From a768dc3daa04d35fedfbe75c0a59b9b2545b85c4 Mon Sep 17 00:00:00 2001
From: gongzuming <gongzuming>
Date: 星期四, 19 九月 2024 16:59:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2'

---
 src/main/java/com/mzl/flower/dto/response/point/PointGoodVO.java                        |   44 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java       |   96 
 src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderList4CheckDTO.java       |    2 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsDTO.java           |   17 
 src/main/java/com/mzl/flower/dto/response/current/CurrentUserDTO.java                   |    6 
 src/main/java/com/mzl/flower/service/customer/FollowService.java                        |   16 
 src/main/java/com/mzl/flower/web/customer/DeliveryCustomerController.java               |   47 
 src/main/java/com/mzl/flower/web/member/MemberController.java                           |  121 
 src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailVO.java              |   54 
 src/main/java/com/mzl/flower/mapper/payment/DeliveryOrderMapper.java                    |    3 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerShowListDTO.java                 |    5 
 src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java           |  552 ++
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java          |  234 +
 src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java                  |   90 
 src/main/java/com/mzl/flower/dto/response/point/PointGoodsListDTO.java                  |   31 
 src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java                      |   46 
 src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java   |   10 
 src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java                    |   16 
 src/main/java/com/mzl/flower/dto/response/supplier/SupplierDTO.java                     |    4 
 src/main/java/com/mzl/flower/service/menber/GrowthValueDeductionStrategy.java           |   16 
 src/main/resources/script/db-v2.sql                                                     |   26 
 src/main/java/com/mzl/flower/enums/TrueOrFalseEnum.java                                 |   17 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponVipDTO.java                  |   19 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java           |   21 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java            |  186 
 src/main/java/com/mzl/flower/web/customer/PointGoodsCustomerController.java             |   70 
 src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java        |  493 ++
 src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderStatisticsDTO.java       |    3 
 src/main/java/com/mzl/flower/dto/response/payment/OrderListDTO.java                     |    8 
 src/main/java/com/mzl/flower/dto/request/coupon/BatchCouponTemplateDTO.java             |   23 
 src/main/java/com/mzl/flower/enums/CouponCategoryEnum.java                              |   22 
 src/main/java/com/mzl/flower/service/flower/FlowerService.java                          |   69 
 src/main/java/com/mzl/flower/dto/request/menber/UserMemberRecordQueryDTO.java           |   13 
 src/main/java/com/mzl/flower/config/RedissonConfig.java                                 |   45 
 pom.xml                                                                                 |   10 
 src/main/java/com/mzl/flower/web/login/SupplierLoginController.java                     |   12 
 src/main/resources/mapper/coupon/CouponTemplateCustomerMapper.xml                       |   12 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListDTO.java                 |    6 
 src/main/java/com/mzl/flower/service/payment/BillService.java                           |   47 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryMineCouponRecordDTO.java           |   32 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponPointStatisVO.java               |   18 
 src/main/java/com/mzl/flower/web/pub/PubSupplierController.java                         |    2 
 src/main/resources/mapper/point/PointGoodMapper.xml                                     |   28 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerShowDTO.java                     |    5 
 src/main/resources/mapper/payment/OrderItemMapper.xml                                   |   15 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsBO.java            |   18 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java             |  171 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java            |  140 
 src/main/java/com/mzl/flower/enums/CouponGetUserTypeEnum.java                           |   22 
 src/main/resources/mapper/coupon/CouponRecordMapper.xml                                 |   32 
 src/main/java/com/mzl/flower/dto/request/point/PointGoodQueryDTO.java                   |   27 
 src/main/java/com/mzl/flower/mapper/point/CustomerPointMapper.java                      |   22 
 src/main/java/com/mzl/flower/dto/response/member/MemberGrowthRecordVO.java              |   52 
 src/main/resources/mapper/payment/OrderMapper.xml                                       |   27 
 src/main/resources/mapper/customer/FollowMapper.xml                                     |    7 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryActivityEffectCouponDTO.java       |   32 
 src/main/java/com/mzl/flower/dto/response/payment/BillListDTO.java                      |    2 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplatePointVO.java             |  135 
 src/main/resources/mapper/coupon/CouponTemplateMapper.xml                               |   41 
 src/main/java/com/mzl/flower/web/point/CustomerPointController.java                     |   88 
 src/main/resources/application.yml                                                      |    6 
 src/main/java/com/mzl/flower/dto/request/point/ExchangeGoodsDTO.java                    |   15 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java              |  190 
 src/main/java/com/mzl/flower/service/payment/OrderService.java                          |  313 +
 src/main/java/com/mzl/flower/entity/payment/Order.java                                  |   30 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java             |  183 
 src/main/java/com/mzl/flower/entity/flower/Flower.java                                  |    3 
 src/main/java/com/mzl/flower/dto/request/menber/UserGrowthRecordDTO.java                |   31 
 src/main/java/com/mzl/flower/dto/request/point/ChangePointDTO.java                      |   20 
 src/main/java/com/mzl/flower/service/menber/impl/ThirdDeductionStrategy.java            |   91 
 src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderStationQueryDTO.java      |    7 
 src/main/java/com/mzl/flower/mapper/point/PointGoodsRecordMapper.java                   |   18 
 src/main/java/com/mzl/flower/dto/request/point/PointGoodDTO.java                        |   32 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java                  |  114 
 src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java           |   26 
 src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java         |   17 
 src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml                           |   19 
 src/main/java/com/mzl/flower/dto/response/point/CustomerPointDTO.java                   |   34 
 src/main/java/com/mzl/flower/dto/request/point/QueryPointDetailDTO.java                 |   28 
 src/main/java/com/mzl/flower/service/customer/CustomerService.java                      |   33 
 src/main/java/com/mzl/flower/service/payment/OrderItemSettlementService.java            |   20 
 src/main/java/com/mzl/flower/web/login/PartnerLoginController.java                      |   11 
 src/main/java/com/mzl/flower/config/ResourceServerConfig.java                           |    3 
 src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapper.java                    |   16 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateAppVO.java               |  146 
 src/main/java/com/mzl/flower/enums/CouponUsageTimeTypeEnum.java                         |   23 
 src/main/java/com/mzl/flower/web/supplier/DeliverySupplierController.java               |   11 
 src/main/java/com/mzl/flower/mapper/member/MemberGrowthRecordMapper.java                |   39 
 src/main/java/com/mzl/flower/dto/response/payment/OrderItemListDTO.java                 |   19 
 src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java                |   37 
 src/main/java/com/mzl/flower/entity/menber/Member.java                                  |   55 
 src/main/表设计-二期.xlsx                                                                    |    0 
 src/main/java/com/mzl/flower/web/payment/DeliveryOrderController.java                   |   97 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java              |   75 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListWrapDTO.java             |    2 
 src/main/java/com/mzl/flower/service/coupon/CouponTemplateCustomerService.java          |   40 
 src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java                |   35 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateController.java                |  160 
 src/main/java/com/mzl/flower/dto/response/payment/OrderItemPlatformListDTO.java         |    9 
 src/main/java/com/mzl/flower/dto/request/point/QueryExchangeGoodsDTO.java               |   14 
 src/main/resources/mapper/payment/DeliveryOrderMapper.xml                               |   60 
 src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java                        |   21 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryActivePointCouponDTO.java          |   40 
 src/main/java/com/mzl/flower/dto/response/payment/OrderPlatformListDTO.java             |    8 
 src/main/java/com/mzl/flower/dto/response/point/PointGoodsDTO.java                      |   12 
 src/main/java/com/mzl/flower/schedule/ScheduleService.java                              |   62 
 src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java                 |  216 +
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateActivyDTO.java      |  152 
 src/main/java/com/mzl/flower/web/point/PointGoodsController.java                        |   90 
 src/main/java/com/mzl/flower/service/point/PointGoodsService.java                       |  239 +
 src/main/java/com/mzl/flower/service/supplier/StationService.java                       |    4 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java        |   81 
 src/main/java/com/mzl/flower/service/menber/impl/SecondDeductionStrategy.java           |   30 
 src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml                       |    5 
 src/main/java/com/mzl/flower/entity/point/PointGoods.java                               |   33 
 src/main/java/com/mzl/flower/mapper/member/MemberMapper.java                            |   51 
 src/main/定时任务说明.txt                                                                     |    3 
 src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java                  |   32 
 src/main/java/com/mzl/flower/mapper/payment/OrderItemMapper.java                        |    3 
 src/main/java/com/mzl/flower/enums/CouponGetTypeEnum.java                               |   27 
 src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailDTO.java             |   42 
 src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java                          |  113 
 src/main/java/com/mzl/flower/entity/coupon/CouponTemplateDO.java                        |  149 
 src/main/java/com/mzl/flower/entity/menber/MemberDowngradeRecord.java                   |   28 
 src/main/java/com/mzl/flower/mapper/point/PointGoodsMapper.java                         |   16 
 src/main/java/com/mzl/flower/service/menber/impl/GrowthValueStrategyContext.java        |   24 
 src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderInfoSpQueryDTO.java       |    7 
 src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItem4CheckDTO.java       |    2 
 src/main/java/com/mzl/flower/entity/menber/MemberGrowthRecord.java                      |   42 
 src/main/java/com/mzl/flower/dto/response/payment/OrderCheckLocationListDTO.java        |    4 
 src/main/java/com/mzl/flower/dto/request/menber/MemberGrowthRecordDTO.java              |   39 
 src/main/java/com/mzl/flower/dto/request/flower/FlowerCreateDTO.java                    |    3 
 src/main/java/com/mzl/flower/dto/request/menber/MemberDTO.java                          |   59 
 src/main/java/com/mzl/flower/enums/CouponUsageTypeEnum.java                             |   23 
 src/main/java/com/mzl/flower/web/payment/OrderController.java                           |    4 
 src/main/java/com/mzl/flower/dto/request/flower/FlowerLimitedDTO.java                   |   15 
 src/main/java/com/mzl/flower/schedule/PointScheduleService.java                         |   96 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java           |  249 +
 src/main/java/com/mzl/flower/dto/request/point/QueryCustomerPointDTO.java               |   12 
 src/main/java/com/mzl/flower/dto/request/point/PointGoodsQueryDTO.java                  |   28 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateCustomerVO.java          |   20 
 src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java                     |    3 
 src/main/java/com/mzl/flower/dto/response/member/MemberVO.java                          |   60 
 src/main/java/com/mzl/flower/entity/system/User.java                                    |    4 
 src/main/java/com/mzl/flower/entity/point/PointGoodsRecord.java                         |   57 
 src/main/java/com/mzl/flower/service/payment/WxDeliveryGoodService.java                 |    2 
 src/main/java/com/mzl/flower/mapper/customer/CustomerMapper.java                        |   20 
 src/main/java/com/mzl/flower/dto/request/menber/MemberQueryDTO.java                     |   10 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateUserVO.java              |  148 
 src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java            |  190 
 src/main/java/com/mzl/flower/entity/point/CustomerPoint.java                            |   32 
 src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java                            |   23 
 src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java                         |   26 
 src/main/java/com/mzl/flower/constant/Constants.java                                    |  133 
 src/main/java/com/mzl/flower/service/menber/impl/GrowthValueDealService.java            |   48 
 src/main/java/com/mzl/flower/web/customer/FollowController.java                         |   12 
 src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateCustomerMapper.java            |   16 
 src/main/表设计.xlsx                                                                       |    0 
 src/main/java/com/mzl/flower/web/customer/CustomerSignInController.java                 |   57 
 src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java                |   23 
 src/main/java/com/mzl/flower/dto/request/menber/MemberRecordQueryDTO.java               |   20 
 src/main/java/com/mzl/flower/web/login/CustomerLoginController.java                     |    7 
 src/main/java/com/mzl/flower/mapper/customer/FollowMapper.java                          |    2 
 src/main/v2_sql.sql                                                                     |   33 
 src/main/java/com/mzl/flower/service/menber/MemberService.java                          |   20 
 src/main/resources/mapper/point/CustomerPointMapper.xml                                 |   56 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryExistCouponDTO.java                |   19 
 src/main/java/com/mzl/flower/service/system/UserService.java                            |   28 
 src/main/java/com/mzl/flower/dto/request/menber/TargetMemberDTO.java                    |   33 
 src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailQueryDTO.java         |   32 
 src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java                    |  123 
 src/main/resources/mapper/point/CustomerPointDetailMapper.xml                           |   43 
 src/main/resources/mapper/point/PointGoodsMapper.xml                                    |   30 
 src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailDTO.java              |   50 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponDTO.java                     |   34 
 src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java               |   44 
 src/main/resources/mapper/member/MemberMapper.xml                                       |   14 
 src/main/java/com/mzl/flower/dto/response/point/PointGoodsRecordDTO.java                |   56 
 src/main/java/com/mzl/flower/service/payment/OrderSettlementService.java                |   25 
 src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapper.java                      |   16 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierListDTO.java             |    3 
 src/main/java/com/mzl/flower/dto/request/flower/FlowerUpdateAdminDTO.java               |    3 
 src/main/java/com/mzl/flower/entity/customer/Customer.java                              |    2 
 src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapperCustom.java              |   68 
 src/main/java/com/mzl/flower/service/menber/MemberGrowthRecordService.java              |   32 
 src/main/java/com/mzl/flower/web/flower/FlowerController.java                           |    7 
 src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java                  |    4 
 src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java                  |   16 
 src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java                 |  103 
 src/main/java/com/mzl/flower/dto/response/flower/StationStatisticDTO.java               |    6 
 src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java     |  238 +
 src/main/java/com/mzl/flower/dto/response/flower/FlowerListDTO.java                     |    6 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateVipDTO.java         |   78 
 src/main/java/com/mzl/flower/dto/response/payment/OrderCheckListDTO.java                |    3 
 src/main/java/com/mzl/flower/enums/VipGradeEnum.java                                    |   24 
 src/main/java/com/mzl/flower/utils/ConverterUtil.java                                   |   73 
 src/main/java/com/mzl/flower/dto/request/point/PointGoodsCreateDTO.java                 |   28 
 src/main/java/com/mzl/flower/service/point/CustomerPointService.java                    |  210 +
 src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java                    |    6 
 src/main/resources/mapper/member/MemberGrowthRecordMapper.xml                           |   48 
 src/main/java/com/mzl/flower/service/BaseService.java                                   |   59 
 src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java                      |   18 
 src/main/java/com/mzl/flower/mapper/member/MemberDowngradeRecordMapper.java             |   24 
 src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java                  |   14 
 src/main/java/com/mzl/flower/utils/DateUtils.java                                       |   14 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierDTO.java                 |    3 
 src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemDTO.java             |    1 
 src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateCustomerServiceImpl.java |   51 
 src/main/java/com/mzl/flower/schedule/WarehouseScheduleService.java                     |    4 
 src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java             |  151 
 src/main/java/com/mzl/flower/dto/response/member/UserGrowthRecordVO.java                |   28 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVO.java                  |  253 +
 src/main/java/com/mzl/flower/dto/response/flower/FlowerDTO.java                         |    3 
 src/main/java/com/mzl/flower/service/system/RoleService.java                            |   20 
 src/main/java/com/mzl/flower/dto/response/flower/FlowerCategoryTreeDTO.java             |    6 
 src/main/java/com/mzl/flower/dto/request/payment/PostQueryDTO.java                      |   15 
 src/main/java/com/mzl/flower/entity/point/PointGood.java                                |   42 
 src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java                 |   14 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java               |  162 
 src/main/java/com/mzl/flower/enums/CouponUsedStatusEnum.java                            |   23 
 src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml                         |  243 +
 src/main/java/com/mzl/flower/enums/CouponStatusEnum.java                                |   22 
 src/main/java/com/mzl/flower/service/flower/FlowerCategoryService.java                  |   11 
 src/main/java/com/mzl/flower/service/menber/impl/FirstDeductionStrategy.java            |   26 
 src/main/java/com/mzl/flower/entity/payment/OrderItem.java                              |   17 
 src/main/java/com/mzl/flower/entity/payment/Bill.java                                   |    2 
 src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordVO.java                    |   41 
 src/main/java/com/mzl/flower/web/partner/OrderPartnerController.java                    |    2 
 src/main/java/com/mzl/flower/dto/request/point/PointGoodsUpdateDTO.java                 |   11 
 src/main/java/com/mzl/flower/enums/CouponTypeEnum.java                                  |   23 
 src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml                           |  132 
 231 files changed, 11,358 insertions(+), 178 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8f0d9f0..ceb76b2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,7 @@
         <springfox-swagger.version>2.9.2</springfox-swagger.version>
         <io.swagger.version>1.5.22</io.swagger.version>
         <base.version>1.0-SNAPSHOT</base.version>
+        <mybatis-plus.version>3.4.1</mybatis-plus.version>
     </properties>
 
     <dependencies>
@@ -55,6 +56,8 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
+            <version>1.18.20</version>
+            <scope>provided</scope>
             <optional>true</optional>
         </dependency>
 
@@ -259,6 +262,13 @@
             <artifactId>aspectjweaver</artifactId>
             <version>1.9.7</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.15.6</version> <!-- 确保使用与你的 Spring Boot 版本兼容的 Redisson 版本 -->
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/mzl/flower/config/RedissonConfig.java b/src/main/java/com/mzl/flower/config/RedissonConfig.java
new file mode 100644
index 0000000..4d921e2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/RedissonConfig.java
@@ -0,0 +1,45 @@
+package com.mzl.flower.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RedissonConfig {
+
+    @Value("${spring.redis.host}")
+    private String host;
+
+    @Value("${spring.redis.port}")
+    private Integer port;
+
+    @Value("${spring.redis.password}")
+    private String password;
+
+    @Value("${spring.redis.timeout:10000}")
+    private int timeout; // 10秒
+
+    @Value("${spring.redis.connectionPoolSize:100}")
+    private int connectionPoolSize; // 100个连接
+
+    @Value("${spring.redis.connectionMinimumIdleSize:20}")
+    private int connectionMinimumIdleSize; // 20个空闲连接
+
+
+
+    @Bean(destroyMethod = "shutdown")
+    public RedissonClient redissonClient() {
+        Config config = new Config();
+        config.useSingleServer()
+                .setAddress(String.format("redis://%s:%d", host, port))
+                .setPassword(password)
+                .setTimeout(timeout)
+                .setConnectionPoolSize(connectionPoolSize)
+                .setConnectionMinimumIdleSize(connectionMinimumIdleSize);
+
+        return Redisson.create(config);
+    }
+}
diff --git a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
index c77de72..885356a 100644
--- a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
+++ b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
@@ -51,10 +51,13 @@
                 .antMatchers("/api/customer/flower/list/view").permitAll()
                 .antMatchers("/api/customer/flower/up/stock").permitAll()
                 .antMatchers("api/pub/customer/home/**").permitAll()
+                .antMatchers("/api/customer/point/goods/**").permitAll()
                 .antMatchers("/api/upload/oss/file").permitAll()
                 .antMatchers("/api/flower/zone/list").permitAll()
                 .antMatchers("/api/config/content/list/view").permitAll()
+                .antMatchers("/api/v2/coupon/home/alert").permitAll()
                 .antMatchers("/api/customer/partner/name").permitAll()
+                .antMatchers("/api/v2/coupon/app/home/alert").permitAll()
                 .antMatchers("/api/**").authenticated();//配置访问控制,必须认证过后才可以访问
 
     }
diff --git a/src/main/java/com/mzl/flower/constant/Constants.java b/src/main/java/com/mzl/flower/constant/Constants.java
index 15f6667..fc79067 100644
--- a/src/main/java/com/mzl/flower/constant/Constants.java
+++ b/src/main/java/com/mzl/flower/constant/Constants.java
@@ -10,6 +10,8 @@
 
     public static final String DEFAULT_PASSWORD = "1234562";
 
+    public static final String DEFAULT_MEMBER_ID = "1"; //默认会员等级
+
 
     /**
      * 审核结果
@@ -430,9 +432,136 @@
         }
     }
 
+    public enum POINT_GOODS_STATUS {
+        A("上架"),
+        I("下架");
+
+        POINT_GOODS_STATUS(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum POINT_GOOD_STATUS {
+        up("上架"),
+        off("下架");
+
+        POINT_GOOD_STATUS(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum POINT_CHANGE_TYPE {
+        add("增加"),
+        reduce("减少");
+
+        POINT_CHANGE_TYPE(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+
+    public enum POINT_TYPE {
+        consume("消费获取"),
+        activity("活动获取"),
+        giveaway("积分赠送"),
+        sign("签到"),
+        deduction("积分扣减"),
+        exchange("积分兑换"),
+        expired("积分过期");
+
+        POINT_TYPE(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum POINT_GOODS_RECORD_STATUS {
+        A("未使用"),
+        U("已使用"),
+        E("已过期");
+
+        POINT_GOODS_RECORD_STATUS(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum DISCOUNT_TYPE {
+        ratio("百分比"),
+        amount("固定金额");
+
+        DISCOUNT_TYPE(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum GROWTH_SOURCE {
+        sign("签到"), consume("消费"), downgrading("降级");
+
+        GROWTH_SOURCE(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+    public enum GROWTH_TYPE {
+        add("新增"), reduce("扣除");
+
+        GROWTH_TYPE(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
     public enum after_sale_type {
-        barters("换货"),
-        returns("退货"),
+        quality("1.质量问题"),
+        stockout("2.缺货问题"),
+        broken("3.断头问题"),
+        category("4.品类不符"),
+        grade("5.等级不符"),
         ;
 
         after_sale_type(String desc) {
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/BatchCouponTemplateDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/BatchCouponTemplateDTO.java
new file mode 100644
index 0000000..019aadd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/BatchCouponTemplateDTO.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@ApiModel("优惠券批量操作")
+@Data
+public class BatchCouponTemplateDTO {
+
+
+    @ApiModelProperty(value = "ID列表不能为空")
+    @NotNull(message = "ID列表不能为空")
+    private List<String> idList;
+
+    @ApiModelProperty(hidden = true)
+    private String updateBy;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java
new file mode 100644
index 0000000..e8f6a9d
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordAppDTO.java
@@ -0,0 +1,21 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Data
+public class CreateCouponRecordAppDTO {
+
+    /**
+     * 优惠券ID
+     */
+    @ApiModelProperty(value = "优惠券ID")
+    @NotEmpty(message = "优惠券ID不能为空")
+    private String couponId;
+
+    @ApiModelProperty(value = "商户ID",hidden = true)
+    private Long customerId;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java
new file mode 100644
index 0000000..b5e7334
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponRecordDTO.java
@@ -0,0 +1,75 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class CreateCouponRecordDTO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券ID
+     */
+    @ApiModelProperty(value = "优惠券ID")
+    @NotEmpty(message = "优惠券ID不能为空")
+    private String couponId;
+
+    /**
+     * 用户id
+     */
+
+    @ApiModelProperty(value = "用户id")
+//    @NotEmpty(message = "用户id不能为空")
+    private String userId;
+
+    /**
+     * 商户ID
+     */
+    @ApiModelProperty(value = "商户ID")
+    @NotNull(message = "商户ID不能为空")
+    private Long customerId;
+
+    /**
+     * 状态(coupon_record_status)未使用、已使用、已过期
+     */
+//    @ApiModelProperty(value = "状态")
+//    private String status;
+
+    /**
+     * 有效开始时间
+     */
+//    @ApiModelProperty(value = "有效开始时间")
+//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+//    @DateTimeFormat
+//    @NotNull(message = "有效开始时间不能为空")
+//    private LocalDateTime effectiveStart;
+
+    /**
+     * 有效结束时间
+     */
+//    @ApiModelProperty(value = "有效结束时间")
+//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+//    @DateTimeFormat
+//    @NotNull(message = "有效结束时间不能为空")
+//    private LocalDateTime effectiveEnd;
+
+    /**
+     * 使用订单
+     */
+//    @ApiModelProperty(value = "订单号")
+//    private String orderId;
+
+    /**
+     * 使用时间
+     */
+//    @ApiModelProperty(value = "使用时间")
+//    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+//    @DateTimeFormat
+//    private LocalDateTime usedTime;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateActivyDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateActivyDTO.java
new file mode 100644
index 0000000..fd49d0e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateActivyDTO.java
@@ -0,0 +1,152 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class CreateCouponTemplateActivyDTO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "couponName")
+    @NotEmpty(message = "优惠券名称不能为空")
+    private String couponName;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE)")
+    @NotEmpty(message = "优惠券类型不能为空(COUPON_TYPE)")
+    private String couponDiscountType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @NotEmpty(message = "领取渠道不能为空(COUPON_GET_TYPE)")
+    private String getType;
+
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "使用规则")
+    @NotEmpty(message = "使用规则不能为空")
+    private String couponDescription;
+
+
+    /**
+     * 领取开始时间
+     */
+    @ApiModelProperty(value = "领取开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    @NotNull(message = "领取开始时间不能为空")
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    @NotNull(message = "领取结束时间不能为空")
+    private LocalDateTime getEndDate;
+
+
+    /**
+     * 使用时间类型(COUPON_USAGE_TYPE)与领取时间一致、固定时间、领取后有效
+     */
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @NotEmpty(message = "使用时间类型不能为空(COUPON_USAGE_TYPE)")
+    private String usageType;
+
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型 (COUPON_USAGE_TIME_TYPE)")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    @Min(value = 1,message = "领取后有效时间必须大于等于1")
+    @Max(value = 99999999,message = "领取后有效时间不能超过99999999")
+    private Integer usageTimeNum;
+
+
+    /**
+     * 使用开始时间
+     */
+    @ApiModelProperty(value = "使用时间-固定时间-开始日期")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用时间-固定时间-结束日期")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件,满多少钱")
+    @NotNull(message = "使用条件不能为空")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    @NotNull(message = "优惠券面值不能为空")
+    private BigDecimal couponDiscountValue;
+
+
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "发放数量")
+    @NotNull(message = "发放数量不能为空")
+    @Min(value = 1,message = "发放数量必须大于0")
+    @Max(value = 99999999,message = "库存数量不能超过99999999")
+    private Integer couponAmount;
+
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    @NotNull(message = "每人限领不能为空")
+    @Min(value = 1,message = "每人限领必须大于0")
+    @Max(value = 99999999,message = "每人限领不能超过99999999")
+    private Integer getLimit;
+
+    /**
+     * 优惠券图片
+     */
+    @ApiModelProperty(value = "优惠券图片")
+    private String imageUrl;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java
new file mode 100644
index 0000000..24ff28a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateBO.java
@@ -0,0 +1,151 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CreateCouponTemplateBO {
+
+    private String id;
+
+
+    /**
+     * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)
+     */
+    private String category;
+    /**
+     * 优惠券代码(唯一)
+     */
+    private String couponCode;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 最大折扣金额(可选,仅对百分比折扣类型适用)
+     */
+    private BigDecimal maxDiscountAmount;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    private String getType;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    private String getUserType;
+
+    /**
+     * 领取开始时间
+     */
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    private LocalDateTime getEndDate;
+
+    /**
+     * 每人限领
+     */
+    private Integer getLimit;
+
+    /**
+     * 使用时间类型(COUPON_USAGE_TIME_TYPE)与领取时间一致、固定时间、领取后有效
+     */
+    private String usageType;
+
+    /**
+     * 使用次数限制
+     */
+    private Integer usageLimit;
+
+    /**
+     * 每个用户的使用次数限制
+     */
+    private Integer usagePerUser;
+
+    /**
+     * 使用开始时间
+     */
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    private LocalDateTime usageEndDate;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    private Integer usageTimeNum;
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    private String status;
+
+    /**
+     * 兑换积分
+     */
+    private Integer point;
+
+    /**
+     * 会员ID
+     */
+    private Integer memberId;
+
+    /**
+     * 指定的用户的id
+     */
+    private List<Long> pointCostomIdList;
+
+    /**
+     * 优惠券的图片
+     */
+    private String imageUrl;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java
new file mode 100644
index 0000000..546ea4a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateDTO.java
@@ -0,0 +1,140 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class CreateCouponTemplateDTO  {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "couponName")
+    @NotEmpty(message = "优惠券名称不能为空")
+    private String couponName;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型")
+    @NotEmpty(message = "优惠券类型不能为空")
+    private String couponDiscountType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道")
+    @NotEmpty(message = "领取渠道不能为空")
+    private String getType;
+
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "使用规则")
+    @NotEmpty(message = "使用规则不能为空")
+    private String couponDescription;
+
+
+    /**
+     * 领取开始时间
+     */
+    @ApiModelProperty(value = "领取开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    @NotNull(message = "领取开始时间不能为空")
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    @NotNull(message = "领取结束时间不能为空")
+    private LocalDateTime getEndDate;
+
+
+    /**
+     * 使用时间类型(COUPON_USAGE_TIME_TYPE)与领取时间一致、固定时间、领取后有效
+     */
+    @ApiModelProperty(value = "使用时间类型")
+    @NotEmpty(message = "使用时间类型不能为空")
+    private String usageType;
+
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型 天、小时、分钟")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+
+    /**
+     * 使用开始时间
+     */
+    @ApiModelProperty(value = "使用时间-固定时间-开始日期")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用时间-固定时间-结束日期")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件,满多少钱")
+    @NotNull(message = "使用条件不能为空")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    @NotNull(message = "优惠券面值不能为空")
+    private BigDecimal couponDiscountValue;
+
+
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "发放数量")
+    @NotNull(message = "发放数量不能为空")
+    private Integer couponAmount;
+
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    @NotNull(message = "每人限领不能为空")
+    private Integer getLimit;
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java
new file mode 100644
index 0000000..436ce5c
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplatePointDTO.java
@@ -0,0 +1,96 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 积分优惠券
+ */
+@Data
+public class CreateCouponTemplatePointDTO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+
+    @ApiModelProperty(value = "优惠券名称")
+    @NotEmpty(message = "优惠券名称不能为空")
+    private String couponName;
+
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型")
+    @NotEmpty(message = "优惠券类型不能为空")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "使用规则")
+    @NotEmpty(message = "使用规则不能为空")
+    private String couponDescription;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TYPE)天、小时、分钟")
+    @NotEmpty(message = "领取后有效类型不能为空")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value ="领取后有效时间整数,比如90(天,小时,分钟)" )
+    @NotNull(message = "领取后有效时间不能为空")
+    @Min(value = 1,message = "领取后有效时间必须大于等于1")
+    @Max(value = 99999999,message = "领取后有效时间不能超过99999999")
+    private Integer usageTimeNum;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    @NotNull(message = "使用条件不能为空")
+    @Max(value = 99999999,message = "使用条件不能超过99999999")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    @NotNull(message = "优惠券面值不能为空")
+    @Min(value = 1,message = "优惠券面值大于0")
+    @Max(value = 99999999,message = "优惠券面值不能超过99999999")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 库存
+     */
+    @ApiModelProperty(value = "库存")
+    @NotNull(message = "库存不能为空")
+    @Min(value = 1,message = "库存数量必须大于0")
+    @Max(value = 99999999,message = "库存数量不能超过99999999")
+    private Integer couponAmount;
+
+
+    @ApiModelProperty(value = "积分数量")
+    @NotNull(message = "积分数量不能为空")
+    @Min(value = 1,message = "积分数量必须大于0")
+    @Max(value = 99999999,message = "积分数量不能超过99999999")
+    private Integer point;
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java
new file mode 100644
index 0000000..1af6f04
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateUserDTO.java
@@ -0,0 +1,81 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class CreateCouponTemplateUserDTO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+
+    @ApiModelProperty(value = "优惠券名称")
+    @NotEmpty(message = "优惠券名称不能为空")
+    private String couponName;
+
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型")
+    @NotEmpty(message = "优惠券类型不能为空")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "使用规则")
+    @NotEmpty(message = "使用规则不能为空")
+    private String couponDescription;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TYPE)天、小时、分钟")
+    @NotEmpty(message = "领取后有效类型不能为空")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value ="领取后有效时间整数,比如90(天,小时,分钟)" )
+    @NotNull(message = "领取后有效时间不能为空")
+    @Min(value = 1,message = "领取后有效时间必须大于0")
+    @Max(value = 99999999,message = "领取后有效时间不能超过99999999")
+    private Integer usageTimeNum;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    @NotNull(message = "使用条件不能为空")
+    @Max(value = 99999999,message = "使用条件不能超过99999999")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    @NotNull(message = "优惠券面值不能为空")
+    @Min(value = 1,message = "优惠券面值大于0")
+    @Max(value = 99999999,message = "优惠券面值不能超过99999999")
+    private BigDecimal couponDiscountValue;
+
+
+    @ApiModelProperty(value = "指定的用户列表id")
+    @NotNull(message = "指定的用户列表id不能为空")
+    private List<Long> pointCostomIdList;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateVipDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateVipDTO.java
new file mode 100644
index 0000000..c06c539
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/CreateCouponTemplateVipDTO.java
@@ -0,0 +1,78 @@
+package com.mzl.flower.dto.request.coupon;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+public class CreateCouponTemplateVipDTO {
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+
+    @ApiModelProperty(value = "优惠券名称")
+    @NotEmpty(message = "优惠券名称不能为空")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "使用规则")
+    @NotEmpty(message = "使用规则不能为空")
+    private String couponDescription;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型")
+    @NotEmpty(message = "优惠券类型不能为空")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    @NotNull(message = "优惠券面值不能为空")
+    @Max(value = 99999999,message = "优惠券面值不能超过99999999")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    @NotNull(message = "使用条件不能为空")
+    @Max(value = 99999999,message = "使用条件不能超过99999999")
+    private BigDecimal minOrderAmount;
+
+
+    /**
+     *  会员等级
+     */
+    @ApiModelProperty(value = "会员等级")
+    @NotNull(message = "会员等级不能为空")
+    private Integer memberId;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    @Max(value = 99999999,message = "领取后有效时间不能超过99999999")
+    private Integer usageTimeNum;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java
new file mode 100644
index 0000000..c5fe403
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/ExchangeCouponDTO.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ExchangeCouponDTO {
+
+    @NotNull(message = "优惠券id不能为空")
+    private String couponId;
+
+    @ApiModelProperty(value = "兑换数量",hidden = true)
+    private Integer num;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivePointCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivePointCouponDTO.java
new file mode 100644
index 0000000..761a86b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivePointCouponDTO.java
@@ -0,0 +1,40 @@
+package com.mzl.flower.dto.request.coupon;
+
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryActivePointCouponDTO{
+
+    @ApiModelProperty(value = "排序列 point desc / create_time desc,默认 create_time desc",hidden = true)
+    private String orderStr;
+
+    @ApiModelProperty(value = "积分最小值")
+    private Integer minPoint;
+
+    @ApiModelProperty(value = "积分最大值")
+    private Integer maxPoint;
+
+    @ApiModelProperty(value = "优惠券种类",hidden = true)
+    private String category;
+
+    @ApiModelProperty(value = "优惠券状态",hidden = true)
+    private String status;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivityEffectCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivityEffectCouponDTO.java
new file mode 100644
index 0000000..41f0e3d
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryActivityEffectCouponDTO.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("App活动优惠券实体类")
+public class QueryActivityEffectCouponDTO {
+
+
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE)" ,hidden = true)
+    private String couponDiscountType;
+
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)",hidden = true)
+    private String getType;
+
+    @ApiModelProperty(value = "领取用户类型(COUPON_GET_USER_TYPE)",hidden = true)
+    private String getUserType;
+
+    @ApiModelProperty(value = "优惠券种类(COUPON_CATEGORY)",hidden = true)
+    private String category;
+
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)",hidden = true)
+    private String status;
+
+    @ApiModelProperty(value = "领取人ID",hidden = true)
+    private String userId;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponDTO.java
new file mode 100644
index 0000000..7f473a7
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponDTO.java
@@ -0,0 +1,34 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryCouponDTO {
+
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String name;
+
+    @ApiModelProperty(value = "优惠券类型")
+    private String couponDiscountType;
+
+    @ApiModelProperty(value = "领取渠道")
+    private String getType;
+
+    @ApiModelProperty(value = "领取用户类型")
+    private String getUserType;
+
+    @ApiModelProperty(value = "优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)")
+    private String category;
+
+    @ApiModelProperty(value = "优惠券状态")
+    private String status;
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java
new file mode 100644
index 0000000..50cf5f2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponRecordDTO.java
@@ -0,0 +1,44 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryCouponRecordDTO {
+
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String name;
+
+    @ApiModelProperty(value = "优惠券类型")
+    private String couponDiscountType;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "用户id/店铺名称")
+    private String keyword;
+
+    @ApiModelProperty(value = "联系方式")
+    private String tel;
+
+    @ApiModelProperty(value = "领取渠道")
+    private String getType;
+
+    @ApiModelProperty(value = "状态")
+    private String status;
+
+    @ApiModelProperty(value = "领取用户类型-全部用户,指定用户")
+    private String getUserType;
+
+    @ApiModelProperty(value = "优惠券模版ID")
+    private String couponId;
+
+    @ApiModelProperty(value = "优惠券种类")
+    private String category;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsBO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsBO.java
new file mode 100644
index 0000000..0454617
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsBO.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.dto.request.coupon;
+
+import lombok.Data;
+
+
+@Data
+public class QueryCouponStatisticsBO extends QueryCouponStatisticsDTO{
+
+//    @ApiModelProperty(value = "优惠券名称")
+//    private String name;
+    /**
+     * 优惠券总数
+     */
+    private String category;
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsDTO.java
new file mode 100644
index 0000000..548c919
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponStatisticsDTO.java
@@ -0,0 +1,17 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryCouponStatisticsDTO {
+
+//    @ApiModelProperty(value = "优惠券名称")
+//    private String name;
+
+    @ApiModelProperty(hidden = true)
+    private String category;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponVipDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponVipDTO.java
new file mode 100644
index 0000000..76fb073
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryCouponVipDTO.java
@@ -0,0 +1,19 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryCouponVipDTO {
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String name;
+
+    @ApiModelProperty(value = "优惠券类型")
+    private String couponDiscountType;
+
+    @ApiModelProperty(value = "id")
+    private String id;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryExistCouponDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryExistCouponDTO.java
new file mode 100644
index 0000000..8c3d62a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryExistCouponDTO.java
@@ -0,0 +1,19 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QueryExistCouponDTO {
+
+    @ApiModelProperty(value = "商户ID")
+    private Long customerId;
+
+    @ApiModelProperty(value = "优惠券ID")
+    private String couponId;
+
+    @ApiModelProperty(value = "优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)")
+    private String category;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/coupon/QueryMineCouponRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/coupon/QueryMineCouponRecordDTO.java
new file mode 100644
index 0000000..ae8675f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/coupon/QueryMineCouponRecordDTO.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.dto.request.coupon;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+@ApiModel("App活动优惠券实体类")
+public class QueryMineCouponRecordDTO {
+
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id",hidden = true)
+    private String userId;
+
+    /**
+     * 商户ID
+     */
+    @ApiModelProperty(value = "商户ID",hidden = true)
+    private Long customerId;
+
+    /**
+     * 状态(coupon_record_status)未使用、已使用、已过期
+     */
+    @ApiModelProperty(value = "状态(coupon_record_status)",hidden = true)
+    private String status;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/flower/FlowerCreateDTO.java b/src/main/java/com/mzl/flower/dto/request/flower/FlowerCreateDTO.java
index 3dbeac4..fe3fa8d 100644
--- a/src/main/java/com/mzl/flower/dto/request/flower/FlowerCreateDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/flower/FlowerCreateDTO.java
@@ -43,4 +43,7 @@
 
     @ApiModelProperty(value = "描述")
     private String description;
+
+    @ApiModelProperty(value = "限购数量")
+    private Integer limited;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/flower/FlowerLimitedDTO.java b/src/main/java/com/mzl/flower/dto/request/flower/FlowerLimitedDTO.java
new file mode 100644
index 0000000..001f526
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/flower/FlowerLimitedDTO.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.dto.request.flower;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FlowerLimitedDTO {
+    @ApiModelProperty(value = "ids")
+    private List<Long> ids;
+
+    @ApiModelProperty(value = "限购数量")
+    private Integer limited;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/flower/FlowerUpdateAdminDTO.java b/src/main/java/com/mzl/flower/dto/request/flower/FlowerUpdateAdminDTO.java
index 3dd4911..882fd35 100644
--- a/src/main/java/com/mzl/flower/dto/request/flower/FlowerUpdateAdminDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/flower/FlowerUpdateAdminDTO.java
@@ -13,6 +13,9 @@
     @ApiModelProperty(value = "销量")
     private Integer sales;
 
+    @ApiModelProperty(value = "限购数量")
+    private Integer limited;
+
     @ApiModelProperty(value = "商品参数")
     private List<ParamDTO> params;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/MemberDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/MemberDTO.java
new file mode 100644
index 0000000..bd069ad
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/MemberDTO.java
@@ -0,0 +1,59 @@
+package com.mzl.flower.dto.request.menber;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+public class MemberDTO {
+    @ApiModelProperty(value = "会员等级id")
+    private Long id;
+
+    @ApiModelProperty("会员等级名称")
+    @NotNull
+    private String name;
+
+    @ApiModelProperty("成长点-区间-开始")
+    @NotNull
+    private int startPoint;
+
+    @ApiModelProperty("成长点-区间-结束")
+    private Integer endPoint;
+
+    @ApiModelProperty("会员折扣类型(百分比、固定金额)")
+    @NotNull
+    private String discountType;
+
+    @ApiModelProperty("会员折扣百分比")
+    @NotNull
+    private BigDecimal discountRatio;
+
+    @ApiModelProperty("会员折扣固定金额")
+    @NotNull
+    private BigDecimal discountAmount;
+
+    @ApiModelProperty("消费金额(元)")
+    @NotNull
+    private int consumptionAmount;
+
+    @ApiModelProperty("已消费产生的成长值")
+    @NotNull
+    private int growthValue;
+
+    @ApiModelProperty("未消费产生的下降值")
+    @NotNull
+    private int downgradeValue;
+
+
+    @ApiModelProperty("背景")
+    @NotNull
+    private String background;
+
+    @ApiModelProperty("图片")
+    @NotNull
+    private String pictures;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/MemberGrowthRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/MemberGrowthRecordDTO.java
new file mode 100644
index 0000000..bcb67c3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/MemberGrowthRecordDTO.java
@@ -0,0 +1,39 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Date;
+
+@Data
+public class MemberGrowthRecordDTO {
+    @ApiModelProperty(value = "会员成长记录表ID")
+    private Long id;
+
+    @ApiModelProperty("记录日期")
+    private Date recordDate;
+
+    @ApiModelProperty("订单金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("成长值")
+    private int growth;
+
+    @ApiModelProperty("用户id")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private BigInteger customerId;
+
+    @ApiModelProperty("成长值来源(growth_source:签到、消费)")
+    private String source;
+
+    @ApiModelProperty("新增、扣除(growth_type)")
+    private String type;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/MemberQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/MemberQueryDTO.java
new file mode 100644
index 0000000..4976ec7
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/MemberQueryDTO.java
@@ -0,0 +1,10 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class MemberQueryDTO {
+    @ApiModelProperty(value = "会员等级名称")
+    private String name;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/MemberRecordQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/MemberRecordQueryDTO.java
new file mode 100644
index 0000000..64cd4b9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/MemberRecordQueryDTO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class MemberRecordQueryDTO {
+    @ApiModelProperty(value = "新增、扣除(growth_type)")
+    private String type;
+    @ApiModelProperty(value = "成长值来源(growth_source:签到、消费)")
+    private String source;
+    @ApiModelProperty(value = "记录开始日期")
+    private Date startRecordDate;
+    @ApiModelProperty(value = "记录结束日期")
+    private Date endRecordDate;
+    @ApiModelProperty("用户ID")
+    private String userId;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/TargetMemberDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/TargetMemberDTO.java
new file mode 100644
index 0000000..4ba60c8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/TargetMemberDTO.java
@@ -0,0 +1,33 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+@Data
+public class TargetMemberDTO {
+    @ApiModelProperty(value = "目标会员等级")
+    private String targetMemberLevel;
+
+    @ApiModelProperty("目标会员等级要求成长值")
+    private int targetStartPoint;
+
+    @ApiModelProperty("达到目标所需成长值")
+    private int targetGap;
+
+    @ApiModelProperty("目标会员等级优惠金额")
+    private BigDecimal targetDiscountAmount;
+
+    @ApiModelProperty("折扣类型")
+    private String targetDiscountType;
+
+    @ApiModelProperty("折扣类型Str")
+    private String targetDiscountTypeStr;
+
+    @ApiModelProperty("会员折扣百分比")
+    private BigDecimal targetDiscountRatio;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/UserGrowthRecordDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/UserGrowthRecordDTO.java
new file mode 100644
index 0000000..4281ed3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/UserGrowthRecordDTO.java
@@ -0,0 +1,31 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class UserGrowthRecordDTO {
+    @ApiModelProperty(value = "当前会员等级")
+    private String currentMemberLevel;
+
+    @ApiModelProperty("当前成长值")
+    private int currentGrowthValue;
+
+    @ApiModelProperty("折扣类型")
+    private String currentDiscountType;
+
+    @ApiModelProperty("折扣类型Str")
+    private String currentDiscountTypeStr;
+
+    @ApiModelProperty("当前会员等级优惠金额")
+    private BigDecimal currentDiscountAmount;
+
+    @ApiModelProperty("会员折扣百分比")
+    private BigDecimal currentDiscountRatio;
+
+    List<TargetMemberDTO> targetMemberInfos;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/menber/UserMemberRecordQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/menber/UserMemberRecordQueryDTO.java
new file mode 100644
index 0000000..47fd2d8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/menber/UserMemberRecordQueryDTO.java
@@ -0,0 +1,13 @@
+package com.mzl.flower.dto.request.menber;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class UserMemberRecordQueryDTO {
+    @ApiModelProperty(value = "用户名称")
+    private String nickName;
+    @ApiModelProperty(value = "联系方式")
+    private String tel;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderInfoSpQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderInfoSpQueryDTO.java
index 04dc3fe..aeee9a5 100644
--- a/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderInfoSpQueryDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderInfoSpQueryDTO.java
@@ -4,6 +4,7 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 public class DeliveryOrderInfoSpQueryDTO {
@@ -28,9 +29,15 @@
     @ApiModelProperty(value = "库位名称")
     private String warehouseLocationCode;
 
+    @ApiModelProperty(value = "日期")
+    private String date;
+
     @ApiModelProperty(hidden = true)
     private LocalDateTime startDate;
 
     @ApiModelProperty(hidden = true)
     private LocalDateTime endDate;
+
+    @ApiModelProperty(hidden = true)
+    private List<String> statusList;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderStationQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderStationQueryDTO.java
index e503680..19217da 100644
--- a/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderStationQueryDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/payment/DeliveryOrderStationQueryDTO.java
@@ -4,6 +4,7 @@
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 public class DeliveryOrderStationQueryDTO {
@@ -34,9 +35,15 @@
     @ApiModelProperty(value = "库位名称")
     private String warehouseLocationCode;
 
+    @ApiModelProperty(value = "日期")
+    private String date;
+
     @ApiModelProperty(hidden = true)
     private LocalDateTime startDate;
 
     @ApiModelProperty(hidden = true)
     private LocalDateTime endDate;
+
+    @ApiModelProperty(hidden = true)
+    private List<String> statusList;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
index 884f18f..c338f50 100644
--- a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java
@@ -26,4 +26,10 @@
 
     @NotBlank(message = "微信code不能为空")
     private String wxcode;
+
+    @ApiModelProperty(value = "用户优惠券id")
+    private String couponRecordId;
+
+    @ApiModelProperty(value = "用户积分商品兑换券id列表")
+    private List<Long> goodsRecordIdList;
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/payment/PostQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/PostQueryDTO.java
new file mode 100644
index 0000000..e86e0e2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/payment/PostQueryDTO.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.dto.request.payment;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+public class PostQueryDTO implements Serializable {
+    @ApiModelProperty(value = "主键列表")
+    private List<String> ids;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/ChangePointDTO.java b/src/main/java/com/mzl/flower/dto/request/point/ChangePointDTO.java
new file mode 100644
index 0000000..ba68e70
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/ChangePointDTO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.request.point;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ChangePointDTO {
+
+    @NotNull(message = "积分不能为空")
+    private Integer point;
+
+    @NotBlank(message = "备注不能为空")
+    private String remarks;
+
+    @NotNull(message = "商户ID不能为空")
+    private Long customerId;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailDTO.java b/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailDTO.java
new file mode 100644
index 0000000..ccb69be
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailDTO.java
@@ -0,0 +1,50 @@
+package com.mzl.flower.dto.request.point;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * packageName com.mzl.flower.dto.request.point
+ * @author fanghaowei
+ * @version version2.0
+ * @className CustomerPointDetailDTO
+ * @date 2024/8/29
+ * @description TODO
+ */
+@Data
+public class CustomerPointDetailDTO {
+
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty("记录日期")
+    private Date recordDate;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("积分变更类型(point_change_type)增加、减少")
+    private String changeType;
+
+    @ApiModelProperty("积分类型:增加(消费获取、活动获取、积分赠送),减少(积分扣减、积分兑换)")
+    private String type;
+
+    @ApiModelProperty("积分(积分=使用积分+过期积分)")
+    private Integer point;
+
+    @ApiModelProperty("使用积分")
+    private Integer usePoint;
+
+    @ApiModelProperty("过期积分")
+    private Integer expiredPoint;
+
+    @ApiModelProperty("备注(可记录积分的来源或去向,如订单号、兑换内容、活动名称等)")
+    private String remarks;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailQueryDTO.java
new file mode 100644
index 0000000..99ef8bb
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/CustomerPointDetailQueryDTO.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CustomerPointDetailQueryDTO {
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("积分变更类型(point_change_type)增加、减少")
+    private String changeType;
+
+    @ApiModelProperty("积分类型:增加(消费获取、活动获取、积分赠送),减少(积分扣减、积分兑换)")
+    private String type;
+
+//    @ApiModelProperty("创建日期(yyyy-mm-dd)")
+//    private String createDateBeginStr;
+//
+//    @ApiModelProperty("创建日期(yyyy-mm-dd)")
+//    private String createDateEndStr;
+//
+//    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)",hidden = true)
+//    private LocalDateTime createDateBegin;
+//
+//    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)", hidden = true)
+//    private LocalDateTime createDateEnd;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/ExchangeGoodsDTO.java b/src/main/java/com/mzl/flower/dto/request/point/ExchangeGoodsDTO.java
new file mode 100644
index 0000000..3cc3872
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/ExchangeGoodsDTO.java
@@ -0,0 +1,15 @@
+package com.mzl.flower.dto.request.point;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class ExchangeGoodsDTO {
+
+    @NotNull(message = "商品id不能为空")
+    private Long goodsId;
+
+    @NotNull(message = "兑换数量不能为空")
+    private Integer num;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/PointGoodDTO.java b/src/main/java/com/mzl/flower/dto/request/point/PointGoodDTO.java
new file mode 100644
index 0000000..478255f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/PointGoodDTO.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PointGoodDTO {
+    @ApiModelProperty(value = "积分商品表ID")
+    private Long id;
+
+    @ApiModelProperty("商品名称")
+    private String name;
+
+    @ApiModelProperty("商品描述")
+    private String description;
+
+    @ApiModelProperty("库存")
+    private Integer stock;
+
+    @ApiModelProperty("封面图")
+    private String cover;
+
+    @ApiModelProperty("商品图片")
+    private String pictures;
+
+    @ApiModelProperty("兑换积分")
+    private Integer point;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/PointGoodQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/point/PointGoodQueryDTO.java
new file mode 100644
index 0000000..fd558cb
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/PointGoodQueryDTO.java
@@ -0,0 +1,27 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PointGoodQueryDTO {
+
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+//    @ApiModelProperty("创建日期(yyyy-mm-dd)")
+//    private String createDateBeginStr;
+//
+//    @ApiModelProperty("创建日期(yyyy-mm-dd)")
+//    private String createDateEndStr;
+//
+//    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)",hidden = true)
+//    private LocalDateTime createDateBegin;
+//
+//    @ApiModelProperty(value = "创建日期(yyyy-mm-dd)", hidden = true)
+//    private LocalDateTime createDateEnd;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/PointGoodsCreateDTO.java b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsCreateDTO.java
new file mode 100644
index 0000000..0194aa3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsCreateDTO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PointGoodsCreateDTO {
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "库存")
+    private Integer stock;
+
+    @ApiModelProperty(value = "封面图")
+    private String cover;
+
+    @ApiModelProperty(value = "商品图片")
+    private List<String> pictureList;
+
+    @ApiModelProperty(value = "兑换积分")
+    private Integer point;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/PointGoodsQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsQueryDTO.java
new file mode 100644
index 0000000..ff598cd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsQueryDTO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PointGoodsQueryDTO {
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "状态")
+    private String status;
+
+    @ApiModelProperty(value = "库存-下限")
+    private Integer stockLower;
+
+    @ApiModelProperty(value = "库存-上限")
+    private Integer stockUpper;
+
+    @ApiModelProperty(value = "兑换积分-下限")
+    private Integer pointLower;
+
+    @ApiModelProperty(value = "兑换积分-上限")
+    private Integer pointUpper;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/PointGoodsUpdateDTO.java b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsUpdateDTO.java
new file mode 100644
index 0000000..0e8d586
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/PointGoodsUpdateDTO.java
@@ -0,0 +1,11 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PointGoodsUpdateDTO extends PointGoodsCreateDTO{
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/QueryCustomerPointDTO.java b/src/main/java/com/mzl/flower/dto/request/point/QueryCustomerPointDTO.java
new file mode 100644
index 0000000..7cf4cd1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/QueryCustomerPointDTO.java
@@ -0,0 +1,12 @@
+package com.mzl.flower.dto.request.point;
+
+
+import lombok.Data;
+
+@Data
+public class QueryCustomerPointDTO {
+
+    private String customerName;
+
+    private String customerTel;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/QueryExchangeGoodsDTO.java b/src/main/java/com/mzl/flower/dto/request/point/QueryExchangeGoodsDTO.java
new file mode 100644
index 0000000..24cf8b5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/QueryExchangeGoodsDTO.java
@@ -0,0 +1,14 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class QueryExchangeGoodsDTO {
+
+    @ApiModelProperty(value = "兑换券状态(POINT_GOODS_RECORD_STATUS)")
+    private String status;
+
+    @ApiModelProperty(value = "用户ID",hidden = true)
+    private String userId;
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/point/QueryPointDetailDTO.java b/src/main/java/com/mzl/flower/dto/request/point/QueryPointDetailDTO.java
new file mode 100644
index 0000000..f236ea1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/point/QueryPointDetailDTO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.request.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class QueryPointDetailDTO {
+
+    @ApiModelProperty("客户ID")
+    private Long customerId;
+
+    @ApiModelProperty("记录日期")
+    private String recordDateStart;
+
+    @ApiModelProperty("记录日期")
+    private String recordDateEnd;
+
+    @ApiModelProperty("积分类型-point_type")
+    private String type;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty(hidden = true)
+    private String userId;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponPointStatisVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponPointStatisVO.java
new file mode 100644
index 0000000..dc08fdd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponPointStatisVO.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.dto.response.coupon;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CouponPointStatisVO  {
+
+    @ApiModelProperty(value = "优惠券总数")
+    private Integer totalAmount;
+
+    @ApiModelProperty(value = "本月兑换优惠券总数")
+    private Integer curMonExchangeAmount;
+
+    @ApiModelProperty(value = "本月兑换积分总数")
+    private Integer curMonExchangePointAmount;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java
new file mode 100644
index 0000000..0f6c669
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordResultVO.java
@@ -0,0 +1,190 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class CouponRecordResultVO extends AbstractTransDTO {
+
+    @ApiModelProperty(value = "ID ")
+    private String id;
+
+
+
+    @ApiModelProperty(value = "领取用户类型(COUPON_GET_USER_TYPE)")
+    @DictTrans(target = "getUserTypeName",codeType = "COUPON_GET_USER_TYPE")
+    private String getUserType;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    @ApiModelProperty(value = "领取用户类型")
+    private String getUserTypeName;
+
+
+
+    /**
+     * 商户名称
+     */
+    @ApiModelProperty(value = "店铺名称")
+    private String customerName;
+
+    /**
+     * 电话
+     */
+    @ApiModelProperty(value = "联系方式")
+    private String tel;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+
+    @ApiModelProperty(value = "优惠券类型 ")
+    private String couponDiscountTypeName;
+
+
+    @ApiModelProperty(value = "状态(COUPON_RECORD_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_USED_STATUS")
+    private String status;
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+    /**
+     * 有效开始时间
+     */
+    @ApiModelProperty(value = "有效开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime effectiveStart;
+
+    /**
+     * 有效结束时间
+     */
+    @ApiModelProperty(value = "有效结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime effectiveEnd;
+
+
+    /**
+     * 优惠券面值
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件(满多少钱)
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道")
+    private String getTypeName;
+
+
+    /**
+     * 订单号
+     */
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    /**
+     * 优惠券ID
+     */
+    @ApiModelProperty(value = "优惠券ID")
+    private String couponId;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private String userId;
+
+    /**
+     * 商户ID
+     */
+    @ApiModelProperty(value = "商户ID")
+    private Long customerId;
+
+    /**
+     * 使用订单
+     */
+    @ApiModelProperty(value = "使用订单")
+    private String orderId;
+
+    /**
+     * 使用时间
+     */
+    @ApiModelProperty(value = "使用时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usedTime;
+
+    /**
+     * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)
+     */
+    @ApiModelProperty(value = "优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)")
+    @DictTrans(target = "categoryName",codeType = "COUPON_CATEGORY")
+    private String category;
+
+    /**
+     * 优惠券代码
+     */
+    @ApiModelProperty(value = "优惠券代码")
+    private String couponCode;
+
+    /**
+     * 积分数量
+     */
+    @ApiModelProperty(value = "积分数量")
+    private Integer point;
+
+    /**
+     * 会员等级
+     */
+    @ApiModelProperty(value = "会员等级")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "优惠券种类名称")
+    private String categoryName;
+
+    @ApiModelProperty(value = "优惠券图片")
+    private String imageUrl;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordVO.java
new file mode 100644
index 0000000..9817309
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponRecordVO.java
@@ -0,0 +1,41 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import lombok.Data;
+
+@Data
+public class CouponRecordVO extends CouponRecordDO {
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    private String couponDiscountTypeName;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    private String getTypeName;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    private String getUserTypeName;
+
+
+    /**
+     * 状态名称
+     */
+    private String statusName;
+
+    /**
+     * 商户名称
+     */
+    private String customerName;
+
+    /**
+     * 电话
+     */
+    private String tel;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java
new file mode 100644
index 0000000..568c196
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateActivyVO.java
@@ -0,0 +1,186 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel("活动优惠券")
+public class CouponTemplateActivyVO extends AbstractTransDTO {
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "总数")
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+    @ApiModelProperty(value = "领取用户类型")
+    @DictTrans(target = "getUserTypeName",codeType = "COUPON_GET_USER_TYPE")
+    private String getUserType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+
+    /**
+     * 领取开始时间
+     */
+    @ApiModelProperty(value = "领取开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getEndDate;
+
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+
+
+    @ApiModelProperty(value = "使用开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "操作人")
+    private String createByName;
+
+    @ApiModelProperty(value = "领取用户类型")
+    private String getUserTypeName;
+
+    /**
+     * 已经领取数
+     */
+    @ApiModelProperty(value = "已经领取数")
+    private Integer getNum;
+
+    /**
+     * 未领取数
+     */
+    @ApiModelProperty(value = "未领取数")
+    private Integer unGetNum;
+
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @DictTrans(target = "usageTypeName",codeType = "COUPON_USAGE_TYPE")
+    private String usageType;
+
+    @ApiModelProperty(value = "使用时间类型")
+    private String usageTypeName;
+
+    @ApiModelProperty(value = "领取后有效类型名称")
+    private String usageTimeTypeName;
+
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    private String getTypeName;
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    private Integer getLimit;
+
+
+    @ApiModelProperty(value = "发放时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+    /**
+     * 优惠券图片
+     */
+    @ApiModelProperty(value = "优惠券图片")
+    private String imageUrl;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateAppVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateAppVO.java
new file mode 100644
index 0000000..b7dbca1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateAppVO.java
@@ -0,0 +1,146 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class CouponTemplateAppVO extends AbstractTransDTO {
+
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+
+    @ApiModelProperty(value = "使用开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+
+    /**
+     * 领取开始时间
+     */
+    @ApiModelProperty(value = "领取开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getEndDate;
+
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+    @ApiModelProperty(value = "领取后有效类型名称")
+    private String usageTimeTypeName;
+
+    /**
+     * 有效开始时间
+     */
+    @ApiModelProperty(value = "有效开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime effectiveStart;
+
+    /**
+     * 有效结束时间
+     */
+    @ApiModelProperty(value = "有效结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime effectiveEnd;
+
+
+    /**
+     * 优惠券图片
+     */
+    @ApiModelProperty(value = "优惠券图片")
+    private String imageUrl;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateCustomerVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateCustomerVO.java
new file mode 100644
index 0000000..33622c3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateCustomerVO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CouponTemplateCustomerVO extends AbstractTransDTO {
+
+    @ApiModelProperty("用户id")
+    private Long id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("电话")
+    private String tel;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplatePointVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplatePointVO.java
new file mode 100644
index 0000000..1e25aea
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplatePointVO.java
@@ -0,0 +1,135 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel("积分记录")
+public class CouponTemplatePointVO extends AbstractTransDTO {
+
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "库存")
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+    /**
+     * 兑换积分
+     */
+    @ApiModelProperty(value = "所需积分数量")
+    private Integer point;
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @DictTrans(target = "usageTypeName",codeType = "COUPON_USAGE_TYPE")
+    private String usageType;
+
+    @ApiModelProperty(value = "使用时间类型")
+    private String usageTypeName;
+
+    @ApiModelProperty(value = "领取后有效类型名称")
+    private String usageTimeTypeName;
+
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    private String getTypeName;
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    private Integer getLimit;
+
+    @ApiModelProperty(value = "发放时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateUserVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateUserVO.java
new file mode 100644
index 0000000..95de0b8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateUserVO.java
@@ -0,0 +1,148 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel("用户优惠券")
+public class CouponTemplateUserVO extends AbstractTransDTO {
+
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "总数")
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+
+
+    @ApiModelProperty(value = "使用开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "操作人")
+    private String createByName;
+
+    @ApiModelProperty(value = "商户列表")
+    List<CouponTemplateCustomerVO> customerList;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @DictTrans(target = "usageTypeName",codeType = "COUPON_USAGE_TYPE")
+    private String usageType;
+
+    @ApiModelProperty(value = "使用时间类型")
+    private String usageTypeName;
+
+    @ApiModelProperty(value = "领取后有效类型名称")
+    private String usageTimeTypeName;
+
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    private String getTypeName;
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    private Integer getLimit;
+
+    @ApiModelProperty(value = "发放时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVO.java
new file mode 100644
index 0000000..146c38e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVO.java
@@ -0,0 +1,253 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import com.mzl.flower.entity.menber.Member;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class CouponTemplateVO extends AbstractTransDTO {
+
+    @ApiModelProperty(value = "主键")
+    @DictTrans(target = "id",codeType = "id")
+    private String id;
+
+    /**
+     * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)
+     */
+    @ApiModelProperty(value = "优惠券种类")
+    @DictTrans(target = "categoryName",codeType = "COUPON_CATEGORY")
+    private String category;
+    /**
+     * 优惠券代码(唯一)
+     */
+    @ApiModelProperty(value = "优惠券代码")
+    private String couponCode;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "发放数量")
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型 ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 最大折扣金额(可选,仅对百分比折扣类型适用)
+     */
+    private BigDecimal maxDiscountAmount;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    @ApiModelProperty(value = "领取用户类型(COUPON_GET_USER_TYPE)")
+    @DictTrans(target = "getUserTypeName",codeType = "COUPON_GET_USER_TYPE")
+    private String getUserType;
+
+    /**
+     * 领取开始时间
+     */
+    @ApiModelProperty(value = "领取开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    @ApiModelProperty(value = "领取结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime getEndDate;
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    private Integer getLimit;
+
+    /**
+     * 使用时间类型(COUPON_USAGE_TYPE)与领取时间一致、固定时间、领取后有效
+     */
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @DictTrans(target = "usageTypeName",codeType = "COUPON_USAGE_TYPE")
+    private String usageType;
+
+    /**
+     * 使用次数限制
+     */
+    @ApiModelProperty(value = "使用次数限制")
+    private Integer usageLimit;
+
+    /**
+     * 每个用户的使用次数限制
+     */
+    @ApiModelProperty(value = "每个用户的使用次数限制")
+    private Integer usagePerUser;
+
+    /**
+     * 使用开始时间
+     */
+    @ApiModelProperty(value = "使用开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+    /**
+     * 兑换积分
+     */
+    @ApiModelProperty(value = "兑换积分")
+    private Integer point;
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    private String getTypeName;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    @ApiModelProperty(value = "领取用户类型")
+    private String getUserTypeName;
+
+    /**
+     * 已经领取数
+     */
+    @ApiModelProperty(value = "已经领取数")
+    private Integer getNum;
+
+    /**
+     * 未领取数
+     */
+    @ApiModelProperty(value = "未领取数")
+    private Integer unGetNum;
+
+    @ApiModelProperty(value = "优惠券种类名称")
+    private String categoryName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "领取后有效类型")
+    private String usageTimeTypeName;
+
+    @ApiModelProperty(value = "使用时间类型")
+    private String usageTypeName;
+
+    /**
+     * 创建人名称
+     */
+    @ApiModelProperty(value = "创建人名称")
+    private String createByName;
+
+    /**
+     * 更新人名称
+     */
+    @ApiModelProperty(value = "更新人名称")
+    private String updateByName;
+
+    @ApiModelProperty(value = "会员等级")
+
+    private Integer memberId;
+
+    @ApiModelProperty(value = "会员等级名称")
+    private String memberName;
+
+
+    @ApiModelProperty(value = "商户列表")
+    List<CouponTemplateCustomerVO> customerList;
+
+
+    @ApiModelProperty(value = "会员等级对象")
+    private Member member;
+
+    @ApiModelProperty(value = "发放时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "优惠券图片")
+    private String imageUrl;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java
new file mode 100644
index 0000000..3838c47
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/coupon/CouponTemplateVipVO.java
@@ -0,0 +1,162 @@
+package com.mzl.flower.dto.response.coupon;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import com.mzl.flower.entity.menber.Member;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class CouponTemplateVipVO  extends AbstractTransDTO {
+
+
+    @ApiModelProperty(value = "ID")
+    private String id;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    @ApiModelProperty(value = "优惠券描述(使用规则)")
+    private String couponDescription;
+
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型(COUPON_TYPE) ")
+    @DictTrans(target = "couponDiscountTypeName",codeType = "COUPON_TYPE")
+    private String couponDiscountType;
+
+
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    @ApiModelProperty(value = "优惠券面值")
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    @ApiModelProperty(value = "使用条件")
+    private BigDecimal minOrderAmount;
+
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    @ApiModelProperty(value = "优惠券状态(COUPON_STATUS)")
+    @DictTrans(target = "statusName",codeType = "COUPON_STATUS")
+    private String status;
+
+
+    @ApiModelProperty(value = "使用开始时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    @ApiModelProperty(value = "使用结束时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime usageEndDate;
+
+
+    /**
+     * 优惠券类型名称 COUPON_TYPE)满减和无门槛
+     */
+    @ApiModelProperty(value = "优惠券类型名称 ")
+    private String couponDiscountTypeName;
+
+    /**
+     * 状态名称
+     */
+    @ApiModelProperty(value = "状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "操作人")
+    private String createByName;
+
+    /**
+     * 已经领取数
+     */
+    @ApiModelProperty(value = "已经领取数")
+    private Integer getNum;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    @ApiModelProperty(value = "领取后有效类型(COUPON_USAGE_TIME_TYPE)")
+    @DictTrans(target = "usageTimeTypeName",codeType = "COUPON_USAGE_TIME_TYPE")
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    @ApiModelProperty(value = "领取后有效时间整数")
+    private Integer usageTimeNum;
+
+    @ApiModelProperty(value = "领取后有效类型名称")
+    private String usageTimeTypeName;
+
+    @ApiModelProperty(value = "会员等级")
+    private Integer memberId;
+
+    @ApiModelProperty(value = "会员等级名称")
+    private String memberName;
+
+    @ApiModelProperty(value = "会员等级对象")
+    private Member member;
+
+
+
+    @ApiModelProperty(value = "使用时间类型(COUPON_USAGE_TYPE)")
+    @DictTrans(target = "usageTypeName",codeType = "COUPON_USAGE_TYPE")
+    private String usageType;
+
+    @ApiModelProperty(value = "使用时间类型")
+    private String usageTypeName;
+
+
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    @DictTrans(target = "getTypeName",codeType = "COUPON_GET_TYPE")
+    private String getType;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    @ApiModelProperty(value = "领取渠道(COUPON_GET_TYPE)")
+    private String getTypeName;
+
+    /**
+     * 每人限领
+     */
+    @ApiModelProperty(value = "每人限领")
+    private Integer getLimit;
+
+    /**
+     * 发放数量
+     */
+    @ApiModelProperty(value = "发放数量")
+    private Integer couponAmount;
+
+    @ApiModelProperty(value = "发放时间")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime createTime;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/current/CurrentUserDTO.java b/src/main/java/com/mzl/flower/dto/response/current/CurrentUserDTO.java
index 8e67b4f..c3cdf51 100644
--- a/src/main/java/com/mzl/flower/dto/response/current/CurrentUserDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/current/CurrentUserDTO.java
@@ -50,4 +50,10 @@
 
     @ApiModelProperty(value = "是否绑定微信")
     private Boolean bindWechat;
+
+    @ApiModelProperty(value = "当前积分")
+    private Integer currentPoint;
+
+    @ApiModelProperty(value = "是否总仓权限")
+    private Boolean mainWarehouse;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java b/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
index e32f68f..25442ff 100644
--- a/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/customer/CustomerDTO.java
@@ -1,5 +1,6 @@
 package com.mzl.flower.dto.response.customer;
 
+import com.mzl.flower.dto.request.menber.UserGrowthRecordDTO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -55,4 +56,6 @@
 
     @ApiModelProperty("启用/禁用")
     private Boolean isEnabled;
+
+    private UserGrowthRecordDTO userGrowthRecord;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListDTO.java
index 4063993..74e15a2 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListDTO.java
@@ -26,4 +26,10 @@
     private Long paramId;
 
     private Integer realSales;//真实销量
+
+    @ApiModelProperty(value = "会员价")
+    private BigDecimal priceMember;
+
+    @ApiModelProperty(value = "会员价总价")
+    private BigDecimal totalMember;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListWrapDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListWrapDTO.java
index fe52698..e14e221 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListWrapDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCartListWrapDTO.java
@@ -14,7 +14,7 @@
     @ApiModelProperty(value = "供应商名称")
     private String supplierName;
 
-    @ApiModelProperty(value = "供应商名称")
+    @ApiModelProperty(value = "商品列表")
     private List<FlowerCartListDTO> flowerList;
 
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCategoryTreeDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCategoryTreeDTO.java
index 047dc51..93ababc 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerCategoryTreeDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerCategoryTreeDTO.java
@@ -51,6 +51,12 @@
     @ApiModelProperty(value = "最高价")
     private BigDecimal priceHigh;
 
+    @ApiModelProperty(value = "最低价(会员)")
+    private BigDecimal priceLowMember;
+
+    @ApiModelProperty(value = "最高价(会员)")
+    private BigDecimal priceHighMember;
+
     @ApiModelProperty(value = "库存")
     private Integer stock;
 
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerDTO.java
index e77ceda..694fb0c 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerDTO.java
@@ -40,4 +40,7 @@
     private String zoneName;
 
     private Boolean shown;//是否显示
+
+    @ApiModelProperty("限购数量")
+    private Integer limited;//限购
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerListDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerListDTO.java
index 748250e..1610688 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerListDTO.java
@@ -1,13 +1,10 @@
 package com.mzl.flower.dto.response.flower;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.mzl.flower.base.AbstractTransDTO;
-import com.mzl.flower.base.annotation.DictTrans;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -52,4 +49,7 @@
     private Boolean shown;//是否显示
 
     private Integer zoneRank;//专区排序
+
+    @ApiModelProperty("限购数量")
+    private Integer limited;//限购
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowDTO.java
index 76ace54..9eeced2 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowDTO.java
@@ -3,6 +3,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class FlowerShowDTO extends FlowerSupplierDTO {
 
@@ -29,4 +31,7 @@
     private Integer shopnum;
 
     private Integer realSales;//真实销量
+
+    @ApiModelProperty(value = "会员价")
+    private BigDecimal priceMember;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowListDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowListDTO.java
index 1526929..d2d6d6f 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerShowListDTO.java
@@ -3,6 +3,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class FlowerShowListDTO extends FlowerSupplierListDTO {
 
@@ -24,4 +26,7 @@
 
     @ApiModelProperty(value = "是否推荐")
     private Boolean recommend;
+
+    @ApiModelProperty(value = "会员价")
+    private BigDecimal priceMember;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierDTO.java
index a7b3869..fd49473 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierDTO.java
@@ -59,4 +59,7 @@
     @ApiModelProperty(value = "描述")
     private String description;
 
+    @ApiModelProperty(value = "库存")
+    private Integer limited;
+
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierListDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierListDTO.java
index a433584..a635acd 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/FlowerSupplierListDTO.java
@@ -50,4 +50,7 @@
 
     @ApiModelProperty(value = "价格排序")
     private Integer typeRank;
+
+    // 限购数量
+    private Integer limited;//
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/flower/StationStatisticDTO.java b/src/main/java/com/mzl/flower/dto/response/flower/StationStatisticDTO.java
index 5e169f8..89d2e43 100644
--- a/src/main/java/com/mzl/flower/dto/response/flower/StationStatisticDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/flower/StationStatisticDTO.java
@@ -22,4 +22,10 @@
 
     @ApiModelProperty("供货数")
     private Long totalNum;
+
+    @ApiModelProperty("已质检供应商数量")
+    private Integer checkedSupplierCount;
+
+    @ApiModelProperty("待质检供应商数量")
+    private Integer uncheckedSupplierCount;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/member/MemberGrowthRecordVO.java b/src/main/java/com/mzl/flower/dto/response/member/MemberGrowthRecordVO.java
new file mode 100644
index 0000000..50eddd9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/member/MemberGrowthRecordVO.java
@@ -0,0 +1,52 @@
+package com.mzl.flower.dto.response.member;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigInteger;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class MemberGrowthRecordVO extends AbstractTransDTO {
+    private Long id;
+
+    @ApiModelProperty("记录日期")
+    @JsonFormat(pattern="yyyy-MM-dd" ,timezone="GMT+8")
+    @DateTimeFormat
+    private Date recordDate;
+
+    @ApiModelProperty("成长值")
+    private int growth;
+
+    @ApiModelProperty("用户id")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private BigInteger customerId;
+
+    @ApiModelProperty("成长值来源(growth_source:签到、消费)")
+    @DictTrans(target = "sourceStr", codeType = "GROWTH_SOURCE")
+    private String source;
+
+    private String sourceStr;
+
+    @ApiModelProperty("新增、扣除(growth_type)")
+    @DictTrans(target = "typeStr", codeType = "GROWTH_TYPE")
+    private String type;
+
+    private String typeStr;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("创建日期")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改日期")
+    private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/member/MemberVO.java b/src/main/java/com/mzl/flower/dto/response/member/MemberVO.java
new file mode 100644
index 0000000..30aa7ca
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/member/MemberVO.java
@@ -0,0 +1,60 @@
+package com.mzl.flower.dto.response.member;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+public class MemberVO extends AbstractTransDTO {
+    private Long id;
+
+    @ApiModelProperty("会员等级名称")
+    private String name;
+
+    @ApiModelProperty("成长点-区间-开始")
+    private int startPoint;
+
+    @ApiModelProperty("成长点-区间-结束")
+    private int endPoint;
+
+    @ApiModelProperty("会员折扣类型(百分比、固定金额)")
+    @DictTrans(target = "discountTypeStr", codeType = "DISCOUNT_TYPE")
+    private String discountType;
+
+    private String discountTypeStr;
+
+    @ApiModelProperty("会员折扣百分比")
+    private BigDecimal discountRatio;
+
+    @ApiModelProperty("会员折扣固定金额")
+    private BigDecimal discountAmount;
+
+    @ApiModelProperty("消费金额(元)")
+    private int consumptionAmount;
+
+    @ApiModelProperty("已消费产生的成长值")
+    private int growthValue;
+
+    @ApiModelProperty("未消费产生的下降值")
+    private int downgradeValue;
+
+    @ApiModelProperty("创建日期")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改日期")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("操作人")
+    private String createName;
+
+    @ApiModelProperty("背景")
+    private String background;
+
+    @ApiModelProperty("图片")
+    private String pictures;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/member/UserGrowthRecordVO.java b/src/main/java/com/mzl/flower/dto/response/member/UserGrowthRecordVO.java
new file mode 100644
index 0000000..db73dd5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/member/UserGrowthRecordVO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.response.member;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class UserGrowthRecordVO extends AbstractTransDTO {
+    private Long id;
+
+    @ApiModelProperty("用户名称")
+    private String nickName;
+
+    @ApiModelProperty("联系方式")
+    private String tel;
+
+    @ApiModelProperty("当前成长值")
+    private int sumGrowthValue;
+
+    @ApiModelProperty("当前会员等级ID")
+    private Long levelId;
+
+    @ApiModelProperty("当前会员等级名称")
+    private String levelName;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/BillListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/BillListDTO.java
index bddb0c6..7bd6e0d 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/BillListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/BillListDTO.java
@@ -48,4 +48,6 @@
     @ApiModelProperty(value = "账单日期")
     private LocalDate billDate;
 
+    @ApiModelProperty(value = "优惠券金额")
+    private BigDecimal memberCouponAmount = new BigDecimal(0);
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItem4CheckDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItem4CheckDTO.java
index 1e02cee..f0b2e4d 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItem4CheckDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItem4CheckDTO.java
@@ -37,7 +37,7 @@
     private String flowerLevelStr;
 
     @ApiModelProperty(value = "订单商品状态")
-    @DictTrans(target = "statusStr", codeType = "CHECK_OPERATE")
+    @DictTrans(target = "statusStr", codeType = "ORDER_ITEM_STATUS")
     private String status;
     private String statusStr;
 
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemDTO.java
index f8d9395..7108efe 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemDTO.java
@@ -44,4 +44,5 @@
     @ApiModelProperty(value = "商品参数")
     private List<ParamItemDTO> params;
 
+    private Integer num;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java
index e878c48..b6abfbb 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java
@@ -1,9 +1,11 @@
 package com.mzl.flower.dto.response.payment;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.mzl.flower.base.AbstractTransDTO;
 import com.mzl.flower.base.annotation.DictTrans;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -78,4 +80,12 @@
 
     @ApiModelProperty(value = "下单时间")
     private LocalDateTime orderTime;
+
+    @ApiModelProperty(value = "收货日期")
+    @JsonFormat(pattern="yyyy-MM-dd" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime receiveTime;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderList4CheckDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderList4CheckDTO.java
index ae7760f..a392344 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderList4CheckDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderList4CheckDTO.java
@@ -25,4 +25,6 @@
     @ApiModelProperty(value = "供应商总价")
     private BigDecimal totalAmount;
 
+    @ApiModelProperty(value = "未完成质检订单数量")
+    private Integer uncheckedCount;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderStatisticsDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderStatisticsDTO.java
index 8cd62cb..e505bc4 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderStatisticsDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderStatisticsDTO.java
@@ -11,6 +11,9 @@
 @Data
 public class DeliveryOrderStatisticsDTO {
 
+    @ApiModelProperty(value = "日期id")
+    private String id;
+
     @ApiModelProperty(value = "日期")
     private LocalDate date;
 
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckListDTO.java
index 2ba18f0..36b99e9 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckListDTO.java
@@ -5,6 +5,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -53,4 +54,6 @@
     private List<OrderItemListDTO> items;
 
     private String createBy;
+
+    private BigDecimal totalAmount;//订单金额
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckLocationListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckLocationListDTO.java
index f1f14bd..32b9b99 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckLocationListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderCheckLocationListDTO.java
@@ -5,6 +5,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 @Data
@@ -40,4 +41,7 @@
     private List<OrderItemLocationListDTO> items;
 
     private String createBy;
+
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal totalAmount;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java
index fb43104..7ae63c5 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java
@@ -137,5 +137,31 @@
     @ApiModelProperty(value = "支付单号")
     private String paymentTrId;
 
+    @ApiModelProperty(value = "积分商品列表")
+    private List<OrderPointGoodsListDTO> pointGoodsList;
+
+    @ApiModelProperty(value = "优惠券编码")
+    private String memberCouponCode;
+
+    @ApiModelProperty(value = "优惠券名称")
+    private String memberCouponName;
+
+    @ApiModelProperty(value = "优惠券金额")
+    private BigDecimal memberCouponAmount;
+
+    @ApiModelProperty(value = "会员等级名称")
+    private String memberName;
+
+    @ApiModelProperty(value = "折扣类型(discount_type)")
+    @DictTrans(target = "memberDiscountTypeStr", codeType = "DISCOUNT_TYPE")
+    private String memberDiscountType;
+    private String memberDiscountTypeStr;
+
+    @ApiModelProperty(value = "会员折扣")
+    private BigDecimal memberDiscountRatio;
+
+    @ApiModelProperty(value = "优惠金额(每扎)")
+    private BigDecimal memberDiscountAmount;
+
     private List<OrderItemListDTO> items;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderItemListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderItemListDTO.java
index b655378..4a08e76 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderItemListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderItemListDTO.java
@@ -11,6 +11,8 @@
 public class OrderItemListDTO extends AbstractTransDTO {
     private String id;
 
+    private String orderId;
+
     private Long stationId;//集货站id
     private String stationName;
 
@@ -49,4 +51,21 @@
     @ApiModelProperty(value = "总金额")
     private BigDecimal total;
 
+    @ApiModelProperty(value = "优惠券金额/扎")
+    private BigDecimal couponAmount;
+
+    @ApiModelProperty(value = "优惠前售价/扎")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "真实成交价格/每扎")
+    private BigDecimal realPrice;
+
+    @ApiModelProperty(value = "补货数量")
+    private Integer replaceNum;
+
+    @ApiModelProperty(value = "降级数量")
+    private Integer reduceNum;
+
+    @ApiModelProperty(value = "缺货数量")
+    private Integer lackNum;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderItemPlatformListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderItemPlatformListDTO.java
index 6ad932b..40e5069 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderItemPlatformListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderItemPlatformListDTO.java
@@ -48,4 +48,13 @@
 
     @ApiModelProperty(value = "异常未处理数量")
     private Integer unProcessCount;
+
+    @ApiModelProperty(value = "供应商缺货扣款")
+    private BigDecimal lackFeeSupplier;
+
+    @ApiModelProperty(value = "供应商补货扣款")
+    private BigDecimal replaceFee;
+
+    @ApiModelProperty(value = "供应商降级扣款")
+    private BigDecimal checkFee;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderListDTO.java
index efc30df..0087f32 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderListDTO.java
@@ -85,4 +85,12 @@
 
     @ApiModelProperty(value = "支付单号")
     private String paymentTrId;
+
+    @ApiModelProperty(value = "特殊需求")
+    @DictTrans(target = "specialNeedsStr", codeType = "SPEC_REQ")
+    private String specialNeeds;
+    private String specialNeedsStr;
+
+    @ApiModelProperty(value = "留言")
+    private String remarks;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderPlatformListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderPlatformListDTO.java
index 3a34db2..6276efa 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderPlatformListDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderPlatformListDTO.java
@@ -85,4 +85,12 @@
 
     @ApiModelProperty(value = "快递单号")
     private String deliveryNo;//快递单号
+
+    @ApiModelProperty(value = "特殊需求")
+    @DictTrans(target = "specialNeedsStr", codeType = "SPEC_REQ")
+    private String specialNeeds;
+    private String specialNeedsStr;
+
+    @ApiModelProperty(value = "留言")
+    private String remarks;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java
new file mode 100644
index 0000000..51f9a7b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java
@@ -0,0 +1,26 @@
+package com.mzl.flower.dto.response.payment;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OrderPointGoodsListDTO {
+    @ApiModelProperty(value = "积分商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "商品封面图")
+    private String cover;
+
+    @ApiModelProperty(value = "商品图片")
+    private String pictures;
+
+    @ApiModelProperty(value = "兑换数量")
+    private Integer num;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java
index 167c3ee..75794f2 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderSettlementDetailDTO.java
@@ -1,11 +1,14 @@
 package com.mzl.flower.dto.response.payment;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.mzl.flower.base.AbstractTransDTO;
 import com.mzl.flower.base.annotation.DictTrans;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 public class OrderSettlementDetailDTO extends AbstractTransDTO {
@@ -40,4 +43,18 @@
     @ApiModelProperty(value = "售后理赔")
     private BigDecimal salesFee;
 
+    @ApiModelProperty(value = "收货日期")
+    @JsonFormat(pattern="yyyy-MM-dd" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime receiveTime;
+
+    @ApiModelProperty(value = "质检日期")
+    @JsonFormat(pattern="yyyy-MM-dd" ,timezone="GMT+8")
+    @DateTimeFormat
+    private LocalDateTime checkTime;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    private String orderId;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
index fde99f8..48ba6dc 100644
--- a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java
@@ -19,7 +19,25 @@
     @ApiModelProperty(value = "商品总金额")
     private BigDecimal totalAmount;
 
+    @ApiModelProperty(value = "商品会员价总金额")
+    private BigDecimal totalMemberAmount;
+
     @ApiModelProperty(value = "打包费")
     private BigDecimal packing;
 
+    @ApiModelProperty(value = "会员等级id")
+    private Long memberId;
+
+    @ApiModelProperty(value = "会员等级名称")
+    private String memberName;
+
+    @ApiModelProperty(value = "折扣类型(discount_type)")
+    private String memberDiscountType;
+
+    @ApiModelProperty(value = "会员折扣")
+    private BigDecimal memberDiscountRatio;
+
+    @ApiModelProperty(value = "优惠金额(每扎)")
+    private BigDecimal memberDiscountAmount;
+
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDTO.java b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDTO.java
new file mode 100644
index 0000000..5932d33
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDTO.java
@@ -0,0 +1,34 @@
+package com.mzl.flower.dto.response.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CustomerPointDTO {
+
+    private Long id;
+
+    @ApiModelProperty("用户DI")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("商户名称")
+    private String customerName;
+
+    @ApiModelProperty("商户联系电话")
+    private String customerTel;
+
+    @ApiModelProperty("总积分")
+    private String totalPoint;
+
+    @ApiModelProperty("使用积分")
+    private String usedPoint;
+
+    @ApiModelProperty("过期积分")
+    private String expiredPoint;
+
+    @ApiModelProperty("系统扣减积分")
+    private Integer deductionPoint;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailDTO.java b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailDTO.java
new file mode 100644
index 0000000..1ab3855
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailDTO.java
@@ -0,0 +1,42 @@
+package com.mzl.flower.dto.response.point;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class CustomerPointDetailDTO extends AbstractTransDTO {
+
+    @ApiModelProperty("记录日期")
+    private LocalDate recordDate;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("积分变更类型-POINT_CHANGE_TYPE")
+    @DictTrans(target = "changeTypeStr",codeType = "POINT_CHANGE_TYPE")
+    private String changeType;
+
+    @ApiModelProperty("积分类型-POINT_TYPE")
+    @DictTrans(target = "typeStr",codeType = "POINT_TYPE")
+    private String type;
+
+    @ApiModelProperty("积分变更类型-point_change_type")
+    private String changeTypeStr;
+
+    @ApiModelProperty("积分类型-POINT_TYPE")
+    private String typeStr;
+
+    @ApiModelProperty("积分")
+    private String point;
+
+    @ApiModelProperty("积分备注")
+    private String remarks;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailVO.java b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailVO.java
new file mode 100644
index 0000000..4126e90
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/CustomerPointDetailVO.java
@@ -0,0 +1,54 @@
+package com.mzl.flower.dto.response.point;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class CustomerPointDetailVO extends AbstractTransDTO {
+
+    private Long id;
+
+    @ApiModelProperty("记录日期")
+    private Date recordDate;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("积分变更类型(point_change_type)增加、减少")
+    @DictTrans(target = "changeTypeStr", codeType = "POINT_CHANGE_TYPE")
+    private String changeType;
+
+    private String changeTypeStr;
+
+    @ApiModelProperty("积分类型:增加(消费获取、活动获取、积分赠送),减少(积分扣减、积分兑换)")
+    @DictTrans(target = "typeStr", codeType = "POINT_TYPE")
+    private String type;
+
+    private String typeStr;
+
+    @ApiModelProperty("积分(积分=使用积分+过期积分)")
+    private Integer point;
+
+    @ApiModelProperty("使用积分")
+    private Integer usePoint;
+
+    @ApiModelProperty("过期积分")
+    private Integer expiredPoint;
+
+    @ApiModelProperty("备注(可记录积分的来源或去向,如订单号、兑换内容、活动名称等)")
+    private String remarks;
+
+    @ApiModelProperty("创建日期")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改日期")
+    private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java b/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java
new file mode 100644
index 0000000..54a395b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.dto.response.point;
+
+
+import lombok.Data;
+
+@Data
+public class ExpiredPointDTO {
+
+    private String userId;
+
+    private Long customerId;
+
+    private Integer addPoint;
+
+    private Integer reducePoint;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/PointGoodVO.java b/src/main/java/com/mzl/flower/dto/response/point/PointGoodVO.java
new file mode 100644
index 0000000..7919a99
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/PointGoodVO.java
@@ -0,0 +1,44 @@
+package com.mzl.flower.dto.response.point;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PointGoodVO extends AbstractTransDTO {
+
+    private Long id;
+
+    @ApiModelProperty("商品名称")
+    private String name;
+
+    @ApiModelProperty("商品描述")
+    private String description;
+
+    @ApiModelProperty("库存")
+    private Integer stock;
+
+    @ApiModelProperty("封面图")
+    private String cover;
+
+    @ApiModelProperty("商品图片")
+    private String pictures;
+
+    @ApiModelProperty("兑换积分")
+    private Integer point;
+
+    @ApiModelProperty("状态")
+    @DictTrans(target = "statusStr", codeType = "POINT_GOOD_STATUS")
+    private String status;
+
+    private String statusStr;
+
+    @ApiModelProperty("创建日期")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改日期")
+    private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/PointGoodsDTO.java b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsDTO.java
new file mode 100644
index 0000000..ed93b32
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsDTO.java
@@ -0,0 +1,12 @@
+package com.mzl.flower.dto.response.point;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PointGoodsDTO extends PointGoodsListDTO {
+    @ApiModelProperty(value = "商品图片")
+    private List<String> pictureList;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/PointGoodsListDTO.java b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsListDTO.java
new file mode 100644
index 0000000..b455255
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsListDTO.java
@@ -0,0 +1,31 @@
+package com.mzl.flower.dto.response.point;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PointGoodsListDTO extends AbstractTransDTO {
+    private Long id;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "库存")
+    private Integer stock;
+
+    @ApiModelProperty(value = "封面图")
+    private String cover;
+
+    @ApiModelProperty(value = "兑换积分")
+    private Integer point;
+
+    @ApiModelProperty(value = "状态")
+    @DictTrans(target = "statusStr", codeType = "POINT_GOODS_STATUS")
+    private String status;
+    private String statusStr;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/point/PointGoodsRecordDTO.java b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsRecordDTO.java
new file mode 100644
index 0000000..7114439
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/point/PointGoodsRecordDTO.java
@@ -0,0 +1,56 @@
+package com.mzl.flower.dto.response.point;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PointGoodsRecordDTO extends AbstractTransDTO {
+
+    private Long id;
+
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "商户ID")
+    private Long customerId;
+
+    @ApiModelProperty(value = "兑换码")
+    private String redeemCode;
+
+    @ApiModelProperty(value = "积分商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "商品封面图")
+    private String cover;
+
+    @ApiModelProperty(value = "商品图片")
+    private String pictures;
+
+    @ApiModelProperty(value = "兑换积分数")
+    private Integer point;
+
+    @ApiModelProperty(value = "兑换数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "兑换总积分")
+    private Integer totalPoint;
+
+    @ApiModelProperty(value = "兑换券状态POINT_GOODS_RECORD_STATUS")
+    @DictTrans(target = "statusStr",codeType = "POINT_GOODS_RECORD_STATUS")
+    private String status;
+
+    private String statusStr;
+
+    @ApiModelProperty(value = "到期时间")
+    private LocalDateTime expireTime;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/supplier/SupplierDTO.java b/src/main/java/com/mzl/flower/dto/response/supplier/SupplierDTO.java
index 71fb6c8..620351c 100644
--- a/src/main/java/com/mzl/flower/dto/response/supplier/SupplierDTO.java
+++ b/src/main/java/com/mzl/flower/dto/response/supplier/SupplierDTO.java
@@ -3,6 +3,7 @@
 import com.mzl.flower.base.AbstractTransDTO;
 import com.mzl.flower.base.annotation.DictTrans;
 import com.mzl.flower.dto.AttachmentDTO;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -96,4 +97,7 @@
 
     @ApiModelProperty("启用/禁用")
     private Boolean isEnabled;
+
+    @ApiModelProperty("粉丝数")
+    private int fans;
 }
diff --git a/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java
new file mode 100644
index 0000000..6233710
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/coupon/CouponRecordDO.java
@@ -0,0 +1,113 @@
+package com.mzl.flower.entity.coupon;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("t_coupon_record")
+public class CouponRecordDO extends BaseEntity {
+
+
+    /**
+     * 优惠券ID
+     */
+    private String couponId;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 商户ID
+     */
+    private Long customerId;
+
+    /**
+     * 状态(coupon_record_status)未使用、已使用、已过期
+     */
+    private String status;
+
+    /**
+     * 有效开始时间
+     */
+    private LocalDateTime effectiveStart;
+
+    /**
+     * 有效结束时间
+     */
+    private LocalDateTime effectiveEnd;
+
+    /**
+     * 使用订单
+     */
+    private String orderId;
+
+    /**
+     * 使用时间
+     */
+    private LocalDateTime usedTime;
+
+    /**
+     * 优惠券面值
+     */
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件(满多少钱)
+     */
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)
+     */
+    private String category;
+
+    /**
+     * 优惠券代码
+     */
+    private String couponCode;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    private String couponDiscountType;
+
+    private String getType;
+
+    /**
+     * 用户获取类型
+     */
+    private String getUserType;
+
+    /**
+     * 积分数量
+     */
+    private Integer point;
+
+    /**
+     * 会员等级
+     */
+    private Integer memberId;
+
+    /**
+     * 优惠券图片
+     */
+    private String imageUrl;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java
new file mode 100644
index 0000000..b698ca1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateCustomerDO.java
@@ -0,0 +1,35 @@
+package com.mzl.flower.entity.coupon;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-24
+ */
+@Data
+@Accessors(chain = true)
+@TableName("t_coupon_template_customer")
+public class CouponTemplateCustomerDO {
+
+
+    @TableId("id")
+    private String id;
+
+    /**
+     * 优惠券id
+     */
+    @TableField("coupon_id")
+    private String couponId;
+
+    /**
+     * 指定的顾客id
+     */
+    @TableField("custom_id")
+    private Long customId;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateDO.java b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateDO.java
new file mode 100644
index 0000000..f5c3ef5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/coupon/CouponTemplateDO.java
@@ -0,0 +1,149 @@
+package com.mzl.flower.entity.coupon;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("t_coupon_template")
+public class CouponTemplateDO extends BaseEntity {
+
+
+    /**
+     * 优惠券种类(活动优惠券、用户优惠券、会员优惠券,积分优惠券)
+     */
+    private String category;
+    /**
+     * 优惠券代码(唯一)
+     */
+    private String couponCode;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 优惠券描述(使用规则)
+     */
+    private String couponDescription;
+
+    /**
+     * 发放数量
+     */
+    private Integer couponAmount;
+
+    /**
+     * 优惠券类型(COUPON_TYPE)满减和无门槛
+     */
+    private String couponDiscountType;
+
+    /**
+     * 优惠券面值  折扣值(百分比或金额)
+     */
+    private BigDecimal couponDiscountValue;
+
+    /**
+     * 使用条件,最小订单金额(可选)=》使用条件
+     */
+    private BigDecimal minOrderAmount;
+
+    /**
+     * 最大折扣金额(可选,仅对百分比折扣类型适用)
+     */
+    private BigDecimal maxDiscountAmount;
+
+    /**
+     * 领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心
+     */
+    private String getType;
+
+    /**
+     * 领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户
+     */
+    private String getUserType;
+
+    /**
+     * 领取开始时间
+     */
+    private LocalDateTime getStartDate;
+
+    /**
+     * 领取结束时间
+     */
+    private LocalDateTime getEndDate;
+
+    /**
+     * 每人限领
+     */
+    private Integer getLimit;
+
+    /**
+     * 使用时间类型(COUPON_USAGE_TYPE)与领取时间一致、固定时间、领取后有效
+     */
+    private String usageType;
+
+    /**
+     * 使用次数限制
+     */
+    private Integer usageLimit;
+
+    /**
+     * 每个用户的使用次数限制
+     */
+    private Integer usagePerUser;
+
+    /**
+     * 使用开始时间
+     */
+    private LocalDateTime usageStartDate;
+
+    /**
+     * 使用结束时间
+     */
+    private LocalDateTime usageEndDate;
+
+    /**
+     * 领取后有效类型(COUPON_usage_time_type)天、小时、分钟
+     */
+    private String usageTimeType;
+
+    /**
+     * 领取后有效时间整数,比如90(天,小时,分钟)
+     */
+    private Integer usageTimeNum;
+
+    /**
+     * 优惠券状态(COUPON_STATUS)
+     */
+    private String status;
+
+    /**
+     * 兑换积分
+     */
+    private Integer point;
+
+    /**
+     * 会员等级
+     */
+    private Integer memberId;
+
+    /**
+     * 优惠券图片
+     */
+    private String imageUrl;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/customer/Customer.java b/src/main/java/com/mzl/flower/entity/customer/Customer.java
index 2332d65..a62cb78 100644
--- a/src/main/java/com/mzl/flower/entity/customer/Customer.java
+++ b/src/main/java/com/mzl/flower/entity/customer/Customer.java
@@ -43,4 +43,6 @@
 
     @ApiModelProperty("启用/禁用")
     private Boolean isEnabled;
+    @ApiModelProperty("等级id")
+    private Long levelId;
 }
diff --git a/src/main/java/com/mzl/flower/entity/flower/Flower.java b/src/main/java/com/mzl/flower/entity/flower/Flower.java
index 2728d88..82593d3 100644
--- a/src/main/java/com/mzl/flower/entity/flower/Flower.java
+++ b/src/main/java/com/mzl/flower/entity/flower/Flower.java
@@ -78,4 +78,7 @@
     @TableField("type_rank")
     private Integer typeRank;//同类排序
 
+    @TableField("limited")
+    private Integer limited;//限购数量
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/entity/menber/Member.java b/src/main/java/com/mzl/flower/entity/menber/Member.java
new file mode 100644
index 0000000..b23f218
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/menber/Member.java
@@ -0,0 +1,55 @@
+package com.mzl.flower.entity.menber;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className Member
+ * @date 2024/8/26
+ * @description 会员管理功能实体类
+ */
+@Data
+@TableName("t_member")
+public class Member extends BaseAutoEntity {
+
+    @ApiModelProperty("会员等级名称")
+    private String name;
+
+    @ApiModelProperty("成长点-区间-开始")
+    private int startPoint;
+
+    @ApiModelProperty("成长点-区间-结束")
+    private int endPoint;
+
+    @ApiModelProperty("会员折扣类型(百分比、固定金额)")
+    private String discountType;
+
+    @ApiModelProperty("会员折扣百分比")
+    private BigDecimal discountRatio;
+
+    @ApiModelProperty("会员折扣固定金额")
+    private BigDecimal discountAmount;
+
+    @ApiModelProperty("消费金额(元)")
+    private int consumptionAmount;
+
+    @ApiModelProperty("已消费产生的成长值")
+    private int growthValue;
+
+    @ApiModelProperty("未消费产生的下降值")
+    private int downgradeValue;
+
+    @ApiModelProperty("背景")
+    private String background;
+
+    @ApiModelProperty("图片")
+    private String pictures;
+}
diff --git a/src/main/java/com/mzl/flower/entity/menber/MemberDowngradeRecord.java b/src/main/java/com/mzl/flower/entity/menber/MemberDowngradeRecord.java
new file mode 100644
index 0000000..a55894a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/menber/MemberDowngradeRecord.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.entity.menber;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className Member
+ * @date 2024/9/02
+ * @description 会员降级记录表
+ */
+@Data
+@TableName("t_member_downgrade_record")
+public class MemberDowngradeRecord extends BaseAutoEntity {
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("会员等级ID")
+    private Long memberId;
+
+    @ApiModelProperty("会员等级名称")
+    private String memberName;
+}
diff --git a/src/main/java/com/mzl/flower/entity/menber/MemberGrowthRecord.java b/src/main/java/com/mzl/flower/entity/menber/MemberGrowthRecord.java
new file mode 100644
index 0000000..c73f69f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/menber/MemberGrowthRecord.java
@@ -0,0 +1,42 @@
+package com.mzl.flower.entity.menber;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className Member
+ * @date 2024/8/27
+ * @description 会员成长记录表ID
+ */
+@Data
+@TableName("t_member_growth_record")
+public class MemberGrowthRecord extends BaseAutoEntity {
+
+    @ApiModelProperty("记录日期")
+    private Date recordDate;
+
+    @ApiModelProperty("成长值")
+    private int growth;
+
+    @ApiModelProperty("用户id")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private BigInteger customerId;
+
+    @ApiModelProperty("成长值来源(growth_source:签到、消费)")
+    private String source;
+
+    @ApiModelProperty("新增、扣除(growth_type)")
+    private String type;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+}
diff --git a/src/main/java/com/mzl/flower/entity/payment/Bill.java b/src/main/java/com/mzl/flower/entity/payment/Bill.java
index 1ab9565..6b12059 100644
--- a/src/main/java/com/mzl/flower/entity/payment/Bill.java
+++ b/src/main/java/com/mzl/flower/entity/payment/Bill.java
@@ -51,4 +51,6 @@
     @TableField("bill_date")
     private LocalDate billDate;//账单日期
 
+    @TableField("member_coupon_amount")
+    private BigDecimal memberCouponAmount;//优惠券金额
 }
diff --git a/src/main/java/com/mzl/flower/entity/payment/Order.java b/src/main/java/com/mzl/flower/entity/payment/Order.java
index 7706db4..438c5f4 100644
--- a/src/main/java/com/mzl/flower/entity/payment/Order.java
+++ b/src/main/java/com/mzl/flower/entity/payment/Order.java
@@ -16,7 +16,7 @@
     private String orderNo;//单号
 
     @TableField("flower_amount")
-    private BigDecimal flowerAmount;//商品金额
+    private BigDecimal flowerAmount;//商品金额(会员价)
 
     @TableField("packing_fee")
     private BigDecimal packingFee;//打包费
@@ -134,4 +134,32 @@
 
     @TableField("wx_delivery_msg")
     private String wxDeliveryMsg;// 微信发货返回消息
+
+    @TableField("member_coupon_id")
+    private String memberCouponId;//用户优惠券id
+
+    @TableField("member_coupon_code")
+    private String memberCouponCode;//优惠券编码
+
+    @TableField("member_coupon_name")
+    private String memberCouponName;//优惠券名称
+
+    @TableField("member_coupon_amount")
+    private BigDecimal memberCouponAmount;//优惠券金额
+
+    @TableField("member_id")
+    private Long memberId;//会员等级id
+
+    @TableField("member_name")
+    private String memberName;//会员等级名称
+
+    @TableField("member_discount_type")
+    private String memberDiscountType;//折扣类型(discount_type)
+
+    @TableField("member_discount_ratio")
+    private BigDecimal memberDiscountRatio;//会员折扣
+
+    @TableField("member_discount_amount")
+    private BigDecimal memberDiscountAmount;//优惠金额(每扎)
+
 }
diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
index 5d1167b..fa2bdd7 100644
--- a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
+++ b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java
@@ -61,7 +61,7 @@
     private BigDecimal markupPartner;//合伙人加价
 
     @TableField("price")
-    private BigDecimal price;//商品售价
+    private BigDecimal price;//商品售价(会员价)
 
     @TableField("total")
     private BigDecimal total;//总金额
@@ -84,4 +84,19 @@
     @TableField("deduct_amount")
     private BigDecimal deductAmount;//扣款金额
 
+    @TableField("coupon_amount")
+    private BigDecimal couponAmount;//优惠券金额/扎
+
+    @TableField("original_price")
+    private BigDecimal originalPrice;//优惠前售价/扎
+
+    @TableField("real_price")
+    private BigDecimal realPrice;//真实成交价格/每扎
+
+    @TableField("coupon_amount_total")
+    private BigDecimal couponAmountTotal;//优惠券总金额
+
+    @TableField("real_total")
+    private BigDecimal realTotal;//真实成交总价格
+
 }
diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java b/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java
new file mode 100644
index 0000000..6c91533
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java
@@ -0,0 +1,21 @@
+package com.mzl.flower.entity.payment;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("t_order_point_goods")
+public class OrderPointGoods extends BaseEntity {
+
+    @TableField("order_id")
+    private String orderId;//订单id
+
+    @TableField("goods_record_id")
+    private Long goodsRecordId;//客户商品id
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/point/CustomerPoint.java b/src/main/java/com/mzl/flower/entity/point/CustomerPoint.java
new file mode 100644
index 0000000..e088ece
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/point/CustomerPoint.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.entity.point;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("t_customer_point")
+public class CustomerPoint extends BaseAutoEntity {
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("总积分")
+    private Integer totalPoint;
+
+    @ApiModelProperty("使用积分")
+    private Integer usedPoint;
+
+    @ApiModelProperty("过期积分")
+    private Integer expiredPoint;
+
+    @ApiModelProperty("系统扣减积分")
+    private Integer deductionPoint;
+}
diff --git a/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java b/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java
new file mode 100644
index 0000000..e025402
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java
@@ -0,0 +1,46 @@
+package com.mzl.flower.entity.point;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+
+/**
+ * packageName com.mzl.flower.entity.point
+ * @author fanghaowei
+ * @version version2.0
+ * @className CustomerPointDetail
+ * @date 2024/8/29
+ * @description 用户积分统计
+ */
+
+@Data
+@TableName("t_customer_point_detail")
+public class CustomerPointDetail extends BaseAutoEntity {
+
+    @ApiModelProperty("记录日期")
+    private LocalDate recordDate;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("商户ID")
+    private Long customerId;
+
+    @ApiModelProperty("积分变更类型(point_change_type)增加、减少")
+    private String changeType;
+
+    @ApiModelProperty("积分类型:增加(消费获取、活动获取、积分赠送),减少(积分扣减、积分兑换)")
+    private String type;
+
+    @ApiModelProperty("积分变更数量")
+    private Integer point;
+
+    @ApiModelProperty("备注(可记录积分的来源或去向,如订单号、兑换内容、活动名称等)")
+    private String remarks;
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/point/PointGood.java b/src/main/java/com/mzl/flower/entity/point/PointGood.java
new file mode 100644
index 0000000..30631e7
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/point/PointGood.java
@@ -0,0 +1,42 @@
+package com.mzl.flower.entity.point;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className Member
+ * @date 2024/8/27
+ * @description 积分商品表
+ */
+@Data
+@TableName("t_point_goods")
+public class PointGood extends BaseAutoEntity {
+
+    @ApiModelProperty("商品名称")
+    private String name;
+
+    @ApiModelProperty("商品描述")
+    private String description;
+
+    @ApiModelProperty("库存")
+    private Integer stock;
+
+    @ApiModelProperty("封面图")
+    private String cover;
+
+    @ApiModelProperty("商品图片")
+    private String pictures;
+
+    @ApiModelProperty("兑换积分")
+    private Integer point;
+
+    @ApiModelProperty("状态")
+    private String status;
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/point/PointGoods.java b/src/main/java/com/mzl/flower/entity/point/PointGoods.java
new file mode 100644
index 0000000..5b08efd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/point/PointGoods.java
@@ -0,0 +1,33 @@
+package com.mzl.flower.entity.point;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.Data;
+
+@Data
+@TableName("t_point_goods")
+public class PointGoods extends BaseAutoEntity {
+
+    @TableField("name")
+    private String name;//商品名称
+
+    @TableField("description")
+    private String description;//商品描述
+
+    @TableField("stock")
+    private Integer stock;//库存
+
+    @TableField("cover")
+    private String cover;//封面图
+
+    @TableField("pictures")
+    private String pictures;//商品图片
+
+    @TableField("point")
+    private Integer point;//兑换积分
+
+    @TableField("status")
+    private String status;//状态
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/entity/point/PointGoodsRecord.java b/src/main/java/com/mzl/flower/entity/point/PointGoodsRecord.java
new file mode 100644
index 0000000..a0b2b6e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/point/PointGoodsRecord.java
@@ -0,0 +1,57 @@
+package com.mzl.flower.entity.point;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("t_point_goods_record")
+public class PointGoodsRecord extends BaseAutoEntity {
+
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "商户ID")
+    private Long customerId;
+
+    @ApiModelProperty(value = "兑换码")
+    private String redeemCode;
+
+    @ApiModelProperty(value = "积分商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "商品封面图")
+    private String cover;
+
+    @ApiModelProperty(value = "商品图片")
+    private String pictures;
+
+    @ApiModelProperty(value = "兑换积分数")
+    private Integer point;
+
+    @ApiModelProperty(value = "兑换数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "兑换总积分")
+    private Integer totalPoint;
+
+    @ApiModelProperty(value = "兑换券状态POINT_GOODS_RECORD_STATUS")
+    private String status;
+
+    @ApiModelProperty(value = "绑定订单ID")
+    private String orderId;
+
+
+    @ApiModelProperty(value = "到期时间")
+    private LocalDateTime expireTime;
+}
diff --git a/src/main/java/com/mzl/flower/entity/system/User.java b/src/main/java/com/mzl/flower/entity/system/User.java
index ae798e1..bcdcd1a 100644
--- a/src/main/java/com/mzl/flower/entity/system/User.java
+++ b/src/main/java/com/mzl/flower/entity/system/User.java
@@ -35,4 +35,8 @@
 
     @TableField("third_id")
     private String thirdId;
+
+    @TableField("vip_grade")
+    private String vipGrade;
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/enums/CouponCategoryEnum.java b/src/main/java/com/mzl/flower/enums/CouponCategoryEnum.java
new file mode 100644
index 0000000..a43218c
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponCategoryEnum.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponCategoryEnum {
+
+    ACTIVITY("activity","活动优惠券"),
+    USER("user","用户优惠券"),
+    MEMBER("member","会员优惠券"),
+    POINT("point","积分优惠券"),
+    ;
+
+    @Getter
+    private String status;
+
+    private String desc;
+    private CouponCategoryEnum(String status, String desc){
+        this.status=status;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponGetTypeEnum.java b/src/main/java/com/mzl/flower/enums/CouponGetTypeEnum.java
new file mode 100644
index 0000000..918f2a5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponGetTypeEnum.java
@@ -0,0 +1,27 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+/**
+ * 优惠券领取渠道
+ */
+public enum CouponGetTypeEnum {
+
+
+    HOME("home","首页弹框"),
+    ACTIVITY("activity","活动入口"),
+    CENTER("center","领券中心"),
+
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponGetTypeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponGetUserTypeEnum.java b/src/main/java/com/mzl/flower/enums/CouponGetUserTypeEnum.java
new file mode 100644
index 0000000..2b66fe3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponGetUserTypeEnum.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponGetUserTypeEnum {
+
+
+    ALL("all","全部用户"),
+    TARGET("target","指定用户"),
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponGetUserTypeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponStatusEnum.java b/src/main/java/com/mzl/flower/enums/CouponStatusEnum.java
new file mode 100644
index 0000000..8879187
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponStatusEnum.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponStatusEnum {
+
+
+    INACTIVE("inactive","未发布"),
+    ACTIVE("active","已发布"),
+    EXPIRED("expired","下架"),
+    ;
+
+    @Getter
+    private String status;
+
+    private String desc;
+    private CouponStatusEnum(String status,String desc){
+        this.status=status;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponTypeEnum.java b/src/main/java/com/mzl/flower/enums/CouponTypeEnum.java
new file mode 100644
index 0000000..0dcfb9b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponTypeEnum.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponTypeEnum {
+
+
+    DISCOUNT("discount","满减"),
+    ZERO("zero","无门槛"),
+
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponTypeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponUsageTimeTypeEnum.java b/src/main/java/com/mzl/flower/enums/CouponUsageTimeTypeEnum.java
new file mode 100644
index 0000000..d5acc44
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponUsageTimeTypeEnum.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponUsageTimeTypeEnum {
+
+
+    DAY("day","天"),
+    HOUR("hour","小时"),
+    MINUTE("minute","分钟"),
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponUsageTimeTypeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponUsageTypeEnum.java b/src/main/java/com/mzl/flower/enums/CouponUsageTypeEnum.java
new file mode 100644
index 0000000..a988154
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponUsageTypeEnum.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponUsageTypeEnum {
+
+
+    GET("get","与领取时间一致"),
+    FIXED("fixed","固定时间"),
+    GET_AFTER_TIME("get_after_time","领取后有效时间"),
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponUsageTypeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/CouponUsedStatusEnum.java b/src/main/java/com/mzl/flower/enums/CouponUsedStatusEnum.java
new file mode 100644
index 0000000..4a0257e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/CouponUsedStatusEnum.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum CouponUsedStatusEnum {
+
+    UNUSED("unused","待使用"),
+    USED("used","已使用"),
+    EXPIRED("expired","过期"),
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private CouponUsedStatusEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/enums/TrueOrFalseEnum.java b/src/main/java/com/mzl/flower/enums/TrueOrFalseEnum.java
new file mode 100644
index 0000000..8dfbe95
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/TrueOrFalseEnum.java
@@ -0,0 +1,17 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum TrueOrFalseEnum {
+
+
+    TRUE(true),
+    FALSE(false),
+    ;
+
+    @Getter
+    private boolean flag;
+    private TrueOrFalseEnum(boolean flag){
+      this.flag=flag;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/enums/VipGradeEnum.java b/src/main/java/com/mzl/flower/enums/VipGradeEnum.java
new file mode 100644
index 0000000..3bbe6d3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/enums/VipGradeEnum.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.enums;
+
+import lombok.Getter;
+
+public enum VipGradeEnum {
+
+    NORMAL("0","普通会员"),
+    SILVER("1","银卡会员"),
+    GOLD("2","金卡会员"),
+    DIAMOND("3","钻石会员"),
+
+    ;
+
+    @Getter
+    private String type;
+
+    private String desc;
+    private VipGradeEnum(String type, String desc){
+        this.type=type;
+        this.desc=desc;
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapper.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapper.java
new file mode 100644
index 0000000..bccaf11
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapper.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.mapper.coupon;
+
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-27
+ */
+public interface CouponRecordMapper extends BaseMapper<CouponRecordDO> {
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java
new file mode 100644
index 0000000..2cc46fa
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponRecordMapperCustom.java
@@ -0,0 +1,37 @@
+package com.mzl.flower.mapper.coupon;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.coupon.QueryCouponRecordDTO;
+import com.mzl.flower.dto.request.coupon.QueryCouponStatisticsBO;
+import com.mzl.flower.dto.request.coupon.QueryMineCouponRecordDTO;
+import com.mzl.flower.dto.response.coupon.CouponRecordVO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-27
+ */
+public interface CouponRecordMapperCustom extends BaseMapper<CouponRecordDO> {
+
+    List<CouponRecordVO> getPage(Page page, @Param("param") QueryCouponRecordDTO dto);
+
+    List<CouponRecordVO> getList(@Param("param") QueryCouponRecordDTO dto);
+
+    Integer statisCouponTemplateCount(@Param("param") QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    Integer statisCouponTemplateCurMonCount(@Param("param") QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    Integer statisCouponPointCurMonPointAmonut(@Param("param") QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    List<CouponRecordVO> getMineCouponRecordList(@Param("param") QueryMineCouponRecordDTO dto);
+
+    void checkCouponExpired(@Param("param") QueryMineCouponRecordDTO dto);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateCustomerMapper.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateCustomerMapper.java
new file mode 100644
index 0000000..1ad55c8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateCustomerMapper.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.mapper.coupon;
+
+import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-24
+ */
+public interface CouponTemplateCustomerMapper extends BaseMapper<CouponTemplateCustomerDO> {
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapper.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapper.java
new file mode 100644
index 0000000..db8ab11
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapper.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.mapper.coupon;
+
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+public interface CouponTemplateMapper extends BaseMapper<CouponTemplateDO> {
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapperCustom.java b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapperCustom.java
new file mode 100644
index 0000000..f8b8327
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/coupon/CouponTemplateMapperCustom.java
@@ -0,0 +1,68 @@
+package com.mzl.flower.mapper.coupon;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.coupon.BatchCouponTemplateDTO;
+import com.mzl.flower.dto.request.coupon.QueryActivePointCouponDTO;
+import com.mzl.flower.dto.request.coupon.QueryActivityEffectCouponDTO;
+import com.mzl.flower.dto.request.coupon.QueryCouponDTO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateCustomerVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+public interface CouponTemplateMapperCustom extends BaseMapper<CouponTemplateDO> {
+
+    /**
+     * 获取普通分页信息
+     * @param page
+     * @param dto
+     * @return
+     */
+    List<CouponTemplateVO> getCouponTemplatePage(Page page,@Param("param") QueryCouponDTO dto);
+
+    /**
+     * 获取普通会员全部列表信息
+     * @param dto
+     * @return
+     */
+    List<CouponTemplateVO> getList(@Param("param") QueryCouponDTO dto);
+
+    int deleteBatchCouponTemplate(@Param("param") BatchCouponTemplateDTO dto);
+
+    int activeBatchCouponTemplate(@Param("param") BatchCouponTemplateDTO dto);
+
+    int expireBatchCouponTemplate(@Param("param") BatchCouponTemplateDTO dto);
+
+
+    List<CouponTemplateVO> getCouponPointList(@Param("param") QueryActivePointCouponDTO dto);
+
+    Page<CouponTemplateVO> getPointPage(Page page,@Param("param") QueryActivePointCouponDTO dto);
+
+    List<CouponTemplateVO> getActivityEffectList(@Param("param") QueryActivityEffectCouponDTO dto);
+
+    /**
+     * 获取关联的用户信息
+     * @param id
+     * @return
+     */
+    List<CouponTemplateCustomerVO> getCouponCustomerList(@Param("id") String id);
+
+    List<CouponTemplateVO> getVipList(@Param("param") QueryCouponDTO dto);
+
+    List<CouponTemplateVO> getCouponTemplateVipPage(Page page, @Param("param") QueryCouponDTO dto);
+
+    CouponTemplateVO getHomeActivityEffectAlert(@Param("param") QueryActivityEffectCouponDTO dto);
+
+    void expireHomeActivityCouponTemplate();
+}
diff --git a/src/main/java/com/mzl/flower/mapper/customer/CustomerMapper.java b/src/main/java/com/mzl/flower/mapper/customer/CustomerMapper.java
index d1f488e..f36c8d7 100644
--- a/src/main/java/com/mzl/flower/mapper/customer/CustomerMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/customer/CustomerMapper.java
@@ -6,6 +6,8 @@
 import com.mzl.flower.dto.response.customer.CustomerDTO;
 import com.mzl.flower.entity.customer.Customer;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -17,4 +19,22 @@
     CustomerDTO getCurrentCustomer(@Param("userId") String userId);
 
     void bindPartner(@Param("id") Long id, @Param("partnerId")Long partnerId, @Param("userId")String userId);
+
+    @Select("select count(1) from t_customer_info where level_id = #{levelId} and deleted = '0' ")
+    Integer getByLevelId(@Param("levelId") String levelId);
+
+    @Update("UPDATE t_customer_info c " +
+            "JOIN ( " +
+            "    SELECT user_id, " +
+            "           SUM(growth) as sumgrowthvalue " +
+            "    FROM t_member_growth_record " +
+            "    WHERE deleted = '0' " +
+            "    GROUP BY user_id " +
+            "    HAVING SUM(growth) > 0 " +
+            ") t1 ON c.user_id = t1.user_id " +
+            "SET c.level_id = #{levelId} " +
+            "WHERE t1.sumgrowthvalue BETWEEN #{startPoint} AND #{endPoint} ")
+    Boolean updateMemberLevelByPoint(@Param("levelId") Long levelId, @Param("startPoint") int startPoint, @Param("endPoint") int endPoint);
+
+
 }
diff --git a/src/main/java/com/mzl/flower/mapper/customer/FollowMapper.java b/src/main/java/com/mzl/flower/mapper/customer/FollowMapper.java
index a2d832d..13874dc 100644
--- a/src/main/java/com/mzl/flower/mapper/customer/FollowMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/customer/FollowMapper.java
@@ -12,4 +12,6 @@
 @Repository
 public interface FollowMapper extends BaseMapper<Follow> {
     List<FollowDTO> myFollow(Page page, @Param("userId") String userId);
+
+    Integer getStatisFansCount(@Param("supplierId")  Long supplierId);
 }
diff --git a/src/main/java/com/mzl/flower/mapper/member/MemberDowngradeRecordMapper.java b/src/main/java/com/mzl/flower/mapper/member/MemberDowngradeRecordMapper.java
new file mode 100644
index 0000000..587a31b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/member/MemberDowngradeRecordMapper.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.mapper.member;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mzl.flower.entity.menber.MemberDowngradeRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberMapper
+ * @date 2024/9/2
+ * @description 会员降级mapper
+ */
+@SuppressWarnings("ALL")
+@Repository
+public interface MemberDowngradeRecordMapper extends BaseMapper<MemberDowngradeRecord> {
+
+    @Select("select count(1) from t_member_downgrade_record where user_id = #{userId} and deleted = '0' ")
+    Integer getMemberByName(@Param("userId") String userId);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/member/MemberGrowthRecordMapper.java b/src/main/java/com/mzl/flower/mapper/member/MemberGrowthRecordMapper.java
new file mode 100644
index 0000000..d09649d
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/member/MemberGrowthRecordMapper.java
@@ -0,0 +1,39 @@
+package com.mzl.flower.mapper.member;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.menber.MemberRecordQueryDTO;
+import com.mzl.flower.dto.request.menber.UserMemberRecordQueryDTO;
+import com.mzl.flower.dto.response.member.MemberGrowthRecordVO;
+import com.mzl.flower.dto.response.member.UserGrowthRecordVO;
+import com.mzl.flower.entity.menber.MemberGrowthRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDate;
+import java.util.List;
+
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberMapper
+ * @date 2024/8/27
+ * @description 会员成记录mapper
+ */
+@SuppressWarnings("ALL")
+@Repository
+public interface MemberGrowthRecordMapper extends BaseMapper<MemberGrowthRecord> {
+
+    @Select("SELECT COALESCE(CASE WHEN SUM(growth) < 0 THEN 0 ELSE SUM(growth) END, 0)  as total_growth from t_member_growth_record WHERE user_id  = #{userId} and deleted = '0'")
+    Integer getSumGrowthByUsertId(@Param("userId") String userId);
+
+    List<MemberGrowthRecordVO> queryPage(@Param("dto") MemberRecordQueryDTO dto, Page page);
+
+    List<UserGrowthRecordVO> queryUserPage(@Param("dto") UserMemberRecordQueryDTO dto, Page page);
+
+    @Select("SELECT * from t_member_growth_record WHERE user_id  = #{userId} and deleted = '0' and record_date = #{localDate} and type= 'reduce' and source = 'downgrading'")
+    List<MemberGrowthRecordVO> selectDowngradingByUserId(@Param("userId") String userId, LocalDate localDate);
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/member/MemberMapper.java b/src/main/java/com/mzl/flower/mapper/member/MemberMapper.java
new file mode 100644
index 0000000..e1081ba
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/member/MemberMapper.java
@@ -0,0 +1,51 @@
+package com.mzl.flower.mapper.member;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.menber.MemberQueryDTO;
+import com.mzl.flower.dto.response.member.MemberVO;
+import com.mzl.flower.entity.menber.Member;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberMapper
+ * @date 2024/8/26
+ * @description 会员管理功能mapper
+ */
+@SuppressWarnings("ALL")
+@Repository
+public interface MemberMapper extends BaseMapper<Member> {
+
+    @Select("select * from t_member where end_point = #{endPoint} and deleted = '0' limit 1")
+    Member getEndPointByIntegerMaxValue(@Param("endPoint") Integer endPoint);
+
+    @Select("select * from t_member where name = #{name} and deleted = '0' limit 1")
+    Member getMemberByName(@Param("name") String name);
+
+    @Select("select * from t_member where start_point <= #{growthValue} and end_point > #{growthValue} and deleted = '0' limit 1")
+    Member getMemberByGrowthValue(@Param("growthValue") Integer growthValue);
+
+    //获取成长值大于当前值的会员
+    @Select("select * from t_member where start_point > #{growthValue} and deleted = '0' ")
+    List<Member> getgtMembersByGrowthValue(@Param("growthValue") Integer growthValue);
+
+    //获取成长值区间最大值小于当前值的会员
+    @Select("select * from t_member where end_point < #{growthValue} and deleted = '0' ORDER BY end_point DESC LIMIT 1")
+    Member getgtMembersByEndPoint(@Param("growthValue") Integer growthValue);
+
+    List<MemberVO> queryPage(@Param("dto") MemberQueryDTO dto, Page page);
+
+    @Select("select * from  t_member where deleted = '0'")
+    List<Member> getAllMember();
+
+    @Select("select * from  t_member where deleted = '0' and id != #{id} ")
+    List<Member> getOtherAllMember(@Param("id") Long id);
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/payment/DeliveryOrderMapper.java b/src/main/java/com/mzl/flower/mapper/payment/DeliveryOrderMapper.java
index 5ed5364..aacaae1 100644
--- a/src/main/java/com/mzl/flower/mapper/payment/DeliveryOrderMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/payment/DeliveryOrderMapper.java
@@ -38,7 +38,8 @@
     List<StationStatisticDTO> statisticStationList(@Param("startDate") LocalDateTime startDate,
                                                    @Param("endDate")LocalDateTime endDate,
                                                    @Param("name") String name,
-                                                   @Param("userId") String userId);
+                                                   @Param("userId") String userId,
+                                                   @Param("statusList") List<String> statusList);
 
     List<DeliveryOrder> selectSupplierDoEntity4Check(@Param("supplierId") Long supplierId
             , @Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderItemMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderItemMapper.java
index ff6f409..f6cb15c 100644
--- a/src/main/java/com/mzl/flower/mapper/payment/OrderItemMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/payment/OrderItemMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.mzl.flower.dto.response.payment.AbnormalOrderItemDTO;
+import com.mzl.flower.dto.response.payment.OrderItemListDTO;
 import com.mzl.flower.dto.response.payment.OrderItemPlatformListDTO;
 import com.mzl.flower.entity.payment.OrderItem;
 import org.apache.ibatis.annotations.Param;
@@ -14,4 +15,6 @@
     List<AbnormalOrderItemDTO> getAbnormalItems(@Param("orderId") String orderId);
 
     List<OrderItemPlatformListDTO> getPlatformOrderItems(@Param("orderId") String orderId);
+
+    List<OrderItemListDTO> getOrderItems(@Param("orderIds") List<String> orderIds);
 }
diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java
index 0cb82c9..a893c08 100644
--- a/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java
@@ -3,12 +3,10 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mzl.flower.dto.request.payment.OrderQueryDTO;
-import com.mzl.flower.dto.response.payment.OrderCheckListDTO;
-import com.mzl.flower.dto.response.payment.OrderListDTO;
-import com.mzl.flower.dto.response.payment.OrderStatusCountDTO;
-import com.mzl.flower.dto.response.payment.SupplierNumDTO;
+import com.mzl.flower.dto.response.payment.*;
 import com.mzl.flower.entity.payment.Order;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Repository;
 
 import java.time.LocalDateTime;
@@ -36,4 +34,21 @@
     List<Order> getOrderForBill(@Param("startTime")LocalDateTime startTime
             , @Param("endTime")LocalDateTime endTime);
 
+    Order getUserLastOrder(@Param("userId") String userId);
+
+    List<OrderPointGoodsListDTO> getPointGoodsList(@Param("orderId") String orderId);
+
+    @Select("SELECT t1.* " +
+            "FROM t_order t1 " +
+            "JOIN ( " +
+            "    SELECT create_by, MAX(receive_time) AS max_time " +
+            "    FROM t_order " +
+            "    where receive_time is not null  " +
+            "    GROUP BY create_by " +
+            "    HAVING max_time < NOW() - INTERVAL 30 DAY " +
+            ") t2 ON t1.create_by = t2.create_by AND t1.receive_time = t2.max_time " +
+            "LEFT JOIN t_customer_info c ON t1.create_by = c.user_id ")
+    List<Order> getOrderInfoByReceiveTime();
+
+    Integer getFlowerCompleteNumToday(@Param("userId") String userId,@Param("flowerId") Long flowerId);
 }
diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java
new file mode 100644
index 0000000..6cf35fe
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java
@@ -0,0 +1,14 @@
+package com.mzl.flower.mapper.payment;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.entity.payment.OrderPointGoods;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface OrderPointGoodsMapper extends BaseMapper<OrderPointGoods> {
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java b/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java
new file mode 100644
index 0000000..b1b6235
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java
@@ -0,0 +1,23 @@
+package com.mzl.flower.mapper.point;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.point.CustomerPointDetailQueryDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDetailVO;
+import com.mzl.flower.dto.response.point.ExpiredPointDTO;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDate;
+import java.util.List;
+
+
+
+@Repository
+public interface CustomerPointDetailMapper extends BaseMapper<CustomerPointDetail> {
+
+    List<CustomerPointDetailVO> queryPage(@Param("dto") CustomerPointDetailQueryDTO dto, Page page);
+
+    List<ExpiredPointDTO> tongjiExpiredPoint(@Param("lastYear") LocalDate lastYear,@Param("userId") String userId);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/point/CustomerPointMapper.java b/src/main/java/com/mzl/flower/mapper/point/CustomerPointMapper.java
new file mode 100644
index 0000000..f8f42fa
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/point/CustomerPointMapper.java
@@ -0,0 +1,22 @@
+package com.mzl.flower.mapper.point;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.point.QueryCustomerPointDTO;
+import com.mzl.flower.dto.request.point.QueryPointDetailDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDetailDTO;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.supplier.Station;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface CustomerPointMapper extends BaseMapper<CustomerPoint> {
+
+    List<CustomerPointDTO> queryPage(@Param(value = "dto") QueryCustomerPointDTO dto, Page page);
+
+    List<CustomerPointDetailDTO> queryCustomerDetails(@Param(value = "dto")QueryPointDetailDTO dto, Page page);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/point/PointGoodsMapper.java b/src/main/java/com/mzl/flower/mapper/point/PointGoodsMapper.java
new file mode 100644
index 0000000..8825c9b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/point/PointGoodsMapper.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.mapper.point;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.point.PointGoodsQueryDTO;
+import com.mzl.flower.dto.response.point.PointGoodsListDTO;
+import com.mzl.flower.entity.point.PointGoods;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PointGoodsMapper extends BaseMapper<PointGoods> {
+    List<PointGoodsListDTO> selectGoodsList(Page page, @Param("condition") PointGoodsQueryDTO dto);
+}
diff --git a/src/main/java/com/mzl/flower/mapper/point/PointGoodsRecordMapper.java b/src/main/java/com/mzl/flower/mapper/point/PointGoodsRecordMapper.java
new file mode 100644
index 0000000..5ce4510
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/point/PointGoodsRecordMapper.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.mapper.point;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.point.QueryExchangeGoodsDTO;
+import com.mzl.flower.dto.response.point.PointGoodsRecordDTO;
+import com.mzl.flower.entity.point.PointGoodsRecord;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PointGoodsRecordMapper extends BaseMapper<PointGoodsRecord> {
+    List<PointGoodsRecordDTO> selectMyExchangeGoods(@Param("dto") QueryExchangeGoodsDTO dto, Page page);
+
+    void updateExpiredPointGoodsRecord();
+}
diff --git a/src/main/java/com/mzl/flower/schedule/PointScheduleService.java b/src/main/java/com/mzl/flower/schedule/PointScheduleService.java
new file mode 100644
index 0000000..9a6a612
--- /dev/null
+++ b/src/main/java/com/mzl/flower/schedule/PointScheduleService.java
@@ -0,0 +1,96 @@
+package com.mzl.flower.schedule;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.response.point.ExpiredPointDTO;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
+import com.mzl.flower.mapper.point.PointGoodsRecordMapper;
+import com.mzl.flower.utils.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+@Component
+@Slf4j
+public class PointScheduleService {
+
+
+    private final CustomerPointMapper customerPointMapper;
+
+    private final CustomerPointDetailMapper customerPointDetailMapper;
+
+    private final PointGoodsRecordMapper pointGoodsRecordMapper;
+
+    public PointScheduleService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper, PointGoodsRecordMapper pointGoodsRecordMapper) {
+        this.customerPointMapper = customerPointMapper;
+        this.customerPointDetailMapper = customerPointDetailMapper;
+        this.pointGoodsRecordMapper = pointGoodsRecordMapper;
+    }
+
+
+    /**
+     * 定时计算用户过期积分
+     */
+    @Scheduled(cron = "0 10 0 * * ?")
+    public void calculatingExpiredPoint() {
+        log.info("过期积分计算开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+        LocalDate now = LocalDate.now().minusDays(1);//前一天
+        LocalDate lastYear = now.minus(1, ChronoUnit.YEARS); // 日期减去一年
+        List<ExpiredPointDTO> pointDTOS = customerPointDetailMapper.tongjiExpiredPoint(lastYear,null);
+        if(pointDTOS != null && pointDTOS.size() > 0){
+            for (ExpiredPointDTO pointDTO : pointDTOS) {
+                if(pointDTO.getAddPoint().intValue()> pointDTO.getReducePoint().intValue()){ //积分增加大于减少
+                    Integer expiredPoint = pointDTO.getAddPoint().intValue() - pointDTO.getReducePoint().intValue();
+                    CustomerPointDetail customerPointDetail = new CustomerPointDetail();
+                    customerPointDetail.setUserId(pointDTO.getUserId());
+                    customerPointDetail.setCustomerId(pointDTO.getCustomerId());
+                    customerPointDetail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
+                    customerPointDetail.setType(Constants.POINT_TYPE.expired.name());
+                    customerPointDetail.setPoint(expiredPoint);
+                    customerPointDetail.setRecordDate(lastYear);
+                    customerPointDetail.create("sys");
+                    customerPointDetail.setRemarks(DateUtils.toString(now,"yyyy-MM-dd")+"过期积分结算,过期积分"+expiredPoint);
+                    customerPointDetailMapper.insert(customerPointDetail);
+
+                    //更新用户积分记录
+                    CustomerPoint customerPoint = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+                            .eq(CustomerPoint::getCustomerId, pointDTO.getCustomerId())
+                            .eq(CustomerPoint::getUserId, pointDTO.getUserId()));
+                    if(customerPoint == null ){
+                        log.error("用户积分记录不存在,userId={},customerId={}",pointDTO.getUserId(),pointDTO.getCustomerId());
+                    }else {
+                        Integer expiredPointTotal = customerPoint.getExpiredPoint()==null?0:customerPoint.getExpiredPoint();
+                        customerPoint.setExpiredPoint(expiredPoint+expiredPointTotal);
+                        customerPointMapper.updateById(customerPoint);
+                    }
+
+                }
+            }
+        }
+
+
+        log.info("过期积分计算结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+    }
+
+
+    /**
+     * 积分兑换券过期
+     */
+    @Scheduled(cron = "0 46 11 * * ?")
+    public void expiredPointGoodsRecord() {
+        log.info("积分兑换券过期计算开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+        pointGoodsRecordMapper.updateExpiredPointGoodsRecord();
+        log.info("积分兑换券过期计算开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/schedule/ScheduleService.java b/src/main/java/com/mzl/flower/schedule/ScheduleService.java
index 7842cad..6130515 100644
--- a/src/main/java/com/mzl/flower/schedule/ScheduleService.java
+++ b/src/main/java/com/mzl/flower/schedule/ScheduleService.java
@@ -2,21 +2,26 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.response.member.MemberGrowthRecordVO;
 import com.mzl.flower.entity.flower.FlowerCategory;
 import com.mzl.flower.entity.partner.Partner;
 import com.mzl.flower.entity.payment.Order;
 import com.mzl.flower.entity.payment.Transfer;
 import com.mzl.flower.mapper.flower.FlowerCategoryMapper;
+import com.mzl.flower.mapper.member.MemberGrowthRecordMapper;
 import com.mzl.flower.mapper.partner.PartnerMapper;
 import com.mzl.flower.mapper.payment.OrderMapper;
+import com.mzl.flower.service.coupon.CouponRecordService;
 import com.mzl.flower.service.flower.FlowerCategoryService;
 import com.mzl.flower.service.flower.FlowerService;
+import com.mzl.flower.service.menber.impl.GrowthValueDealService;
 import com.mzl.flower.service.payment.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -56,6 +61,15 @@
 
     @Autowired
     private OrderItemSettlementService orderItemSettlementService;
+
+    @Autowired
+    private GrowthValueDealService growthValueDealService;
+
+    @Autowired
+    private CouponRecordService couponRecordService;
+
+    @Autowired
+    private MemberGrowthRecordMapper memberGrowthRecordMapper;
 
     @Scheduled(cron = "1 0/30 * * * ?")
     public void calculateAvePrice() {
@@ -133,7 +147,12 @@
     @Scheduled(cron = "1 20 0/1 * * ?")
     public void autoReceive() {
         log.info("自动收货开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
-        orderService.autoReceive();
+        List<Order> ls = orderService.autoReceive();
+        if(ls != null && ls.size() > 0){
+            for(Order o : ls){
+                orderService.processAfterReceive(o);
+            }
+        }
         log.info("自动收货结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
     }
 
@@ -180,4 +199,45 @@
         billService.generateBill(date.plusDays(-1));
         log.info("账单结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
     }
+
+    //成长值降级定时任务
+    @Scheduled(cron = "0 0 5 * * ?")
+    public void deductGrowthValue() {
+        log.info("成长值扣除开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+        //获取当前员工
+        List<Order> orderList = orderMapper.getOrderInfoByReceiveTime();
+        if(!CollectionUtils.isEmpty(orderList)){
+            orderList.forEach(o->{
+                try {
+                    LocalDateTime now = LocalDateTime.now();
+                    LocalDate nowDate = now.toLocalDate();
+                    List<MemberGrowthRecordVO> memberGrowthRecordVOS = memberGrowthRecordMapper.selectDowngradingByUserId(o.getCreateBy(), nowDate);
+                    if (CollectionUtils.isEmpty(memberGrowthRecordVOS)) {
+                        growthValueDealService.deductionGrowthValue(o);
+                    }
+                } catch (Exception e) {
+                    // 记录错误信息,例如将错误信息写入日志
+                    log.info("处理订单 " + o.getId() + " 时出错: " + e.getMessage());
+                }
+            });
+        }
+        log.info("成长值扣除结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+    }
+
+
+    @Scheduled(cron = "0 30 0 1 * ?")
+    public void grantVipCouponRecordList() {
+        log.info("会员优惠券开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+        couponRecordService.grantVipCouponRecordList();
+        log.info("会员优惠券结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+    }
+
+    @Scheduled(cron = "0 30 0 1 * ?")
+    public void expiredCouponRecordLastMon() {
+        log.info("会员优惠券开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+        couponRecordService.expiredCouponRecordLastMon();
+        log.info("会员优惠券结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
+    }
+
+
 }
diff --git a/src/main/java/com/mzl/flower/schedule/WarehouseScheduleService.java b/src/main/java/com/mzl/flower/schedule/WarehouseScheduleService.java
index 999763e..8689b36 100644
--- a/src/main/java/com/mzl/flower/schedule/WarehouseScheduleService.java
+++ b/src/main/java/com/mzl/flower/schedule/WarehouseScheduleService.java
@@ -85,8 +85,8 @@
                         }
                     }
                     if(customerOrders!=null && customerOrders.size()>0){ //散户订单
+                        Map<String, WarehouseLocationDTO> customerLocationMap = new HashMap<>();
                         for (Order order : customerOrders) {
-                            Map<String, WarehouseLocationDTO> customerLocationMap = new HashMap<>();
                             if(locations!=null && locations.size()>0){
                                 String key = order.getCreateBy()+"||"+order.getCustomerAddress();
                                 WarehouseLocationDTO location = null;
@@ -110,7 +110,7 @@
     /**
      * 每天凌晨2点,合伙人发货
      */
-    @Scheduled(cron = "0 0 2 * * ?")
+    @Scheduled(cron = "0 0 4 * * ?")
     public void clearWarehouseLocation() {
         log.info("定时合伙人发货开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss"));
         orderService.setPartnerOrderSend();
diff --git a/src/main/java/com/mzl/flower/service/BaseService.java b/src/main/java/com/mzl/flower/service/BaseService.java
index 94c2d4c..c5c2d7e 100644
--- a/src/main/java/com/mzl/flower/service/BaseService.java
+++ b/src/main/java/com/mzl/flower/service/BaseService.java
@@ -12,6 +12,7 @@
 import com.mzl.flower.dto.response.payment.OrderSalesItemChargeDTO;
 import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.flower.*;
+import com.mzl.flower.entity.menber.Member;
 import com.mzl.flower.entity.partner.Partner;
 import com.mzl.flower.entity.payment.FeeService;
 import com.mzl.flower.entity.payment.OrderItemSales;
@@ -19,6 +20,7 @@
 import com.mzl.flower.entity.supplier.Supplier;
 import com.mzl.flower.mapper.customer.CustomerMapper;
 import com.mzl.flower.mapper.flower.FlowerCategoryMapper;
+import com.mzl.flower.mapper.member.MemberMapper;
 import com.mzl.flower.mapper.partner.PartnerMapper;
 import com.mzl.flower.mapper.supplier.SupplierMapper;
 import com.mzl.flower.mapper.system.UserMapper;
@@ -31,6 +33,7 @@
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -62,6 +65,13 @@
 
     @Autowired
     private FlowerCategoryMapper flowerCategoryMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
+    protected Member getMember(Long levelId){
+        return memberMapper.selectById(levelId);
+    }
 
     @Autowired
     private StringCacheClient stringCacheClient;
@@ -479,6 +489,55 @@
         return p;
     }
 
+    /**
+     * 计算会员单价
+     *
+     * @param price
+     * @param member
+     * @return
+     */
+    protected BigDecimal calculateMemberPrice(BigDecimal price, Member member){
+        if(price == null || member == null){
+            return price;
+        }
+        BigDecimal r = price;
+
+        String discountType = member.getDiscountType();
+        if(Constants.DISCOUNT_TYPE.ratio.name().equals(discountType)){
+            BigDecimal discountRatio = getAmount(member.getDiscountRatio());
+            r = price.multiply(discountRatio).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+        } else if (Constants.DISCOUNT_TYPE.amount.name().equals(discountType)){
+            BigDecimal discountAmount = getAmount(member.getDiscountAmount());
+            r = price.subtract(discountAmount);
+        }
+
+        if(r.doubleValue() < 0){
+            r = new BigDecimal(0);
+        }
+
+        return r;
+    }
+
+    protected Customer getCustomerByUserId(String userId){
+        Customer p = customerMapper.selectOne(new QueryWrapper<Customer>()
+                .eq("user_id", userId));
+        if(p == null){
+            throw new ValidationException("客户不存在");
+        }
+
+        return p;
+    }
+
+    protected Customer getCustomer(Long id){
+        Customer p = customerMapper.selectById(id);
+
+        if(p == null){
+            throw new ValidationException("商户不存在");
+        }
+
+        return p;
+    }
+
     public Partner getCurrentPartner(){
         String userId = SecurityUtils.getUserId();
         Partner p = partnerMapper.selectOne(new QueryWrapper<Partner>()
diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java
new file mode 100644
index 0000000..a416242
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/coupon/CouponRecordService.java
@@ -0,0 +1,123 @@
+package com.mzl.flower.service.coupon;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponRecordVO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-27
+ */
+public interface CouponRecordService extends IService<CouponRecordDO> {
+
+    List<CouponRecordVO> getList(QueryCouponRecordDTO dto) ;
+    boolean createCouponRecord(CreateCouponRecordDTO dto);
+
+    boolean updateCouponRecord(CreateCouponRecordDTO dto);
+
+    boolean deleteCouponRecord(String id);
+
+    CouponRecordVO getCouponRecordById(String id);
+
+    Page<CouponRecordVO> getPage(Page page, QueryCouponRecordDTO dto);
+
+    /**
+     * 会员定时任务
+     * 根据会员等级定时下发刷优惠券
+     * @return
+     */
+    boolean grantVipCouponRecordList();
+
+    /**
+     * 根据当月日期设置上个月的日期的优惠券过期
+     * @return
+     */
+    boolean expiredCouponRecordLastMon();
+
+    Integer statisCouponTemplateCount(QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    Integer statisCouponTemplateCurMonCount(QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    Integer statisCouponPointCurMonPontAmonut(QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+    /**
+     * 根据优惠券种类,优惠券ID,用户的ID查找优惠券的记录数量
+     * @param queryExistCouponDTO
+     * @return
+     */
+    Integer getExistCouponAmount(QueryExistCouponDTO queryExistCouponDTO);
+
+    /**
+     * 根据优惠券的ID来查找已经领取的优惠券的数量
+     * @param couponId
+     * @return
+     */
+    Integer getExistGainCouponRecordAmountById(String couponId);
+
+    Integer getUserGainCouponRecordAmountById(String couponId,Long customerId);
+
+    /**
+     *
+     * @param couponId
+     * @param userId
+     * @return
+     */
+    Integer getUserGainCouponRecordAmountByUserId(String couponId,String userId);
+
+    List<CouponRecordVO> getMineCouponRecordList(QueryMineCouponRecordDTO dto);
+
+    /**
+     * 检查优惠券是否到期
+     * @param dto
+     */
+    void checkCouponExpired(QueryMineCouponRecordDTO dto);
+
+    boolean checkCurMonVipCouponExists(String couponId, Long customId, LocalDateTime startDateTime,LocalDateTime endDateTime);
+
+
+    /**
+     * 优惠券的使用
+     * @param couponId 优惠券ID
+     * @param orderId 订单的ID
+     * @param orderMount 订单的金额
+     * @return
+     */
+    boolean useCoupon(String couponId, String orderId, BigDecimal orderMount);
+
+    /**
+     * 优惠券退单
+     * @param orderId
+     * @return
+     */
+    boolean cancelCouponUsage(String orderId);
+
+    /**
+     * 根据订单号查找优惠券信息
+     * @param orderId
+     * @return
+     */
+    List<CouponRecordDO> getCouponListByOrderId(String orderId) ;
+
+
+    CouponRecordDO getCouponByOrderId(String orderId) ;
+
+    /**
+     * 查看当前人员是否已经重复发过此优惠券
+     * @param couponId
+     * @param customId
+     * @return
+     */
+    boolean checkUserCouponExists(String couponId, Long customId);
+
+
+}
diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponTemplateCustomerService.java b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateCustomerService.java
new file mode 100644
index 0000000..8388ac4
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateCustomerService.java
@@ -0,0 +1,40 @@
+package com.mzl.flower.service.coupon;
+
+import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.entity.customer.Customer;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-24
+ */
+public interface CouponTemplateCustomerService extends IService<CouponTemplateCustomerDO> {
+
+    /**
+     * 根据优惠券的id查找关联关系
+     * @param couponTemplateId
+     * @return
+     */
+    List<CouponTemplateCustomerDO> getPointCustomReList(String couponTemplateId);
+
+    /**
+     * 根据优惠券的模版id删除关联关系
+     * @param couponTemplateId
+     * @return
+     */
+    boolean deleteByCouponTemplateId(String couponTemplateId);
+
+    /**
+     * 根据优惠券的模版ID查找用户列表
+     * @param id
+     * @return
+     */
+    List<Customer> getPointCustomerList(String id);
+
+}
diff --git a/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java
new file mode 100644
index 0000000..b33de57
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/coupon/CouponTemplateService2.java
@@ -0,0 +1,103 @@
+package com.mzl.flower.service.coupon;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponPointStatisVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+public interface CouponTemplateService2 extends IService<CouponTemplateDO> {
+
+    boolean createCouponTemplate(CreateCouponTemplateBO dto);
+
+
+    boolean updateCouponTemplate(CreateCouponTemplateBO dto);
+
+    List<CouponTemplateVO> getList(QueryCouponDTO dto);
+
+    Page<CouponTemplateVO>  getPage(Page page, QueryCouponDTO dto);
+
+    /**
+     * 详情
+     * @param id
+     * @return
+     */
+    CouponTemplateVO getDetailById(String id);
+
+    boolean deleteCouponTemplate(String id);
+
+    boolean activeCouponTemplate(String id);
+    /**
+     * 活动-下架优惠券
+     * @param id
+     * @return
+     */
+    boolean expireCouponTemplate(String id);
+
+
+    /**
+     * 获取所有会员优惠券模版
+     * @return
+     */
+    List<CouponTemplateDO> getVipCouponTemplate();
+
+    boolean deleteBatchCouponTemplate(BatchCouponTemplateDTO dto);
+
+    boolean activeBatchCouponTemplate(BatchCouponTemplateDTO dto);
+
+    boolean expireBatchCouponTemplate(BatchCouponTemplateDTO dto);
+
+    /**
+     * 积分统计
+     *
+     * @param queryCouponStatisticsBO
+     * @return
+     */
+    CouponPointStatisVO statisCouponTemplatePoint(QueryCouponStatisticsBO queryCouponStatisticsBO);
+
+
+    /**
+     * 积分优惠券全部
+     * @param dto
+     * @return
+     */
+    List<CouponTemplateVO> getPointList(QueryActivePointCouponDTO dto);
+
+    /**
+     * 积分优惠券列表
+     * @param page
+     * @param dto
+     * @return
+     */
+    Page<CouponTemplateVO> getPointPage(Page page, QueryActivePointCouponDTO dto);
+
+    /**
+     * 获取活动优惠券
+     * 1.需要领取时间在有效期内的
+     * 2.已经发布的
+     * @param dto
+     * @return
+     */
+    List<CouponTemplateVO> getActivityEffectList(QueryActivityEffectCouponDTO dto);
+
+    void exchangeCoupon(ExchangeCouponDTO dto);
+
+    /**
+     * 查询首页弹簧,且当前自己领取过的话则不用展示
+     * @param dto
+     * @return
+     */
+    CouponTemplateVO getHomeActivityEffectAlert(QueryActivityEffectCouponDTO dto);
+
+}
diff --git a/src/main/java/com/mzl/flower/service/customer/CustomerService.java b/src/main/java/com/mzl/flower/service/customer/CustomerService.java
index 187c75b..1933dc4 100644
--- a/src/main/java/com/mzl/flower/service/customer/CustomerService.java
+++ b/src/main/java/com/mzl/flower/service/customer/CustomerService.java
@@ -10,29 +10,37 @@
 import com.mzl.flower.dto.request.customer.ChangePartnerDTO;
 import com.mzl.flower.dto.request.customer.QueryCustomerDTO;
 import com.mzl.flower.dto.request.customer.UpdateCustomerDTO;
+import com.mzl.flower.dto.request.menber.UserGrowthRecordDTO;
 import com.mzl.flower.dto.response.customer.CustomerDTO;
 import com.mzl.flower.dto.response.partner.PartnerDTO;
 import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.partner.Partner;
+import com.mzl.flower.enums.TrueOrFalseEnum;
 import com.mzl.flower.mapper.customer.CustomerMapper;
 import com.mzl.flower.mapper.partner.PartnerMapper;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import lombok.extern.slf4j.Slf4j;
 import com.mzl.flower.service.BaseService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
 import java.util.List;
 
 @Service
 @Transactional
+@Slf4j
 public class CustomerService {
 
 
     private final CustomerMapper customerMapper;
 
     private final PartnerMapper partnerMapper;
+    @Resource
+    private MemberGrowthRecordService memberGrowthRecordService;
 
     @Resource
     private BaseService baseService;
@@ -43,7 +51,12 @@
     }
 
     public CustomerDTO getCurrentCustomer() {
-        return customerMapper.getCurrentCustomer(SecurityUtils.getUserId());
+        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(SecurityUtils.getUserId());
+        UserGrowthRecordDTO userGrowthRecordDTO = memberGrowthRecordService.getInfoByUserId(SecurityUtils.getUserId());
+        if(!ObjectUtils.isEmpty(userGrowthRecordDTO)){
+            currentCustomer.setUserGrowthRecord(userGrowthRecordDTO);
+        }
+        return currentCustomer;
     }
 
     public PartnerDTO getCurrentBindPartner() {
@@ -71,6 +84,7 @@
 
             customer.create(SecurityUtils.getUserId());
             customer.setIsEnabled(true);
+            customer.setLevelId(Long.valueOf(Constants.DEFAULT_MEMBER_ID));
             customerMapper.insert(customer);
         } else {//重新修改
             customer = customerMapper.selectById(dto.getId());
@@ -221,4 +235,21 @@
         customer.update(SecurityUtils.getUserId());
         customerMapper.updateById(customer);
     }
+
+    /**
+     * 根据会员等级获取等级下的customer信息
+     * @param levelId
+     * @return
+     */
+    public List<Customer> getCustomerListByLevelId(Integer levelId){
+        if(null != levelId){
+            QueryWrapper<Customer> customerQueryWrapper=new QueryWrapper<>();
+            customerQueryWrapper.lambda()
+                    .eq(Customer::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                    .eq(Customer::getLevelId,levelId);
+            return customerMapper.selectList(customerQueryWrapper);
+        }
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/mzl/flower/service/customer/FollowService.java b/src/main/java/com/mzl/flower/service/customer/FollowService.java
index 2607eb4..fb185a6 100644
--- a/src/main/java/com/mzl/flower/service/customer/FollowService.java
+++ b/src/main/java/com/mzl/flower/service/customer/FollowService.java
@@ -2,13 +2,11 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.mzl.flower.config.exception.ValidationException;
 import com.mzl.flower.config.security.SecurityUtils;
 import com.mzl.flower.dto.request.customer.CreateFollowDTO;
 import com.mzl.flower.dto.response.customer.FollowDTO;
 import com.mzl.flower.entity.customer.Follow;
 import com.mzl.flower.mapper.customer.FollowMapper;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -59,4 +57,18 @@
         }
         return false;
     }
+
+    public int fansCount(Long supplierId) {
+        int count = followMapper.selectCount(new LambdaQueryWrapper<Follow>()
+                .eq(Follow::getSupplierId, supplierId));
+        return count;
+    }
+
+
+    public Integer getStatisFansCount(Long supplierId) {
+
+        Integer count = followMapper.getStatisFansCount(supplierId);
+
+        return count;
+    }
 }
diff --git a/src/main/java/com/mzl/flower/service/flower/FlowerCategoryService.java b/src/main/java/com/mzl/flower/service/flower/FlowerCategoryService.java
index 3000ec0..41f590e 100644
--- a/src/main/java/com/mzl/flower/service/flower/FlowerCategoryService.java
+++ b/src/main/java/com/mzl/flower/service/flower/FlowerCategoryService.java
@@ -13,12 +13,15 @@
 import com.mzl.flower.dto.response.flower.FlowerCategoryDTO;
 import com.mzl.flower.dto.response.flower.FlowerCategoryShowDTO;
 import com.mzl.flower.dto.response.flower.FlowerCategoryTreeDTO;
+import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.flower.Flower;
 import com.mzl.flower.entity.flower.FlowerCategory;
 import com.mzl.flower.entity.flower.FlowerCategoryDaily;
+import com.mzl.flower.entity.menber.Member;
 import com.mzl.flower.mapper.flower.FlowerCategoryDailyMapper;
 import com.mzl.flower.mapper.flower.FlowerCategoryMapper;
 import com.mzl.flower.mapper.flower.FlowerMapper;
+import com.mzl.flower.mapper.member.MemberMapper;
 import com.mzl.flower.service.BaseService;
 import com.mzl.flower.utils.TreeBuilderUtil;
 import io.micrometer.core.instrument.util.StringUtils;
@@ -154,7 +157,11 @@
         List<FlowerCategoryTreeDTO> treeList = new ArrayList<>();
         List<FlowerCategoryTreeDTO> result = new ArrayList<>();
         if(tLs != null && tLs.size() > 0){
-            Long partnerId = getCurrentCustomerPartner();
+            Customer p = getCurrentCustomerWithoutCheck();
+            Long partnerId = p == null ? null : p.getPartnerId();
+            Long levelId = p == null ? null : p.getLevelId();
+            Member member = getMember(levelId);
+
             for(FlowerCategoryTreeDTO t : tLs){
                 if(t.getParentId() != null && t.getFlowerCount() == 0){
                     continue;
@@ -165,6 +172,8 @@
                     JSONObject o = parseObject(ppp, JSONObject.class);
                     t.setPriceLow(o.getBigDecimal("priceLow"));
                     t.setPriceHigh(o.getBigDecimal("priceHigh"));
+                    t.setPriceLowMember(calculateMemberPrice(t.getPriceLow(), member));
+                    t.setPriceHighMember(calculateMemberPrice(t.getPriceHigh(), member));
                 }
 
                 treeList.add(t);
diff --git a/src/main/java/com/mzl/flower/service/flower/FlowerService.java b/src/main/java/com/mzl/flower/service/flower/FlowerService.java
index d7b2ea7..3a25854 100644
--- a/src/main/java/com/mzl/flower/service/flower/FlowerService.java
+++ b/src/main/java/com/mzl/flower/service/flower/FlowerService.java
@@ -11,6 +11,7 @@
 import com.mzl.flower.entity.customer.Collect;
 import com.mzl.flower.entity.customer.Customer;
 import com.mzl.flower.entity.flower.*;
+import com.mzl.flower.entity.menber.Member;
 import com.mzl.flower.entity.payment.Cart;
 import com.mzl.flower.entity.payment.Order;
 import com.mzl.flower.entity.payment.OrderItem;
@@ -214,6 +215,7 @@
         } else {
             g.setPrice(dto.getPrice());
             g.setStock(dto.getStock());
+            g.setLimited(dto.getLimited());
         }
 
         g.update(SecurityUtils.getUserId());
@@ -245,6 +247,7 @@
     public Long editFlowerAdmin(FlowerUpdateAdminDTO dto){
         Flower g = flowerMapper.selectById(dto.getId());
         g.setSales(dto.getSales());
+        g.setLimited(dto.getLimited());
         g.update(SecurityUtils.getUserId());
         flowerMapper.updateById(g);
 
@@ -406,8 +409,6 @@
             dto.setZoneName(String.join(",", zoneNameLs));
         }
 
-        //TODO 合伙人加价列表
-
         return dto;
     }
 
@@ -465,6 +466,9 @@
     public void deleteFlower(Long id){
 
         final Flower flower = flowerMapper.selectById(id);
+        if(flower == null){
+            throw new ValidationException("商品未找到");
+        }
 
         flowerMapper.deleteById(id);
 
@@ -552,20 +556,7 @@
         dto.setUserId(SecurityUtils.getUserId());
         dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory()));
         List<FlowerShowListDTO> ls = flowerMapper.selectFlowerShowList(page, dto);
-        if(ls != null && ls.size() > 0){
-            Long partnerId = getCurrentCustomerPartner();
-            for(FlowerShowListDTO s : ls){
-                BigDecimal price = getFinalPrice(partnerId, s.getCategory()
-                        , s.getId(), s.getPrice(), s.getLevel());
-                s.setPrice(price);
-                s.setCollection(s.getCollectCount() > 0);
-                s.setShopnum(s.getShopnum() == null ? 0 : s.getShopnum());
-
-                if(s.getSales() != null && s.getRealSales() != null){
-                    s.setSales(s.getSales() + s.getRealSales());
-                }
-            }
-        }
+        prepareShowList(ls);
 
         page.setRecords(ls);
 
@@ -592,10 +583,14 @@
         if(pId == null){
             pId = getCurrentCustomerPartner();
         }
+        Customer p = getCurrentCustomerWithoutCheck();
+        Long levelId = p == null ? null : p.getLevelId();
+        Member member = getMember(levelId);
 
         BigDecimal price = getFinalPrice(pId, dto.getCategory()
                 , dto.getId(), dto.getPrice(), dto.getLevel());
         dto.setPrice(price);
+        dto.setPriceMember(calculateMemberPrice(price, member));
 
         String userId = SecurityUtils.getUserId();
         if(StringUtils.isNotEmpty(userId)) {
@@ -696,8 +691,33 @@
 
         dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory()));
         List<FlowerShowListDTO> flowerShowListDTOS = flowerMapper.myCollect(page, dto);
+        prepareShowList(flowerShowListDTOS);
+
         page.setRecords(flowerShowListDTOS);
         return page;
+    }
+
+    private void prepareShowList(List<FlowerShowListDTO> ls){
+        if(ls != null && ls.size() > 0){
+            Customer p = getCurrentCustomerWithoutCheck();
+            Long partnerId = p == null ? null : p.getPartnerId();
+            Long levelId = p == null ? null : p.getLevelId();
+            Member member = getMember(levelId);
+
+            for(FlowerShowListDTO s : ls){
+                BigDecimal price = getFinalPrice(partnerId, s.getCategory()
+                        , s.getId(), s.getPrice(), s.getLevel());
+                s.setPrice(price);
+                s.setPriceMember(calculateMemberPrice(price, member));
+
+                s.setCollection(s.getCollectCount() > 0);
+                s.setShopnum(s.getShopnum() == null ? 0 : s.getShopnum());
+
+                if(s.getSales() != null && s.getRealSales() != null){
+                    s.setSales(s.getSales() + s.getRealSales());
+                }
+            }
+        }
     }
 
     public Page<FlowerShowListDTO> myBrowseHistory(Page page, FlowerShowQueryDTO dto) {
@@ -711,6 +731,8 @@
         }*/
         dto.setParamId(paramService.getParamIdByCategoryId(dto.getCategory()));
         List<FlowerShowListDTO> flowerShowListDTOS = flowerMapper.myBrowseHistory(page, dto);
+        prepareShowList(flowerShowListDTOS);
+
         page.setRecords(flowerShowListDTOS);
         return page;
     }
@@ -719,7 +741,8 @@
         if(dto.getZoneId()!=null && dto.getZoneId().size()>0){//添加专区
             for (Long zoneId : dto.getZoneId()) {
                 for(Long flowerId : dto.getIds()) {
-                    FlowerZoneMap fzp = flowerZoneMapMapper.selectOne(new QueryWrapper<FlowerZoneMap>().eq("flower_id", flowerId).eq("zone_id", zoneId));
+                    FlowerZoneMap fzp = flowerZoneMapMapper.selectOne(new QueryWrapper<FlowerZoneMap>()
+                            .eq("flower_id", flowerId).eq("zone_id", zoneId));
                     if(fzp==null){
                         fzp = new FlowerZoneMap();
                         fzp.setFlowerId(flowerId);
@@ -854,5 +877,17 @@
         return flowerDeleteDO;
     }
 
+    public void setFlowersLimited(FlowerLimitedDTO dto) {
+        List<Long> ids = dto.getIds();
+        if (ids == null || ids.size() == 0) {
+            throw new ValidationException("请选择商品");
+        }
+        for (Long id : ids) {
+            Flower f = flowerMapper.selectById(id);
+            f.setLimited(dto.getLimited());
+            flowerMapper.updateById(f);
+        }
+    }
+
 
 }
diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java
new file mode 100644
index 0000000..573ebaf
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponRecordServiceImpl.java
@@ -0,0 +1,552 @@
+package com.mzl.flower.service.impl.coupon;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
+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.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponRecordVO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.enums.*;
+import com.mzl.flower.mapper.coupon.CouponRecordMapper;
+import com.mzl.flower.mapper.coupon.CouponRecordMapperCustom;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.service.coupon.CouponRecordService;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.service.customer.CustomerService;
+import com.mzl.flower.service.system.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-27
+ */
+@Slf4j
+@Service
+public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, CouponRecordDO> implements CouponRecordService {
+
+    @Autowired
+    private CouponRecordMapperCustom couponRecordMapperCustom;
+
+    @Autowired
+    private CouponTemplateService2 couponTemplateService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private CustomerMapper customerMapper;
+
+    @Autowired
+    private CustomerService customerService;
+
+
+    @Override
+    public List<CouponRecordVO> getList(QueryCouponRecordDTO dto) {
+        return couponRecordMapperCustom.getList(dto);
+    }
+
+    @Autowired
+    RedissonClient redissonClient;
+
+    private static final String COUPON_KEY="com:mzl:flower:service:impl:coupon:%s";
+
+    @Transactional
+    @Override
+    public boolean createCouponRecord(CreateCouponRecordDTO dto) {
+
+        final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+        if(couponTemplateDO==null){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        final Customer customer = customerMapper.selectById(dto.getCustomerId());
+        if(null==customer){
+            throw new ValidationException("商户信息不存在");
+        }
+
+        RLock lock = redissonClient.getLock(String.format(COUPON_KEY, couponTemplateDO.getId()));
+        try {
+            // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒
+            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
+                try {
+                    // 活动优惠券和积分优惠券需要根据库存来控制- 根据优惠券的发放数量来控制有没有超发
+                    if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && (
+                            couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) || couponTemplateDO.getCategory().equals(CouponCategoryEnum.POINT.getStatus())
+                    )){
+                        // 获取当前优惠券已经领取的数量
+                        final Integer gainTotal = getExistGainCouponRecordAmountById(couponTemplateDO.getId());
+                        if(couponTemplateDO.getCouponAmount().compareTo(gainTotal)<=0){
+                            throw new ValidationException("当前优惠券已经领完!");
+                        }
+                    }
+
+                    // 根据用户领取设置的getLimit 查看当前用户是否已经超领优惠券
+                    if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus()) ){
+                        // 查看当前优惠券的领取时间在不在设置的领取时间范围类
+                        LocalDateTime now = LocalDateTime.now();
+                        // 判断当前时间是否在领取时间范围内
+                        if (!(now.isAfter(couponTemplateDO.getGetStartDate()) && now.isBefore(couponTemplateDO.getGetEndDate()))) {
+                            throw new ValidationException("当前时间不在优惠券的领取时间范围内,无法操作!");
+                        }
+
+                        // 获取当前优惠券已经领取的数量
+                        final Integer customGainTotal = getUserGainCouponRecordAmountById(couponTemplateDO.getId(),customer.getId());
+                        if(couponTemplateDO.getGetLimit().compareTo(customGainTotal)<=0){
+                            throw new ValidationException("超出个人领取限制,每人限领"+couponTemplateDO.getGetLimit()+"张!");
+                        }
+                    }
+
+
+                    CouponRecordDO couponRecordDO=new CouponRecordDO();
+                    BeanUtils.copyProperties(dto,couponRecordDO);
+                    couponRecordDO.create(SecurityUtils.getUserId());
+                    // 设置为待使用状态
+                    couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType());
+
+                    // 根据商户设置用户id
+                    if(StringUtils.isBlank(dto.getUserId()) && StringUtils.isNotBlank(customer.getUserId())){
+                        couponRecordDO.setUserId(customer.getUserId());
+                    }
+
+                    // 优惠券字段冗余
+                    couponRecordDO.setCategory(couponTemplateDO.getCategory());
+                    couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode());
+                    couponRecordDO.setCouponName(couponTemplateDO.getCouponName());
+                    couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue());
+                    couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount());
+                    couponRecordDO.setGetType(couponTemplateDO.getGetType());
+                    couponRecordDO.setCouponDiscountType(couponTemplateDO.getCouponDiscountType());
+                    couponRecordDO.setGetUserType(couponTemplateDO.getGetUserType());
+                    couponRecordDO.setPoint(couponTemplateDO.getPoint());
+                    couponRecordDO.setMemberId(couponTemplateDO.getMemberId());
+                    couponRecordDO.setImageUrl(couponTemplateDO.getImageUrl());
+
+
+                    // 根据优惠券模板来计算优惠券的生效开始时间和结束时间
+                    if(StringUtils.isNotBlank(couponTemplateDO.getCategory()) && couponTemplateDO.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){
+                        // 如果是会员优惠券的话,则设置为优惠券的使用条件为优惠券的时间
+                        couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate());
+                        couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate());
+                    }else{
+                        // 非会员的根据领取时间类型来计算优惠券的时间
+                        if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET.getType())){
+                            // 与领取时间一致
+                            couponRecordDO.setEffectiveStart(couponTemplateDO.getGetStartDate());
+                            couponRecordDO.setEffectiveEnd(couponTemplateDO.getGetEndDate());
+                        }
+                        if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.FIXED.getType())){
+                            // 固定时间
+                            couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate());
+                            couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate());
+                        }
+                        if(StringUtils.isNotBlank(couponTemplateDO.getUsageType()) && couponTemplateDO.getUsageType().equals(CouponUsageTypeEnum.GET_AFTER_TIME.getType())){
+                            // 领取后有段时间 领取后有效时间
+                            // 根据发放后有效期来设置时间
+                            if (couponTemplateDO.getUsageTimeNum() == null || couponTemplateDO.getUsageTimeNum() <= 0) {
+                                throw new ValidationException("使用时间数量必须为正整数");
+                            }
+                            LocalDateTime currentTime = LocalDateTime.now();
+                            couponRecordDO.setEffectiveStart(currentTime);
+                            if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.DAY.getType())) {
+                                // 天
+                                couponRecordDO.setEffectiveEnd(currentTime.plusDays(couponTemplateDO.getUsageTimeNum()));
+                            }
+                            if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.HOUR.getType())) {
+                                // 小时
+                                couponRecordDO.setEffectiveEnd(currentTime.plusHours(couponTemplateDO.getUsageTimeNum()));
+                            }
+                            if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.MINUTE.getType())) {
+                                // 分钟
+                                couponRecordDO.setEffectiveEnd(currentTime.plusMinutes(couponTemplateDO.getUsageTimeNum()));
+                            }
+
+                        }
+                    }
+
+                    // 手动设置ID
+                    couponRecordDO.setId(IdUtil.simpleUUID());
+                    return baseMapper.insert(couponRecordDO)>0;
+
+                } finally {
+                    lock.unlock();
+                }
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            // 处理异常
+        }
+
+        return false;
+
+    }
+
+    @Override
+    public boolean updateCouponRecord(CreateCouponRecordDTO dto) {
+        CouponRecordDO couponRecordDO=baseMapper.selectById(dto.getId());
+        BeanUtils.copyProperties(dto,couponRecordDO);
+        couponRecordDO.update(SecurityUtils.getUserId());
+
+        // 优惠券字段冗余
+        final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+        if(null!=couponTemplateDO){
+            couponRecordDO.setCategory(couponTemplateDO.getCategory());
+            couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode());
+            couponRecordDO.setCouponName(couponTemplateDO.getCouponName());
+            couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue());
+            couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount());
+        }
+
+
+        return baseMapper.updateById(couponRecordDO)>0;
+    }
+
+    @Override
+    public boolean deleteCouponRecord(String id) {
+        return baseMapper.deleteById(id)>0;
+    }
+
+    @Override
+    public CouponRecordVO getCouponRecordById(String id) {
+        QueryCouponRecordDTO dto=new QueryCouponRecordDTO();
+        dto.setId(id);
+        final List<CouponRecordVO> list = couponRecordMapperCustom.getList(dto);
+        if(CollectionUtils.isNotEmpty(list)){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public Page<CouponRecordVO> getPage(Page page, QueryCouponRecordDTO dto) {
+        List<CouponRecordVO> result=couponRecordMapperCustom.getPage(page,dto);
+        return page.setRecords(result);
+    }
+
+    @Transactional
+    @Override
+    public boolean grantVipCouponRecordList() {
+
+        try{
+
+            LocalDateTime now = LocalDateTime.now();
+            LocalDateTime firstDayStart = now.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0);
+            LocalDateTime lastDayEnd = now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59).withNano(0);
+
+            // 获取所有会员模版列表
+            List<CouponTemplateDO> vipTemplateList= couponTemplateService.getVipCouponTemplate();
+
+            // 遍历所有相同等级用户信息,并根据优惠券设置的规则构造优惠券
+            final List<CouponTemplateDO> updateCouponTemplateList = vipTemplateList.stream().map(couponTemplateDO -> {
+                // 获取当前等级下的所有用户
+                final List<Customer> customerList = customerService.getCustomerListByLevelId(couponTemplateDO.getMemberId());
+
+                final List<CouponRecordDO> gradeCouponRecordList = customerList.stream().map(customer -> {
+                    CouponRecordDO couponRecordDO = new CouponRecordDO();
+                    BeanUtils.copyProperties(couponTemplateDO, couponRecordDO);
+                    couponRecordDO.setId(IdUtil.simpleUUID());
+                    couponRecordDO.setCouponId(couponTemplateDO.getId());
+                    couponRecordDO.setUserId(customer.getUserId());
+                    couponRecordDO.setCustomerId(customer.getId());
+                    couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType());
+                    couponRecordDO.setEffectiveStart(firstDayStart);
+                    couponRecordDO.setEffectiveEnd(lastDayEnd);
+                    couponRecordDO.setMemberId(couponTemplateDO.getMemberId());
+                    couponRecordDO.setImageUrl(couponTemplateDO.getImageUrl());
+                    // 创建信息
+                    couponRecordDO.create();
+                    if(!checkCurMonVipCouponExists(couponRecordDO.getCouponId(),couponRecordDO.getCustomerId(),firstDayStart,lastDayEnd)){
+                        return couponRecordDO;
+                    }else{
+                        return null;
+                    }
+
+                }).filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+
+                // 批量保存等级下的优惠券信息
+                saveBatch(gradeCouponRecordList);
+
+                couponTemplateDO.setUsageStartDate(firstDayStart);
+                couponTemplateDO.setUsageEndDate(lastDayEnd);
+                couponTemplateDO.setGetStartDate(firstDayStart);
+                couponTemplateDO.setGetEndDate(lastDayEnd);
+
+                // 设置总数为当前会员的人数
+                couponTemplateDO.setCouponAmount(CollectionUtils.isNotEmpty(customerList)?customerList.size():0);
+
+                // 设置默认类型固定
+                couponTemplateDO.setUsageType(CouponUsageTypeEnum.FIXED.getType());
+
+                return couponTemplateDO;
+
+            }).collect(Collectors.toList());
+
+            // 批量更新原模版时间
+            couponTemplateService.updateBatchById(updateCouponTemplateList);
+
+            return true;
+        }catch (Exception e){
+            // 报错日志信息报错
+            log.error(e.getMessage());
+            return false;
+        }
+    }
+
+    @Override
+    public boolean expiredCouponRecordLastMon() {
+
+        try{
+            LocalDateTime now = LocalDateTime.now();
+            LocalDateTime firstDayStart = now.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0);
+            LocalDateTime lastDayEnd = now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59).withNano(0);
+
+            // 只要找出时间小于当月的首天的设置成过期就可以
+
+            QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+            queryWrapper.lambda().eq(CouponRecordDO::getOrderId,"")
+                    .lt(CouponRecordDO::getEffectiveEnd,firstDayStart);
+
+            final List<CouponRecordDO> couponRecordDOS = baseMapper.selectList(queryWrapper);
+
+            final List<CouponRecordDO> expiredCouponRecordList = couponRecordDOS.stream().map(couponRecordDO -> {
+                couponRecordDO.setStatus(CouponUsedStatusEnum.EXPIRED.getType());
+                return couponRecordDO;
+            }).collect(Collectors.toList());
+
+            //更新
+            updateBatchById(expiredCouponRecordList);
+
+            return true;
+        }catch (Exception e){
+            log.error(e.getMessage());
+            return false;
+        }
+
+
+    }
+
+    @Override
+    public Integer statisCouponTemplateCount(QueryCouponStatisticsBO queryCouponStatisticsBO) {
+        return couponRecordMapperCustom.statisCouponTemplateCount(queryCouponStatisticsBO);
+    }
+    @Override
+    public Integer statisCouponTemplateCurMonCount(QueryCouponStatisticsBO queryCouponStatisticsBO) {
+        return couponRecordMapperCustom.statisCouponTemplateCurMonCount(queryCouponStatisticsBO);
+    }
+
+    @Override
+    public Integer statisCouponPointCurMonPontAmonut(QueryCouponStatisticsBO queryCouponStatisticsBO) {
+        return couponRecordMapperCustom.statisCouponPointCurMonPointAmonut(queryCouponStatisticsBO);
+    }
+
+    @Override
+    public Integer getExistCouponAmount(QueryExistCouponDTO dto) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(StringUtils.isNotBlank(dto.getCouponId()), CouponRecordDO::getCouponId,dto.getCouponId())
+                .eq(null!=dto.getCustomerId(),CouponRecordDO::getCustomerId,dto.getCustomerId())
+                .eq(StringUtils.isNotBlank(dto.getCategory()),CouponRecordDO::getCategory,dto.getCategory());
+
+        return baseMapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public Integer getExistGainCouponRecordAmountById(String couponId) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(StringUtils.isNotBlank(couponId), CouponRecordDO::getCouponId,couponId)
+                ;
+        return baseMapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public Integer getUserGainCouponRecordAmountById(String couponId, Long customerId) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(StringUtils.isNotBlank(couponId), CouponRecordDO::getCouponId,couponId)
+                .eq(null!=customerId,CouponRecordDO::getCustomerId,customerId)
+                ;
+
+        return baseMapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public Integer getUserGainCouponRecordAmountByUserId(String couponId, String userId) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(StringUtils.isNotBlank(couponId), CouponRecordDO::getCouponId,couponId)
+                .eq(null!=userId,CouponRecordDO::getUserId,userId)
+        ;
+
+        return baseMapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public List<CouponRecordVO> getMineCouponRecordList(QueryMineCouponRecordDTO dto) {
+        checkCouponExpired(dto);
+        return couponRecordMapperCustom.getMineCouponRecordList(dto);
+    }
+
+    @Override
+    public void checkCouponExpired(QueryMineCouponRecordDTO dto) {
+        if(StringUtils.isBlank(dto.getUserId())){
+            dto.setUserId(SecurityUtils.getUserId());
+        }
+        // 将未使用的优惠券直接过期
+        couponRecordMapperCustom.checkCouponExpired(dto);
+    }
+
+    @Override
+    public boolean checkCurMonVipCouponExists(String couponId, Long customId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
+
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime firstDayStart = now.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0).withNano(0);
+        LocalDateTime lastDayEnd = now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59).withNano(0);
+        if(null==startDateTime){
+            startDateTime=firstDayStart;
+        }
+        if(null==endDateTime){
+            endDateTime=lastDayEnd;
+        }
+
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted,TrueOrFalseEnum.FALSE.isFlag())
+                .eq(CouponRecordDO::getCouponId,couponId)
+                .eq(CouponRecordDO::getCustomerId,customId)
+                .eq(CouponRecordDO::getEffectiveStart,startDateTime)
+                .eq(CouponRecordDO::getEffectiveEnd,endDateTime);
+        return  baseMapper.selectCount(queryWrapper)>0;
+
+    }
+
+    @Transactional
+    @Override
+    public boolean useCoupon(String couponId, String orderId, BigDecimal orderMount) {
+        // 优惠券为空
+        if(StringUtils.isBlank(couponId)){
+            throw new ValidationException("无效的优惠券");
+        }
+        if(StringUtils.isBlank(orderId)){
+            throw new ValidationException("订单id不能为空");
+        }
+        if(orderMount.compareTo(BigDecimal.ZERO)<=0){
+            throw new ValidationException("订单金额不能小于0");
+        }
+
+        // 验证优惠券存在且有效
+        final CouponRecordDO couponRecordDO = baseMapper.selectById(couponId);
+        if(null==couponRecordDO || StringUtils.isNotBlank(couponRecordDO.getOrderId()) ){
+            throw new ValidationException("无效的优惠券");
+        }
+
+        if(couponRecordDO.getStatus().equals(CouponUsedStatusEnum.USED.getType())){
+            throw new ValidationException("优惠券已经被使用");
+        }
+        if(couponRecordDO.getStatus().equals(CouponUsedStatusEnum.EXPIRED.getType()) || LocalDateTime.now().isAfter(couponRecordDO.getEffectiveEnd())){
+            throw new ValidationException("优惠券已过期");
+        }
+
+        // 根据类型判断是无门槛还是满减,如果是无门槛
+        if(couponRecordDO.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType())){
+            // 无门槛,查看金额是否大于满减值
+            if(orderMount.compareTo(couponRecordDO.getCouponDiscountValue())<0){
+                throw new ValidationException(String.format("订单金额(%s)小于无门槛的金额(%s)", orderMount, couponRecordDO.getCouponDiscountValue()));
+            }
+        }
+
+        if(couponRecordDO.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())){
+            //满减,查看金额是否满足最小订单额
+            if(orderMount.compareTo(couponRecordDO.getMinOrderAmount())<0){
+                throw new ValidationException(String.format("订单金额(%s)小于最低折扣订单金额(%s)", orderMount, couponRecordDO.getMinOrderAmount()));
+            }
+
+            if(orderMount.compareTo(couponRecordDO.getCouponDiscountValue())<0){
+                throw new ValidationException(String.format("订单金额(%s)小于折扣的金额(%s)", orderMount, couponRecordDO.getCouponDiscountValue()));
+            }
+        }
+
+        // 查看当前的优惠券是否是当前人员的
+        if(!SecurityUtils.getUserId().equals(couponRecordDO.getUserId())){
+            throw new ValidationException("优惠券不属于当前人员");
+        }
+
+        // 优惠券使用操作
+        couponRecordDO.setStatus(CouponUsedStatusEnum.USED.getType());
+        couponRecordDO.setUsedTime(LocalDateTime.now());
+        couponRecordDO.setOrderId(orderId);
+
+        return baseMapper.updateById(couponRecordDO)>0;
+
+    }
+
+
+    @Transactional
+    @Override
+    public boolean cancelCouponUsage(String orderId) {
+        // 查询订单使用的优惠券
+        final CouponRecordDO couponRecordDO = getCouponByOrderId(orderId);
+        if(null==couponRecordDO){
+            return false;
+        }
+        log.info("优惠券退回之前:"+ JSON.toJSONString(couponRecordDO));
+        couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType());
+        couponRecordDO.setUsedTime(null);
+        couponRecordDO.setOrderId(null);
+        log.info("优惠券退回之后:"+ JSON.toJSONString(couponRecordDO));
+        return baseMapper.updateById(couponRecordDO)>0;
+    }
+
+    @Override
+    public List<CouponRecordDO> getCouponListByOrderId(String orderId) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted,TrueOrFalseEnum.FALSE.isFlag())
+                .eq(CouponRecordDO::getOrderId,orderId);
+
+        return baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public CouponRecordDO getCouponByOrderId(String orderId) {
+        final List<CouponRecordDO> couponRecordDOList = getCouponListByOrderId(orderId);
+        if(CollectionUtils.isNotEmpty(couponRecordDOList)){
+            return couponRecordDOList.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public boolean checkUserCouponExists(String couponId, Long customId) {
+        QueryWrapper<CouponRecordDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponRecordDO::getDeleted,TrueOrFalseEnum.FALSE.isFlag())
+                .eq(CouponRecordDO::getCouponId,couponId)
+                .eq(CouponRecordDO::getCustomerId,customId)
+        ;
+        return baseMapper.selectCount(queryWrapper)>0;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateCustomerServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateCustomerServiceImpl.java
new file mode 100644
index 0000000..61177ea
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateCustomerServiceImpl.java
@@ -0,0 +1,51 @@
+package com.mzl.flower.service.impl.coupon;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.mapper.coupon.CouponTemplateCustomerMapper;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.service.coupon.CouponTemplateCustomerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-24
+ */
+@Service
+public class CouponTemplateCustomerServiceImpl extends ServiceImpl<CouponTemplateCustomerMapper, CouponTemplateCustomerDO> implements CouponTemplateCustomerService {
+
+    @Autowired
+    private CustomerMapper customerMapper;
+
+    @Override
+    public List<CouponTemplateCustomerDO> getPointCustomReList(String id) {
+        QueryWrapper<CouponTemplateCustomerDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponTemplateCustomerDO::getCouponId,id);
+        return baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public boolean deleteByCouponTemplateId(String couponTemplateId) {
+        QueryWrapper<CouponTemplateCustomerDO> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(CouponTemplateCustomerDO::getCouponId,couponTemplateId);
+        return baseMapper.delete(queryWrapper)>0;
+    }
+
+    @Override
+    public List<Customer> getPointCustomerList(String id) {
+        final List<CouponTemplateCustomerDO> pointCustomReList = getPointCustomReList(id);
+        final List<Long> customerList = pointCustomReList.stream().map(CouponTemplateCustomerDO::getCustomId).collect(Collectors.toList());
+        final List<Customer> customers = customerMapper.selectBatchIds(customerList);
+        return customers;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
new file mode 100644
index 0000000..b33c44a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/impl/coupon/CouponTemplateServiceImpl2.java
@@ -0,0 +1,493 @@
+package com.mzl.flower.service.impl.coupon;
+
+import cn.hutool.core.util.IdUtil;
+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.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponPointStatisVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateCustomerVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import com.mzl.flower.entity.coupon.CouponTemplateCustomerDO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import com.mzl.flower.enums.*;
+import com.mzl.flower.mapper.coupon.CouponTemplateMapper;
+import com.mzl.flower.mapper.coupon.CouponTemplateMapperCustom;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
+import com.mzl.flower.service.coupon.CouponRecordService;
+import com.mzl.flower.service.coupon.CouponTemplateCustomerService;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.service.menber.MemberService;
+import com.mzl.flower.service.payment.RedisLockService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@Service
+public class CouponTemplateServiceImpl2 extends ServiceImpl<CouponTemplateMapper, CouponTemplateDO> implements CouponTemplateService2 {
+
+    @Autowired
+    private CouponTemplateMapperCustom couponTemplateMapperCustom;
+
+    @Autowired
+    private CouponTemplateCustomerService pointCustomReService;
+
+    @Autowired
+    private CouponRecordService couponRecordService;
+
+    @Autowired
+    private CustomerMapper customerMapper;
+
+    @Autowired
+    private CustomerPointMapper customerPointMapper;
+
+    @Autowired
+    private CouponTemplateService2 couponTemplateService;
+
+    @Autowired
+    private CustomerPointDetailMapper customerPointDetailMapper;
+
+    @Autowired
+    private MemberService memberService;
+
+    @Autowired
+    private RedisLockService lockService;
+
+
+
+    @Transactional
+    @Override
+    public boolean createCouponTemplate(CreateCouponTemplateBO dto) {
+        CouponTemplateDO couponTemplateDO = new CouponTemplateDO();
+        BeanUtils.copyProperties(dto, couponTemplateDO);
+        // 设置id,关联使用到的id
+        couponTemplateDO.setId(IdUtil.simpleUUID());
+
+        couponTemplateDO.create(SecurityUtils.getUserId());
+        if (StringUtils.isBlank(dto.getStatus())) {
+            // 优惠券状态 初始化为未激活状态
+            couponTemplateDO.setStatus(CouponStatusEnum.INACTIVE.getStatus());
+        }
+
+        // 指定会员:需要添加制定用户的关联信息
+        if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
+
+            final List<CouponTemplateCustomerDO> couponCustomList = dto.getPointCostomIdList().stream().map(customId -> {
+                CouponTemplateCustomerDO customReDO = new CouponTemplateCustomerDO();
+                // 解决本地不加ID不报错,线上报错问题
+                customReDO.setId(IdUtil.simpleUUID());
+                customReDO.setCouponId(couponTemplateDO.getId());
+                customReDO.setCustomId(customId);
+                return customReDO;
+            }).collect(Collectors.toList());
+
+            // 批量插入 优惠券与指定用户关联关系
+            pointCustomReService.saveBatch(couponCustomList);
+
+            // 设置优惠券的数量
+            couponTemplateDO.setCouponAmount(dto.getPointCostomIdList().size());
+
+        }
+
+        return baseMapper.insert(couponTemplateDO) > 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateCouponTemplate(CreateCouponTemplateBO dto) {
+        CouponTemplateDO couponTemplateDO = baseMapper.selectById(dto.getId());
+        BeanUtils.copyProperties(dto, couponTemplateDO);
+        couponTemplateDO.update(SecurityUtils.getUserId());
+
+        if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
+            // 根据优惠券的信息删除关联信息
+            pointCustomReService.deleteByCouponTemplateId(couponTemplateDO.getId());
+        }
+        // 指定会员:需要添加制定用户的关联信息
+        if (CollectionUtils.isNotEmpty(dto.getPointCostomIdList())) {
+
+            final List<CouponTemplateCustomerDO> couponCustomList = dto.getPointCostomIdList().stream().map(customId -> {
+                CouponTemplateCustomerDO customReDO = new CouponTemplateCustomerDO();
+                // 解决本地不加ID不报错,线上报错问题
+                customReDO.setId(IdUtil.simpleUUID());
+                customReDO.setCouponId(couponTemplateDO.getId());
+                customReDO.setCustomId(customId);
+                return customReDO;
+            }).collect(Collectors.toList());
+
+            // 批量插入 优惠券与指定用户关联关系
+            pointCustomReService.saveBatch(couponCustomList);
+
+            // 设置优惠券总数当前人数
+            couponTemplateDO.setCouponAmount(couponCustomList.size());
+
+        }
+
+
+        return baseMapper.updateById(couponTemplateDO) > 0;
+    }
+
+    @Override
+    public List<CouponTemplateVO> getList(QueryCouponDTO dto) {
+
+        List<CouponTemplateVO> list =new ArrayList<>();
+        if(StringUtils.isNotBlank(dto.getCategory())
+                && dto.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())
+        ){
+            // 会员优惠券
+            list = couponTemplateMapperCustom.getVipList(dto);
+        }else{
+            list = couponTemplateMapperCustom.getList(dto);
+        }
+        return list;
+    }
+
+    @Override
+    public Page<CouponTemplateVO> getPage(Page page, QueryCouponDTO dto) {
+        List<CouponTemplateVO> result =new ArrayList<>();
+        if(StringUtils.isNotBlank(dto.getCategory())
+                && dto.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())
+        ){
+            // 会员优惠券
+            result = couponTemplateMapperCustom.getCouponTemplateVipPage(page, dto);
+        }else{
+            result = couponTemplateMapperCustom.getCouponTemplatePage(page, dto);
+        }
+        return page.setRecords(result);
+    }
+
+    @Override
+    public CouponTemplateVO getDetailById(String id) {
+        QueryCouponDTO dto = new QueryCouponDTO();
+        dto.setId(id);
+        final List<CouponTemplateVO> list = getList(dto);
+        if (CollectionUtils.isNotEmpty(list)) {
+            CouponTemplateVO vo =list.get(0);
+            // 用户获取
+            if(StringUtils.isNotBlank(vo.getCategory())
+                  &&  vo.getCategory().equals(CouponCategoryEnum.USER.getStatus())){
+                List<CouponTemplateCustomerVO> customerList= couponTemplateMapperCustom.getCouponCustomerList(id);
+                vo.setCustomerList(customerList);
+            }
+            // 会员等级
+            if(StringUtils.isNotBlank(vo.getCategory()) && null!=vo.getMemberId()
+                    &&  vo.getCategory().equals(CouponCategoryEnum.MEMBER.getStatus())){
+                final Member member = memberService.getById(vo.getMemberId());
+                if(null!=member){
+                    vo.setMember(member);
+                    vo.setMemberName(member.getName());
+                }
+
+            }
+
+            return vo;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean deleteCouponTemplate(String id) {
+        return baseMapper.deleteById(id) > 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean activeCouponTemplate(String id) {
+
+        CouponTemplateDO couponTemplateDO = baseMapper.selectById(id);
+        couponTemplateDO.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+
+        // 判断当前的优惠券的用户类型是指定用户还是全部用户,如果是指定用户的情况下需要发布优惠券
+        if (StringUtils.isNotBlank(couponTemplateDO.getGetUserType())
+                && StringUtils.isNotBlank(couponTemplateDO.getCategory())
+                && couponTemplateDO.getGetUserType().equals(CouponGetUserTypeEnum.TARGET.getType())
+                && couponTemplateDO.getCategory().equals(CouponCategoryEnum.USER.getStatus())
+        ) {
+
+            // 获取当前优惠券下的指定人员信息
+            List<CouponTemplateCustomerDO> couponTemplateCustomerDOList = pointCustomReService.getPointCustomReList(id);
+
+            if (CollectionUtils.isNotEmpty(couponTemplateCustomerDOList)) {
+
+                // 根据发放后有效期来设置时间
+                if (couponTemplateDO.getUsageTimeNum() == null || couponTemplateDO.getUsageTimeNum() <= 0) {
+                    throw new ValidationException("使用时间数量必须为正整数");
+                }
+                LocalDateTime currentTime = LocalDateTime.now();
+                couponTemplateDO.setUsageStartDate(currentTime);
+                if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.DAY.getType())) {
+                    // 天
+                    couponTemplateDO.setUsageEndDate(currentTime.plusDays(couponTemplateDO.getUsageTimeNum()));
+                }
+                if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.HOUR.getType())) {
+                    // 小时
+                    couponTemplateDO.setUsageEndDate(currentTime.plusHours(couponTemplateDO.getUsageTimeNum()));
+                }
+                if (couponTemplateDO.getUsageTimeType().equals(CouponUsageTimeTypeEnum.MINUTE.getType())) {
+                    // 分钟
+                    couponTemplateDO.setUsageEndDate(currentTime.plusMinutes(couponTemplateDO.getUsageTimeNum()));
+                }
+
+                // 优惠券的总数等于下发人员的总数
+                couponTemplateDO.setCouponAmount(couponTemplateCustomerDOList.size());
+
+                List<CouponRecordDO> couponUsageDOList = couponTemplateCustomerDOList.stream().map(pointCustomRe -> {
+
+                    CouponRecordDO couponRecordDO = new CouponRecordDO();
+
+                    couponRecordDO.setId(IdUtil.simpleUUID());
+                    couponRecordDO.setCouponId(pointCustomRe.getCouponId());
+                    couponRecordDO.setCustomerId(pointCustomRe.getCustomId());
+                    final Customer customer = customerMapper.selectById(pointCustomRe.getCustomId());
+                    if (null != customer && StringUtils.isNotBlank(customer.getUserId())) {
+                        // 设置所属用户id
+                        couponRecordDO.setUserId(customer.getUserId());
+                    }
+                    couponRecordDO.setStatus(CouponUsedStatusEnum.UNUSED.getType());
+
+                    // 设置优惠券的使用开始时间
+                    couponRecordDO.setEffectiveStart(couponTemplateDO.getUsageStartDate());
+                    // 设置优惠券的使用结束时间
+                    couponRecordDO.setEffectiveEnd(couponTemplateDO.getUsageEndDate());
+
+                    // 优惠券的冗余字段
+                    couponRecordDO.setCouponCode(couponTemplateDO.getCouponCode());
+                    couponRecordDO.setCouponName(couponTemplateDO.getCouponName());
+                    //  优惠券种类
+                    couponRecordDO.setCategory(couponTemplateDO.getCategory());
+                    couponRecordDO.setMinOrderAmount(couponTemplateDO.getMinOrderAmount());
+                    couponRecordDO.setCouponDiscountValue(couponTemplateDO.getCouponDiscountValue());
+                    couponRecordDO.setGetType(couponTemplateDO.getGetType());
+                    couponRecordDO.setCouponDiscountType(couponTemplateDO.getCouponDiscountType());
+                    couponRecordDO.setGetUserType(couponTemplateDO.getGetUserType());
+                    couponRecordDO.setPoint(couponTemplateDO.getPoint());
+                    couponRecordDO.setMemberId(couponTemplateDO.getMemberId());
+                    couponRecordDO.setImageUrl(couponTemplateDO.getImageUrl());
+
+                    // 创建相关信息
+                    couponRecordDO.create(SecurityUtils.getUserId());
+
+                    // 查看当前优惠券是不是已经存在,存在的话则不能添加,防止同一人员重复下发同一张指定的优惠券
+                    if(!couponRecordService.checkUserCouponExists(pointCustomRe.getCouponId(),pointCustomRe.getCustomId())){
+                        return couponRecordDO;
+                    }else{
+                        return null;
+                    }
+
+                }).filter(Objects::nonNull).collect(Collectors.toList());
+
+                // 批量保存优惠券信息
+                couponRecordService.saveBatch(couponUsageDOList);
+            }
+        }
+
+        // 如果是活动优惠券且领取渠道是Home类型的,那么只能设置当前优惠券为激活状态,其他优惠券是激活状态的设置为下架状态
+        if (StringUtils.isNotBlank(couponTemplateDO.getCategory())  && couponTemplateDO.getCategory().equals(CouponCategoryEnum.ACTIVITY.getStatus())
+                && StringUtils.isNotBlank(couponTemplateDO.getGetType()) && couponTemplateDO.getGetType().equals(CouponGetTypeEnum.HOME.getType())
+        ) {
+
+            couponTemplateMapperCustom.expireHomeActivityCouponTemplate();
+        }
+
+        return baseMapper.updateById(couponTemplateDO) > 0;
+    }
+
+    @Transactional
+    @Override
+    public boolean expireCouponTemplate(String id) {
+        CouponTemplateDO couponTemplateDO = baseMapper.selectById(id);
+        couponTemplateDO.setStatus(CouponStatusEnum.EXPIRED.getStatus());
+        return baseMapper.updateById(couponTemplateDO) > 0;
+    }
+
+    /**
+     * 获取所有会员优惠券模版
+     *
+     * @return
+     */
+    @Transactional
+    @Override
+    public List<CouponTemplateDO> getVipCouponTemplate() {
+        QueryWrapper<CouponTemplateDO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
+                .eq(CouponTemplateDO::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(CouponTemplateDO::getCategory, CouponCategoryEnum.MEMBER.getStatus())
+                .eq(CouponTemplateDO::getStatus, CouponStatusEnum.ACTIVE.getStatus());
+
+        return baseMapper.selectList(queryWrapper);
+
+    }
+
+    @Transactional
+    @Override
+    public boolean deleteBatchCouponTemplate(BatchCouponTemplateDTO dto) {
+
+        if (CollectionUtils.isNotEmpty(dto.getIdList())) {
+            dto.setUpdateBy(SecurityUtils.getUserId());
+            return couponTemplateMapperCustom.deleteBatchCouponTemplate(dto) > 0;
+        }
+        return false;
+    }
+
+    @Transactional
+    @Override
+    public boolean activeBatchCouponTemplate(BatchCouponTemplateDTO dto) {
+        if (CollectionUtils.isNotEmpty(dto.getIdList())) {
+            dto.setUpdateBy(SecurityUtils.getUserId());
+            return couponTemplateMapperCustom.activeBatchCouponTemplate(dto) > 0;
+        }
+        return false;
+    }
+
+    @Transactional
+    @Override
+    public boolean expireBatchCouponTemplate(BatchCouponTemplateDTO dto) {
+        if (CollectionUtils.isNotEmpty(dto.getIdList())) {
+            dto.setUpdateBy(SecurityUtils.getUserId());
+            return couponTemplateMapperCustom.expireBatchCouponTemplate(dto) > 0;
+        }
+        return false;
+    }
+
+    @Override
+    public CouponPointStatisVO statisCouponTemplatePoint(QueryCouponStatisticsBO queryCouponStatisticsBO) {
+        CouponPointStatisVO vo=new CouponPointStatisVO();
+        //优惠券总数
+        vo.setTotalAmount(couponRecordService.statisCouponTemplateCount(queryCouponStatisticsBO));
+        // 本月兑换优惠券总数
+        vo.setCurMonExchangeAmount(couponRecordService.statisCouponTemplateCurMonCount(queryCouponStatisticsBO));
+        // 本月兑换积分总数
+        vo.setCurMonExchangePointAmount(couponRecordService.statisCouponPointCurMonPontAmonut(queryCouponStatisticsBO));
+        return vo;
+    }
+
+    @Override
+    public List<CouponTemplateVO> getPointList(QueryActivePointCouponDTO dto) {
+        if(StringUtils.isBlank(dto.getOrderStr())){
+            dto.setOrderStr(" create_time desc ");
+        }
+        return couponTemplateMapperCustom.getCouponPointList(dto);
+    }
+
+    @Override
+    public Page<CouponTemplateVO> getPointPage(Page page, QueryActivePointCouponDTO dto) {
+        if(StringUtils.isBlank(dto.getOrderStr())){
+            dto.setOrderStr(" create_time desc ");
+        }
+        return couponTemplateMapperCustom.getPointPage(page,dto);
+    }
+
+    @Override
+    public  void exchangeCoupon(ExchangeCouponDTO dto) {
+
+        String key="EXCHANGE_COUPON:"+dto.getCouponId()+":"+SecurityUtils.getUserId();
+        boolean lock = lockService.getObjectLock(key, "");
+        if(!lock){
+            throw new ValidationException("系统操作频繁,请稍后重试");
+        }
+        try {
+            dto.setNum(1);
+            final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+            if(couponTemplateDO==null){
+                throw new ValidationException("优惠券不存在");
+            }
+
+            CustomerPoint cp = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+                    .eq(CustomerPoint::getUserId, SecurityUtils.getUserId()));
+            if(cp == null || (cp.getTotalPoint()-cp.getUsedPoint()-cp.getExpiredPoint()- cp.getExpiredPoint()) < couponTemplateDO.getPoint() * dto.getNum()){
+                throw new ValidationException("积分不足");
+            }
+
+            CreateCouponRecordDTO recordDTO =new CreateCouponRecordDTO();
+            recordDTO.setCouponId(dto.getCouponId());
+            recordDTO.setUserId(SecurityUtils.getUserId());
+            Customer customer = customerMapper.selectOne(new LambdaQueryWrapper<Customer>()
+                    .eq(Customer::getUserId, SecurityUtils.getUserId()));
+            if(customer == null){
+                throw new ValidationException("商户不存在");
+            }
+            recordDTO.setCustomerId(customer.getId());
+            couponRecordService.createCouponRecord(recordDTO);
+
+            //更新积分汇总
+            cp.setUsedPoint(cp.getUsedPoint()+couponTemplateDO.getPoint());
+            customerPointMapper.updateById(cp);
+
+            //记录积分明细
+            CustomerPointDetail detail = new CustomerPointDetail();
+            detail.setUserId(customer.getUserId());
+            detail.setCustomerId(customer.getId());
+            detail.setPoint(couponTemplateDO.getPoint());
+            detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
+            detail.setType(Constants.POINT_TYPE.exchange.name());
+            detail.setRecordDate(LocalDate.now());
+            detail.setRemarks(couponTemplateDO.getCouponName());
+            detail.create(SecurityUtils.getUserId());
+            customerPointDetailMapper.insert(detail);
+        }catch (Exception e){
+            throw new ValidationException("兑换失败");
+        }finally {
+            lockService.releaseObjectLock(key,"");
+        }
+
+    }
+
+    @Override
+    public CouponTemplateVO getHomeActivityEffectAlert(QueryActivityEffectCouponDTO dto) {
+
+        // 存在用户是空的情况
+        final CouponTemplateVO homeActivityEffectAlert = couponTemplateMapperCustom.getHomeActivityEffectAlert(dto);
+        if(null!=homeActivityEffectAlert ){
+            if(StringUtils.isNotBlank(SecurityUtils.getUserId()) ){
+                // 查看当前已经领取了几张
+                final Integer getCnt = couponRecordService.getUserGainCouponRecordAmountByUserId(homeActivityEffectAlert.getId(), SecurityUtils.getUserId());
+                // 如果当前领取的数量小于限制领取的数量的时候,可以再次领取
+                if(null!=homeActivityEffectAlert.getGetLimit() && null!=getCnt
+                        && homeActivityEffectAlert.getGetLimit().compareTo(getCnt)>0){
+                    return homeActivityEffectAlert;
+                }
+            }else{
+                return homeActivityEffectAlert;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public List<CouponTemplateVO> getActivityEffectList(QueryActivityEffectCouponDTO dto) {
+
+        return couponTemplateMapperCustom.getActivityEffectList(dto);
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/GrowthValueDeductionStrategy.java b/src/main/java/com/mzl/flower/service/menber/GrowthValueDeductionStrategy.java
new file mode 100644
index 0000000..6f00da3
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/GrowthValueDeductionStrategy.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.service.menber;
+
+import com.mzl.flower.entity.payment.Order;
+
+/**
+ * packageName com.mzl.flower.service.menber
+ * @author fanghaowei
+ * @version version2.0
+ * @className GrowthValueDeductionStrategy
+ * @date 2024/9/2
+ * @description 成长值扣除策略
+ */
+public interface GrowthValueDeductionStrategy {
+    public void deduct(Order order);
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/MemberGrowthRecordService.java b/src/main/java/com/mzl/flower/service/menber/MemberGrowthRecordService.java
new file mode 100644
index 0000000..f033d19
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/MemberGrowthRecordService.java
@@ -0,0 +1,32 @@
+package com.mzl.flower.service.menber;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.request.menber.MemberGrowthRecordDTO;
+import com.mzl.flower.dto.request.menber.MemberRecordQueryDTO;
+import com.mzl.flower.dto.request.menber.UserGrowthRecordDTO;
+import com.mzl.flower.dto.request.menber.UserMemberRecordQueryDTO;
+import com.mzl.flower.dto.response.member.MemberGrowthRecordVO;
+import com.mzl.flower.dto.response.member.UserGrowthRecordVO;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.entity.menber.MemberGrowthRecord;
+import com.mzl.flower.entity.payment.Order;
+
+
+public interface MemberGrowthRecordService extends IService<MemberGrowthRecord> {
+
+    void saveMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO);
+    void updateMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO);
+    void deleteMemberGrowthRecord(String id);
+    UserGrowthRecordDTO getInfoByUserId(String userId);
+
+    Page<MemberGrowthRecordVO> queryPage(MemberRecordQueryDTO memberRecordQueryDTO, Page page);
+
+    Member getMemberByUserId(String userId);
+
+    void growthValueDeduct(Order order);
+
+    Page<UserGrowthRecordVO> queryUserPage(UserMemberRecordQueryDTO userMemberRecordQueryDTO, Page page);
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/MemberService.java b/src/main/java/com/mzl/flower/service/menber/MemberService.java
new file mode 100644
index 0000000..0d92a2d
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/MemberService.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.service.menber;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.request.menber.MemberDTO;
+import com.mzl.flower.dto.request.menber.MemberQueryDTO;
+import com.mzl.flower.dto.response.member.MemberVO;
+import com.mzl.flower.entity.menber.Member;
+
+
+public interface MemberService extends IService<Member> {
+
+    void saveMember(MemberDTO memberDTO);
+
+    void updateMember(MemberDTO memberDTO);
+    void deleteMember(String id);
+    Page<MemberVO> queryPage(MemberQueryDTO memberQueryDTO, Page page);
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/FirstDeductionStrategy.java b/src/main/java/com/mzl/flower/service/menber/impl/FirstDeductionStrategy.java
new file mode 100644
index 0000000..fc3731e
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/FirstDeductionStrategy.java
@@ -0,0 +1,26 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.mzl.flower.entity.payment.Order;
+import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * packageName com.mzl.flower.service.menber.impl
+ * @author fanghaowei
+ * @version version2.0
+ * @className FristDeductionStrategy
+ * @date 2024/9/2
+ * @description TODO
+ */
+@Transactional
+@RequiredArgsConstructor
+@Service("FirstDeduction")
+public class FirstDeductionStrategy implements GrowthValueDeductionStrategy {
+
+    @Override
+    public void deduct(Order order) {
+
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueDealService.java b/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueDealService.java
new file mode 100644
index 0000000..df6e4ea
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueDealService.java
@@ -0,0 +1,48 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.mzl.flower.entity.payment.Order;
+import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+
+/**
+ * packageName com.mzl.flower.service.menber.impl
+ * @author fanghaowei
+ * @version version2.0
+ * @className GrowthValueDealService
+ * @date 2024/9/2
+ * @description TODO
+ */
+
+@Service
+public class GrowthValueDealService {
+
+    @Resource
+    private GrowthValueStrategyContext growthValueStrategyContext;
+    public void deductionGrowthValue(Order order) {
+        //当前时间
+        LocalDateTime now = LocalDateTime.now();
+
+        //最后消费时间
+        LocalDateTime receiveTime = order.getReceiveTime();
+
+        // 将时间转换为LocalDate,只保留年月日部分
+        LocalDate nowDate = now.toLocalDate();
+        LocalDate receiveTimeDate = receiveTime.toLocalDate();
+        long daysBetween = ChronoUnit.DAYS.between(receiveTimeDate, nowDate);
+
+        if (daysBetween > 30 && daysBetween <= 90) {
+            GrowthValueDeductionStrategy growthInfo = growthValueStrategyContext.getGrowthInfo("SecondDeduction");
+            growthInfo.deduct(order);
+        } else if (daysBetween > 90) {
+            GrowthValueDeductionStrategy growthInfo = growthValueStrategyContext.getGrowthInfo("ThirdDeduction");
+            growthInfo.deduct(order);
+        }
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueStrategyContext.java b/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueStrategyContext.java
new file mode 100644
index 0000000..fd8b775
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/GrowthValueStrategyContext.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Service
+public class GrowthValueStrategyContext {
+    @Autowired
+    private final Map<String, GrowthValueDeductionStrategy> growthValueDeductionStrategyMap = new HashMap<>();
+
+    public GrowthValueStrategyContext(Map<String, GrowthValueDeductionStrategy> growthValueDeductionStrategyMap) {
+        this.growthValueDeductionStrategyMap.clear();
+        growthValueDeductionStrategyMap.forEach((k, v) -> this.growthValueDeductionStrategyMap.put(k, v));
+    }
+
+    public GrowthValueDeductionStrategy getGrowthInfo(String growthInfo) {
+        return growthValueDeductionStrategyMap.get(growthInfo);
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java
new file mode 100644
index 0000000..34b83f9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java
@@ -0,0 +1,238 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.menber.*;
+import com.mzl.flower.dto.response.customer.CustomerDTO;
+import com.mzl.flower.dto.response.member.MemberGrowthRecordVO;
+import com.mzl.flower.dto.response.member.UserGrowthRecordVO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.entity.menber.MemberGrowthRecord;
+import com.mzl.flower.entity.payment.Order;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.member.MemberGrowthRecordMapper;
+import com.mzl.flower.mapper.member.MemberMapper;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberGrowthRecordServiceImpl
+ * @date 2024/8/26
+ * @description 会员记录功能逻辑层
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class MemberGrowthRecordServiceImpl extends ServiceImpl<MemberGrowthRecordMapper, MemberGrowthRecord> implements MemberGrowthRecordService {
+
+    private final MemberGrowthRecordMapper memberGrowthRecordMapper;
+
+    private final MemberMapper memberMapper;
+
+    private final CustomerMapper customerMapper;
+
+
+    @Override
+    public void saveMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO) {
+        if (StringUtils.isEmpty(memberGrowthRecordDTO.getUserId())) {
+            throw new ValidationException("用户ID不能为空");
+        }
+
+        MemberGrowthRecord memberGrowthRecord = new MemberGrowthRecord();
+        BeanUtils.copyProperties(memberGrowthRecordDTO, memberGrowthRecord);
+        memberGrowthRecord.create(SecurityUtils.getUserId());
+        memberGrowthRecord.setRecordDate(new Date());
+
+        CustomerDTO customerDTO = customerMapper.getCurrentCustomer(memberGrowthRecord.getUserId());
+        if (ObjectUtils.isEmpty(customerDTO)) {
+            throw new ValidationException("人员信息为空");
+        }
+
+        Customer customer = customerMapper.selectById(customerDTO.getId());
+        if (ObjectUtils.isEmpty(customer)) {
+            throw new ValidationException("人员信息为空");
+        }
+        Member memberBefore = memberMapper.selectById(customer.getLevelId());
+        if(ObjectUtils.isEmpty(memberBefore)){
+            throw new ValidationException("人员对应的会员等级不存在,请联系管理员");
+        }
+
+        //保存会员记录逻辑:
+        if (Constants.GROWTH_SOURCE.consume.name().equals(memberGrowthRecordDTO.getSource())) {
+            //消费:成长值=消费金额/消费金额(元)*已消费产生的成长值C
+            BigDecimal totalAmount = memberGrowthRecordDTO.getTotalAmount();
+            int consumptionAmount = memberBefore.getConsumptionAmount();
+            int growthValue = memberBefore.getGrowthValue();
+            BigDecimal actualGrowthValue = totalAmount.divide(new BigDecimal(consumptionAmount), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(growthValue));
+            int growth = actualGrowthValue.setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); // 四舍五入取整
+            memberGrowthRecord.setGrowth(growth);
+            memberGrowthRecord.setType(Constants.GROWTH_TYPE.add.name());
+        }
+        memberGrowthRecordMapper.insert(memberGrowthRecord);
+
+        //会员等级同步逻辑:
+        Member memberAfter = getMemberByUserId(memberGrowthRecord.getUserId());
+        customer.setLevelId(memberAfter.getId());
+        customerMapper.updateById(customer);
+    }
+
+
+    /**
+     * 查询当前人员的成长值 最少是0
+     *
+     * @param userId
+     * @return
+     */
+    @Override
+    public Member getMemberByUserId(String userId) {
+        if (StringUtils.isEmpty(userId)) {
+            throw new ValidationException("用户ID不能为空");
+        }
+        Integer sumGrowth = memberGrowthRecordMapper.getSumGrowthByUsertId(userId);
+
+        //查询当前会员等级
+        Member member = memberMapper.getMemberByGrowthValue(sumGrowth);
+        if (ObjectUtils.isEmpty(member)) {
+            throw new ValidationException("会员信息为空");
+        }
+        return member;
+    }
+
+    @Override
+    public void updateMemberGrowthRecord(MemberGrowthRecordDTO memberGrowthRecordDTO) {
+        MemberGrowthRecord memberGrowthRecord = memberGrowthRecordMapper.selectById(memberGrowthRecordDTO.getId());
+        if (memberGrowthRecord == null) {
+            throw new ValidationException("成长记录信息不存在");
+        }
+        BeanUtils.copyProperties(memberGrowthRecordDTO, memberGrowthRecord);
+        memberGrowthRecord.update(SecurityUtils.getUserId());
+        memberGrowthRecordMapper.updateById(memberGrowthRecord);
+    }
+
+    @Override
+    public void deleteMemberGrowthRecord(String id) {
+        MemberGrowthRecord memberGrowthRecord = memberGrowthRecordMapper.selectById(id);
+        if (memberGrowthRecord == null) {
+            throw new ValidationException("成长记录信息不存在");
+        }
+        memberGrowthRecordMapper.deleteById(id);
+    }
+
+    @Override
+    public UserGrowthRecordDTO getInfoByUserId(String userId) {
+        UserGrowthRecordDTO userGrowthRecordDTO = new UserGrowthRecordDTO();
+        List<TargetMemberDTO> targetMemberDTOList = new ArrayList<>();
+        //查询当前人员的成长值 最少是0
+        Integer sumGrowth = memberGrowthRecordMapper.getSumGrowthByUsertId(userId);
+        userGrowthRecordDTO.setCurrentGrowthValue(sumGrowth);
+        //查询当前会员等级
+        Member member = new Member();
+        member = memberMapper.getMemberByGrowthValue(sumGrowth);
+        if (ObjectUtils.isEmpty(member)) {
+            member = memberMapper.selectById(Constants.DEFAULT_MEMBER_ID);
+        }
+        userGrowthRecordDTO.setCurrentMemberLevel(member.getName());
+        userGrowthRecordDTO.setCurrentDiscountType(member.getDiscountType());
+        switch (member.getDiscountType()) {
+            case "ratio":
+                userGrowthRecordDTO.setCurrentDiscountTypeStr(Constants.DISCOUNT_TYPE.ratio.getDesc());
+                break;
+            case "amount":
+                userGrowthRecordDTO.setCurrentDiscountTypeStr(Constants.DISCOUNT_TYPE.amount.getDesc());
+                break;
+        }
+        userGrowthRecordDTO.setCurrentDiscountRatio(StringUtils.isEmpty(member.getDiscountRatio()) ? BigDecimal.valueOf(100) : member.getDiscountRatio());
+        userGrowthRecordDTO.setCurrentDiscountAmount(StringUtils.isEmpty(member.getDiscountAmount()) ? BigDecimal.ZERO  : member.getDiscountAmount());
+        //查询比当前等级高的会员等级信息
+        List<Member> memberList = memberMapper.getgtMembersByGrowthValue(sumGrowth);
+        if (!CollectionUtils.isEmpty(memberList)) {
+            memberList.forEach(m -> {
+                TargetMemberDTO targetMemberDTO = new TargetMemberDTO();
+                targetMemberDTO.setTargetMemberLevel(m.getName());
+                targetMemberDTO.setTargetStartPoint(m.getStartPoint());
+                targetMemberDTO.setTargetGap(m.getStartPoint() - sumGrowth);
+                targetMemberDTO.setTargetDiscountAmount(StringUtils.isEmpty(m.getDiscountAmount()) ? BigDecimal.ZERO : m.getDiscountAmount());
+                targetMemberDTO.setTargetDiscountType(m.getDiscountType());
+                switch (m.getDiscountType()) {
+                    case "ratio":
+                        targetMemberDTO.setTargetDiscountTypeStr(Constants.DISCOUNT_TYPE.ratio.getDesc());
+                        break;
+                    case "amount":
+                        targetMemberDTO.setTargetDiscountTypeStr(Constants.DISCOUNT_TYPE.amount.getDesc());
+                        break;
+                }
+                targetMemberDTO.setTargetDiscountRatio(StringUtils.isEmpty(m.getDiscountRatio()) ? BigDecimal.valueOf(100) : m.getDiscountRatio());
+                targetMemberDTOList.add(targetMemberDTO);
+            });
+        }
+        userGrowthRecordDTO.setTargetMemberInfos(targetMemberDTOList);
+
+        return userGrowthRecordDTO;
+    }
+
+    @Override
+    public Page<MemberGrowthRecordVO> queryPage(MemberRecordQueryDTO memberRecordQueryDTO, Page page) {
+        List<MemberGrowthRecordVO> list = memberGrowthRecordMapper.queryPage(memberRecordQueryDTO, page);
+        page.setRecords(list);
+        return page;
+    }
+
+    @Override
+    public void growthValueDeduct(Order order) {
+        //超过30天不到90天,每天处理当前会员等级的成长值
+        CustomerDTO customerDTO = customerMapper.getCurrentCustomer(order.getCreateBy());
+        Customer customer = customerMapper.selectById(customerDTO.getId());
+        Member member = memberMapper.selectById(customer.getLevelId());
+        if(ObjectUtils.isEmpty(member)){
+            throw new ValidationException("用户会员等级未维护");
+        }
+        int deductGrowthValue = member.getDowngradeValue();
+        Integer sumGrowthByUserId = memberGrowthRecordMapper.getSumGrowthByUsertId(order.getCreateBy());
+
+        //当前成长值如果是等于0不需要走扣除逻辑
+        if (sumGrowthByUserId != 0) {
+        int waitDeductGrowthValue = 0;
+
+        //判断当前用户的成长值是够扣除,如果够扣除直接减去成长值,如果不够扣除则全部减去
+        if (sumGrowthByUserId - deductGrowthValue > 0) {
+            waitDeductGrowthValue = deductGrowthValue;
+        } else {
+            waitDeductGrowthValue = sumGrowthByUserId;
+        }
+
+        //保存会员成长记录到记录表
+        MemberGrowthRecordDTO memberGrowthRecordDTO = new MemberGrowthRecordDTO();
+        memberGrowthRecordDTO.setUserId(order.getCreateBy());
+        memberGrowthRecordDTO.setRecordDate(new Date());
+        memberGrowthRecordDTO.setGrowth(-waitDeductGrowthValue);
+        memberGrowthRecordDTO.setSource(Constants.GROWTH_SOURCE.downgrading.name());
+        memberGrowthRecordDTO.setType(Constants.GROWTH_TYPE.reduce.name());
+        memberGrowthRecordDTO.setRemarks("自动扣除");
+        saveMemberGrowthRecord(memberGrowthRecordDTO);
+        }
+    }
+
+    @Override
+    public Page<UserGrowthRecordVO> queryUserPage(UserMemberRecordQueryDTO userMemberRecordQueryDTO, Page page) {
+        List<UserGrowthRecordVO> list = memberGrowthRecordMapper.queryUserPage(userMemberRecordQueryDTO, page);
+        page.setRecords(list);
+        return page;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java b/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java
new file mode 100644
index 0000000..fef0691
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java
@@ -0,0 +1,216 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.menber.MemberDTO;
+import com.mzl.flower.dto.request.menber.MemberQueryDTO;
+import com.mzl.flower.dto.response.member.MemberVO;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.member.MemberMapper;
+import com.mzl.flower.service.menber.MemberService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberServiceImpl
+ * @date 2024/8/26
+ * @description 会员管理功能逻辑层
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
+
+    private final MemberMapper memberMapper;
+
+    private final CustomerMapper customerMapper;
+
+    @Override
+    public void saveMember(MemberDTO memberDTO) {
+        //是否已经存在endpoint已经有最大值了,有的话需要删除或者修改
+        if (memberDTO.getEndPoint() == null) {
+//            Member pointByIntegerMaxValue = memberMapper.getEndPointByIntegerMaxValue(Integer.MAX_VALUE);
+//            if (!ObjectUtils.isEmpty(pointByIntegerMaxValue)) {
+//                throw new ValidationException("系统中已经有一条最大值或者空值记录,请删除或者修改再保存");
+//            } else {
+                memberDTO.setEndPoint(Integer.MAX_VALUE);
+//            }
+        }
+        if (StringUtils.isEmpty(memberDTO.getName())) {
+            throw new ValidationException("会员等级名称不能为空");
+        }
+
+        if (StringUtils.isEmpty(memberDTO.getDiscountType())) {
+            throw new ValidationException("会员折扣类型不能为空");
+        }
+        if (Constants.DISCOUNT_TYPE.amount.name().equals(memberDTO.getDiscountType()) && StringUtils.isEmpty(memberDTO.getDiscountAmount())) {
+            throw new ValidationException("会员折扣固定金额不能为空");
+        }
+        if (Constants.DISCOUNT_TYPE.ratio.name().equals(memberDTO.getDiscountType()) && StringUtils.isEmpty(memberDTO.getDiscountRatio())) {
+            throw new ValidationException("会员折扣百分比不能为空");
+        }
+
+        if (memberDTO.getStartPoint() > memberDTO.getEndPoint()) {
+            throw new ValidationException("成长点开始不能大于结束点");
+        }
+        if (!StringUtils.isEmpty(memberDTO.getDiscountRatio())) {
+            int discountRatio1 = memberDTO.getDiscountRatio().compareTo(BigDecimal.ZERO);
+            if (discountRatio1 == -1) {
+                throw new ValidationException("会员折扣百分比不能小于0");
+            }
+            int discountRatio2 = memberDTO.getDiscountRatio().compareTo(new BigDecimal(100));
+            if (discountRatio2 == 1) {
+                throw new ValidationException("会员折扣百分比不能大于100");
+            }
+        }
+        //区间交集判断
+        //查询所有等级
+        List<Member> allMember = memberMapper.getAllMember();
+        allMember.forEach(a -> {
+            if (a.getStartPoint() < memberDTO.getEndPoint() && a.getEndPoint() > memberDTO.getStartPoint()) {
+                throw new ValidationException("存在交集,不允许保存");
+            }
+        });
+        if (!StringUtils.isEmpty(memberDTO.getDiscountAmount())) {
+            int discountAmount = memberDTO.getDiscountAmount().compareTo(BigDecimal.ZERO);
+            if (discountAmount == -1) {
+                throw new ValidationException("会员折扣固定金额不能小于0");
+            }
+        }
+
+        //保存时判断是否有重复的名称
+        Member memberByName = memberMapper.getMemberByName(memberDTO.getName());
+        if (!ObjectUtils.isEmpty(memberByName)) {
+            throw new ValidationException("会员等级名称重复");
+        }
+        Member member = new Member();
+        BeanUtils.copyProperties(memberDTO, member);
+        member.create(SecurityUtils.getUserId());
+        memberMapper.insert(member);
+        //更新会员等级
+        customerMapper.updateMemberLevelByPoint(member.getId(), member.getStartPoint(), member.getEndPoint());
+
+    }
+
+    @Override
+    public void updateMember(MemberDTO memberDTO) {
+        Member memberInfo = memberMapper.selectById(memberDTO.getId());
+        if (memberInfo == null) {
+            throw new ValidationException("会员等级信息不存在");
+        }
+        if (StringUtils.isEmpty(memberDTO.getDiscountType())) {
+            throw new ValidationException("会员折扣类型不能为空");
+        }
+        if (Constants.DISCOUNT_TYPE.amount.name().equals(memberDTO.getDiscountType()) && StringUtils.isEmpty(memberDTO.getDiscountAmount())) {
+            throw new ValidationException("会员折扣固定金额不能为空");
+        }
+        if (Constants.DISCOUNT_TYPE.ratio.name().equals(memberDTO.getDiscountType()) && StringUtils.isEmpty(memberDTO.getDiscountRatio())) {
+            throw new ValidationException("会员折扣百分比不能为空");
+        }
+        if (!StringUtils.isEmpty(memberDTO.getDiscountRatio())) {
+            int discountRatio1 = memberDTO.getDiscountRatio().compareTo(BigDecimal.ZERO);
+            if (discountRatio1 == -1) {
+                throw new ValidationException("会员折扣百分比不能小于0");
+            }
+            int discountRatio2 = memberDTO.getDiscountRatio().compareTo(new BigDecimal(100));
+            if (discountRatio2 == 1) {
+                throw new ValidationException("会员折扣百分比不能大于100");
+            }
+        }
+        if (!StringUtils.isEmpty(memberDTO.getDiscountAmount())) {
+            int discountAmount = memberDTO.getDiscountAmount().compareTo(BigDecimal.ZERO);
+            if (discountAmount == -1) {
+                throw new ValidationException("会员折扣固定金额不能小于0");
+            }
+        }
+        Member memberTemp = memberMapper.getMemberByName(memberDTO.getName());
+        //判断如果按照会员等级查询到得名称和当前得Id不一致,不能修改。
+        if (!ObjectUtils.isEmpty(memberTemp)) {
+            if (memberTemp.getId() != memberDTO.getId()) {
+                throw new ValidationException("已存在会员等级名称,无法修改");
+            }
+        }
+        //是否已经存在endpoint已经有最大值了,有的话需要删除或者修改
+//        if (memberDTO.getEndPoint() == null && memberInfo.getEndPoint() != Integer.MAX_VALUE) {
+//            Member pointByIntegerMaxValue = memberMapper.getEndPointByIntegerMaxValue(Integer.MAX_VALUE);
+//            if (!ObjectUtils.isEmpty(pointByIntegerMaxValue)) {
+//                throw new ValidationException("系统中已经有一条最大值或者空值记录,请删除或者修改再保存");
+//            } else {
+//                memberDTO.setEndPoint(Integer.MAX_VALUE);
+//            }
+//        } else if (memberDTO.getEndPoint() == null && memberInfo.getEndPoint() == Integer.MAX_VALUE) {
+//            memberDTO.setEndPoint(Integer.MAX_VALUE);
+//        }
+
+        if (memberDTO.getEndPoint() == null) {
+            if (memberInfo.getEndPoint() != Integer.MAX_VALUE) {
+                Member pointByIntegerMaxValue = memberMapper.getEndPointByIntegerMaxValue(Integer.MAX_VALUE);
+                if (!ObjectUtils.isEmpty(pointByIntegerMaxValue)) {
+                    throw new ValidationException("系统中已经有一条最大值或者空值记录,请删除或者修改再保存");
+                } else {
+                    memberDTO.setEndPoint(Integer.MAX_VALUE);
+                }
+            } else {
+                memberDTO.setEndPoint(Integer.MAX_VALUE);
+            }
+        }
+
+        if (memberDTO.getStartPoint() > memberDTO.getEndPoint()) {
+            throw new ValidationException("成长点开始不能大于结束");
+        }
+        //区间交集判断
+        //查询所有等级
+        List<Member> allMember = memberMapper.getOtherAllMember(memberDTO.getId());
+        allMember.forEach(a -> {
+            if (a.getStartPoint() < memberDTO.getEndPoint() && a.getEndPoint() > memberDTO.getStartPoint()) {
+                throw new ValidationException("存在交集,不允许修改");
+            }
+        });
+
+        //更新会员等级
+        if (memberInfo.getStartPoint() != memberDTO.getStartPoint() || memberInfo.getEndPoint() != memberDTO.getEndPoint()) {
+            customerMapper.updateMemberLevelByPoint(memberInfo.getId(), memberInfo.getStartPoint(), memberInfo.getEndPoint());
+        }
+
+        BeanUtils.copyProperties(memberDTO,memberInfo);
+        memberInfo.update(SecurityUtils.getUserId());
+        memberMapper.updateById(memberInfo);
+
+    }
+
+    @Override
+    public void deleteMember(String id) {
+        if(id.equals(Constants.DEFAULT_MEMBER_ID)){
+            throw new ValidationException("默认普通会员只能编辑,不能删除");
+        }
+        Member member = memberMapper.selectById(id);
+        if (member == null) {
+            throw new ValidationException("会员等级信息不存在");
+        }
+        Integer levelId = customerMapper.getByLevelId(id);
+        if (levelId > 0) {
+            throw new ValidationException("当前会员等级用户已使用,无法删除");
+        }
+        memberMapper.deleteById(id);
+    }
+
+    @Override
+    public Page<MemberVO> queryPage(MemberQueryDTO memberQueryDTO, Page page) {
+        List<MemberVO> list = memberMapper.queryPage(memberQueryDTO, page);
+        page.setRecords(list);
+        return page;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/SecondDeductionStrategy.java b/src/main/java/com/mzl/flower/service/menber/impl/SecondDeductionStrategy.java
new file mode 100644
index 0000000..3f814b9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/SecondDeductionStrategy.java
@@ -0,0 +1,30 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.mzl.flower.entity.payment.Order;
+import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * packageName com.mzl.flower.service.menber.impl
+ * @author fanghaowei
+ * @version version2.0
+ * @className SecondDeductionStrategy
+ * @date 2024/9/2
+ * @description TODO
+ */
+@Transactional
+@RequiredArgsConstructor
+@Service("SecondDeduction")
+public class SecondDeductionStrategy  implements GrowthValueDeductionStrategy {
+
+    private final MemberGrowthRecordService memberGrowthRecordService;
+
+    @Override
+    public void deduct(Order order) {
+        memberGrowthRecordService.growthValueDeduct(order);
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/service/menber/impl/ThirdDeductionStrategy.java b/src/main/java/com/mzl/flower/service/menber/impl/ThirdDeductionStrategy.java
new file mode 100644
index 0000000..6a29e76
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/menber/impl/ThirdDeductionStrategy.java
@@ -0,0 +1,91 @@
+package com.mzl.flower.service.menber.impl;
+
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.menber.MemberGrowthRecordDTO;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.entity.menber.MemberDowngradeRecord;
+import com.mzl.flower.entity.payment.Order;
+import com.mzl.flower.mapper.member.MemberDowngradeRecordMapper;
+import com.mzl.flower.mapper.member.MemberGrowthRecordMapper;
+import com.mzl.flower.mapper.member.MemberMapper;
+import com.mzl.flower.service.menber.GrowthValueDeductionStrategy;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+
+/**
+ * packageName com.mzl.flower.service.menber.impl
+ * @author fanghaowei
+ * @version version2.0
+ * @className ThirdDeductionStrategy
+ * @date 2024/9/2
+ * @description TODO
+ */
+@Transactional
+@RequiredArgsConstructor
+@Service("ThirdDeduction")
+public class ThirdDeductionStrategy  implements GrowthValueDeductionStrategy {
+
+    private final MemberDowngradeRecordMapper memberDowngradeRecordMapper;
+    private final MemberGrowthRecordService memberGrowthRecordService;
+    private final MemberGrowthRecordMapper memberGrowthRecordMapper;
+
+    private final MemberMapper memberMapper;
+
+    @Override
+    public void deduct(Order order) {
+        LocalDate nowDate = LocalDateTime.now().toLocalDate();
+        LocalDate receiveTimeDate = order.getReceiveTime().toLocalDate();
+        long daysBetween = ChronoUnit.DAYS.between(receiveTimeDate, nowDate);
+        //判断是否有会员降级记录
+        Integer countByUserId = memberDowngradeRecordMapper.getMemberByName(order.getCreateBy());
+        int day = (int) (daysBetween - countByUserId * 90);
+        //扣除记录数*90
+        //0-90;1-180;2-270
+        if (countByUserId == 0 || day > 90) {
+            //保存会员降级记录
+            Member member = memberGrowthRecordService.getMemberByUserId(order.getCreateBy());
+            MemberDowngradeRecord memberDowngradeRecord = new MemberDowngradeRecord();
+            memberDowngradeRecord.setUserId(order.getCreateBy());
+            memberDowngradeRecord.setMemberId(member.getId());
+            memberDowngradeRecord.setMemberName(member.getName());
+            memberDowngradeRecord.create();
+            memberDowngradeRecordMapper.insert(memberDowngradeRecord);
+
+            //统计当前人员现有成长值
+            Integer sumGrowthByUserId = memberGrowthRecordMapper.getSumGrowthByUsertId(order.getCreateBy());
+
+            //当前人员需要降到的成长值
+            Member targetMember = memberMapper.getgtMembersByEndPoint(sumGrowthByUserId);
+            if (!ObjectUtils.isEmpty(targetMember)) {
+                //有降级目标
+                int targetGrowth = targetMember.getEndPoint() - 1;
+                //需要降级扣除的成长值是目标值减去当前值
+                int needDeductGrowthValue = targetGrowth-sumGrowthByUserId;
+                //保存会员成长记录到记录表
+                MemberGrowthRecordDTO memberGrowthRecordDTO = new MemberGrowthRecordDTO();
+                memberGrowthRecordDTO.setUserId(order.getCreateBy());
+                memberGrowthRecordDTO.setRecordDate(new Date());
+                memberGrowthRecordDTO.setGrowth(needDeductGrowthValue);
+                memberGrowthRecordDTO.setSource(Constants.GROWTH_SOURCE.downgrading.name());
+                memberGrowthRecordDTO.setType(Constants.GROWTH_TYPE.reduce.name());
+                memberGrowthRecordDTO.setRemarks("自动降级");
+                memberGrowthRecordService.saveMemberGrowthRecord(memberGrowthRecordDTO);
+            } else {
+                memberGrowthRecordService.growthValueDeduct(order);
+            }
+        } else if (countByUserId > 0) {
+            if (day > 30 && day <= 90) {
+                memberGrowthRecordService.growthValueDeduct(order);
+            }
+
+        }
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/payment/BillService.java b/src/main/java/com/mzl/flower/service/payment/BillService.java
index fa0cb1c..65311be 100644
--- a/src/main/java/com/mzl/flower/service/payment/BillService.java
+++ b/src/main/java/com/mzl/flower/service/payment/BillService.java
@@ -42,6 +42,9 @@
     @Autowired
     private OrderItemSalesMapper orderItemSalesMapper;
 
+    @Autowired
+    private OrderItemSettlementMapper orderItemSettlementMapper;
+
     public Page<BillListDTO> selectBillList(Page page, BillQueryDTO dto){
         dto.setStart(parseLocalDate(dto.getStartDate()));
         dto.setEnd(parseLocalDate(dto.getEndDate()));
@@ -72,6 +75,7 @@
                 r.setDeductAmount(r.getDeductAmount().add(b.getDeductAmount()));
                 r.setSalesAmount(r.getSalesAmount().add(b.getSalesAmount()));
                 r.setProfitAmount(r.getProfitAmount().add(b.getProfitAmount()));
+                r.setMemberCouponAmount(r.getMemberCouponAmount().add(b.getMemberCouponAmount()));
             }
         }
 
@@ -136,24 +140,30 @@
         }
 
         //账单售后
-        List<OrderItemSales> sLs = orderItemSalesMapper.selectList(new QueryWrapper<OrderItemSales>()
+        /*List<OrderItemSales> sLs = orderItemSalesMapper.selectList(new QueryWrapper<OrderItemSales>()
+                .in("order_id", orderIdsAll));*/
+        List<OrderItemSettlement> sLs = orderItemSettlementMapper.selectList(new QueryWrapper<OrderItemSettlement>()
                 .in("order_id", orderIdsAll));
         Map<String, BigDecimal> salesMap = new HashMap<>();
+        Map<String, BigDecimal> deductMap = new HashMap<>();
         if(sLs != null && sLs.size() > 0){
-            for(OrderItemSales s : sLs){//同一个订单的同一个商品可能会多次理赔
-                prepareSalesAmount(s, null, null, salesMap);
+            for(OrderItemSettlement s : sLs){//同一个订单的同一个商品可能会多次理赔
+                salesMap.put(s.getOrderItemId(), s.getSalesFeePlatform());
+                deductMap.put(s.getOrderItemId(), s.getLackFeePlatform());
             }
         }
 
+
         String type = Constants.BILL_TYPE.partner.name();//账单类型
-        calculate(date, type, orderIdsPartner, orderMap, orderItemMap, salesMap);
+        calculate(date, type, orderIdsPartner, orderMap, orderItemMap, salesMap, deductMap);
 
         type = Constants.BILL_TYPE.personal.name();//账单类型
-        calculate(date, type, orderIdsPersonal, orderMap, orderItemMap, salesMap);
+        calculate(date, type, orderIdsPersonal, orderMap, orderItemMap, salesMap, deductMap);
     }
 
     public Bill calculate(LocalDate date, String type, List<String> orderIds, Map<String, Order> orderMap
-            , Map<String, List<OrderItem>> orderItemMap, Map<String, BigDecimal> salesMap){
+            , Map<String, List<OrderItem>> orderItemMap, Map<String, BigDecimal> salesMap
+            , Map<String, BigDecimal> deductMap){
         Bill bill = new Bill();
         bill.setId(UUIDGenerator.getUUID());
 
@@ -165,8 +175,9 @@
         BigDecimal markupOne = new BigDecimal(0);//区间加价
         BigDecimal markupTwo = new BigDecimal(0);//二次加价
         BigDecimal markupPartner = new BigDecimal(0);//合伙人加价
-        BigDecimal deductAmount = new BigDecimal(0);//质检退款
+        BigDecimal deductAmount = new BigDecimal(0);//质检退款(缺货)
         BigDecimal salesAmount = new BigDecimal(0);//售后退款
+        BigDecimal memberCouponAmount = new BigDecimal(0);//优惠券金额
         for(String orderId : orderIds){
             Order o = orderMap.get(orderId);
             orderAmount = orderAmount.add(o.getTotalAmount());
@@ -176,14 +187,16 @@
             for(OrderItem oi : items){
                 Integer n = oi.getNum();
                 supplierAmount = supplierAmount.add(oi.getSupplierPrice().multiply(new BigDecimal(n)));
-                markupOne = markupOne.add(oi.getMarkupOne().multiply(new BigDecimal(n)));
-                markupTwo = markupTwo.add((oi.getMarkupTwo() == null ? new BigDecimal(0) : oi.getMarkupTwo()).multiply(new BigDecimal(n)));
-                markupPartner = markupPartner.add((oi.getMarkupPartner() == null ? new BigDecimal(0) : oi.getMarkupPartner()).multiply(new BigDecimal(n)));
-                deductAmount = deductAmount.add(oi.getDeductAmount() == null ? new BigDecimal(0) : oi.getDeductAmount());
+                markupOne = markupOne.add(getAmount(oi.getMarkupOne()).multiply(new BigDecimal(n)));
+                markupTwo = markupTwo.add(getAmount(oi.getMarkupTwo()).multiply(new BigDecimal(n)));
+                markupPartner = markupPartner.add(getAmount(oi.getMarkupPartner()).multiply(new BigDecimal(n)));
+
+                salesAmount = salesAmount.add(getAmount(salesMap.get(oi.getId())));
+                deductAmount = deductAmount.add(getAmount(deductMap.get(oi.getId())));
                 num += n;
             }
-            BigDecimal ss = salesMap.get(orderId);
-            salesAmount = salesAmount.add(ss == null ? new BigDecimal(0) : ss);
+
+            memberCouponAmount = memberCouponAmount.add(getAmount(o.getMemberCouponAmount()));
 
             o.setBillId(bill.getId());
             orderMapper.updateById(o);
@@ -200,13 +213,15 @@
         bill.setMarkupPartner(markupPartner);
         bill.setDeductAmount(deductAmount);
         bill.setSalesAmount(salesAmount);
+        bill.setMemberCouponAmount(memberCouponAmount);
         bill.setBillDate(date);
 
-        //合伙人:利润=售价-底价(花农上架价格)-打包、运费(订单管理手输)-合伙人加价-平台罚款
-        //散户:利润=售价-底价(花农上架价格)-运费-平台罚款
+        //合伙人:利润=售价-底价(花农上架价格)-打包、运费(订单管理手输)-合伙人加价-平台罚款-质检(缺货)-优惠券
+        //散户:利润=售价-底价(花农上架价格)-运费-平台罚款-质检(缺货)-优惠券
         //其实都一样的计算方式
         BigDecimal profitAmount = orderAmount.subtract(supplierAmount)
-                .subtract(markupPartner).subtract(salesAmount).subtract(packingFee).subtract(transportFee);//利润合计
+                .subtract(markupPartner).subtract(salesAmount).subtract(packingFee).subtract(transportFee)
+                .subtract(deductAmount).subtract(memberCouponAmount);//利润合计
         bill.setProfitAmount(profitAmount);
 
         bill.create();
diff --git a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java
index f0a98e9..f7466d1 100644
--- a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java
+++ b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java
@@ -34,6 +34,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -179,6 +180,8 @@
     }
 
     public Page<DeliveryOrderStatisticsDTO> selectSupplierDoStatistics(Page page){
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
         LocalDate theDay = parseLocalDate("2024-08-03");
 
         long current = page.getCurrent();
@@ -187,7 +190,7 @@
         current = current == 0 ? 1 : current;
 
         long endDays = (current - 1) * size;
-        long beginDays = endDays + size;
+        long beginDays = endDays + size-1;
         LocalDate beginDate = now.plusDays(-beginDays);
         LocalDate endDate = now.plusDays(-endDays);
 
@@ -207,6 +210,7 @@
                     , fivePm.plusDays(-1), fivePm);
 
             DeliveryOrderStatisticsDTO dto = new DeliveryOrderStatisticsDTO();
+            dto.setId(endDate.format(formatter));
             dto.setDate(endDate);
             dto.setNum(0);
             dto.setPrice(new BigDecimal(0));
@@ -219,11 +223,31 @@
         }
 
         page.setRecords(ls);
+
+
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+        // 计算当前日期与给定日期的天数差
+        long daysBetween = ChronoUnit.DAYS.between(theDay, today);
+        page.setTotal(daysBetween);
+
         return page;
     }
 
     public List<DeliveryOrderItemListDTO> getDeliveryOrderItems(String id) {
         return deliveryOrderItemMapper.selectDoItemList(id);
+    }
+
+    public List<DeliveryOrderItemDTO> getSupplierDeliveryOrderItems(PostQueryDTO dto){
+        List<String> idList = dto.getIds();
+        List<DeliveryOrderItemDTO> ls = new ArrayList<>();
+        if(idList != null && idList.size() > 0){
+            for(String id : idList){
+                ls.add(getSupplierDeliveryOrderItem(id));
+            }
+        }
+
+        return ls;
     }
 
     public DeliveryOrderItemDTO getSupplierDeliveryOrderItem(String id) {
@@ -250,7 +274,21 @@
 
         dto.setParams(parseArray(oi.getFlowerParams(), ParamItemDTO.class));
 
+        dto.setNum(oi.getNum());
+
         return dto;
+    }
+
+    public List<DeliveryOrderItemDTO> getDeliveryOrderItems(PostQueryDTO dto){
+        List<String> idList = dto.getIds();
+        List<DeliveryOrderItemDTO> ls = new ArrayList<>();
+        if(idList != null && idList.size() > 0){
+            for(String id : idList){
+                ls.add(getDeliveryOrderItem(id));
+            }
+        }
+
+        return ls;
     }
 
     public DeliveryOrderItemDTO getDeliveryOrderItem(String id) {
@@ -272,6 +310,8 @@
         dto.setFlowerCategory(oi.getFlowerCategory());
 
         dto.setParams(parseArray(oi.getFlowerParams(), ParamItemDTO.class));
+
+        dto.setNum(oi.getNum());
 
         return dto;
     }
@@ -354,7 +394,7 @@
         );
         if (items != null && items.size() > 0) {
             for (OrderItem i : items) {
-                i.setStatus(Constants.CHECK_OPERATE.ok.name());
+                i.setStatus(Constants.ORDER_ITEM_STATUS.ok.name());
                 i.setCheckTime(LocalDateTime.now());
                 orderItemMapper.updateById(i);
             }
@@ -370,6 +410,10 @@
         );
         if (count == 0) {
             Order o = orderMapper.selectById(orderId);
+            if(!Constants.ORDER_STATUS_BACKEND.COLLECTION.name().equals(o.getStatusBackend())){
+                log.warn("非待集货状态,不可设置待发货");
+                return;
+            }
             o.setStatusBackend(Constants.ORDER_STATUS_BACKEND.SEND.name());
             o.update(SecurityUtils.getUserId());
             orderMapper.updateById(o);
@@ -399,12 +443,14 @@
             }
 
             Integer orderCountToday = deliveryOrderMapper.selectCount(new QueryWrapper<DeliveryOrder>()
+                    .eq("deleted", 0)
                     .eq("supplier_id", supplierId)
                     .gt("create_time", startDate)
                     .le("create_time", endDate));
             dto.setOrderCountToday(orderCountToday == null ? 0 : orderCountToday);
 
             Integer orderCountYesterday = deliveryOrderMapper.selectCount(new QueryWrapper<DeliveryOrder>()
+                    .eq("deleted", 0)
                     .eq("supplier_id", supplierId)
                     .gt("create_time", startDate.plusDays(-1))
                     .le("create_time", endDate.plusDays(-1)));
@@ -412,13 +458,16 @@
 
             LocalDateTime ffPm = LocalDate.now().withDayOfMonth(1).atTime(17, 0, 0).plusDays(-1);
             Integer orderCountMonth = deliveryOrderMapper.selectCount(new QueryWrapper<DeliveryOrder>()
+                    .eq("deleted", 0)
                     .eq("supplier_id", supplierId)
                     .gt("create_time", ffPm));
             dto.setOrderCountMonth(orderCountMonth == null ? 0 : orderCountMonth);
 
             BigDecimal salesRate = new BigDecimal(0);
             Integer orderTotal = deliveryOrderMapper.selectCount(new QueryWrapper<DeliveryOrder>()
-                    .eq("supplier_id", supplierId));
+                    .eq("deleted", 0)
+                    .eq("supplier_id", supplierId)
+            );
             Integer salesCount = orderItemSalesMapper.getSupplierSalesCount(supplierId);
             if (orderTotal != null && orderTotal > 0) {
                 BigDecimal rate = new BigDecimal(salesCount).divide(new BigDecimal(orderTotal), 2, RoundingMode.HALF_UP);
@@ -446,23 +495,26 @@
         return dto;
     }
 
-    public List<StationStatisticDTO> statisticStationList(String name, LocalDateTime startDate, LocalDateTime endDate) {
+    public List<StationStatisticDTO> statisticStationList(String name, LocalDateTime startDate
+            , LocalDateTime endDate, String status) {
         String userId = SecurityUtils.getUserId();
         LambdaQueryWrapper<Station> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-        lambdaQueryWrapper.like(Station::getUserIds, userId);
+        lambdaQueryWrapper.like(Station::getUserIds, "%" + userId + "%");
         lambdaQueryWrapper.eq(Station::getType, "0");
-        boolean hasZc = stationMapper.selectCount(lambdaQueryWrapper)>0;//当前用户是否有总仓权限,总仓能查看到所有集货站的数据
+        boolean hasZc = stationMapper.selectCount(lambdaQueryWrapper) > 0;//当前用户是否有总仓权限,总仓能查看到所有集货站的数据
+        List<String> statusList = splitParam(status);
         if(hasZc){
-            List<StationStatisticDTO> stationStatisticDTOS = deliveryOrderMapper.statisticStationList(startDate, endDate,name,null);
+            List<StationStatisticDTO> stationStatisticDTOS = deliveryOrderMapper.statisticStationList(startDate, endDate,name,null, statusList);
             return stationStatisticDTOS;
         }else{
-            List<StationStatisticDTO> stationStatisticDTOS = deliveryOrderMapper.statisticStationList(startDate, endDate,name,userId);
+            List<StationStatisticDTO> stationStatisticDTOS = deliveryOrderMapper.statisticStationList(startDate, endDate, name, userId, statusList);
             return stationStatisticDTOS;
         }
     }
 
     //////////////////////////////////////////////////////////////新接口
     public Page<DeliveryOrderList4CheckDTO> selectSupplierDoList4Check(Page page, DeliveryOrderStationQueryDTO dto) {
+        dto.setStatusList(splitParam(dto.getStatus()));
         List<DeliveryOrderList4CheckDTO> ls = deliveryOrderMapper.selectSupplierDoList4Check(page, dto);
 
         page.setRecords(ls);
@@ -473,6 +525,7 @@
         if(dto.getSupplierId() == null){
             throw new ValidationException("供应商id不能为空");
         }
+        dto.setStatusList(splitParam(dto.getStatus()));
         List<DeliveryOrder4CheckDTO> ls = deliveryOrderMapper.selectSupplierDoInfo4Check(page, dto);
 
         if(ls != null && ls.size() > 0){
@@ -558,7 +611,7 @@
         return dto;
     }
 
-    public OrderItemCheckNumDTO getOtherCheck(String itemId, String type){
+    public OrderItemCheckNumDTO getOtherCheck(String itemId, String type, boolean isSupplier){
         OrderItemCheck c = orderItemCheckMapper.selectOne(new QueryWrapper<OrderItemCheck>()
                 .eq("type", type)
                 .eq("order_item_id", itemId)
@@ -570,6 +623,12 @@
             BeanUtils.copyProperties(c, dto);
             User user = userMapper.selectById(c.getCreateBy());
             dto.setCreateName(user.getNickName());
+
+            if(Constants.CHECK_TYPE.lack.name().equals(c.getType()) && isSupplier){
+                OrderItem oi = orderItemMapper.selectById(itemId);
+                BigDecimal lackFeeSupplier = oi.getSupplierPrice().multiply(new BigDecimal(c.getNum()));
+                dto.setDeductAmount(lackFeeSupplier);
+            }
         }
 
         return dto;
@@ -609,17 +668,24 @@
         }
 
         BigDecimal deduct = new BigDecimal(0);
+        BigDecimal realPrice = getAmount(oi.getRealPrice());
         if(Constants.CHECK_TYPE.replace.name().equals(dto.getType())){
             deduct = oi.getSupplierPrice().multiply(new BigDecimal(dto.getNum()));
         } else if(Constants.CHECK_TYPE.lack.name().equals(dto.getType())){
-            deduct = oi.getPrice().multiply(new BigDecimal(dto.getNum()));
+            deduct = realPrice.multiply(new BigDecimal(dto.getNum()));
+            //质检退款,按照这个单价扣,如果3扎都缺货,按照总的金额退
+            //缺货数量等于商品总数时按真实总价退款
+            if(dto.getNum().intValue() == oi.getNum() && oi.getRealTotal() != null){
+                deduct = oi.getRealTotal();
+            }
         } else if (Constants.CHECK_TYPE.reduce.name().equals(dto.getType())) {
             if(deductAmount == null){
                 throw new ValidationException("降级金额不能为空");
             }
             deduct = deductAmount.multiply(new BigDecimal(dto.getNum()));
-            BigDecimal dt = oi.getPrice().multiply(new BigDecimal(dto.getNum()));
-            if(deduct.doubleValue() > dt.doubleValue()){
+            BigDecimal dt = realPrice.multiply(new BigDecimal(dto.getNum()));
+            if(deduct.doubleValue() > dt.doubleValue()
+                    || (oi.getRealTotal() != null && deduct.doubleValue() > oi.getRealTotal().doubleValue())){
                 throw new ValidationException("降级金额不能大于商品处理数量金额");
             }
         }
diff --git a/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java b/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java
index e7f77e7..a11cdf9 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderItemSalesService.java
@@ -64,6 +64,9 @@
     @Autowired
     private CodeDecorator codeDecorator;
 
+    @Autowired
+    private OrderItemCheckMapper orderItemCheckMapper;
+
     public String createSales(OrderItemSalesCreateDTO dto){
         Integer num = dto.getNum();
         if(num == null || num == 0){
@@ -75,7 +78,16 @@
             throw new ValidationException("订单商品不存在");
         }
 
-        if(num > oi.getNum()){
+        OrderItemCheck c = orderItemCheckMapper.selectOne(new QueryWrapper<OrderItemCheck>()
+                .eq("order_item_id", oi.getId())
+                .eq("type", Constants.CHECK_TYPE.lack.name())
+                .eq("audit_status", Constants.CHECK_AUDIT_STATUS.AGREED.name())
+        );
+        int totalNum = oi.getNum();
+        if(c != null){//需要减去缺货的数量
+            totalNum -= c.getNum();
+        }
+        if(num > totalNum){
             throw new ValidationException("申请数量不能超过总数");
         }
 
diff --git a/src/main/java/com/mzl/flower/service/payment/OrderItemSettlementService.java b/src/main/java/com/mzl/flower/service/payment/OrderItemSettlementService.java
index e645d58..6de9160 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderItemSettlementService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderItemSettlementService.java
@@ -110,9 +110,9 @@
             int replaceNum = 0;//补货数量
             BigDecimal replaceFee = new BigDecimal(0);//补货扣款
             int lackNum = 0;//缺货数量
-            BigDecimal lackFeeSupplier = new BigDecimal(0);//缺货扣款
-            BigDecimal lackFeePartner = new BigDecimal(0);//缺货扣款
-            BigDecimal lackFeePlatform = new BigDecimal(0);//缺货扣款
+            BigDecimal lackFeeSupplier = new BigDecimal(0);//供应商缺货扣款
+            BigDecimal lackFeePartner = new BigDecimal(0);//合伙人缺货扣款
+            BigDecimal lackFeePlatform = new BigDecimal(0);//平台缺货扣款
             if (orderItemCheckList != null && orderItemCheckList.size() > 0) {
                 for (OrderItemCheck c : orderItemCheckList) {
                     Integer num = c.getNum();
@@ -120,7 +120,7 @@
                     String type = c.getType();
                     if (Constants.CHECK_TYPE.reduce.name().equals(type)) {
                         checkNum = num == null ? 0 : num;
-                        checkFee = amount == null ? new BigDecimal(0) : amount;
+                        checkFee = getAmount(amount);
                     } else if (Constants.CHECK_TYPE.lack.name().equals(type)) {
                         lackNum = num == null ? 0 : num;
                         lackFeeSupplier = oi.getSupplierPrice().multiply(new BigDecimal(lackNum));
@@ -130,11 +130,11 @@
 
                         BigDecimal markupOne = getAmount(oi.getMarkupOne());
                         BigDecimal markupTwo = getAmount(oi.getMarkupTwo());
-                        lackFeePlatform = markupOne.multiply(new BigDecimal(lackNum));
-                        lackFeePlatform = lackFeePlatform.add(markupTwo.multiply(new BigDecimal(lackNum)));
+                        BigDecimal ppPrice = markupOne.add(markupTwo).subtract(getAmount(oi.getCouponAmount()));//1次加价+2次加价-优惠券金额
+                        lackFeePlatform = lackFeePlatform.add(ppPrice.multiply(new BigDecimal(lackNum)));
                     } else if (Constants.CHECK_TYPE.replace.name().equals(type)) {
                         replaceNum = num == null ? 0 : num;
-                        replaceFee = amount == null ? new BigDecimal(0) : amount;
+                        replaceFee = getAmount(amount);
                     }
                 }
             }
@@ -151,9 +151,9 @@
             if (serviceFeeRate == null) {
                 ois.setServiceFeeRate(getFeeRate(oi));
             }
-            ois.setServiceFee(getServiceFee(oi, replaceNum, lackNum, ois.getServiceFeeRate()));
+            ois.setServiceFee(getServiceFee(oi, replaceNum, lackNum, ois.getServiceFeeRate()));//服务费
 
-            ois.setStationFee(getStationFee(oi, replaceNum, lackNum));
+            ois.setStationFee(getStationFee(oi, replaceNum, lackNum));//集货站运费
         }
 
         //售后计算
@@ -223,7 +223,7 @@
 
     private void setPartnerIncome(OrderItem oi, OrderItemSettlement ois){
         //合伙人结算:合伙人加价-理赔-缺货扣款 = 结算金额
-        BigDecimal markupPartner = oi.getMarkupPartner() == null ? new BigDecimal(0) : oi.getMarkupPartner();
+        BigDecimal markupPartner = getAmount(oi.getMarkupPartner());
         BigDecimal totalAmount = markupPartner.multiply(new BigDecimal(oi.getNum()));
         BigDecimal settlementAmount = totalAmount.subtract(ois.getSalesFeePartner()).subtract(ois.getLackFeePartner());//结算金额
         if(settlementAmount.doubleValue() < 0){
diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java
index e840003..0b26afb 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java
@@ -12,18 +12,23 @@
 import com.mzl.flower.config.security.SecurityUtils;
 import com.mzl.flower.constant.Constants;
 import com.mzl.flower.dto.PriceDTO;
+import com.mzl.flower.dto.request.menber.MemberGrowthRecordDTO;
 import com.mzl.flower.dto.request.payment.*;
 import com.mzl.flower.dto.response.flower.FlowerCartListDTO;
 import com.mzl.flower.dto.response.flower.FlowerCartListWrapDTO;
+import com.mzl.flower.dto.response.flower.FlowerDTO;
 import com.mzl.flower.dto.response.flower.ParamItemDTO;
 import com.mzl.flower.dto.response.partner.PartnerOrderDTO;
 import com.mzl.flower.dto.response.payment.*;
 import com.mzl.flower.dto.response.system.CodeValueDTO;
 import com.mzl.flower.dto.response.transport.TransportOrderDTO;
 import com.mzl.flower.dto.response.warehouse.WarehouseLocationDTO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
 import com.mzl.flower.entity.customer.Address;
 import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.entity.flower.Flower;
 import com.mzl.flower.entity.flower.FlowerSupplierSaleNum;
+import com.mzl.flower.entity.menber.Member;
 import com.mzl.flower.entity.partner.Partner;
 import com.mzl.flower.entity.payment.*;
 import com.mzl.flower.entity.supplier.Station;
@@ -37,7 +42,11 @@
 import com.mzl.flower.mapper.system.UserWechatMapper;
 import com.mzl.flower.mapper.warehouse.WarehouseLocationMapper;
 import com.mzl.flower.service.BaseService;
+import com.mzl.flower.service.coupon.CouponRecordService;
 import com.mzl.flower.service.flower.FlowerService;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import com.mzl.flower.service.point.CustomerPointService;
+import com.mzl.flower.service.point.PointGoodsService;
 import com.mzl.flower.service.system.CodeService;
 import com.mzl.flower.service.system.WeChatService;
 import com.mzl.flower.service.transport.TransportService;
@@ -48,6 +57,7 @@
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -132,7 +142,24 @@
     private OrderItemCheckMapper orderItemCheckMapper;
 
     @Autowired
+    private OrderPointGoodsMapper pointGoodsMapper;
+
+    @Autowired
+    @Lazy
+    private MemberGrowthRecordService memberGrowthRecordService;
+
+    @Autowired
+    private CustomerPointService customerPointService;
+
+    @Autowired
+    private PointGoodsService pointGoodsService;
+
+    @Autowired
     private RedisLockService lockService;
+
+    @Autowired
+    private CouponRecordService couponRecordService;
+
 
     public void changeFlower2Cart(CartSaveDTO dto) {
         String userId = SecurityUtils.getUserId();
@@ -154,9 +181,41 @@
                 c.setNum(dto.getNum());
                 c.create(userId);
 
+                // 限购  1.首先查看购物车中的数量是否已经超过限售数量
+                final FlowerDTO flowerDetail = flowerService.getFlowerDetail(c.getFlowerId());
+                if(null!=c.getNum() && null!=flowerDetail.getLimited()
+                        && c.getNum().compareTo(flowerDetail.getLimited())>0){
+                    throw new ValidationException("数量不能超过限售数量!");
+                }
+
+                // 限购  2.查看已结单的订单的当前花朵已经购买的数量,加当前购物车的加入的数量是否超过限购的数量,查看当前5点前到昨天五点前
+                Integer completeNumToday=getFlowerCompleteNumToday(userId,c.getFlowerId());
+                Integer tmp=completeNumToday+c.getNum();
+                if(null!=tmp && null!=flowerDetail.getLimited()
+                      &&  tmp.compareTo(flowerDetail.getLimited())>0){
+                    throw new ValidationException("当天的订单的花数量加上购物车的数量不能超过限售数量!");
+                }
+
                 cartMapper.insert(c);
             } else {
-                c.setNum(c.getNum() + dto.getNum());
+                // 查看是否已经超过当前商品的限购数量
+                final FlowerDTO flowerDetail = flowerService.getFlowerDetail(c.getFlowerId());
+                c.setNum((c.getNum()==null?0:c.getNum()) + dto.getNum());
+
+                // 限购  1.首先查看购物车中的数量是否已经超过限售数量
+                if(null!=c.getNum() && null!=flowerDetail.getLimited()
+                      && c.getNum().compareTo(flowerDetail.getLimited())>0){
+                    throw new ValidationException("数量不能超过限售数量!");
+                }
+
+                // 限购  2.查看已结单的订单的当前花朵已经购买的数量,加当前购物车的加入的数量是否超过限购的数量,查看当前5点前到昨天五点前
+                Integer completeNumToday=getFlowerCompleteNumToday(userId,c.getFlowerId());
+                Integer tmp=completeNumToday+c.getNum();
+                if(null!=tmp && null!=flowerDetail.getLimited()
+                       && tmp.compareTo(flowerDetail.getLimited())>0){
+                    throw new ValidationException("当天的订单的花数量加上购物车的数量不能超过限售数量!");
+                }
+
                 c.update(userId);
                 if (c.getNum() <= 0) {
                     cartMapper.deleteById(c.getId());
@@ -235,13 +294,18 @@
         if (ls != null && ls.size() > 0) {
             Customer customer = getCurrentCustomer();
             Long partnerId = customer.getPartnerId();
+            Long levelId = customer.getLevelId();
+            Member member = getMember(levelId);
 
             Map<Long, FlowerCartListWrapDTO> map = new HashMap<>();
             for (FlowerCartListDTO c : ls) {
                 BigDecimal price = getFinalPrice(partnerId, c.getCategory()
                         , c.getId(), c.getPrice(), c.getLevel());
                 c.setPrice(price);
+                c.setPriceMember(calculateMemberPrice(price, member));
+
                 c.setTotal(price.multiply(new BigDecimal(c.getNum())));
+                c.setTotalMember(c.getPriceMember().multiply(new BigDecimal(c.getNum())));
 
                 if (c.getSales() != null && c.getRealSales() != null) {
                     c.setSales(c.getSales() + c.getRealSales());
@@ -269,6 +333,8 @@
     }
 
     public PreOrderDTO getPreOrderInfo(List<CartSaveDTO> flowers, Map<Long, PriceDTO> priceMap) {
+        String userId = SecurityUtils.getUserId();
+
         if (flowers == null || flowers.size() == 0) {
             throw new ValidationException("请选择商品");
         }
@@ -284,15 +350,37 @@
             }
             idNumMap.put(id, num);
         }
+
+        // 限购数量校验 鲜花数量校验
+        flowers.forEach(cartSaveDTO -> {
+            // 限购数量 鲜花数量校验
+            Integer completeNumToday=getFlowerCompleteNumToday(userId,cartSaveDTO.getId());
+            Integer tmp=completeNumToday+cartSaveDTO.getNum();
+            Flower flower=flowerMapper.selectById(cartSaveDTO.getId());
+            if(null!=flower.getLimited() && tmp.compareTo(flower.getLimited())>0){
+                throw new ValidationException("商品:'"+flower.getName()+"' 昨天17:00到今天17:00 超过限售数量:"+flower.getLimited()+"!");
+            }
+        });
+
         PreOrderDTO result = new PreOrderDTO();
 
         List<FlowerCartListDTO> ls = flowerMapper.selectFlowerOrderList(ids);
         Customer customer = getCurrentCustomer();
         Long partnerId = customer.getPartnerId();
+        Long levelId = customer.getLevelId();
+        Member member = getMember(levelId);
+        if (member != null) {
+            result.setMemberId(levelId);
+            result.setMemberName(member.getName());
+            result.setMemberDiscountType(member.getDiscountType());
+            result.setMemberDiscountRatio(member.getDiscountRatio());
+            result.setMemberDiscountAmount(member.getDiscountAmount());
+        }
 
         double totalWeight = 0D;
         int num = 0;
         BigDecimal totalAmount = new BigDecimal(0);
+        BigDecimal totalMemberAmount = new BigDecimal(0);
         for (FlowerCartListDTO c : ls) {
             if (!Constants.FLOWER_STATUS.UP.name().equals(c.getStatus())) {
                 throw new ValidationException("商品" + c.getName() + "已下架,请重新提交");
@@ -312,7 +400,10 @@
                     , c.getId(), c.getPrice(), c.getLevel());
             BigDecimal price = priceDTO.getPrice();
             c.setPrice(price);
+            c.setPriceMember(calculateMemberPrice(price, member));
+
             c.setTotal(price.multiply(new BigDecimal(c.getNum())));
+            c.setTotalMember(c.getPriceMember().multiply(new BigDecimal(c.getNum())));//使用会员价计算总价
 
             if (priceMap != null) {
                 priceMap.put(c.getId(), priceDTO);
@@ -320,6 +411,7 @@
 
             totalWeight += c.getWeight() * c.getNum();
             totalAmount = totalAmount.add(c.getTotal());
+            totalMemberAmount = totalMemberAmount.add(c.getTotalMember());
             num += c.getNum();
         }
 
@@ -330,6 +422,7 @@
         result.setFlowers(ls);
         result.setPacking(packing);
         result.setTotalAmount(totalAmount);
+        result.setTotalMemberAmount(totalMemberAmount);
         result.setTotalWeight(totalWeight);
 
         return result;
@@ -351,6 +444,17 @@
     }
 
     public Map commitOrder(OrderCommitDTO dto, PreOrderDTO p, Map<Long, PriceDTO> priceMap) {
+        String userId = SecurityUtils.getUserId();
+        p.getFlowers().forEach(flower -> {
+            // 限购数量 鲜花数量校验
+            Integer completeNumToday=getFlowerCompleteNumToday(userId,flower.getId());
+            Integer tmp=completeNumToday+flower.getNum();
+            if(null!=tmp && null!=flower.getLimited()
+                    && tmp.compareTo(flower.getLimited())>0){
+                throw new ValidationException("商品:'"+flower.getName()+"' 昨天17:00到今天17:00 超过限售数量:"+flower.getLimited()+"!");
+            }
+        });
+
         WxMaJscode2SessionResult session = null;
         try {
             session = weChatService.getWxMaSessionInfo(dto.getWxcode());
@@ -363,7 +467,8 @@
         }
 
         Address address = addressMapper.selectById(dto.getAddressId());
-        List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address, p.getTotalWeight(), dto.getTransportId());
+        List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address
+                , p.getTotalWeight(), dto.getTransportId());
         BigDecimal transportFee = new BigDecimal(0);
         String deliveryName = "";
         if (tLs != null && tLs.size() > 0) {
@@ -372,21 +477,49 @@
             deliveryName = d.getName();
         }
 
-        String userId = SecurityUtils.getUserId();
+
         Order order = new Order();
         order.setId(UUIDGenerator.getUUID());
+
+        final List<Long> goodsRecordIdList = dto.getGoodsRecordIdList();
+        usePointGoods(order.getId(), goodsRecordIdList);//使用积分商品兑换券
+
         order.create(userId);
         order.setRemarks(dto.getRemarks());
         order.setSpecialNeeds(dto.getSpecialNeeds());
         order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.PENDING.name());
         order.setStatus(Constants.ORDER_STATUS.PENDING.name());
 
-        order.setFlowerAmount(p.getTotalAmount());
+        //设置下单时的会员信息
+        order.setMemberId(p.getMemberId());
+        order.setMemberName(p.getMemberName());
+        order.setMemberDiscountType(p.getMemberDiscountType());
+        order.setMemberDiscountRatio(p.getMemberDiscountRatio());
+        order.setMemberCouponAmount(p.getMemberDiscountAmount());
+
+        order.setFlowerAmount(p.getTotalMemberAmount());//使用会员价总价
         order.setPackingFee(p.getPacking());
         order.setTransportFee(transportFee);
         order.setDeliveryName(deliveryName);
 
-        BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);
+        BigDecimal totalAmount = order.getFlowerAmount();//使用优惠券之前的总价,使用商品价格
+        CouponRecordDO coupon = useCouponRecord(order.getId(), totalAmount, dto.getCouponRecordId());
+        log.info("用户优惠券: " + coupon);
+        if(coupon != null){
+            order.setMemberCouponId(coupon.getId());
+            order.setMemberCouponCode(coupon.getCouponCode());
+            order.setMemberCouponName(coupon.getCouponName());
+            order.setMemberCouponAmount(coupon.getCouponDiscountValue());
+
+            totalAmount = totalAmount.subtract(order.getMemberCouponAmount());//满足条件需要减去优惠券金额
+        }
+        if(totalAmount.doubleValue() < 0){//假如扣除优惠券后金额小于0,则按0计算
+            totalAmount = new BigDecimal(0);
+        }
+        totalAmount = totalAmount.add(p.getPacking()).add(transportFee);
+        if(totalAmount.doubleValue() <= 0){//假如总价小于等于0,则支付0.01元
+            totalAmount = new BigDecimal(0.01);
+        }
         order.setTotalAmount(totalAmount);
 
         order.setCustomer(address.getName());
@@ -407,7 +540,12 @@
         //商品列表处理
         List<FlowerCartListDTO> flowers = p.getFlowers();
         Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>();
-        for (FlowerCartListDTO f : flowers) {
+        final BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价
+        final BigDecimal memberCouponAmount = order.getMemberCouponAmount();//使用优惠券面值
+        BigDecimal usedCouponAmount = new BigDecimal(0);
+        for (int i = 0; i < flowers.size(); i++) {
+            FlowerCartListDTO f = flowers.get(i);
+
             OrderItem t = new OrderItem();
             t.setId(UUIDGenerator.getUUID());
             t.setOrderId(order.getId());
@@ -432,8 +570,23 @@
             t.setMarkupOne(pp.getFirstFee());
             t.setMarkupTwo(pp.getSecondFee());
             t.setMarkupPartner(pp.getPartnerFee());
-            t.setPrice(pp.getPrice());
-            t.setTotal(f.getTotal());
+            t.setPrice(f.getPriceMember());//使用会员单价
+            t.setTotal(f.getTotalMember());//使用会员总价
+
+            t.setOriginalPrice(pp.getPrice());//非会员售价
+            boolean isLastOne = i == (flowers.size() - 1);
+            BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal()
+                    , flowerAmount, t.getNum(), t.getPrice(), isLastOne, usedCouponAmount);
+            t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值
+            t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交单价
+
+            t.setCouponAmountTotal(couponAmount.multiply(BigDecimal.valueOf(t.getNum())));
+            if(isLastOne){
+                t.setCouponAmountTotal(memberCouponAmount.subtract(usedCouponAmount));
+            } else {
+                usedCouponAmount = usedCouponAmount.add(t.getCouponAmountTotal());
+            }
+            t.setRealTotal(t.getTotal().subtract(t.getCouponAmountTotal()));
 
             t.create(userId);
             orderItemMapper.insert(t);
@@ -445,9 +598,74 @@
         order.setPayOpenid(openId);
         orderMapper.insert(order);
 
+        //处理积分商品兑换券
+        if(goodsRecordIdList != null && goodsRecordIdList.size() > 0){
+            for(Long goodsRecordId : goodsRecordIdList){
+                OrderPointGoods g = new OrderPointGoods();
+                g.setId(UUIDGenerator.getUUID());
+                g.setOrderId(order.getId());
+                g.setGoodsRecordId(goodsRecordId);
+                g.create(userId);
+                pointGoodsMapper.insert(g);
+            }
+        }
+
         Map map = paymentV3Service.wxPrepay(order);
         map.put("_testV2OrderId", order.getId());
         return map;
+    }
+
+    private void usePointGoods(String orderId, List<Long> goodsRecordIdList){
+        //使用积分商品兑换券
+        if(goodsRecordIdList != null && goodsRecordIdList.size() > 0){
+            for(Long grId : goodsRecordIdList){
+                pointGoodsService.useExchangeGoods(grId, orderId);
+            }
+        }
+    }
+
+    /**
+     * 计算订单中每种商品每扎平摊的优惠券面值,保留2位小数
+     *
+     * @param couponAmount
+     * @param itemTotalAmount
+     * @param totalAmount
+     * @param num
+     * @param price
+     * @return
+     */
+    private BigDecimal calculateCoupon(BigDecimal couponAmount, BigDecimal itemTotalAmount
+            , BigDecimal totalAmount, Integer num, BigDecimal price
+            , boolean isLastOne, BigDecimal usedCouponAmount){
+        if(couponAmount == null){
+            return new BigDecimal(0);
+        }
+
+        if(couponAmount.doubleValue() >= totalAmount.doubleValue()){
+            return price;
+        }
+        if(isLastOne){//最后的商品使用优惠券剩下的面值
+            BigDecimal subCoupon = couponAmount.subtract(usedCouponAmount);//占有的优惠券面值
+            return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP);
+        }
+
+        /*BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比
+        BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值
+        return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP);*/
+
+        //不能分步计算,分步计算会有精度问题
+        return couponAmount.multiply(itemTotalAmount).divide(totalAmount.multiply(BigDecimal.valueOf(num)), 2, RoundingMode.HALF_UP);
+    }
+
+    private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){
+        log.info("使用用户优惠券id: " + couponRecordId + "; 订单id: " + orderId);
+        if(StringUtils.isNotEmpty(couponRecordId)){
+            //优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法
+            couponRecordService.useCoupon(couponRecordId, orderId, amount);
+            return couponRecordService.getCouponRecordById(couponRecordId);
+        }
+
+        return null;
     }
 
     private String getOrderNo() {
@@ -655,10 +873,9 @@
                 orderIds.add(o.getId());
             }
 
-            List<OrderItem> itemList = orderItemMapper.selectList(
-                    new QueryWrapper<OrderItem>().in("order_id", orderIds));
+            List<OrderItemListDTO> itemList = orderItemMapper.getOrderItems(orderIds);
             Map<String, List<OrderItemListDTO>> map = new HashMap<>();
-            for (OrderItem oi : itemList) {
+            for (OrderItemListDTO oi : itemList) {
                 String orderId = oi.getOrderId();
                 List<OrderItemListDTO> ll = map.computeIfAbsent(orderId, k -> new ArrayList<>());
                 OrderItemListDTO d = new OrderItemListDTO();
@@ -782,10 +999,18 @@
                 if(llc == null){
                     llc = new OrderCheckLocationListDTO();
                     BeanUtils.copyProperties(c, llc);
-                    rMap.put(locationId, llc);
+                    llc.setTotalAmount(new BigDecimal(0));
 
+                    rMap.put(locationId, llc);
                     result.add(llc);
                 }
+
+                BigDecimal t = llc.getTotalAmount();
+                if(t == null){
+                    t = new BigDecimal(0);
+                }
+                t = t.add(c.getTotalAmount());
+                llc.setTotalAmount(t);
             }
 
             Map<Long, String> stationMap = prepareStationMap();
@@ -859,6 +1084,9 @@
         boolean couldCheckRefund = StringUtils.isEmpty(transferId) && count == 0 && cc == 0;
         dto.setCouldCheckRefund(couldCheckRefund);
 
+        List<OrderPointGoodsListDTO> pointGoodsList = orderMapper.getPointGoodsList(id);
+        dto.setPointGoodsList(pointGoodsList);
+
         return dto;
     }
 
@@ -897,12 +1125,12 @@
         return result;
     }
 
-    public void autoReceive() {
+    public List<Order> autoReceive() {
         int days = -5; //5天前的订单自动收货
         LocalDateTime endTime = LocalDateTime.now().plusDays(days);
         List<Order> ls = orderMapper.getOrderForAutoReceive(endTime);
         if (ls == null || ls.size() == 0) {
-            return;
+            return ls;
         }
 
         for (Order o : ls) {
@@ -911,8 +1139,44 @@
             o.setReceiveTime(LocalDateTime.now());
             o.update("sys");
             orderMapper.updateById(o);
-
         }
+
+        return ls;
+    }
+
+    public void processAfterReceive(Order o){
+        String status = o.getStatus();
+        if(!Constants.ORDER_STATUS.EVALUATE.name().equals(status)){
+            log.warn("订单未确认收货,无法处理积分和成长值");
+            return;
+        }
+
+        BigDecimal totalAmount = o.getTotalAmount();
+        List<OrderItemCheck> checkList = orderItemCheckMapper.selectList(new QueryWrapper<OrderItemCheck>()
+                .eq("order_id", o.getId())
+                .eq("audit_status", Constants.CHECK_AUDIT_STATUS.AGREED.name())
+        );
+
+        if(checkList != null && checkList.size() > 0){
+            for(OrderItemCheck c : checkList){
+                if(Constants.CHECK_TYPE.replace.name().equals(c.getType())){
+                    continue;
+                }
+                totalAmount = totalAmount.subtract(getAmount(c.getDeductAmount()));
+            }
+        }
+
+        //成长值计算
+        MemberGrowthRecordDTO mDto = new MemberGrowthRecordDTO();
+        mDto.setTotalAmount(totalAmount);
+        mDto.setUserId(o.getCreateBy());
+        mDto.setSource(Constants.GROWTH_SOURCE.consume.name());
+        mDto.setType(Constants.GROWTH_TYPE.add.name());
+        mDto.setRemarks("订单: " + o.getOrderNo());
+        memberGrowthRecordService.saveMemberGrowthRecord(mDto);
+
+        //积分计算
+        customerPointService.consumptionPoint(totalAmount, o.getOrderNo(), o.getCreateBy());
     }
 
     public JSONObject sendWxDeliveryGood(Order o) {
@@ -954,7 +1218,7 @@
         }
     }
 
-    public void confirmOrderReceive(String id) {
+    public Order confirmOrderReceive(String id) {
         Order o = orderMapper.selectById(id);
         String userId = SecurityUtils.getUserId();
         if (!userId.equals(o.getCreateBy())) {
@@ -973,6 +1237,8 @@
         o.setReceiveTime(LocalDateTime.now());
         o.update(userId);
         orderMapper.updateById(o);
+
+        return o;
     }
 
     public Integer getMyOrderStatusCount(String status) {
@@ -1286,4 +1552,19 @@
         order.update(SecurityUtils.getUserId());
         orderMapper.updateById(order);
     }
+
+    /**
+     * 获取用户最后收货时间
+     * @param userId
+     * @return
+     */
+    public LocalDateTime getUserLastOrderTime(String userId){
+        Order o = orderMapper.getUserLastOrder(userId);
+        return o.getReceiveTime();
+    }
+
+    public Integer getFlowerCompleteNumToday(String userId,Long flowerId){
+        Integer completeNum= orderMapper.getFlowerCompleteNumToday(userId,flowerId);
+        return completeNum;
+    }
 }
diff --git a/src/main/java/com/mzl/flower/service/payment/OrderSettlementService.java b/src/main/java/com/mzl/flower/service/payment/OrderSettlementService.java
index 02cb428..7fe5f0c 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderSettlementService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderSettlementService.java
@@ -130,19 +130,21 @@
         }
         String type = settlement.getType();
 
+        String name = "";
+        if(Constants.SETTLEMENT_TYPE.supplier.name().equals(type)){
+            Supplier s = supplierMapper.selectOne(new QueryWrapper<Supplier>()
+                    .eq("user_id", settlement.getUserId()));
+            name = "供应商" + s.getName();
+        } else {
+            Partner p = partnerMapper.selectOne(new QueryWrapper<Partner>()
+                    .eq("user_id", settlement.getUserId()));
+            name = "合伙人" + p.getName();
+        }
+
         UserWechat wechat = wechatMapper.selectOne(new QueryWrapper<UserWechat>()
                 .eq("user_id", settlement.getUserId()));
         if(wechat == null){
-            String msg;
-            if(Constants.SETTLEMENT_TYPE.supplier.name().equals(type)){
-                Supplier s = supplierMapper.selectOne(new QueryWrapper<Supplier>()
-                        .eq("user_id", settlement.getUserId()));
-                msg = "供应商" + s.getName() + "未绑定账号无法结算";
-            } else {
-                Partner p = partnerMapper.selectOne(new QueryWrapper<Partner>()
-                        .eq("user_id", settlement.getUserId()));
-                msg = "合伙人" + p.getName() + "未绑定账号无法结算";
-            }
+            String msg = name + "未绑定账号无法结算";
             log.error(msg);
             throw new ValidationException(msg);
         }
@@ -151,8 +153,7 @@
         LocalDateTime now = LocalDateTime.now();
         String day = format(now, "yyyy-MM-dd");
 
-        String remarks = Constants.SETTLEMENT_TYPE.supplier.name().equals(type)
-                ? "供应商账单结算" : "合伙人账单结算";
+        String remarks = name + "账单结算";
 
         String appId = Constants.SETTLEMENT_TYPE.supplier.name().equals(type)
                 ? PyamentV3Configurer.supplier_app_id : PyamentV3Configurer.partner_app_id;
diff --git a/src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java b/src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java
index f9ae5d7..3640a32 100644
--- a/src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java
+++ b/src/main/java/com/mzl/flower/service/payment/UserPaymentV3Service.java
@@ -15,7 +15,9 @@
 import com.mzl.flower.mapper.payment.*;
 import com.mzl.flower.mapper.system.UserWechatMapper;
 import com.mzl.flower.service.BaseService;
+import com.mzl.flower.service.coupon.CouponRecordService;
 import com.mzl.flower.service.flower.FlowerService;
+import com.mzl.flower.service.point.PointGoodsService;
 import com.mzl.flower.utils.UUIDGenerator;
 import com.wechat.pay.java.core.notification.NotificationParser;
 import com.wechat.pay.java.core.notification.RequestParam;
@@ -103,6 +105,15 @@
 
     @Autowired
     private OrderRefundMapper orderRefundMapper;
+
+    @Autowired
+    private OrderPointGoodsMapper orderPointGoodsMapper;
+
+    @Autowired
+    private PointGoodsService pointGoodsService;
+
+    @Autowired
+    private CouponRecordService couponRecordService;
 
     /**
      * 微信预支付
@@ -439,8 +450,27 @@
     }
 
     private void releasePrepayLock(Order order){
-        log.info("恢复库存: " + order);
+        log.info("恢复库存 积分商品兑换券 优惠券: " + order);
         revertFlowerStock(order.getId());
+
+        //恢复积分商品兑换券
+        revertPointGoodsRecord(order.getId());
+
+        //恢复优惠券
+        String memberCouponId = order.getMemberCouponId();
+        if(StringUtils.isNotEmpty(memberCouponId)) {
+            couponRecordService.cancelCouponUsage(order.getId());
+        }
+    }
+
+    private void revertPointGoodsRecord(String orderId){
+        List<OrderPointGoods> ls = orderPointGoodsMapper.selectList(new QueryWrapper<OrderPointGoods>()
+                .eq("order_id", orderId));
+        if(ls != null && ls.size() > 0){
+            for(OrderPointGoods pg : ls){
+                pointGoodsService.revertExchangeGoods(pg.getGoodsRecordId());
+            }
+        }
     }
 
     public Map payAgain(String orderId){
diff --git a/src/main/java/com/mzl/flower/service/payment/WxDeliveryGoodService.java b/src/main/java/com/mzl/flower/service/payment/WxDeliveryGoodService.java
index 69f3cea..bd48266 100644
--- a/src/main/java/com/mzl/flower/service/payment/WxDeliveryGoodService.java
+++ b/src/main/java/com/mzl/flower/service/payment/WxDeliveryGoodService.java
@@ -31,7 +31,7 @@
         orderKey.put("mchid",merchantId);//支付下单商户的商户号,由微信支付生成并下发。
         orderKey.put("out_trade_no",orderId);//商户系统内部订单号
         body.put("order_key",orderKey);
-        body.put("logistics_type",4);//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
+        body.put("logistics_type",2);//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
         body.put("delivery_mode",1);//发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY
 
         //商品信息
diff --git a/src/main/java/com/mzl/flower/service/point/CustomerPointService.java b/src/main/java/com/mzl/flower/service/point/CustomerPointService.java
new file mode 100644
index 0000000..8223dd0
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/point/CustomerPointService.java
@@ -0,0 +1,210 @@
+package com.mzl.flower.service.point;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.point.ChangePointDTO;
+import com.mzl.flower.dto.request.point.QueryCustomerPointDTO;
+import com.mzl.flower.dto.request.point.QueryPointDetailDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDetailDTO;
+import com.mzl.flower.entity.customer.Customer;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
+import com.mzl.flower.service.BaseService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.mzl.flower.constant.Constants.*;
+
+@Service
+@Transactional
+public class CustomerPointService extends BaseService {
+
+    private final CustomerPointMapper customerPointMapper;
+
+    private final CustomerPointDetailMapper customerPointDetailMapper;
+
+
+    public CustomerPointService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper) {
+        this.customerPointMapper = customerPointMapper;
+        this.customerPointDetailMapper = customerPointDetailMapper;
+    }
+
+    public Page<CustomerPointDTO> queryPage(QueryCustomerPointDTO dto, Page page) {
+        List<CustomerPointDTO> list = customerPointMapper.queryPage(dto, page);
+        page.setRecords(list);
+        return page;
+    }
+
+    public  Page<CustomerPointDetailDTO> queryCustomerDetails(QueryPointDetailDTO dto, Page page) {
+        List<CustomerPointDetailDTO> list = customerPointMapper.queryCustomerDetails(dto, page);
+        page.setRecords(list);
+
+        return page;
+    }
+
+    public void giveawayPoint(ChangePointDTO dto) {
+        CustomerPointDetail detail = new CustomerPointDetail();
+        Customer customer = getCustomer(dto.getCustomerId());
+        detail.setCustomerId(customer.getId());
+        detail.setUserId(customer.getUserId());
+        detail.setPoint(dto.getPoint());
+        detail.setRemarks(dto.getRemarks());
+        detail.setRecordDate(LocalDate.now());
+        detail.setChangeType(POINT_CHANGE_TYPE.add.name());
+        detail.setType(POINT_TYPE.giveaway.name());
+        detail.create(SecurityUtils.getUserId());
+        customerPointDetailMapper.insert(detail);
+
+        //更新汇总表
+        updateCustomerPoint(detail);
+    }
+
+    public void updateCustomerPoint(CustomerPointDetail detail) {
+        CustomerPoint point = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+                .eq(CustomerPoint::getCustomerId, detail.getCustomerId()));
+        boolean isAdd = false;
+        if(point == null){
+            isAdd = true;
+            point = new CustomerPoint();
+            point.setCustomerId(detail.getCustomerId());
+            point.setUserId(detail.getUserId());
+            point.setTotalPoint(0);
+            point.setUsedPoint(0);
+            point.setExpiredPoint(0);
+            point.setDeductionPoint(0);
+            point.create(SecurityUtils.getUserId());
+        }
+
+        if(POINT_CHANGE_TYPE.add.name().equals(detail.getChangeType())){
+            point.setTotalPoint(point.getTotalPoint() + detail.getPoint());
+        }else if(POINT_CHANGE_TYPE.reduce.name().equals(detail.getChangeType())){
+            Integer detailPoint = detail.getPoint();
+            if(POINT_TYPE.deduction.name().equals(detail.getType())){ //积分扣减
+                Integer balancePoint = point.getTotalPoint() - point.getUsedPoint()-point.getExpiredPoint()-point.getDeductionPoint();//可用积分
+                balancePoint = balancePoint.intValue()>0?balancePoint.intValue():0;
+                if(balancePoint.intValue() >= detail.getPoint().intValue()){
+                    point.setDeductionPoint(point.getDeductionPoint() + detail.getPoint());
+                }else{
+                    //积分不足,直接清0
+                    point.setDeductionPoint(point.getDeductionPoint() + balancePoint);
+                    detail.setPoint(balancePoint);
+                    detail.setRemarks(detail.getRemarks()+",当前积分不足"+detailPoint+",实际扣除积分"+balancePoint);
+                }
+            }
+        }
+        if(isAdd){
+            customerPointMapper.insert(point);
+        }else{
+            customerPointMapper.updateById(point);
+        }
+
+    }
+
+    public void deductionPoint(ChangePointDTO dto) {
+        CustomerPointDetail detail = new CustomerPointDetail();
+        Customer customer = getCustomer(dto.getCustomerId());
+        detail.setCustomerId(customer.getId());
+        detail.setUserId(customer.getUserId());
+        detail.setPoint(dto.getPoint());
+        detail.setRemarks(dto.getRemarks());
+        detail.setRecordDate(LocalDate.now());
+        detail.setChangeType(POINT_CHANGE_TYPE.reduce.name());
+        detail.setType(POINT_TYPE.deduction.name());
+        detail.create(SecurityUtils.getUserId());
+        //更新汇总表
+        updateCustomerPoint(detail);
+
+        customerPointDetailMapper.insert(detail);
+    }
+
+    public void consumptionPoint(BigDecimal orderAmount, String orderNo,String userId)  {
+        CustomerPointDetail detail = new CustomerPointDetail();
+        Customer customer = getCustomerByUserId(userId);
+        detail.setCustomerId(customer.getId());
+        detail.setUserId(customer.getUserId());
+        BigDecimal point = orderAmount.setScale(0, BigDecimal.ROUND_HALF_UP);
+        detail.setPoint(point.intValue());
+        detail.setRemarks(orderNo);
+        detail.setRecordDate(LocalDate.now());
+        detail.setChangeType(POINT_CHANGE_TYPE.add.name());
+        detail.setType(POINT_TYPE.consume.name());
+        detail.create(SecurityUtils.getUserId());
+        customerPointDetailMapper.insert(detail);
+
+        //更新汇总表
+        updateCustomerPoint(detail);
+    }
+
+    public void signIn() {
+        if(signToday()){
+            throw new ValidationException("今天已经签到过了");
+        }
+        int signNum = customerPointDetailMapper
+                .selectCount(new LambdaQueryWrapper<CustomerPointDetail>()
+                        .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId())
+                        .ge(CustomerPointDetail::getRecordDate,LocalDate.now().minusDays(9))
+                        .eq(CustomerPointDetail::getChangeType,POINT_CHANGE_TYPE.add.name())
+                        .eq(CustomerPointDetail::getType,POINT_TYPE.sign.name())
+                );
+        int point = 1;
+        if(signNum==9){
+            point = 3;
+        }
+        CustomerPointDetail detail = new CustomerPointDetail();
+        Customer customer = getCurrentCustomer();
+        detail.setCustomerId(customer.getId());
+        detail.setUserId(customer.getUserId());
+        detail.setPoint(point);
+        detail.setRemarks("签到");
+        detail.setRecordDate(LocalDate.now());
+        detail.setChangeType(POINT_CHANGE_TYPE.add.name());
+        detail.setType(POINT_TYPE.sign.name());
+        detail.create(SecurityUtils.getUserId());
+        customerPointDetailMapper.insert(detail);
+
+        //更新汇总表
+        updateCustomerPoint(detail);
+    }
+
+    public List<CustomerPointDetailDTO> signList(LocalDate startDate, LocalDate endDate) {
+        LambdaQueryWrapper<CustomerPointDetail> lambdaQueryWrapper = new LambdaQueryWrapper<CustomerPointDetail>()
+                .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId())
+                .eq(CustomerPointDetail::getChangeType, POINT_CHANGE_TYPE.add.name())
+                .eq(CustomerPointDetail::getType, POINT_TYPE.sign.name());
+        lambdaQueryWrapper.orderByDesc(CustomerPointDetail::getRecordDate);
+        if(startDate!=null){
+            lambdaQueryWrapper.ge(CustomerPointDetail::getRecordDate,startDate);
+        }
+        if (endDate != null) {
+            lambdaQueryWrapper.le(CustomerPointDetail::getRecordDate, endDate);
+        }
+
+        List<CustomerPointDetail> details = customerPointDetailMapper.selectList(lambdaQueryWrapper);
+        List<CustomerPointDetailDTO> dtos = new ArrayList<>();
+        for (CustomerPointDetail detail : details) {
+            CustomerPointDetailDTO dto = new CustomerPointDetailDTO();
+            BeanUtils.copyProperties(detail, dto);
+            dtos.add(dto);
+        }
+        return dtos;
+    }
+
+    public Boolean signToday() {
+        return customerPointDetailMapper.selectCount(new LambdaQueryWrapper<CustomerPointDetail>()
+                        .eq(CustomerPointDetail::getUserId, SecurityUtils.getUserId())
+                        .eq(CustomerPointDetail::getRecordDate,LocalDate.now())
+                        .eq(CustomerPointDetail::getChangeType,POINT_CHANGE_TYPE.add.name())
+                        .eq(CustomerPointDetail::getType,POINT_TYPE.sign.name()))>0;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/point/PointGoodsService.java b/src/main/java/com/mzl/flower/service/point/PointGoodsService.java
new file mode 100644
index 0000000..69c144b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/point/PointGoodsService.java
@@ -0,0 +1,239 @@
+package com.mzl.flower.service.point;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.point.*;
+import com.mzl.flower.dto.response.point.PointGoodsDTO;
+import com.mzl.flower.dto.response.point.PointGoodsListDTO;
+import com.mzl.flower.dto.response.point.PointGoodsRecordDTO;
+import com.mzl.flower.entity.point.CustomerPoint;
+import com.mzl.flower.entity.point.CustomerPointDetail;
+import com.mzl.flower.entity.point.PointGoods;
+import com.mzl.flower.entity.point.PointGoodsRecord;
+import com.mzl.flower.mapper.point.CustomerPointDetailMapper;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
+import com.mzl.flower.mapper.point.PointGoodsMapper;
+import com.mzl.flower.mapper.point.PointGoodsRecordMapper;
+import com.mzl.flower.service.BaseService;
+import com.mzl.flower.service.payment.RedisLockService;
+import com.mzl.flower.utils.DateUtils;
+import com.mzl.flower.utils.UUIDGenerator;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@Transactional
+public class PointGoodsService extends BaseService {
+
+    @Autowired
+    private PointGoodsMapper pointGoodsMapper;
+
+    @Autowired
+    private PointGoodsRecordMapper pointGoodsRecordMapper;
+
+    @Autowired
+    private CustomerPointMapper customerPointMapper;
+
+    @Autowired
+    private CustomerPointDetailMapper customerPointDetailMapper;
+
+
+    @Autowired
+    private RedisLockService lockService;
+
+    public Long addPointGoods(PointGoodsCreateDTO dto){
+        PointGoods p = new PointGoods();
+        BeanUtils.copyProperties(dto, p);
+        p.setPictures(toJSONString(dto.getPictureList()));
+        p.setStatus(Constants.POINT_GOODS_STATUS.I.name());
+
+        p.create(SecurityUtils.getUserId());
+        pointGoodsMapper.insert(p);
+
+        return p.getId();
+    }
+
+    public Long updatePointGoods(PointGoodsUpdateDTO dto){
+        PointGoods p = pointGoodsMapper.selectById(dto.getId());
+        if(p == null){
+            throw new ValidationException("商品未找到");
+        }
+
+        BeanUtils.copyProperties(dto, p);
+        p.setPictures(toJSONString(dto.getPictureList()));
+
+        p.update(SecurityUtils.getUserId());
+        pointGoodsMapper.updateById(p);
+
+        return p.getId();
+    }
+
+    public void deletePointGoods(String idStr){
+        List<String> ids = splitParam(idStr);
+        if (ids != null && ids.size() > 0) {
+            for(String idd : ids) {
+                Long id = Long.parseLong(idd);
+                pointGoodsMapper.deleteById(id);
+            }
+        }
+    }
+
+    public Page<PointGoodsListDTO> selectGoodsList(Page page, PointGoodsQueryDTO dto){
+        List<PointGoodsListDTO> ls = pointGoodsMapper.selectGoodsList(page, dto);
+
+        page.setRecords(ls);
+        return page;
+    }
+
+    public PointGoodsDTO getGoodsInfo(Long id){
+        PointGoods p = pointGoodsMapper.selectById(id);
+        if(p == null){
+            throw new ValidationException("商品未找到");
+        }
+        PointGoodsDTO dto = new PointGoodsDTO();
+        BeanUtils.copyProperties(p, dto);
+        dto.setPictureList(parseArray(p.getPictures(), String.class));
+
+        return dto;
+    }
+
+    public void updateStatus(String idStr, String status){
+        List<String> ids = splitParam(idStr);
+        if(ids != null && ids.size() > 0) {
+            for(String idd : ids) {
+                Long id = Long.parseLong(idd);
+                PointGoods p = pointGoodsMapper.selectById(id);
+                if (p == null) {
+                    continue;
+                }
+
+                if(Constants.POINT_GOODS_STATUS.A.name().equals(status)){
+                    if(p.getStock() == null || p.getStock() <= 0){
+                        throw new ValidationException("商品" + p.getName() + "库存为0不能上架");
+                    }
+                }
+
+                p.setStatus(status);
+                p.update(SecurityUtils.getUserId());
+                pointGoodsMapper.updateById(p);
+            }
+        }
+    }
+
+    public void exchangeGoods(ExchangeGoodsDTO dto) {
+        String key="EXCHANGE_GOODS:"+dto.getGoodsId()+":"+SecurityUtils.getUserId();
+        boolean lock = lockService.getObjectLock(key, "");
+        if(!lock){
+            throw new ValidationException("系统操作频繁,请稍后重试");
+        }
+        try {
+            PointGoods p = pointGoodsMapper.selectById(dto.getGoodsId());
+            if(p == null){
+                throw new ValidationException("商品未找到");
+            }
+            if(!Constants.POINT_GOODS_STATUS.A.name().equals(p.getStatus())){
+                throw new ValidationException("商品未上架");
+            }
+            if(p.getStock()< dto.getNum()){
+                throw new ValidationException("商品库存不足");
+            }
+            CustomerPoint cp = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+                    .eq(CustomerPoint::getUserId, SecurityUtils.getUserId()));
+            if(cp == null || (cp.getTotalPoint()-cp.getUsedPoint()-cp.getExpiredPoint()-cp.getDeductionPoint()) < p.getPoint() * dto.getNum()){
+                throw new ValidationException("积分不足");
+            }
+            //记录兑换记录
+            PointGoodsRecord record = new PointGoodsRecord();
+            record.setUserId(SecurityUtils.getUserId());
+            record.setCustomerId(getCustomerByUserId(SecurityUtils.getUserId()).getId());
+            record.setGoodsId(dto.getGoodsId());
+            record.setNum(dto.getNum());
+            record.setPoint(p.getPoint());
+            record.setName(p.getName());
+            record.setPictures(p.getCover());
+            record.setDescription(p.getDescription());
+            record.setTotalPoint(p.getPoint() * dto.getNum());
+            record.setCover(p.getCover());
+            record.setRedeemCode(UUIDGenerator.getUUID());
+            record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.A.name());//未使用
+            LocalDate expireDate = LocalDate.now().plusYears(1);
+            String expireDateStr = DateUtils.toString(expireDate,"yyyy-MM-dd");
+            record.setExpireTime(DateUtils.dateToLocalDateTime(expireDateStr,false));
+            record.create(SecurityUtils.getUserId());
+            pointGoodsRecordMapper.insert(record);
+
+            //更新积分汇总
+            cp.setUsedPoint(cp.getUsedPoint()+record.getTotalPoint());
+            customerPointMapper.updateById(cp);
+
+            //记录积分明细
+            CustomerPointDetail detail = new CustomerPointDetail();
+            detail.setUserId(SecurityUtils.getUserId());
+            detail.setCustomerId(record.getCustomerId());
+            detail.setPoint(record.getTotalPoint());
+            detail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name());
+            detail.setType(Constants.POINT_TYPE.exchange.name());
+            detail.setRecordDate(LocalDate.now());
+            detail.setRemarks(record.getName());
+            detail.create(SecurityUtils.getUserId());
+            customerPointDetailMapper.insert(detail);
+
+            //更新库存
+            p.setStock(p.getStock()- dto.getNum());
+            pointGoodsMapper.updateById(p);
+        }catch (Exception e){
+            throw new ValidationException("兑换失败");
+        }finally {
+            lockService.releaseObjectLock(key,"");
+        }
+
+    }
+
+    public Page<PointGoodsRecordDTO> myExchangeGoods(QueryExchangeGoodsDTO dto, Page page) {
+        dto.setUserId(SecurityUtils.getUserId());
+        List<PointGoodsRecordDTO> list = pointGoodsRecordMapper.selectMyExchangeGoods(dto,page);
+        page.setRecords(list);
+        return page;
+    }
+
+    public void useExchangeGoods(Long recordId,String orderId) {
+        PointGoodsRecord record = pointGoodsRecordMapper.selectById(recordId);
+        if(record == null){
+            throw new ValidationException("兑换券不存在");
+        }
+        if(!Constants.POINT_GOODS_RECORD_STATUS.A.name().equals(record.getStatus())){
+            throw new ValidationException("兑换券已使用或过期");
+        }
+        if(!SecurityUtils.getUserId().equals(record.getUserId())){
+            throw new ValidationException("兑换券不属于当前用户");
+        }
+        record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.U.name());
+        record.setOrderId(orderId);
+        pointGoodsRecordMapper.updateById(record);
+    }
+
+    public void revertExchangeGoods(Long recordId) {
+        PointGoodsRecord record = pointGoodsRecordMapper.selectById(recordId);
+        if(record == null){
+            throw new ValidationException("兑换券不存在");
+        }
+        if(!Constants.POINT_GOODS_RECORD_STATUS.U.name().equals(record.getStatus())){
+            throw new ValidationException("兑换券未使用或过期");
+        }
+        if(SecurityUtils.getUserId() != null && !SecurityUtils.getUserId().equals(record.getUserId())){
+            throw new ValidationException("兑换券不属于当前用户");
+        }
+        record.setStatus(Constants.POINT_GOODS_RECORD_STATUS.A.name());
+        record.setOrderId(null);
+        pointGoodsRecordMapper.updateById(record);
+    }
+}
diff --git a/src/main/java/com/mzl/flower/service/supplier/StationService.java b/src/main/java/com/mzl/flower/service/supplier/StationService.java
index 198eb34..9bbca02 100644
--- a/src/main/java/com/mzl/flower/service/supplier/StationService.java
+++ b/src/main/java/com/mzl/flower/service/supplier/StationService.java
@@ -96,4 +96,8 @@
         List<StationDTO> list = stationMapper.queryList( name);
         return list;
     }
+
+    public Boolean getMainWarehouse(String userId) {
+        return stationMapper.selectCount(new LambdaQueryWrapper<Station>().eq(Station::getType,"0").like(Station::getUserIds, userId))>0;
+    }
 }
diff --git a/src/main/java/com/mzl/flower/service/system/RoleService.java b/src/main/java/com/mzl/flower/service/system/RoleService.java
index 9780186..0e771c1 100644
--- a/src/main/java/com/mzl/flower/service/system/RoleService.java
+++ b/src/main/java/com/mzl/flower/service/system/RoleService.java
@@ -69,10 +69,7 @@
         //获取角色详情
         Role role = roleMapper.selectById(id);
         //获取角色下的菜单
-        QueryWrapper queryWrapper = new QueryWrapper<RoleMenu>().and(roleMenuQueryWrapper -> {
-            return roleMenuQueryWrapper
-                    .eq("ROLE_ID", id);
-        });
+        QueryWrapper queryWrapper = new QueryWrapper<RoleMenu>().eq("ROLE_ID", id);
         List<RoleMenu> roleMenus = roleMenuMapper.selectList(queryWrapper);
 
         List<String> menuIds = new ArrayList<>();
@@ -89,10 +86,7 @@
 
     private void addRoleMenus(String id, List<String> menuIds){
         //删除角色已存在的菜单
-        QueryWrapper deleteQuery = new QueryWrapper<RoleMenu>().and(roleMenuQueryWrapper -> {
-            return roleMenuQueryWrapper
-                    .eq("ROLE_ID", id);
-        });
+        QueryWrapper deleteQuery = new QueryWrapper<RoleMenu>().eq("ROLE_ID", id);
         roleMenuMapper.delete(deleteQuery);
         //给角色添加可以访问的菜单
         for (String menuId : menuIds) {
@@ -131,17 +125,11 @@
         roleMapper.deleteById(id);
 
         //删除角色关联的菜单
-        QueryWrapper deleteQuery = new QueryWrapper<RoleMenu>().and(roleMenuQueryWrapper -> {
-            return roleMenuQueryWrapper
-                    .eq("ROLE_ID", id);
-        });
+        QueryWrapper deleteQuery = new QueryWrapper<RoleMenu>().eq("ROLE_ID", id);
         roleMenuMapper.delete(deleteQuery);
 
         //删除角色关联的用户
-        deleteQuery = new QueryWrapper<UserRole>().and(userRoleQueryWrapper -> {
-            return userRoleQueryWrapper
-                    .eq("ROLE_ID", id);
-        });
+        deleteQuery = new QueryWrapper<UserRole>().eq("ROLE_ID", id);
         userRoleMapper.delete(deleteQuery);
     }
 
diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java
index 6b1b93d..e5286b5 100644
--- a/src/main/java/com/mzl/flower/service/system/UserService.java
+++ b/src/main/java/com/mzl/flower/service/system/UserService.java
@@ -13,10 +13,15 @@
 import com.mzl.flower.dto.response.system.MenuTreeDTO;
 import com.mzl.flower.dto.response.system.UserDetailsDTO;
 import com.mzl.flower.dto.response.system.UserListDTO;
+import com.mzl.flower.entity.point.CustomerPoint;
 import com.mzl.flower.entity.system.*;
+import com.mzl.flower.enums.TrueOrFalseEnum;
+import com.mzl.flower.mapper.point.CustomerPointMapper;
 import com.mzl.flower.mapper.system.*;
 import com.mzl.flower.service.customer.CustomerService;
 import com.mzl.flower.service.partner.PartnerService;
+import com.mzl.flower.service.point.CustomerPointService;
+import com.mzl.flower.service.supplier.StationService;
 import com.mzl.flower.service.supplier.SupplierService;
 import com.mzl.flower.utils.TreeBuilderUtil;
 import com.mzl.flower.utils.UUIDGenerator;
@@ -72,6 +77,12 @@
 
     @Autowired
     private EmployeeMapper employeeMapper;
+
+    @Autowired
+    private CustomerPointMapper customerPointMapper;
+    @Autowired
+    private StationService stationService;
+
 
     public User findUserByOpenId(String openId, String sessionKey, String unionId
             , String imgUrl, String nickname,String userType){
@@ -187,10 +198,21 @@
 
         if(Constants.USER_TYPE.customer.name().equals(user.getType())){
             result.setCustomerDTO(customerService.getCurrentCustomer());
+            //查询积分
+            CustomerPoint customerPoint = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>()
+                    .eq(CustomerPoint::getUserId, userId));
+            if(customerPoint == null){
+                result.setCurrentPoint(0);
+            }else{
+                Integer currentPoint =customerPoint.getTotalPoint()-customerPoint.getUsedPoint()-customerPoint.getExpiredPoint()-customerPoint.getDeductionPoint();
+                result.setCurrentPoint(currentPoint>=0?currentPoint:0);
+            }
         }else if(Constants.USER_TYPE.supplier.name().equals(user.getType())){
             result.setSupplierDTO(supplierService.getCurrentSupplier());
         }else if(Constants.USER_TYPE.partner.name().equals(user.getType())){
             result.setPartnerDTO(partnerService.getCurrentPartner());
+        }else if (Constants.USER_TYPE.admin.name().equals(user.getType())){
+            result.setMainWarehouse(stationService.getMainWarehouse(user.getId()));
         }
         result.setBindWechat(wechatMapper.selectCount(new LambdaQueryWrapper<UserWechat>()
                 .eq(UserWechat::getUserId, userId)) > 0);
@@ -455,4 +477,10 @@
     }
 
 
+    public List<User> getVipGradeUserList(String getVipGrade) {
+        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
+        queryWrapper.lambda().eq(User::getDeleted, TrueOrFalseEnum.FALSE.isFlag())
+                .eq(User::getVipGrade,getVipGrade);
+        return userMapper.selectList(queryWrapper);
+    }
 }
diff --git a/src/main/java/com/mzl/flower/utils/ConverterUtil.java b/src/main/java/com/mzl/flower/utils/ConverterUtil.java
new file mode 100644
index 0000000..dfca4e6
--- /dev/null
+++ b/src/main/java/com/mzl/flower/utils/ConverterUtil.java
@@ -0,0 +1,73 @@
+package com.mzl.flower.utils;
+
+import org.springframework.beans.BeanUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class ConverterUtil {
+
+    /**
+     * 单个对象的转换
+     * @param source 源对象
+     * @param targetClass 目标类的类型
+     * @param <T> 源类型
+     * @param <R> 目标类型
+     * @return 转换后的目标对象
+     */
+    public static <T, R> R transObject(T source, Class<R> targetClass) {
+        if (source == null) {
+            return null;
+        }
+        try {
+            R targetObject = targetClass.getDeclaredConstructor().newInstance();
+            BeanUtils.copyProperties(source, targetObject);
+            return targetObject;
+        } catch (Exception e) {
+            throw new RuntimeException("对象转换失败", e);
+        }
+    }
+
+    /**
+     * List对象的转换
+     * @param sourceList 源List对象
+     * @param targetClass 目标类的类型
+     * @param <T> 源类型
+     * @param <R> 目标类型
+     * @return 转换后的目标List对象
+     */
+    public static <T, R> List<R> transList(List<T> sourceList, Class<R> targetClass) {
+        if (sourceList == null || sourceList.isEmpty()) {
+            return new ArrayList<>();
+        }
+        return sourceList.stream()
+                .filter(Objects::nonNull)
+                .map(sourceObject -> transObject(sourceObject, targetClass))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Page对象的转换
+     * @param sourcePage 源Page对象
+     * @param targetClass 目标类的类型
+     * @param <T> 源类型
+     * @param <R> 目标类型
+     * @return 转换后的目标Page对象
+     */
+    public static <T, R> Page<R> transPage(Page<T> sourcePage, Class<R> targetClass) {
+        if (sourcePage == null) {
+            return new Page<>();
+        }
+
+        // 创建一个新的 Page 对象用于存放转换后的目标类型对象
+        Page<R> targetPage = new Page<>(sourcePage.getCurrent(), sourcePage.getSize(), sourcePage.getTotal());
+
+        // 转换列表并设置到 Page 对象中
+        List<R> targetList = transList(sourcePage.getRecords(), targetClass);
+        targetPage.setRecords(targetList);
+        return targetPage;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/utils/DateUtils.java b/src/main/java/com/mzl/flower/utils/DateUtils.java
index fdbaaa3..9970c68 100644
--- a/src/main/java/com/mzl/flower/utils/DateUtils.java
+++ b/src/main/java/com/mzl/flower/utils/DateUtils.java
@@ -2,6 +2,7 @@
 
 import org.apache.poi.util.LocaleUtil;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
@@ -40,6 +41,19 @@
     }
 
 
+    /**
+     * 将LocalDateTime对象转换为字符串
+     * @return
+     */
+    public static String toString(LocalDate date,String format)  {
+        // 定义日期时间格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
+        String str = date.format(formatter);
+        return str;
+    }
+
+
+
     public static Date getJavaDate(double date) {
         return getJavaDate(date, false, (TimeZone)null, false);
     }
diff --git a/src/main/java/com/mzl/flower/web/customer/CustomerSignInController.java b/src/main/java/com/mzl/flower/web/customer/CustomerSignInController.java
new file mode 100644
index 0000000..5254160
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/customer/CustomerSignInController.java
@@ -0,0 +1,57 @@
+package com.mzl.flower.web.customer;
+
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDetailDTO;
+import com.mzl.flower.service.point.CustomerPointService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/customer/point/sign")
+@Api(value = "签到-花店", tags = "签到-花店")
+@Validated
+@Slf4j
+public class CustomerSignInController extends BaseController {
+
+    @Autowired
+    private CustomerPointService customerPointService;
+
+    @PostMapping("/in")
+    @ApiOperation(value = "签到")
+    public ResponseEntity<ReturnDataDTO> signIn(){
+        customerPointService.signIn();
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "签到历史")
+    public ResponseEntity<ReturnDataDTO<List<CustomerPointDetailDTO>>> signList(String startDateStr, String endDateStr)  {
+        LocalDate startDate = LocalDate.parse(startDateStr);
+        LocalDate endDate = LocalDate.parse(endDateStr);
+
+        return returnData(R.SUCCESS.getCode(), customerPointService.signList(startDate, endDate));
+    }
+
+    @GetMapping("/sign/today")
+    @ApiOperation(value = "今日是否签到")
+    public ResponseEntity<ReturnDataDTO<Boolean>> signToday()  {
+        return returnData(R.SUCCESS.getCode(), customerPointService.signToday());
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/customer/DeliveryCustomerController.java b/src/main/java/com/mzl/flower/web/customer/DeliveryCustomerController.java
new file mode 100644
index 0000000..cd843dd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/customer/DeliveryCustomerController.java
@@ -0,0 +1,47 @@
+package com.mzl.flower.web.customer;
+
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.response.payment.*;
+import com.mzl.flower.service.payment.DeliveryOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/customer/delivery")
+@Api(value = "配送管理-花店", tags = "配送管理-花店")
+@Validated
+@Slf4j
+public class DeliveryCustomerController extends BaseController {
+
+    @Autowired
+    private DeliveryOrderService deliveryOrderService;
+
+    @GetMapping("/mine/list/check/info/reduce")
+    @ApiOperation(value = "降级操作详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderItemId", value = "订单商品id", required = true, dataType = "String", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<OrderItemCheckReduceDTO>> getReduceCheck(String orderItemId){
+        return returnData(R.SUCCESS.getCode(), deliveryOrderService.getReduceCheck(orderItemId));
+    }
+
+    @GetMapping("/mine/list/check/info/lack")
+    @ApiOperation(value = "缺货操作详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderItemId", value = "订单商品id", required = true, dataType = "String", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getLackCheck(String orderItemId){
+        return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
+                , Constants.CHECK_TYPE.lack.name(), false));
+    }
+}
diff --git a/src/main/java/com/mzl/flower/web/customer/FollowController.java b/src/main/java/com/mzl/flower/web/customer/FollowController.java
index d318bb8..a4039ae 100644
--- a/src/main/java/com/mzl/flower/web/customer/FollowController.java
+++ b/src/main/java/com/mzl/flower/web/customer/FollowController.java
@@ -5,12 +5,8 @@
 import com.mzl.flower.base.R;
 import com.mzl.flower.base.ReturnDataDTO;
 import com.mzl.flower.config.security.SecurityUtils;
-import com.mzl.flower.dto.request.customer.CreateAddressDTO;
 import com.mzl.flower.dto.request.customer.CreateFollowDTO;
-import com.mzl.flower.dto.request.customer.UpdateAddressDTO;
 import com.mzl.flower.dto.response.customer.FollowDTO;
-import com.mzl.flower.dto.response.supplier.SupplierDTO;
-import com.mzl.flower.entity.customer.Address;
 import com.mzl.flower.service.customer.FollowService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -20,7 +16,6 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotNull;
-import java.util.List;
 
 @RestController
 @RequestMapping("/api/follow")
@@ -56,4 +51,11 @@
     public ResponseEntity<ReturnDataDTO<Page<FollowDTO>>> myFollow(Page page) {
         return returnData(R.SUCCESS.getCode(),followService.myFollow(page,SecurityUtils.getUserId()));
     }
+
+    @GetMapping("/fans/statis/{supplierId}")
+    @ApiOperation(value = "我的关注列表", notes = "我的关注列表")
+    public ResponseEntity<ReturnDataDTO<Integer>> myFansStatis(@NotNull(message = "supplierId不能为空") @PathVariable("supplierId") Long supplierId) {
+        return returnData(R.SUCCESS.getCode(),followService.getStatisFansCount(supplierId));
+    }
+
 }
diff --git a/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java b/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java
index cf1772b..f76374b 100644
--- a/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java
+++ b/src/main/java/com/mzl/flower/web/customer/OrderCustomerController.java
@@ -11,6 +11,7 @@
 import com.mzl.flower.dto.response.payment.OrderDTO;
 import com.mzl.flower.dto.response.payment.OrderItemListDTO;
 import com.mzl.flower.dto.response.payment.OrderListDTO;
+import com.mzl.flower.entity.payment.Order;
 import com.mzl.flower.service.payment.OrderService;
 import com.mzl.flower.service.payment.UserPaymentV3Service;
 import io.swagger.annotations.Api;
@@ -68,7 +69,8 @@
             @ApiImplicitParam(name = "id", value = "订单id", required = true, dataType = "String", paramType = "query")
     })
     public ResponseEntity<ReturnDataDTO<?>> confirmOrderReceive(String id){
-        orderService.confirmOrderReceive(id);
+        Order o = orderService.confirmOrderReceive(id);
+        orderService.processAfterReceive(o);
         return returnData(R.SUCCESS.getCode(), null);
     }
 
diff --git a/src/main/java/com/mzl/flower/web/customer/PointGoodsCustomerController.java b/src/main/java/com/mzl/flower/web/customer/PointGoodsCustomerController.java
new file mode 100644
index 0000000..2782aa7
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/customer/PointGoodsCustomerController.java
@@ -0,0 +1,70 @@
+package com.mzl.flower.web.customer;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.point.*;
+import com.mzl.flower.dto.response.point.CustomerPointDetailDTO;
+import com.mzl.flower.dto.response.point.PointGoodsDTO;
+import com.mzl.flower.dto.response.point.PointGoodsListDTO;
+import com.mzl.flower.dto.response.point.PointGoodsRecordDTO;
+import com.mzl.flower.entity.point.PointGoodsRecord;
+import com.mzl.flower.service.point.PointGoodsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/customer/point/goods")
+@Api(value = "积分商品-花店", tags = "积分商品-花店")
+@Validated
+@Slf4j
+public class PointGoodsCustomerController extends BaseController {
+
+    @Autowired
+    private PointGoodsService pointGoodsService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "商品列表")
+    public ResponseEntity<ReturnDataDTO<Page<PointGoodsListDTO>>> selectGoodsList(Page page, PointGoodsQueryDTO dto){
+        dto.setStatus(Constants.POINT_GOODS_STATUS.A.name());
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.selectGoodsList(page, dto));
+    }
+
+    @GetMapping("/list/view")
+    @ApiOperation(value = "商品详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "Long", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<PointGoodsDTO>> getGoodsInfo(Long id) {
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.getGoodsInfo(id));
+    }
+
+
+    @PostMapping("/exchange")
+    @ApiOperation(value = "积分商品兑换", notes = "积分商品兑换")
+    public ResponseEntity<ReturnDataDTO> exchangeGoods(@Validated @RequestBody ExchangeGoodsDTO dto) {
+        pointGoodsService.exchangeGoods(dto);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+
+    @GetMapping("/exchange/list")
+    @ApiOperation(value = "积分商品兑换券列表", notes = "积分商品兑换券列表")
+    public ResponseEntity<ReturnDataDTO<Page<PointGoodsRecordDTO>>> myExchangeGoods(QueryExchangeGoodsDTO dto, Page page) {
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.myExchangeGoods(dto,page));
+    }
+
+
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/flower/FlowerController.java b/src/main/java/com/mzl/flower/web/flower/FlowerController.java
index f34c6ac..e23a700 100644
--- a/src/main/java/com/mzl/flower/web/flower/FlowerController.java
+++ b/src/main/java/com/mzl/flower/web/flower/FlowerController.java
@@ -166,4 +166,11 @@
         flowerService.setFlowerShown(id, false);
         return returnData(R.SUCCESS.getCode(), null);
     }
+
+    @PostMapping("/list/limiteds")
+    @ApiOperation(value = "批量设置标签")
+    public ResponseEntity<ReturnDataDTO> setFlowersLimited(@RequestBody FlowerLimitedDTO dto) {
+        flowerService.setFlowersLimited(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
 }
diff --git a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
index 475685a..a249fe9 100644
--- a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
+++ b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
@@ -185,6 +185,13 @@
         if(user == null){
             throw new ValidationException("用户不存在");
         }
+        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(user.getId());
+        if (ObjectUtils.isEmpty(currentCustomer)) {
+            throw new ValidationException("用户不存在");
+        }
+        if (currentCustomer.getIsEnabled() == false) {
+            throw new ValidationException("用户已禁用,请联系管理员");
+        }
         String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
         if (StringUtils.isNotBlank(tokenCache))  {
             //强制删除token,下线
diff --git a/src/main/java/com/mzl/flower/web/login/PartnerLoginController.java b/src/main/java/com/mzl/flower/web/login/PartnerLoginController.java
index b7ffa9e..332f052 100644
--- a/src/main/java/com/mzl/flower/web/login/PartnerLoginController.java
+++ b/src/main/java/com/mzl/flower/web/login/PartnerLoginController.java
@@ -96,7 +96,7 @@
         String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
         if (StringUtils.isNotBlank(tokenCache))  {
             //强制删除token,下线
-            removeToken(tokenCache,user.getId());
+//            removeToken(tokenCache,user.getId());
         }
         try {
             PartnerAuthenticationToken authRequest = new PartnerAuthenticationToken(username, password);
@@ -136,10 +136,17 @@
         if(user == null){
             throw new ValidationException("用户不存在");
         }
+        PartnerDTO partnerDTO = partnerMapper.getCurrentPartner(user.getId());
+        if (ObjectUtils.isEmpty(partnerDTO)) {
+            throw new ValidationException("用户不存在");
+        }
+        if (partnerDTO.getIsEnabled() == false) {
+            throw new ValidationException("用户已禁用,请联系管理员");
+        }
         String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
         if (StringUtils.isNotBlank(tokenCache))  {
             //强制删除token,下线
-            removeToken(tokenCache,user.getId());
+//            removeToken(tokenCache,user.getId());
         }
         try {
             PhoneAuthenticationToken authRequest = new PhoneAuthenticationToken(tel, smsCode, Constants.USER_TYPE.partner.name());
diff --git a/src/main/java/com/mzl/flower/web/login/SupplierLoginController.java b/src/main/java/com/mzl/flower/web/login/SupplierLoginController.java
index 0fd20e3..2384912 100644
--- a/src/main/java/com/mzl/flower/web/login/SupplierLoginController.java
+++ b/src/main/java/com/mzl/flower/web/login/SupplierLoginController.java
@@ -88,10 +88,7 @@
             throw new ValidationException("用户不存在");
         }
         SupplierDTO supplierDTO = supplierMapper.getCurrentSupplier(user.getId());
-        if (ObjectUtils.isEmpty(supplierDTO)) {
-            throw new ValidationException("用户不存在");
-        }
-        if (supplierDTO.getIsEnabled() == false) {
+        if (supplierDTO != null && supplierDTO.getIsEnabled() == false) {
             throw new ValidationException("用户已禁用,请联系管理员");
         }
         String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
@@ -137,6 +134,13 @@
         if(user == null){
             throw new ValidationException("用户不存在");
         }
+        SupplierDTO supplierDTO = supplierMapper.getCurrentSupplier(user.getId());
+        if (ObjectUtils.isEmpty(supplierDTO)) {
+            throw new ValidationException("用户不存在");
+        }
+        if (supplierDTO.getIsEnabled() == false) {
+            throw new ValidationException("用户已禁用,请联系管理员");
+        }
         String tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId());
         if (StringUtils.isNotBlank(tokenCache))  {
             //强制删除token,下线
diff --git a/src/main/java/com/mzl/flower/web/member/MemberController.java b/src/main/java/com/mzl/flower/web/member/MemberController.java
new file mode 100644
index 0000000..7fcea01
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/member/MemberController.java
@@ -0,0 +1,121 @@
+package com.mzl.flower.web.member;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.menber.*;
+import com.mzl.flower.dto.response.member.MemberGrowthRecordVO;
+import com.mzl.flower.dto.response.member.MemberVO;
+import com.mzl.flower.dto.response.member.UserGrowthRecordVO;
+import com.mzl.flower.service.menber.MemberGrowthRecordService;
+import com.mzl.flower.service.menber.MemberService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className MemberController
+ * @date 2024/8/26
+ * @description 会员管理功能开发
+ */
+@Api(value = "会员管理", tags = "会员管理")
+@RestController
+@RequestMapping("/api")
+@RequiredArgsConstructor
+public class MemberController extends BaseController {
+
+    private final MemberService memberService;
+
+    private final MemberGrowthRecordService memberGrowthRecordService;
+
+    @GetMapping("/member/list")
+    @ApiOperation(value = "会员列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<MemberVO>>> getMemberList(Page page, MemberQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), memberService.queryPage(dto, page));
+    }
+
+    @GetMapping(value = "/member/delete")
+    @ApiOperation(value = "删除会员 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
+        memberService.deleteMember(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/member/new")
+    @ApiOperation(value = "保存会员", httpMethod = "POST")
+    public ResponseEntity insert(@RequestBody MemberDTO memberDTO) {
+        memberService.saveMember(memberDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/member/edit")
+    @ApiOperation(value = "更新会员", httpMethod = "POST")
+    public ResponseEntity update(@RequestBody MemberDTO memberDTO) {
+        memberService.updateMember(memberDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    @PostMapping("/memberGrowthRecord/list")
+    @ApiOperation(value = "会员记录列表", httpMethod = "POST")
+    public ResponseEntity<ReturnDataDTO<Page<MemberGrowthRecordVO>>> getMemberRecordList(Page page, MemberRecordQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), memberGrowthRecordService.queryPage(dto, page));
+    }
+
+    @GetMapping("/getmemberGrowthRecord/list")
+    @ApiOperation(value = "会员记录列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<MemberGrowthRecordVO>>> getmemberGrowthRecord(Page page, MemberRecordQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), memberGrowthRecordService.queryPage(dto, page));
+    }
+
+    @GetMapping(value = "/memberGrowthRecord/delete")
+    @ApiOperation(value = "删除会员记录 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity deleteGrowthRecord(@NotNull(message = "id不能为空") Long id) {
+        memberGrowthRecordService.deleteMemberGrowthRecord(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/memberGrowthRecord/new")
+    @ApiOperation(value = "保存会员记录", httpMethod = "POST")
+    public ResponseEntity insertGrowthRecord(@RequestBody MemberGrowthRecordDTO memberGrowthRecordDTO) {
+        memberGrowthRecordService.saveMemberGrowthRecord(memberGrowthRecordDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/memberGrowthRecord/edit")
+    @ApiOperation(value = "更新会员记录", httpMethod = "POST")
+    public ResponseEntity updateGrowthRecord(@Validated @RequestBody MemberGrowthRecordDTO memberGrowthRecordDTO) {
+        memberGrowthRecordService.updateMemberGrowthRecord(memberGrowthRecordDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping(value = "/member/info/{userId}")
+    @ApiOperation(value = "当前用户会员信息 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity memberInfo(@PathVariable("userId") Long userId) {
+        UserGrowthRecordDTO userGrowthRecordDTO = memberGrowthRecordService.getInfoByUserId(String.valueOf(userId));
+        return returnData(R.SUCCESS.getCode(), userGrowthRecordDTO);
+    }
+
+    @GetMapping(value = "/app/member/info")
+    @ApiOperation(value = "当前用户会员信息 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity memberInfo2() {
+        UserGrowthRecordDTO userGrowthRecordDTO = memberGrowthRecordService.getInfoByUserId(SecurityUtils.getUserId());
+        return returnData(R.SUCCESS.getCode(), userGrowthRecordDTO);
+    }
+
+    @GetMapping("/userGrowthRecord/list")
+    @ApiOperation(value = "会员用户记录列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<UserGrowthRecordVO>>> getUserMemberRecordList(Page page, UserMemberRecordQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), memberGrowthRecordService.queryUserPage(dto, page));
+    }
+}
+
diff --git a/src/main/java/com/mzl/flower/web/partner/OrderPartnerController.java b/src/main/java/com/mzl/flower/web/partner/OrderPartnerController.java
index 7cbfdff..d5906c5 100644
--- a/src/main/java/com/mzl/flower/web/partner/OrderPartnerController.java
+++ b/src/main/java/com/mzl/flower/web/partner/OrderPartnerController.java
@@ -81,6 +81,8 @@
     @ApiOperation(value = "查询订单清单列表-按库位分商品")
     public ResponseEntity<ReturnDataDTO<List<OrderCheckLocationListDTO>>> selectOrderCheckLocationList(
             @RequestBody OrderQueryDTO dto){
+        Partner partner = orderService.getCurrentPartner();
+        dto.setPartnerId(partner.getId());
         return returnData(R.SUCCESS.getCode(), orderService.selectOrderCheckLocationList(dto));
     }
 }
diff --git a/src/main/java/com/mzl/flower/web/payment/DeliveryOrderController.java b/src/main/java/com/mzl/flower/web/payment/DeliveryOrderController.java
index 2af2b28..a2bf006 100644
--- a/src/main/java/com/mzl/flower/web/payment/DeliveryOrderController.java
+++ b/src/main/java/com/mzl/flower/web/payment/DeliveryOrderController.java
@@ -4,11 +4,13 @@
 import com.mzl.flower.base.BaseController;
 import com.mzl.flower.base.R;
 import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
 import com.mzl.flower.constant.Constants;
 import com.mzl.flower.dto.request.payment.*;
 import com.mzl.flower.dto.response.flower.StationStatisticDTO;
 import com.mzl.flower.dto.response.payment.*;
 import com.mzl.flower.service.payment.DeliveryOrderService;
+import io.micrometer.core.instrument.util.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -35,20 +37,31 @@
 
     @GetMapping("/station/list")
     @ApiOperation(value = "查询我的集货站列表")
-    public ResponseEntity<ReturnDataDTO<List<StationStatisticDTO>>> statisticStationList(String name){
-        LocalDateTime now = LocalDateTime.now();
-        LocalDateTime towAm = LocalDate.now().atTime(2, 0, 0);
-        LocalDateTime fivePm = LocalDate.now().atTime(17, 0, 0);
+    public ResponseEntity<ReturnDataDTO<List<StationStatisticDTO>>> statisticStationList(String name
+            , String status, String date){
+        /*if(StringUtils.isEmpty(date)){
+            throw new ValidationException("请选择日期");
+        }*/
         LocalDateTime startDate;
         LocalDateTime endDate;
-        if(now.isAfter(towAm)){
-            startDate = fivePm.plusDays(-1);
-            endDate = fivePm;
+        LocalDate localDate = deliveryOrderService.parseLocalDate(date);
+        if(localDate != null){
+            endDate = localDate.atTime(17, 0, 0);
+            startDate = endDate.plusDays(-1);
         } else {
-            startDate = fivePm.plusDays(-2);
-            endDate = fivePm.plusDays(-1);
+            LocalDateTime now = LocalDateTime.now();
+            LocalDateTime towAm = LocalDate.now().atTime(2, 0, 0);
+            LocalDateTime fivePm = LocalDate.now().atTime(17, 0, 0);
+            if(now.isAfter(towAm)){
+                startDate = fivePm.plusDays(-1);
+                endDate = fivePm;
+            } else {
+                startDate = fivePm.plusDays(-2);
+                endDate = fivePm.plusDays(-1);
+            }
         }
-        return returnData(R.SUCCESS.getCode(), deliveryOrderService.statisticStationList(name,startDate,endDate));
+
+        return returnData(R.SUCCESS.getCode(), deliveryOrderService.statisticStationList(name, startDate, endDate, status));
     }
 
 
@@ -131,11 +144,29 @@
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getDeliveryOrderItem(id));
     }
 
+    @PostMapping("/list/items/views")
+    @ApiOperation(value = "获取商品详情列表")
+    public ResponseEntity<ReturnDataDTO<List<DeliveryOrderItemDTO>>> getDeliveryOrderItem(@RequestBody PostQueryDTO dto){
+        return returnData(R.SUCCESS.getCode(), deliveryOrderService.getDeliveryOrderItems(dto));
+    }
+
     //////////////////////////////////////////////////////////新接口
     @GetMapping("/check/list")
     @ApiOperation(value = "查询集货站供应商配送列表")
     public ResponseEntity<ReturnDataDTO<Page<DeliveryOrderList4CheckDTO>>> selectSupplierDoList4Check(Page page
             , DeliveryOrderStationQueryDTO dto){
+        String date = dto.getDate();
+        if(StringUtils.isEmpty(date)){
+            throw new ValidationException("请选择日期");
+        }
+        LocalDate localDate = deliveryOrderService.parseLocalDate(date);
+        if(localDate != null){
+            LocalDateTime end = localDate.atTime(17, 0, 0);
+            LocalDateTime begin = end.plusDays(-1);
+            dto.setStartDate(begin);
+            dto.setEndDate(end);
+        }
+
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.selectSupplierDoList4Check(page, dto));
     }
 
@@ -179,6 +210,18 @@
     @ApiOperation(value = "查询供应商配送单列表")
     public ResponseEntity<ReturnDataDTO<Page<DeliveryOrder4CheckDTO>>> selectSupplierDoInfo4Check(Page page
             , DeliveryOrderInfoSpQueryDTO dto){
+        String date = dto.getDate();
+        if(StringUtils.isEmpty(date)){
+            throw new ValidationException("请选择日期");
+        }
+        LocalDate localDate = deliveryOrderService.parseLocalDate(date);
+        if(localDate != null){
+            LocalDateTime end = localDate.atTime(17, 0, 0);
+            LocalDateTime begin = end.plusDays(-1);
+            dto.setStartDate(begin);
+            dto.setEndDate(end);
+        }
+
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.selectSupplierDoInfo4Check(page, dto));
     }
 
@@ -228,14 +271,14 @@
     @ApiOperation(value = "补货操作详情")
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getReplaceCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.replace.name()));
+                , Constants.CHECK_TYPE.replace.name(), false));
     }
 
     @GetMapping("/check/info/lack")
     @ApiOperation(value = "缺货操作详情")
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getLackCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.lack.name()));
+                , Constants.CHECK_TYPE.lack.name(), false));
     }
 
     @PostMapping("/check/info/do/reduce")
@@ -304,11 +347,34 @@
     }
 
     @GetMapping("/check/list/complete")
-    @ApiOperation(value = "一键质检(只能完成当天的,且必须点一下才会修改订单状态)")
+    @ApiOperation(value = "一键质检")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "供应商id", required = true, dataType = "Long", paramType = "query")
+            @ApiImplicitParam(name = "id", value = "供应商id", required = true, dataType = "Long", paramType = "query"),
+            @ApiImplicitParam(name = "date", value = "日期(yyyy-MM-dd)", required = true, dataType = "String", paramType = "query"),
     })
-    public ResponseEntity<ReturnDataDTO> completeCheck(Long id) {
+    public ResponseEntity<ReturnDataDTO> completeCheck(Long id, String date) {
+        if(StringUtils.isEmpty(date)){
+            throw new ValidationException("请选择日期");
+        }
+        LocalDateTime startDate = null;
+        LocalDateTime endDate = null;
+        LocalDate localDate = deliveryOrderService.parseLocalDate(date);
+        if(localDate != null){
+            endDate = localDate.atTime(17, 0, 0);
+            startDate = endDate.plusDays(-1);
+        }
+
+        List<String> orderIds = deliveryOrderService.completeSupplierCheck(id, startDate, endDate);
+        deliveryOrderService.checkOrdersStatus(orderIds);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/check/list/complete/today")
+    @ApiOperation(value = "一键质检(今日)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "供应商id", required = true, dataType = "Long", paramType = "query"),
+    })
+    public ResponseEntity<ReturnDataDTO> completeCheckToday(Long id) {
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime towAm = LocalDate.now().atTime(2, 0, 0);
         LocalDateTime fivePm = LocalDate.now().atTime(17, 0, 0);
@@ -321,7 +387,6 @@
             startDate = fivePm.plusDays(-2);
             endDate = fivePm.plusDays(-1);
         }
-
         List<String> orderIds = deliveryOrderService.completeSupplierCheck(id, startDate, endDate);
         deliveryOrderService.checkOrdersStatus(orderIds);
         return returnData(R.SUCCESS.getCode(), null);
diff --git a/src/main/java/com/mzl/flower/web/payment/OrderController.java b/src/main/java/com/mzl/flower/web/payment/OrderController.java
index 0600857..915eb23 100644
--- a/src/main/java/com/mzl/flower/web/payment/OrderController.java
+++ b/src/main/java/com/mzl/flower/web/payment/OrderController.java
@@ -109,7 +109,7 @@
     })
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getReplaceCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.replace.name()));
+                , Constants.CHECK_TYPE.replace.name(), false));
     }
 
     @GetMapping("/list/check/info/lack")
@@ -119,7 +119,7 @@
     })
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getLackCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.lack.name()));
+                , Constants.CHECK_TYPE.lack.name(), false));
     }
 
     @GetMapping("/list/check/info/agree")
diff --git a/src/main/java/com/mzl/flower/web/point/CustomerPointController.java b/src/main/java/com/mzl/flower/web/point/CustomerPointController.java
new file mode 100644
index 0000000..3a214a1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/point/CustomerPointController.java
@@ -0,0 +1,88 @@
+package com.mzl.flower.web.point;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.point.ChangePointDTO;
+import com.mzl.flower.dto.request.point.QueryCustomerPointDTO;
+import com.mzl.flower.dto.request.point.QueryPointDetailDTO;
+import com.mzl.flower.dto.request.supplier.UpdateSupplierDTO;
+import com.mzl.flower.dto.response.content.AdvertisementDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDTO;
+import com.mzl.flower.dto.response.point.CustomerPointDetailDTO;
+import com.mzl.flower.service.point.CustomerPointService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.ValidationException;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/customer/point")
+@Api(value = "会员积分", tags = "会员积分")
+@Validated
+@Slf4j
+public class CustomerPointController extends BaseController {
+
+
+    private final CustomerPointService customerPointService;
+
+    public CustomerPointController(CustomerPointService customerPointService) {
+        this.customerPointService = customerPointService;
+    }
+
+
+    @GetMapping("/page/list")
+    @ApiOperation(value = "管理端-积分详细记录列表", notes = "管理端-商户积分详细记录列表")
+    public ResponseEntity<ReturnDataDTO<Page<CustomerPointDetailDTO>>> queryCustomerDetails(QueryPointDetailDTO dto, Page page) {
+        if(dto.getCustomerId() == null || dto.getCustomerId() == 0){
+            throw new ValidationException("商户ID不能为空");
+        }
+        return returnData(R.SUCCESS.getCode(),customerPointService.queryCustomerDetails(dto, page));
+    }
+
+
+    @GetMapping("/page")
+    @ApiOperation(value = "管理端-积分查询", notes = "用户端-积分查询")
+    public ResponseEntity<ReturnDataDTO<Page<CustomerPointDTO>>> queryPage(QueryCustomerPointDTO dto, Page page)  {
+        return returnData(R.SUCCESS.getCode(), customerPointService.queryPage(dto, page));
+    }
+
+    @PostMapping("/giveaway")
+    @ApiOperation(value = "管理端-积分赠送", notes = "管理端-积分赠送")
+    public ResponseEntity<ReturnDataDTO> giveawayPoint(@Validated @RequestBody ChangePointDTO dto) {
+        if(dto.getPoint()<=0){
+            throw new ValidationException("赠送积分必须大于0");
+        }
+        customerPointService.giveawayPoint(dto);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+    @PostMapping("/deduction")
+    @ApiOperation(value = "管理端-积分扣除", notes = "管理端-积分扣除")
+    public ResponseEntity<ReturnDataDTO> deductionPoint(@Validated @RequestBody ChangePointDTO dto) {
+        if(dto.getPoint()<=0){
+            throw new ValidationException("扣除积分必须大于0");
+        }
+        customerPointService.deductionPoint(dto);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+
+
+    @GetMapping("/list")
+    @ApiOperation(value = "用户端-积分列表(花店积分列表)", notes = "管理端-积分列表(花店积分列表)")
+    public ResponseEntity<ReturnDataDTO<Page<CustomerPointDetailDTO>>> myPointDetails(QueryPointDetailDTO dto, Page page) {
+        dto.setUserId(SecurityUtils.getUserId());
+        return returnData(R.SUCCESS.getCode(),customerPointService.queryCustomerDetails(dto, page));
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/web/point/PointGoodsController.java b/src/main/java/com/mzl/flower/web/point/PointGoodsController.java
new file mode 100644
index 0000000..5368dbd
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/point/PointGoodsController.java
@@ -0,0 +1,90 @@
+package com.mzl.flower.web.point;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.point.PointGoodsCreateDTO;
+import com.mzl.flower.dto.request.point.PointGoodsQueryDTO;
+import com.mzl.flower.dto.request.point.PointGoodsUpdateDTO;
+import com.mzl.flower.dto.response.point.PointGoodsDTO;
+import com.mzl.flower.dto.response.point.PointGoodsListDTO;
+import com.mzl.flower.service.point.PointGoodsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/point/goods")
+@Api(value = "积分商品管理-运营端", tags = "积分商品管理-运营端")
+@Validated
+@Slf4j
+public class PointGoodsController extends BaseController {
+
+    @Autowired
+    private PointGoodsService pointGoodsService;
+
+    @PostMapping("/list/new")
+    @ApiOperation(value = "新增商品")
+    public ResponseEntity<ReturnDataDTO> addPointGoods(@RequestBody PointGoodsCreateDTO dto) {
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.addPointGoods(dto));
+    }
+
+    @PostMapping("/list/edit")
+    @ApiOperation(value = "编辑商品")
+    public ResponseEntity<ReturnDataDTO> updatePointGoods(@RequestBody PointGoodsUpdateDTO dto) {
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.updatePointGoods(dto));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "商品列表")
+    public ResponseEntity<ReturnDataDTO<Page<PointGoodsListDTO>>> selectGoodsList(Page page, PointGoodsQueryDTO dto){
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.selectGoodsList(page, dto));
+    }
+
+    @GetMapping("/list/view")
+    @ApiOperation(value = "商品详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "Long", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<PointGoodsDTO>> getGoodsInfo(Long id) {
+        return returnData(R.SUCCESS.getCode(), pointGoodsService.getGoodsInfo(id));
+    }
+
+    @GetMapping("/list/delete")
+    @ApiOperation(value = "商品删除")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "String", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<?>> deletePointGoods(String id) {
+        pointGoodsService.deletePointGoods(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/list/on")
+    @ApiOperation(value = "商品上架")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "String", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<?>> upGoods(String id) {
+        pointGoodsService.updateStatus(id, Constants.POINT_GOODS_STATUS.A.name());
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/list/off")
+    @ApiOperation(value = "商品下架")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "商品id", required = true, dataType = "String", paramType = "query")
+    })
+    public ResponseEntity<ReturnDataDTO<?>> offGoods(String id) {
+        pointGoodsService.updateStatus(id, Constants.POINT_GOODS_STATUS.I.name());
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+}
diff --git a/src/main/java/com/mzl/flower/web/pub/PubSupplierController.java b/src/main/java/com/mzl/flower/web/pub/PubSupplierController.java
index 15db984..b918088 100644
--- a/src/main/java/com/mzl/flower/web/pub/PubSupplierController.java
+++ b/src/main/java/com/mzl/flower/web/pub/PubSupplierController.java
@@ -39,6 +39,8 @@
             if(StringUtils.isNotBlank(userId)){
                 supplierDetail.setFollowed(followService.followed(userId, id));
             }
+
+            supplierDetail.setFans(followService.fansCount(supplierDetail.getId()));
         }
         return returnData(R.SUCCESS.getCode(),supplierDetail);
     }
diff --git a/src/main/java/com/mzl/flower/web/supplier/DeliverySupplierController.java b/src/main/java/com/mzl/flower/web/supplier/DeliverySupplierController.java
index 51760a1..8aca450 100644
--- a/src/main/java/com/mzl/flower/web/supplier/DeliverySupplierController.java
+++ b/src/main/java/com/mzl/flower/web/supplier/DeliverySupplierController.java
@@ -7,6 +7,7 @@
 import com.mzl.flower.constant.Constants;
 import com.mzl.flower.dto.request.payment.DeliveryOrderArriveDTO;
 import com.mzl.flower.dto.request.payment.DeliveryOrderQueryDTO;
+import com.mzl.flower.dto.request.payment.PostQueryDTO;
 import com.mzl.flower.dto.response.payment.*;
 import com.mzl.flower.dto.response.supplier.SupplierOrderDTO;
 import com.mzl.flower.service.payment.DeliveryOrderService;
@@ -104,6 +105,12 @@
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getSupplierDeliveryOrderItem(id));
     }
 
+    @PostMapping("/list/items/views")
+    @ApiOperation(value = "获取商品详情列表")
+    public ResponseEntity<ReturnDataDTO<List<DeliveryOrderItemDTO>>> getSupplierDeliveryOrderItems(@RequestBody PostQueryDTO dto){
+        return returnData(R.SUCCESS.getCode(), deliveryOrderService.getSupplierDeliveryOrderItems(dto));
+    }
+
     @PostMapping("/list/arrive")
     @ApiOperation(value = "确认入位")
     public ResponseEntity<ReturnDataDTO> arrived(@RequestBody DeliveryOrderArriveDTO dto) {
@@ -153,7 +160,7 @@
     })
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getReplaceCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.replace.name()));
+                , Constants.CHECK_TYPE.replace.name(), true));
     }
 
     @GetMapping("/mine/list/check/info/lack")
@@ -163,6 +170,6 @@
     })
     public ResponseEntity<ReturnDataDTO<OrderItemCheckNumDTO>> getLackCheck(String orderItemId){
         return returnData(R.SUCCESS.getCode(), deliveryOrderService.getOtherCheck(orderItemId
-                , Constants.CHECK_TYPE.lack.name()));
+                , Constants.CHECK_TYPE.lack.name(), true));
     }
 }
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java
new file mode 100644
index 0000000..4bc4d77
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponRecordController.java
@@ -0,0 +1,114 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.CreateCouponRecordDTO;
+import com.mzl.flower.dto.request.coupon.QueryCouponRecordDTO;
+import com.mzl.flower.dto.response.coupon.CouponRecordResultVO;
+import com.mzl.flower.dto.response.coupon.CouponRecordVO;
+import com.mzl.flower.entity.coupon.CouponRecordDO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.enums.CouponStatusEnum;
+import com.mzl.flower.service.coupon.CouponRecordService;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+* @author @TaoJie
+* @since 2024-08-27
+*/
+@RestController
+@RequestMapping("/v2/coupon-record")
+@Api(value = "优惠券记录管理-活动", tags = "优惠券记录管理")
+@Validated
+public class CouponRecordController extends BaseController {
+    
+    @Autowired
+    CouponRecordService couponRecordService;
+
+    @Autowired
+    private CouponTemplateService2 couponTemplateService;
+
+
+    @PostMapping("")
+    @ApiOperation(value = "新增", notes = "新增")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponRecordDTO dto) {
+
+        final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus()) && couponTemplateDO.getStatus().equals(CouponStatusEnum.INACTIVE.getStatus())){
+            throw new ValidationException("优惠券还未发布");
+        }
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus()) && couponTemplateDO.getStatus().equals(CouponStatusEnum.EXPIRED.getStatus())){
+            throw new ValidationException("优惠券已下架");
+        }
+
+        couponRecordService.createCouponRecord(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO>  update(@PathVariable String id,@Validated @RequestBody CreateCouponRecordDTO dto) {
+
+        dto.setId(id);
+
+        CouponRecordDO couponRecordDO= couponRecordService.getById(dto.getId());
+        if(null==couponRecordDO){
+            throw new ValidationException("优惠券记录不存在");
+        }
+
+        return returnData(R.SUCCESS.getCode(), couponRecordService.updateCouponRecord(dto));
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id ) {
+
+        CouponRecordDO couponRecordDO= couponRecordService.getById(id);
+        if(null==couponRecordDO){
+            throw new ValidationException("优惠券记录不存在");
+        }
+        couponRecordService.deleteCouponRecord(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO>  get(@PathVariable String id) {
+        CouponRecordVO couponRecordVO=couponRecordService.getCouponRecordById(id);
+        return returnData(R.SUCCESS.getCode(),ConverterUtil.transObject(couponRecordVO, CouponRecordResultVO.class));
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponRecordVO>>> page(
+            Page page, QueryCouponRecordDTO dto
+    ) {
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(couponRecordService.getPage(page,dto), CouponRecordResultVO.class));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponRecordVO>>> list(QueryCouponRecordDTO dto
+    ) {
+        return returnData(R.SUCCESS.getCode(),ConverterUtil.transList(couponRecordService.getList(dto), CouponRecordResultVO.class));
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java
new file mode 100644
index 0000000..7905c5f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateActivyController.java
@@ -0,0 +1,234 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponTemplateActivyVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplatePointVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.enums.*;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@RestController
+@RequestMapping("/api/v2/coupon/avtivy")
+@Api(value = "优惠券管理-活动", tags = "优惠券管理-活动")
+@Validated
+public class CouponTemplateActivyController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @PostMapping("")
+    @ApiOperation(value = "新增", notes = "新增")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponTemplateActivyDTO dto) {
+
+        // 信息验证
+        valid(dto);
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成活动优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        couponTemplateBO.setGetUserType(CouponGetUserTypeEnum.ALL.getType());
+
+
+        couponTemplateService.createCouponTemplate(couponTemplateBO);
+        return returnData(R.SUCCESS.getCode(), null);
+
+
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO> update(@PathVariable String id,@Validated @RequestBody CreateCouponTemplateActivyDTO dto) {
+
+        // 手动设置id值
+        dto.setId(id);
+        // 信息验证
+        valid(dto);
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getId());
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO);
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成活动优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        couponTemplateBO.setGetUserType(CouponGetUserTypeEnum.ALL.getType());
+
+        couponTemplateService.updateCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+        couponTemplateService.deleteCouponTemplate(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO> get(@PathVariable String id) {
+        CouponTemplateVO couponTemplateVO = couponTemplateService.getDetailById(id);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(couponTemplateVO, CouponTemplateActivyVO.class));
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplatePointVO>>> page(Page page, QueryCouponDTO dto) {
+        // 设置只查询活动优惠券的
+        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        Page<CouponTemplateVO> resultPage = couponTemplateService.getPage(page, dto);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplateActivyVO.class));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> list(QueryCouponDTO dto) {
+        // 设置只查询活动优惠券的
+        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getList(dto), CouponTemplateActivyVO.class));
+    }
+
+
+    @PutMapping("/active/{id}")
+    @ApiOperation(value = "发布", notes = "发布")
+    public ResponseEntity<ReturnDataDTO> active(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        // 判断当前时间是否在优惠券的领取时间范围内
+        LocalDateTime now = LocalDateTime.now();
+//        if (couponTemplateDO.getGetStartDate() != null && couponTemplateDO.getGetEndDate() != null) {
+//            if (now.isBefore(couponTemplateDO.getGetStartDate()) || now.isAfter(couponTemplateDO.getGetEndDate())) {
+//                throw new ValidationException("当前时间不在优惠券领取时间范围内,不能发布优惠券。");
+//            }
+//        } else {
+//            throw new ValidationException("优惠券的领取时间未设置。");
+//        }
+
+        // 检查结束时间是否存在
+        if (couponTemplateDO.getGetEndDate() != null) {
+            // 如果当前时间小于结束时间,允许发布
+            if (now.isAfter(couponTemplateDO.getGetEndDate())) {
+                throw new ValidationException("当前时间已超过优惠券领取结束时间,不能发布优惠券。");
+            }
+        } else {
+            throw new ValidationException("优惠券的领取结束时间未设置。");
+        }
+
+
+        couponTemplateService.activeCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/expire/{id}")
+    @ApiOperation(value = "下架", notes = "下架")
+    public ResponseEntity<ReturnDataDTO> expire(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.expireCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    private void valid(CreateCouponTemplateActivyDTO dto){
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getMinOrderAmount().compareTo(dto.getCouponDiscountValue()) < 0) {
+            throw new ValidationException("订单金额不能小于折扣金额");
+        }
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getCouponDiscountValue().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new ValidationException("折扣金额必须大于0");
+        }
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType())
+                && dto.getMinOrderAmount().compareTo(BigDecimal.ZERO) != 0) {
+            throw new ValidationException("无门槛的订单金额必须为0");
+        }
+
+        // 领取后 固定时间
+        if(StringUtils.isNotBlank(dto.getUsageType()) && dto.getUsageType().equals(CouponUsageTypeEnum.FIXED.getType()) ){
+            // 如果使用时间是固定时间的话,那么固定时间的开始时间和结束时间就不能为空
+            if(dto.getUsageStartDate()==null){
+                throw new ValidationException("固定时间开始日期不能为空");
+            }
+            if(dto.getUsageEndDate()==null){
+                throw new ValidationException("固定时间结束日期不能为空");
+            }
+        }
+
+        // 领取后 有效时间
+        if(StringUtils.isNotBlank(dto.getUsageType()) && dto.getUsageType().equals(CouponUsageTypeEnum.GET_AFTER_TIME.getType())){
+            // 如果使用时间是领取后有效时间的话,那么领取后的时间类型不能为空,且时间不能为空
+            if(StringUtils.isBlank(dto.getUsageTimeType())){
+                throw new ValidationException("领取后有效时间类型(COUPON_USAGE_TIME_TYPE)不能为空");
+            }
+
+            if(dto.getUsageTimeNum()==null){
+                throw new ValidationException("领取后有效时间整数不能为空");
+            }
+            if(dto.getUsageTimeNum()<=0){
+                throw new ValidationException("领取后有效时间整数需要大于0");
+            }
+        }
+
+        // 用户获取的类型是首页领取的话
+        if(StringUtils.isNotBlank(dto.getGetType()) && dto.getGetType().equals(dto.getGetType().equals(CouponGetTypeEnum.HOME.getType()))
+        ){
+            // 优惠券图片校验
+            if(StringUtils.isBlank(dto.getImageUrl())){
+                throw new ValidationException("优惠券图片不能为空");
+            }
+        }
+
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java
new file mode 100644
index 0000000..fb33a94
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateAppController.java
@@ -0,0 +1,171 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.dto.request.coupon.CreateCouponRecordAppDTO;
+import com.mzl.flower.dto.request.coupon.CreateCouponRecordDTO;
+import com.mzl.flower.dto.request.coupon.QueryActivityEffectCouponDTO;
+import com.mzl.flower.dto.request.coupon.QueryMineCouponRecordDTO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateAppVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.dto.response.customer.CustomerDTO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.enums.CouponCategoryEnum;
+import com.mzl.flower.enums.CouponGetTypeEnum;
+import com.mzl.flower.enums.CouponStatusEnum;
+import com.mzl.flower.enums.CouponUsedStatusEnum;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.service.coupon.CouponRecordService;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@RestController
+@RequestMapping("/api/v2/coupon/app")
+@Api(value = "优惠券管理-小程序", tags = "优惠券管理-小程序")
+@Validated
+public class CouponTemplateAppController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @Autowired
+    CouponRecordService couponRecordService;
+
+
+    @Autowired
+   CustomerMapper customerMapper;
+
+//    @GetMapping("/home/list")
+//    @ApiOperation(value = "查询-首页弹框", notes = "查询-首页弹框")
+//    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> homeList(QueryActivityEffectCouponDTO dto) {
+//        // 活动优惠券
+//        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+//        // 已经发布
+//        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+//        // 首页弹窗
+//        dto.setGetType(CouponGetTypeEnum.HOME.getType());
+//        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getActivityEffectList(dto), CouponTemplateAppVO.class));
+//    }
+
+    @GetMapping("/home/alert")
+    @ApiOperation(value = "查询-首页弹框", notes = "查询-首页弹框")
+    public ResponseEntity<ReturnDataDTO<CouponTemplateVO>> homeAlert(QueryActivityEffectCouponDTO dto) {
+        // 活动优惠券
+        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        // 已经发布
+        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+        // 首页弹窗
+        dto.setGetType(CouponGetTypeEnum.HOME.getType());
+        // 如果当前人员已经领取过的话,则不返回
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(couponTemplateService.getHomeActivityEffectAlert(dto), CouponTemplateAppVO.class));
+    }
+
+    @GetMapping("/activy/list")
+    @ApiOperation(value = "查询-活动入口", notes = "查询-活动入口")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> activyList(QueryActivityEffectCouponDTO dto) {
+        // 活动优惠券
+        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        // 已经发布
+        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+        // 活动入口
+        dto.setGetType(CouponGetTypeEnum.ACTIVITY.getType());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getActivityEffectList(dto), CouponTemplateAppVO.class));
+
+    }
+
+    @GetMapping("/center/list")
+    @ApiOperation(value = "查询-领券中心", notes = "查询-领券中心")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> centerList(QueryActivityEffectCouponDTO dto) {
+        // 活动优惠券
+        dto.setCategory(CouponCategoryEnum.ACTIVITY.getStatus());
+        // 已经发布
+        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+        // 首页弹窗
+        dto.setGetType(CouponGetTypeEnum.CENTER.getType());
+
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getActivityEffectList(dto), CouponTemplateAppVO.class));
+
+    }
+
+    @GetMapping("/mine/unused/list")
+    @ApiOperation(value = "我的优惠券-未使用", notes = "我的优惠券-未使用")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> unusedList(QueryMineCouponRecordDTO dto) {
+        // 未使用
+        dto.setStatus(CouponUsedStatusEnum.UNUSED.getType());
+        dto.setUserId(SecurityUtils.getUserId());
+
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponRecordService.getMineCouponRecordList(dto), CouponTemplateAppVO.class));
+
+    }
+    @GetMapping("/mine/used/list")
+    @ApiOperation(value = "我的优惠券-已使用", notes = "我的优惠券-已使用")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> usedList(QueryMineCouponRecordDTO dto) {
+
+        // 已使用
+        dto.setStatus(CouponUsedStatusEnum.USED.getType());
+        dto.setUserId(SecurityUtils.getUserId());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponRecordService.getMineCouponRecordList(dto), CouponTemplateAppVO.class));
+
+    }
+
+    @GetMapping("/mine/expired/list")
+    @ApiOperation(value = "我的优惠券-已过期", notes = "我的优惠券-已过期")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> expiredList(QueryMineCouponRecordDTO dto) {
+        // 已过期
+        dto.setStatus(CouponUsedStatusEnum.EXPIRED.getType());
+        dto.setUserId(SecurityUtils.getUserId());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponRecordService.getMineCouponRecordList(dto), CouponTemplateAppVO.class));
+
+    }
+
+    @PostMapping("/receive")
+    @ApiOperation(value = "优惠券领取", notes = "优惠券领取")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponRecordAppDTO dto) {
+
+        final CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getCouponId());
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus()) && couponTemplateDO.getStatus().equals(CouponStatusEnum.INACTIVE.getStatus())){
+            throw new ValidationException("优惠券还未发布");
+        }
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus()) && couponTemplateDO.getStatus().equals(CouponStatusEnum.EXPIRED.getStatus())){
+            throw new ValidationException("优惠券已下架");
+        }
+
+        // 根据当前获取获取商户的ID
+        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(SecurityUtils.getUserId());
+        if(null==currentCustomer){
+            throw new ValidationException("当前登录的用户记录不存在");
+        }
+        // 设置当前用户为登录用户
+        dto.setCustomerId(currentCustomer.getId());
+
+        CreateCouponRecordDTO dtoTrans=new CreateCouponRecordDTO();
+        BeanUtils.copyProperties(dto,dtoTrans);
+
+        couponRecordService.createCouponRecord(dtoTrans);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateController.java
new file mode 100644
index 0000000..aa89964
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateController.java
@@ -0,0 +1,160 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.CreateCouponTemplateDTO;
+import com.mzl.flower.dto.request.coupon.QueryCouponDTO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateActivyVO;
+import com.mzl.flower.enums.CouponUsageTypeEnum;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+
+
+/**
+* @author @TaoJie
+* @since 2024-08-22
+*/
+@RestController
+@RequestMapping("/api/v2/coupon/all")
+//@Api(value = "优惠券管理-活动", tags = "优惠券管理-活动")
+@Validated
+public class CouponTemplateController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @PostMapping("")
+    @ApiOperation(value = "新增优惠券", notes = "新增优惠券")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponTemplateDTO dto) {
+
+        // 信息验证
+        valid(dto);
+
+//        couponTemplateService.createCouponTemplate(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO>  update(@PathVariable String id,@Validated @RequestBody CreateCouponTemplateDTO dto) {
+
+        // 手动设置id值
+        dto.setId(id);
+        CouponTemplateDO couponTemplateDO= couponTemplateService.getById(dto.getId());
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        // 信息验证
+        valid(dto);
+
+//        couponTemplateService.updateCouponTemplate(dto);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id ) {
+
+        CouponTemplateDO couponTemplateDO= couponTemplateService.getById(id);
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+        couponTemplateService.deleteCouponTemplate(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO>  get(@PathVariable String id) {
+//        CouponTemplateActivyVO couponTemplateActivyVO=couponTemplateService.getActivityCouponDetailById(id);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateActivyVO>>> page(
+            Page page, QueryCouponDTO dto
+    ) {
+//        couponTemplateService.getActivityPage(page,dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateActivyVO>>> list(QueryCouponDTO dto
+    ) {
+//        couponTemplateService.getActivityList(dto)
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    @PutMapping("/active/{id}")
+    @ApiOperation(value = "发布", notes = "发布")
+    public ResponseEntity<ReturnDataDTO>  active(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO= couponTemplateService.getById(id);
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.activeCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/expire/{id}")
+    @ApiOperation(value = "下架", notes = "下架")
+    public ResponseEntity<ReturnDataDTO>  expire(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO= couponTemplateService.getById(id);
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.expireCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    private void valid(CreateCouponTemplateDTO dto){
+        // 领取后 固定时间
+        if(StringUtils.isNotBlank(dto.getUsageType()) && dto.getUsageType().equals(CouponUsageTypeEnum.FIXED.getType()) ){
+            // 如果使用时间是固定时间的话,那么固定时间的开始时间和结束时间就不能为空
+            if(dto.getUsageStartDate()==null){
+                throw new ValidationException("固定时间开始日期不能为空");
+            }
+            if(dto.getUsageEndDate()==null){
+                throw new ValidationException("固定时间结束日期不能为空");
+            }
+        }
+
+        // 领取后 有效时间
+        if(StringUtils.isNotBlank(dto.getUsageType()) && dto.getUsageType().equals(CouponUsageTypeEnum.GET_AFTER_TIME.getType())){
+            // 如果使用时间是领取后有效时间的话,那么领取后的时间类型不能为空,且时间不能为空
+            if(StringUtils.isBlank(dto.getUsageTimeType())){
+                throw new ValidationException("领取后有效时间类型不能为空");
+            }
+
+            if(dto.getUsageTimeNum()==null){
+                throw new ValidationException("领取后有效时间整数不能为空");
+            }
+            if(dto.getUsageTimeNum()<=0){
+                throw new ValidationException("领取后有效时间整数需要大于0");
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java
new file mode 100644
index 0000000..50a553a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplatePointController.java
@@ -0,0 +1,249 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponPointStatisVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplatePointVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.enums.CouponCategoryEnum;
+import com.mzl.flower.enums.CouponStatusEnum;
+import com.mzl.flower.enums.CouponTypeEnum;
+import com.mzl.flower.enums.CouponUsageTypeEnum;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@RestController
+@RequestMapping("/api/v2/coupon/point")
+@Api(value = "优惠券管理-积分", tags = "优惠券管理-积分")
+@Validated
+public class CouponTemplatePointController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @PostMapping("")
+    @ApiOperation(value = "新增", notes = "新增")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponTemplatePointDTO dto) {
+
+        // 信息校验
+        valid(dto);
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成积分优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.POINT.getStatus());
+        // 设置默认类型领取后有效
+        couponTemplateBO.setUsageType(CouponUsageTypeEnum.GET_AFTER_TIME.getType());
+
+        couponTemplateService.createCouponTemplate(couponTemplateBO);
+        return returnData(R.SUCCESS.getCode(), null);
+
+
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO> update(@PathVariable String id,@Validated @RequestBody CreateCouponTemplatePointDTO dto) {
+        // 信息校验
+        dto.setId(id);
+        valid(dto);
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getId());
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO);
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成积分优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.POINT.getStatus());
+        // 设置默认类型
+        couponTemplateBO.setUsageType(CouponUsageTypeEnum.GET_AFTER_TIME.getType());
+
+
+        couponTemplateService.updateCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+        couponTemplateService.deleteCouponTemplate(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO> get(@PathVariable String id) {
+        CouponTemplateVO couponTemplateVO = couponTemplateService.getDetailById(id);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(couponTemplateVO, CouponTemplatePointVO.class));
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplatePointVO>>> page(Page page, QueryCouponDTO dto) {
+        // 设置只查询积分优惠券的
+        dto.setCategory(CouponCategoryEnum.POINT.getStatus());
+        Page<CouponTemplateVO> resultPage = couponTemplateService.getPage(page, dto);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplatePointVO.class));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> list(QueryCouponDTO dto) {
+        // 设置只查询积分优惠券的
+        dto.setCategory(CouponCategoryEnum.POINT.getStatus());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getList(dto), CouponTemplatePointVO.class));
+    }
+
+
+    @PutMapping("/active/{id}")
+    @ApiOperation(value = "发布", notes = "发布")
+    public ResponseEntity<ReturnDataDTO> active(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.activeCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/expire/{id}")
+    @ApiOperation(value = "下架", notes = "下架")
+    public ResponseEntity<ReturnDataDTO> expire(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.expireCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping("/batch/expire")
+    @ApiOperation(value = "批量下架", notes = "批量下架")
+    public ResponseEntity<ReturnDataDTO> expireBatch(@RequestBody BatchCouponTemplateDTO dto) {
+
+
+        couponTemplateService.expireBatchCouponTemplate(dto);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+
+    @PostMapping("/batch/active")
+    @ApiOperation(value = "批量发布", notes = "批量发布")
+    public ResponseEntity<ReturnDataDTO> activeBatch(@RequestBody BatchCouponTemplateDTO dto) {
+
+        couponTemplateService.activeBatchCouponTemplate(dto);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    @PostMapping("/batch/del")
+    @ApiOperation(value = "批量删除", notes = "批量删除")
+    public ResponseEntity<ReturnDataDTO> deleteBatch(@RequestBody BatchCouponTemplateDTO dto) {
+
+        couponTemplateService.deleteBatchCouponTemplate(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/statistics")
+    @ApiOperation(value = "积分统计", notes = "积分统计")
+    public ResponseEntity<ReturnDataDTO> statistics(QueryCouponStatisticsDTO dto) {
+        QueryCouponStatisticsBO queryCouponStatisticsBO=new QueryCouponStatisticsBO();
+        BeanUtils.copyProperties(dto,queryCouponStatisticsBO);
+        CouponPointStatisVO vo = couponTemplateService.statisCouponTemplatePoint(queryCouponStatisticsBO);
+        return returnData(R.SUCCESS.getCode(), vo);
+    }
+
+    @GetMapping("/active/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> activeList(QueryActivePointCouponDTO dto) {
+        // 设置只查询积分优惠券的
+        dto.setCategory(CouponCategoryEnum.POINT.getStatus());
+        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getPointList(dto), CouponTemplatePointVO.class));
+    }
+
+    @GetMapping("/active/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplatePointVO>>> activePage(Page page, QueryActivePointCouponDTO dto) {
+        // 设置只查询积分优惠券的
+        dto.setCategory(CouponCategoryEnum.POINT.getStatus());
+        dto.setStatus(CouponStatusEnum.ACTIVE.getStatus());
+        Page<CouponTemplateVO> resultPage = couponTemplateService.getPointPage(page, dto);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplatePointVO.class));
+    }
+
+
+    private void valid(CreateCouponTemplatePointDTO dto){
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getMinOrderAmount().compareTo(dto.getCouponDiscountValue()) < 0) {
+            throw new ValidationException("订单金额不能小于折扣金额");
+        }
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getCouponDiscountValue().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new ValidationException("折扣金额必须大于0");
+        }
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType())
+                && dto.getMinOrderAmount().compareTo(BigDecimal.ZERO) != 0) {
+            throw new ValidationException("无门槛的订单金额必须为0");
+        }
+
+
+    }
+
+
+
+    @PostMapping("/exchange")
+    @ApiOperation(value = "小程序-积分优惠券兑换", notes = "小程序-积分优惠券兑换")
+    public ResponseEntity<ReturnDataDTO> exchangeCoupon(@Validated @RequestBody ExchangeCouponDTO dto) {
+        couponTemplateService.exchangeCoupon(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+
+
+    }
+}
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java
new file mode 100644
index 0000000..7939f58
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateUserController.java
@@ -0,0 +1,190 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.CreateCouponTemplateBO;
+import com.mzl.flower.dto.request.coupon.CreateCouponTemplateUserDTO;
+import com.mzl.flower.dto.request.coupon.QueryCouponDTO;
+import com.mzl.flower.dto.response.coupon.CouponTemplatePointVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateUserVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.enums.*;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+
+
+/**
+ * @author @TaoJie
+ * @since 2024-08-22
+ */
+@RestController
+@RequestMapping("/api/v2/coupon/user")
+@Api(value = "优惠券管理-用户", tags = "优惠券管理-用户")
+@Validated
+public class CouponTemplateUserController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @PostMapping("")
+    @ApiOperation(value = "新增", notes = "新增")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponTemplateUserDTO dto) {
+
+        if (dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType()) && dto.getMinOrderAmount().compareTo(dto.getCouponDiscountValue()) < 0) {
+            throw new ValidationException("订单金额不能小于折扣金额");
+        }
+
+        if (dto.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType()) && dto.getMinOrderAmount().compareTo(BigDecimal.ZERO) != 0) {
+            throw new ValidationException("无门槛的订单金额必须为0");
+        }
+
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成指定用户
+        couponTemplateBO.setGetUserType(CouponGetUserTypeEnum.TARGET.getType());
+        // 设置成用户优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.USER.getStatus());
+        // 设置默认类型
+        couponTemplateBO.setUsageType(CouponUsageTypeEnum.GET_AFTER_TIME.getType());
+
+        couponTemplateService.createCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+
+
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO> update(@PathVariable String id,@Validated @RequestBody CreateCouponTemplateUserDTO dto) {
+
+        dto.setId(id);
+
+        if (dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType()) && dto.getMinOrderAmount().compareTo(dto.getCouponDiscountValue()) < 0) {
+            throw new ValidationException("订单金额不能小于折扣金额");
+        }
+
+        if (dto.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType()) && dto.getMinOrderAmount().compareTo(BigDecimal.ZERO) != 0) {
+            throw new ValidationException("无门槛的订单金额必须为0");
+        }
+
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getId());
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO);
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+         // 设置成指定用户
+        couponTemplateBO.setGetUserType(CouponGetUserTypeEnum.TARGET.getType());
+        // 设置成用户优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.USER.getStatus());
+        // 设置默认类型
+        couponTemplateBO.setUsageType(CouponUsageTypeEnum.GET_AFTER_TIME.getType());
+
+
+        couponTemplateService.updateCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+        couponTemplateService.deleteCouponTemplate(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO> get(@PathVariable String id) {
+        CouponTemplateVO couponTemplateVO = couponTemplateService.getDetailById(id);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(couponTemplateVO, CouponTemplateUserVO.class));
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplatePointVO>>> page(
+            Page page, QueryCouponDTO dto
+    ) {
+        // 设置只查询用户优惠券的
+        dto.setCategory(CouponCategoryEnum.USER.getStatus());
+        Page<CouponTemplateVO> resultPage = couponTemplateService.getPage(page, dto);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplateUserVO.class));
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVO>>> list(QueryCouponDTO dto
+    ) {
+        // 设置只查询用户优惠券的
+        dto.setCategory(CouponCategoryEnum.USER.getStatus());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getList(dto), CouponTemplateUserVO.class));
+    }
+
+
+    @PutMapping("/active/{id}")
+    @ApiOperation(value = "发布", notes = "发布")
+    public ResponseEntity<ReturnDataDTO> active(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus())
+                &&  couponTemplateDO.getStatus().equals(CouponStatusEnum.ACTIVE.getStatus())){
+            throw new ValidationException("已发布的的商品不可重复发布");
+        }
+
+        if(StringUtils.isNotBlank(couponTemplateDO.getStatus())
+              &&  couponTemplateDO.getStatus().equals(CouponStatusEnum.EXPIRED.getStatus())){
+            throw new ValidationException("已下架的商品不可重复上架");
+        }
+
+        couponTemplateService.activeCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/expire/{id}")
+    @ApiOperation(value = "下架", notes = "下架")
+    public ResponseEntity<ReturnDataDTO> expire(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.expireCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java
new file mode 100644
index 0000000..fe543b1
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/v2/coupon/CouponTemplateVipController.java
@@ -0,0 +1,183 @@
+package com.mzl.flower.web.v2.coupon;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.dto.request.coupon.*;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVO;
+import com.mzl.flower.dto.response.coupon.CouponTemplateVipVO;
+import com.mzl.flower.entity.coupon.CouponTemplateDO;
+import com.mzl.flower.entity.menber.Member;
+import com.mzl.flower.enums.CouponCategoryEnum;
+import com.mzl.flower.enums.CouponTypeEnum;
+import com.mzl.flower.service.coupon.CouponTemplateService2;
+import com.mzl.flower.service.menber.MemberService;
+import com.mzl.flower.utils.ConverterUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+
+/**
+* @author @TaoJie
+* @since 2024-08-22
+*/
+@RestController
+@RequestMapping("/api/v2/coupon/vip")
+@Api(value = "优惠券管理-会员", tags = "优惠券管理-会员")
+@Validated
+public class CouponTemplateVipController extends BaseController {
+
+    @Autowired
+    CouponTemplateService2 couponTemplateService;
+
+    @Autowired
+    MemberService memberService;
+
+    @PostMapping("")
+    @ApiOperation(value = "新增", notes = "新增")
+    public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateCouponTemplateVipDTO dto) {
+
+        // 信息验证
+        valid(dto);
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成会员优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.MEMBER.getStatus());
+
+        couponTemplateService.createCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/{id}")
+    @ApiOperation(value = "修改", notes = "修改")
+    public ResponseEntity<ReturnDataDTO>  update(@PathVariable String id,@Validated @RequestBody CreateCouponTemplateVipDTO dto) {
+
+        dto.setId(id);
+        // 信息验证
+        valid(dto);
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(dto.getId());
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        CreateCouponTemplateBO couponTemplateBO = new CreateCouponTemplateBO();
+        BeanUtils.copyProperties(couponTemplateDO,couponTemplateBO);
+        BeanUtils.copyProperties(dto, couponTemplateBO);
+
+        // 设置成会员优惠券
+        couponTemplateBO.setCategory(CouponCategoryEnum.MEMBER.getStatus());
+
+        couponTemplateService.updateCouponTemplate(couponTemplateBO);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除", notes = "删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id ) {
+
+        CouponTemplateDO couponTemplateDO= couponTemplateService.getById(id);
+        if(null==couponTemplateDO){
+            throw new ValidationException("优惠券不存在");
+        }
+        couponTemplateService.deleteCouponTemplate(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/{id}")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO>  get(@PathVariable String id) {
+        CouponTemplateVO couponTemplateVO = couponTemplateService.getDetailById(id);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transObject(couponTemplateVO, CouponTemplateVipVO.class));
+    }
+
+    @GetMapping("/page")
+    @ApiOperation(value = "查询-分页", notes = "查询-分页")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVipVO>>> page(
+            Page page, QueryCouponDTO dto
+    ) {
+        // 设置只查询会员优惠券的
+        dto.setCategory(CouponCategoryEnum.MEMBER.getStatus());
+        Page<CouponTemplateVO> resultPage = couponTemplateService.getPage(page, dto);
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplateVipVO.class));
+
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value = "查询-全部", notes = "查询-全部")
+    public ResponseEntity<ReturnDataDTO<Page<CouponTemplateVipVO>>> list(QueryCouponDTO dto
+    ) {
+        dto.setCategory(CouponCategoryEnum.MEMBER.getStatus());
+        return returnData(R.SUCCESS.getCode(), ConverterUtil.transList(couponTemplateService.getList(dto), CouponTemplateVipVO.class));
+    }
+
+    @PutMapping("/active/{id}")
+    @ApiOperation(value = "发布", notes = "发布")
+    public ResponseEntity<ReturnDataDTO> active(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.activeCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PutMapping("/expire/{id}")
+    @ApiOperation(value = "下架", notes = "下架")
+    public ResponseEntity<ReturnDataDTO> expire(@PathVariable String id) {
+
+        CouponTemplateDO couponTemplateDO = couponTemplateService.getById(id);
+        if (null == couponTemplateDO) {
+            throw new ValidationException("优惠券不存在");
+        }
+
+        couponTemplateService.expireCouponTemplate(id);
+
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    private void valid(CreateCouponTemplateVipDTO dto){
+
+        final Member member = memberService.getById(dto.getMemberId());
+
+        if(null==member){
+            throw new ValidationException("会员等级不存在");
+        }
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getMinOrderAmount().compareTo(dto.getCouponDiscountValue()) < 0) {
+            throw new ValidationException("订单金额不能小于折扣金额");
+        }
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.DISCOUNT.getType())
+                && dto.getCouponDiscountValue().compareTo(BigDecimal.ZERO) <= 0) {
+            throw new ValidationException("折扣金额必须大于0");
+        }
+
+        if (StringUtils.isNotBlank(dto.getCouponDiscountType())
+                && dto.getCouponDiscountType().equals(CouponTypeEnum.ZERO.getType())
+                && dto.getMinOrderAmount().compareTo(BigDecimal.ZERO) != 0) {
+            throw new ValidationException("无门槛的订单金额必须为0");
+        }
+
+    }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 653b8fc..6ad42f0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -20,7 +20,7 @@
       maxRequestSize: 50MB
 
 mybatis-plus:
-  mapper-locations: classpath:/mapper/*Mapper.xml,classpath:/mapper/**/*Mapper.xml
+  mapper-locations: classpath:/mapper/*Mapper.xml,classpath:/mapper/**/*Mapper.xml,classpath:/mapper/*Mapper*.xml,classpath:/mapper/**/*Mapper*.xml
   global-config:
     banner: false
     db-config:
@@ -67,8 +67,8 @@
 
 wx:
   miniapp:
-    appid: wx3203fd935a6ffe09    #小程序appId 花店端
-    secret: 9121c703fb0c416b21a8c289dd73ae9b    #secret花店端
+    appid: wx1441324401626290    #小程序appId 花店端
+    secret: bab595ac75f60eb33567511111a569a7    #secret花店端
     msgDataFormat: JSON
   mp:
     app-id: xxx   #公众号appId
diff --git a/src/main/resources/mapper/coupon/CouponRecordMapper.xml b/src/main/resources/mapper/coupon/CouponRecordMapper.xml
new file mode 100644
index 0000000..3f721a5
--- /dev/null
+++ b/src/main/resources/mapper/coupon/CouponRecordMapper.xml
@@ -0,0 +1,32 @@
+<?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.mzl.flower.mapper.coupon.CouponRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.coupon.CouponRecordDO">
+        <id column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="coupon_id" property="couponId" />
+        <result column="user_id" property="userId" />
+        <result column="customer_id" property="customerId" />
+        <result column="status" property="status" />
+        <result column="effective_start" property="effectiveStart" />
+        <result column="effective_end" property="effectiveEnd" />
+        <result column="order_id" property="orderId" />
+        <result column="used_time" property="usedTime" />
+        <result column="coupon_discount_value" property="couponDiscountValue" />
+        <result column="min_order_amount" property="minOrderAmount" />
+        <result column="category" property="category" />
+        <result column="coupon_code" property="couponCode" />
+        <result column="coupon_name" property="couponName" />
+
+        <result column="point" property="point" />
+        <result column="image_url" property="imageUrl" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml
new file mode 100644
index 0000000..7970cda
--- /dev/null
+++ b/src/main/resources/mapper/coupon/CouponRecordMapperCustom.xml
@@ -0,0 +1,132 @@
+<?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.mzl.flower.mapper.coupon.CouponRecordMapperCustom">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.coupon.CouponRecordDO">
+        <id column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="coupon_id" property="couponId" />
+        <result column="user_id" property="userId" />
+        <result column="customer_id" property="customerId" />
+        <result column="status" property="status" />
+        <result column="effective_start" property="effectiveStart" />
+        <result column="effective_end" property="effectiveEnd" />
+        <result column="order_id" property="orderId" />
+        <result column="used_time" property="usedTime" />
+        <result column="coupon_discount_value" property="couponDiscountValue" />
+        <result column="min_order_amount" property="minOrderAmount" />
+        <result column="category" property="category" />
+        <result column="coupon_code" property="couponCode" />
+        <result column="coupon_name" property="couponName" />
+        <result column="get_type" property="getType" />
+        <result column="coupon_discount_type" property="couponDiscountType" />
+        <result column="get_user_type" property="getUserType" />
+
+        <result column="point" property="point" />
+
+    </resultMap>
+    <update id="checkCouponExpired">
+        update t_coupon_record  set `status`='expired' where `status`='unused' and effective_end &lt; NOW()
+        <if test="param.userId != null and param.userId != ''">
+            AND user_id = #{param.userId}
+        </if>
+        <if test="param.customerId != null and param.customerId != ''">
+            AND customer_id =  #{param.customerId}
+        </if>
+    </update>
+
+    <select id="statisCouponTemplateCount" resultType="java.lang.Integer">
+        select IFNULL(count(1),0) as cnt from t_coupon_record where deleted=false and category=#{param.category}
+    </select>
+    <select id="statisCouponTemplateCurMonCount" resultType="java.lang.Integer">
+        select IFNULL(count(1),0) as cnt from t_coupon_record where deleted=false and category=#{param.category}  AND DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
+    </select>
+    <select id="statisCouponPointCurMonPointAmonut" resultType="java.lang.Integer">
+        select IFNULL(sum(point),0) as cnt from t_coupon_record where deleted=false and category='point'  AND DATE_FORMAT(create_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m')
+    </select>
+
+    <select id="getPage" resultType="com.mzl.flower.dto.response.coupon.CouponRecordVO">
+        <include refid="QuerySql"/>
+    </select>
+    <select id="getList" resultType="com.mzl.flower.dto.response.coupon.CouponRecordVO">
+        <include refid="QuerySql"/>
+    </select>
+    <select id="getMineCouponRecordList" resultType="com.mzl.flower.dto.response.coupon.CouponRecordVO">
+        select *
+        from t_coupon_record t
+        where t.deleted=false
+        <if test="param.userId != null and param.userId != ''">
+            AND t.user_id = #{param.userId}
+        </if>
+        <if test="param.customerId != null and param.customerId != ''">
+            AND t.customer_id =  #{param.customerId}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND t.status =  #{param.status}
+        </if>
+    </select>
+
+    <sql id="QuerySql">
+        select *
+        from (
+        select r.*,
+        i.name as customerName,
+        u.tel,
+        o.order_no
+        from t_coupon_record r
+        left join t_customer_info i
+        on r.customer_id=i.id
+        left join t_user u
+        on i.user_id=u.id
+        left join t_order o
+        on r.order_id=o.id
+        ) t
+        where t.deleted=0
+        <if test="param.name != null and param.name != ''">
+            AND t.coupon_name like concat('%', #{param.name},'%')
+        </if>
+        <if test="param.couponDiscountType != null and param.couponDiscountType != ''">
+            AND t.coupon_discount_type =  #{param.couponDiscountType}
+        </if>
+        <if test="param.getType != null and param.getType != ''">
+            AND t.get_type =  #{param.getType}
+        </if>
+        <if test="param.getUserType != null and param.getUserType != ''">
+            AND t.get_user_type =  #{param.getUserType}
+        </if>
+        <if test="param.id != null and param.id != ''">
+            AND t.id =  #{param.id}
+        </if>
+        <if test="param.orderNo != null and param.orderNo != ''">
+            AND t.order_no like  concat('%', #{param.orderNo},'%')
+        </if>
+        <if test="param.tel != null and param.tel != ''">
+            AND t.tel like  concat('%', #{param.tel},'%')
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND t.status =  #{param.status}
+        </if>
+        <if test="param.keyword != null and param.keyword != ''">
+            AND (t.customerName like  concat('%', #{param.keyword},'%')
+                     or t.user_id like  concat('%', #{param.keyword},'%') )
+        </if>
+        <if test="param.couponId != null and param.couponId != ''">
+            and t.coupon_id =  #{param.couponId}
+        </if>
+        <if test="param.category != null and param.category != ''">
+            and t.category =  #{param.category}
+        </if>
+
+
+
+        order by t.create_time desc
+    </sql>
+
+
+
+</mapper>
diff --git a/src/main/resources/mapper/coupon/CouponTemplateCustomerMapper.xml b/src/main/resources/mapper/coupon/CouponTemplateCustomerMapper.xml
new file mode 100644
index 0000000..c876065
--- /dev/null
+++ b/src/main/resources/mapper/coupon/CouponTemplateCustomerMapper.xml
@@ -0,0 +1,12 @@
+<?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.mzl.flower.mapper.coupon.CouponTemplateCustomerMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.coupon.CouponTemplateCustomerDO">
+        <id column="id" property="id" />
+        <result column="coupon_id" property="couponId" />
+        <result column="custom_id" property="customId" />
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/coupon/CouponTemplateMapper.xml b/src/main/resources/mapper/coupon/CouponTemplateMapper.xml
new file mode 100644
index 0000000..aeeafcc
--- /dev/null
+++ b/src/main/resources/mapper/coupon/CouponTemplateMapper.xml
@@ -0,0 +1,41 @@
+<?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.mzl.flower.mapper.coupon.CouponTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.coupon.CouponTemplateDO">
+        <id column="id" property="id" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="deleted" property="deleted" />
+        <result column="coupon_code" property="couponCode" />
+        <result column="coupon_name" property="couponName" />
+        <result column="coupon_description" property="couponDescription" />
+        <result column="coupon_amount" property="couponAmount" />
+        <result column="coupon_discount_type" property="couponDiscountType" />
+        <result column="coupon_discount_value" property="couponDiscountValue" />
+        <result column="min_order_amount" property="minOrderAmount" />
+        <result column="max_discount_amount" property="maxDiscountAmount" />
+        <result column="get_type" property="getType" />
+        <result column="get_user_type" property="getUserType" />
+        <result column="get_start_date" property="getStartDate" />
+        <result column="get_end_date" property="getEndDate" />
+        <result column="get_limit" property="getLimit" />
+        <result column="usage_type" property="usageType" />
+        <result column="usage_limit" property="usageLimit" />
+        <result column="usage_per_user" property="usagePerUser" />
+        <result column="usage_start_date" property="usageStartDate" />
+        <result column="usage_end_date" property="usageEndDate" />
+        <result column="usage_time_type" property="usageTimeType" />
+        <result column="usage_time_num" property="usageTimeNum" />
+        <result column="status" property="status" />
+
+        <result column="member_id" property="memberId" />
+        <result column="image_url" property="imageUrl" />
+
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml b/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml
new file mode 100644
index 0000000..7ce2dbb
--- /dev/null
+++ b/src/main/resources/mapper/coupon/CouponTemplateMapperCustom.xml
@@ -0,0 +1,243 @@
+<?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.mzl.flower.mapper.coupon.CouponTemplateMapperCustom">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.coupon.CouponTemplateDO">
+        <id column="id" property="id" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="deleted" property="deleted" />
+        <result column="category" property="category" />
+        <result column="coupon_code" property="couponCode" />
+        <result column="coupon_name" property="couponName" />
+        <result column="coupon_description" property="couponDescription" />
+        <result column="coupon_amount" property="couponAmount" />
+        <result column="coupon_discount_type" property="couponDiscountType" />
+        <result column="coupon_discount_value" property="couponDiscountValue" />
+        <result column="min_order_amount" property="minOrderAmount" />
+        <result column="max_discount_amount" property="maxDiscountAmount" />
+        <result column="get_type" property="getType" />
+        <result column="get_user_type" property="getUserType" />
+        <result column="get_start_date" property="getStartDate" />
+        <result column="get_end_date" property="getEndDate" />
+        <result column="get_limit" property="getLimit" />
+        <result column="usage_type" property="usageType" />
+        <result column="usage_limit" property="usageLimit" />
+        <result column="usage_per_user" property="usagePerUser" />
+        <result column="usage_start_date" property="usageStartDate" />
+        <result column="usage_end_date" property="usageEndDate" />
+        <result column="usage_time_type" property="usageTimeType" />
+        <result column="usage_time_num" property="usageTimeNum" />
+        <result column="status" property="status" />
+        <result column="point" property="point" />
+        <result column="member_id" property="memberId" />
+    </resultMap>
+
+
+    <update id="activeBatchCouponTemplate">
+        update t_coupon_template set status='active',update_by=#{param.updateBy},update_time=now() where id in
+        <foreach collection="param.idList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+    <update id="expireBatchCouponTemplate">
+        update t_coupon_template set status='expired',update_by=#{param.updateBy},update_time=now() where id in
+        <foreach collection="param.idList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+
+    <update id="deleteBatchCouponTemplate">
+        update t_coupon_template set deleted=true ,update_by=#{param.updateBy},update_time=now() where id in
+        <foreach collection="param.idList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+    <update id="expireHomeActivityCouponTemplate">
+        update t_coupon_template set status='expired'  where  category='activity' and get_type='home' and status='active'
+    </update>
+
+    <select id="getCouponTemplatePage" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QuerySql2"/>
+    </select>
+    <select id="getList" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QuerySql2"/>
+    </select>
+    <select id="getCouponPointList" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QueryPointSql" />
+    </select>
+    <select id="getPointPage" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QueryPointSql" />
+    </select>
+
+<!--    app活动优惠券-->
+    <select id="getActivityEffectList" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+
+        SELECT *
+        FROM t_coupon_template t
+        WHERE t.deleted = FALSE
+        <if test="param.category != null and param.category != '' and param.category == 'activity' ">
+            AND t.get_start_date &lt;= NOW()
+            AND NOW() &lt;= t.get_end_date
+        </if>
+
+        <if test="param.category != null and param.category != ''">
+            AND category =  #{param.category}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND status =  #{param.status}
+        </if>
+        <if test="param.getType != null and param.getType != ''">
+            AND t.get_type =  #{param.getType}
+        </if>
+        ORDER BY t.create_time DESC
+
+    </select>
+    <select id="getCouponCustomerList"
+            resultType="com.mzl.flower.dto.response.coupon.CouponTemplateCustomerVO">
+        select ci.id,ci.name,u.tel
+        from t_coupon_template c
+        left JOIN t_coupon_template_customer cc
+        on c.id=cc.coupon_id
+        left join t_customer_info ci
+        on cc.custom_id=ci.id
+        left join t_user u
+        on ci.user_id=u.id
+        where c.deleted= false
+        and c.id=#{id}
+
+    </select>
+    <select id="getVipList" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QuerySqlVip" />
+    </select>
+    <select id="getCouponTemplateVipPage" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        <include refid="QuerySqlVip" />
+    </select>
+    <select id="getHomeActivityEffectAlert" resultType="com.mzl.flower.dto.response.coupon.CouponTemplateVO">
+        SELECT *
+        FROM t_coupon_template t
+        WHERE t.deleted = FALSE
+
+        <if test="param.category != null and param.category != '' and param.category == 'activity' ">
+            AND t.get_start_date &lt;= NOW()
+            AND NOW() &lt;= t.get_end_date
+        </if>
+
+        <if test="param.category != null and param.category != ''">
+            AND t.category =  #{param.category}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND t.status =  #{param.status}
+        </if>
+        <if test="param.getType != null and param.getType != ''">
+            AND t.get_type =  #{param.getType}
+        </if>
+        ORDER BY t.create_time DESC
+        limit 1
+    </select>
+
+    <sql id="QueryPointSql">
+        select *
+        from t_coupon_template
+        where deleted=0
+        <if test="param.category != null and param.category != ''">
+            AND category =  #{param.category}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND status =  #{param.status}
+        </if>
+        <if test="param.minPoint != null ">
+            AND point &gt;=  #{param.minPoint}
+        </if>
+        <if test="param.maxPoint != null ">
+            AND point &lt;=  #{param.maxPoint}
+        </if>
+        <if test="param.orderStr != null and param.orderStr != '' ">
+            order by ${param.orderStr}
+        </if>
+
+    </sql>
+
+    <sql id="QuerySql2">
+        select *
+        from (
+            select t.*,
+            create_by_user.nick_name as createByName,
+            IFNULL(get_num.cnt, 0) as getNum,
+            IFNULL(t.coupon_amount, 0) - IFNULL(get_num.cnt, 0) as unGetNum
+        from t_coupon_template t
+        left join t_user create_by_user
+        on t.create_by =create_by_user.id
+        left join (select coupon_id,count(1) as cnt  from t_coupon_record where deleted=0 group by coupon_id) get_num
+        on t.id=get_num.coupon_id
+        ) t
+        where t.deleted=0
+        <if test="param.name != null and param.name != ''">
+            AND t.coupon_name like concat('%', #{param.name},'%')
+        </if>
+        <if test="param.couponDiscountType != null and param.couponDiscountType != ''">
+            AND t.coupon_discount_type =  #{param.couponDiscountType}
+        </if>
+        <if test="param.getType != null and param.getType != ''">
+            AND t.get_type =  #{param.getType}
+        </if>
+        <if test="param.getUserType != null and param.getUserType != ''">
+            AND t.get_user_type =  #{param.getUserType}
+        </if>
+        <if test="param.id != null and param.id != ''">
+            AND t.id =  #{param.id}
+        </if>
+        <if test="param.category != null and param.category != ''">
+            AND t.category =  #{param.category}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND t.status =  #{param.status}
+        </if>
+        order by t.create_time desc
+    </sql>
+
+    <sql id="QuerySqlVip">
+        select *
+        from (
+            select t.*,
+            create_by_user.nick_name as createByName,
+            IFNULL(get_num.cnt, 0) as getNum,
+            IFNULL(t.coupon_amount, 0) - IFNULL(get_num.cnt, 0) as unGetNum,
+            m.`name` as member_name
+            from t_coupon_template t
+            left join t_user create_by_user
+            on t.create_by =create_by_user.id
+            left join (select coupon_id,count(1) as cnt  from t_coupon_record where deleted=0 group by coupon_id) get_num
+            on t.id=get_num.coupon_id
+            left join t_member m
+            on t.member_id=m.id
+        ) t
+        where t.deleted=0
+        <if test="param.name != null and param.name != ''">
+            AND t.coupon_name like concat('%', #{param.name},'%')
+        </if>
+        <if test="param.couponDiscountType != null and param.couponDiscountType != ''">
+            AND t.coupon_discount_type =  #{param.couponDiscountType}
+        </if>
+        <if test="param.getType != null and param.getType != ''">
+            AND t.get_type =  #{param.getType}
+        </if>
+        <if test="param.getUserType != null and param.getUserType != ''">
+            AND t.get_user_type =  #{param.getUserType}
+        </if>
+        <if test="param.id != null and param.id != ''">
+            AND t.id =  #{param.id}
+        </if>
+        <if test="param.category != null and param.category != ''">
+            AND t.category =  #{param.category}
+        </if>
+        <if test="param.status != null and param.status != ''">
+            AND t.status =  #{param.status}
+        </if>
+        order by t.create_time desc
+    </sql>
+
+</mapper>
diff --git a/src/main/resources/mapper/customer/FollowMapper.xml b/src/main/resources/mapper/customer/FollowMapper.xml
index d0dad11..89f028d 100644
--- a/src/main/resources/mapper/customer/FollowMapper.xml
+++ b/src/main/resources/mapper/customer/FollowMapper.xml
@@ -21,4 +21,11 @@
         </if>
         ORDER BY f.create_time DESC
     </select>
+
+    <select id="getStatisFansCount" resultType="java.lang.Integer">
+        SELECT IFNULL(COUNT(DISTINCT f.user_id), 0)
+        FROM t_follow_supplier f
+        WHERE f.deleted = 0
+        AND f.supplier_id = #{supplierId};
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberGrowthRecordMapper.xml b/src/main/resources/mapper/member/MemberGrowthRecordMapper.xml
new file mode 100644
index 0000000..a9f2622
--- /dev/null
+++ b/src/main/resources/mapper/member/MemberGrowthRecordMapper.xml
@@ -0,0 +1,48 @@
+<?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.mzl.flower.mapper.member.MemberGrowthRecordMapper">
+
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.member.MemberGrowthRecordVO">
+        select * from t_member_growth_record t where t.deleted= 0
+        <if test="dto.type != null and dto.type != ''">
+            and t.type = #{dto.type}
+        </if>
+        <if test="dto.source != null and dto.source != ''">
+            and t.source = #{dto.source}
+        </if>
+        <if test="dto.startRecordDate!=null ">
+            <![CDATA[
+               AND t.create_time >= #{dto.startRecordDate}
+            ]]>
+        </if>
+        <if test="dto.endRecordDate!=null ">
+            <![CDATA[
+               AND t.create_time <= #{dto.endRecordDate}
+            ]]>
+        </if>
+        <if test="dto.userId != null and dto.userId != ''">
+            and t.user_id = #{dto.userId}
+        </if>
+        order by t.update_time desc
+    </select>
+
+    <select id="queryUserPage" resultType="com.mzl.flower.dto.response.member.UserGrowthRecordVO">
+        SELECT c.name as nickName, c.level_id as levelId, t.tel, t.id as userId, m.name AS levelName, IFNULL(SUM(mg.growth), 0) AS sumGrowthValue
+        FROM t_customer_info c
+                 LEFT JOIN t_user t ON c.user_id = t.id
+                 LEFT JOIN t_member m ON c.level_id = m.id
+                 LEFT JOIN (SELECT user_id, SUM(growth) AS growth
+                            FROM t_member_growth_record
+                            WHERE deleted = 0
+                            GROUP BY user_id) mg ON c.user_id = mg.user_id
+        WHERE c.deleted = 0
+        <if test="dto.nickName!= null and dto.nickName != ''">
+            AND c.name LIKE CONCAT('%',#{dto.nickName},'%')
+        </if>
+        <if test="dto.tel!= null and dto.tel != ''">
+            and t.tel like CONCAT('%',#{dto.tel},'%')
+        </if>
+        GROUP BY c.id
+        order by c.update_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberMapper.xml b/src/main/resources/mapper/member/MemberMapper.xml
new file mode 100644
index 0000000..adf01df
--- /dev/null
+++ b/src/main/resources/mapper/member/MemberMapper.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.mzl.flower.mapper.member.MemberMapper">
+
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.member.MemberVO">
+        select t.*, u.nick_name createName from t_member t
+        left join t_user u on t.create_by = u.id
+         where t.deleted= 0
+        <if test="dto.name != null and dto.name != ''">
+            and t.name like concat('%', #{dto.name}, '%')
+        </if>
+        order by t.start_point
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml b/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml
index d944053..0de6831 100644
--- a/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml
+++ b/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml
@@ -44,8 +44,8 @@
     <select id="selectSettlementListByTime" resultType="com.mzl.flower.dto.response.payment.DeliveryOrderItemSettlementDTO">
         SELECT ois.order_item_id, oi.flower_name, oi.flower_level, oi.num, oi.supplier_price price , s.`status`
         , ois.check_num, ois.check_fee, ois.replace_num, ois.replace_fee, ois.lack_num, ois.lack_fee_supplier lackFee
-        , ois.station_fee, ois.sales_fee_supplier salesFee, ois.service_fee_rate, ois.service_fee, ois.income_supplier
-        , o.status_backend, o.create_time orderTime
+        , ois.station_fee, ois.sales_fee_supplier salesFee, ois.service_fee_rate, ois.service_fee
+        , ois.income_supplier income, o.status_backend, o.create_time orderTime, o.receive_time, o.order_no
         , (select count(1) from t_order_item_sales sa where sa.order_item_id = oi.id) salesNum
         FROM t_delivery_order_item doi
         join t_delivery_order q on q.id = doi.delivery_id
@@ -101,9 +101,18 @@
     <select id="selectDoItemList4Check" resultType="com.mzl.flower.dto.response.payment.DeliveryOrderItem4CheckDTO">
         SELECT oi.id, q.delivery_id, oi.flower_name, oi.flower_unit, oi.flower_color
         , oi.flower_cover, oi.num , oi.supplier_price price, oi.flower_level, oi.status
-        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'replace') replaceNum
-        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'reduce') reduceNum
-        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'lack') lackNum
+        , (select oic.num from t_order_item_check oic
+            where oic.order_item_id = oi.id and oic.type = 'replace'
+            and (oic.audit_status = 'AGREED' or oic.audit_status is null)
+        ) replaceNum
+        , (select oic.num from t_order_item_check oic
+            where oic.order_item_id = oi.id and oic.type = 'reduce'
+            and (oic.audit_status = 'AGREED' or oic.audit_status is null)
+        ) reduceNum
+        , (select oic.num from t_order_item_check oic
+            where oic.order_item_id = oi.id and oic.type = 'lack'
+            and (oic.audit_status = 'AGREED' or oic.audit_status is null)
+        ) lackNum
         FROM t_delivery_order_item q
         join t_order_item oi on oi.id = q.order_item_id
         WHERE q.deleted = 0 and oi.deleted = 0
diff --git a/src/main/resources/mapper/payment/DeliveryOrderMapper.xml b/src/main/resources/mapper/payment/DeliveryOrderMapper.xml
index dbfd143..243e5d8 100644
--- a/src/main/resources/mapper/payment/DeliveryOrderMapper.xml
+++ b/src/main/resources/mapper/payment/DeliveryOrderMapper.xml
@@ -79,13 +79,16 @@
     </select>
 
     <select id="selectSupplierDoList4Check" resultType="com.mzl.flower.dto.response.payment.DeliveryOrderList4CheckDTO">
-        SELECT tt.id, tt.supplierName, tt.supplierTel, tt.stationName, sum(tt.num) totalNum, sum(tt.amount) totalAmount
+        SELECT tt.id, tt.supplierName, tt.supplierTel, tt.stationName, sum(tt.num) totalNum
+            , sum(tt.amount) totalAmount, sum(tt.uncheckedCount) uncheckedCount
         from (
             select s.id, s.name supplierName, s.contact_tel supplierTel, st.name stationName
             , (select sum(num) from t_order_item oi
                 where oi.supplier_id = q.supplier_id and oi.order_id = q.order_id) num
-            ,  (select sum(oi.supplier_price * oi.num) from t_order_item oi
+            , (select sum(oi.supplier_price * oi.num) from t_order_item oi
                 where oi.supplier_id = q.supplier_id and oi.order_id = q.order_id) amount
+            , (select count(1) from t_delivery_order dor
+                where dor.id = q.id and dor.status != 'CHECKED') uncheckedCount
             from t_supplier_info s
             join t_station st on st.id = s.station_id
             join t_delivery_order q on s.id = q.supplier_id
@@ -98,8 +101,12 @@
         <if test="condition.orderNo != null and condition.orderNo != ''">
             AND q.order_no LIKE concat('%', #{condition.orderNo},'%')
         </if>
-        <if test="condition.status != null and condition.status != ''">
-            AND q.status = #{condition.status}
+
+        <if test="condition.statusList != null and condition.statusList.size > 0">
+            AND q.status in
+            <foreach collection="condition.statusList" item="status" open="(" separator="," close=")">
+                #{status}
+            </foreach>
         </if>
 
         <if test="condition.supplierId != null">
@@ -148,8 +155,12 @@
         <if test="condition.orderNo != null and condition.orderNo != ''">
             AND q.order_no LIKE concat('%', #{condition.orderNo},'%')
         </if>
-        <if test="condition.status != null and condition.status != ''">
-            AND q.status = #{condition.status}
+
+        <if test="condition.statusList != null and condition.statusList.size > 0">
+            AND q.status in
+            <foreach collection="condition.statusList" item="status" open="(" separator="," close=")">
+                #{status}
+            </foreach>
         </if>
 
         <if test="condition.warehouseId != null">
@@ -177,6 +188,22 @@
     </select>
 
     <select id="statisticStationList" resultType="com.mzl.flower.dto.response.flower.StationStatisticDTO">
+        select tt.*
+            , (select count(distinct s.id)
+                from t_supplier_info s
+                join t_delivery_order q on s.id = q.supplier_id
+                WHERE q.deleted = 0
+                and q.status in ('CHECKED')
+                AND s.station_id = tt.stationId
+            ) checkedSupplierCount
+            , (select count(distinct s.id)
+                from t_supplier_info s
+                join t_delivery_order q on s.id = q.supplier_id
+                WHERE q.deleted = 0
+                and q.status in ('PENDING', 'ARRIVED')
+                AND s.station_id = tt.stationId
+            ) uncheckedSupplierCount
+        from (
             SELECT
                 s.station_id AS stationId,
                 st.`name`,
@@ -207,10 +234,15 @@
             <if test="endDate != null">
                 AND o.create_time &lt;= #{endDate}
             </if>
-            GROUP BY
-            s.station_id,
-            st.`name`;
 
+            <if test="statusList != null and statusList.size > 0">
+                AND o.status in
+                <foreach collection="statusList" item="status" open="(" separator="," close=")">
+                    #{status}
+                </foreach>
+            </if>
+            GROUP BY s.station_id, st.`name`
+        ) tt
     </select>
 
     <update id="setDeliveryOrderPending">
@@ -225,9 +257,13 @@
         SELECT q.*
         FROM t_delivery_order q
         WHERE q.deleted = 0
-        and q.status in ('PENDING', 'ARRIVED', 'CHECKED')
+        AND q.status in ('PENDING', 'ARRIVED')
         AND q.supplier_id = #{supplierId}
-        AND q.create_time &gt; #{startDate}
-        AND q.create_time &lt;= #{endDate}
+        <if test="startDate != null">
+            AND q.create_time &gt; #{startDate}
+        </if>
+        <if test="endDate != null">
+            AND q.create_time &lt;= #{endDate}
+        </if>
     </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/payment/OrderItemMapper.xml b/src/main/resources/mapper/payment/OrderItemMapper.xml
index c637e25..251abbb 100644
--- a/src/main/resources/mapper/payment/OrderItemMapper.xml
+++ b/src/main/resources/mapper/payment/OrderItemMapper.xml
@@ -50,10 +50,25 @@
         , (select oic.audit_status from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'reduce') reduceStatus
         , (select oic.audit_status from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'lack') lackStatus
         , (select count(1) from t_order_item_check oic where oic.order_item_id = oi.id and oic.audit_status is null) unProcessCount
+        , ois.lack_fee_supplier, ois.replace_fee, ois.check_fee
         FROM t_order_item oi
         left join t_station s on s.id = oi.station_id
         left join t_supplier_info si on si.id = oi.supplier_id
+        left join t_order_item_settlement ois on ois.order_item_id = oi.id
         WHERE oi.deleted = 0
         and oi.order_id = #{orderId}
     </select>
+
+    <select id="getOrderItems" resultType="com.mzl.flower.dto.response.payment.OrderItemListDTO">
+        SELECT oi.*
+        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'replace' and oic.audit_status = 'AGREED') replaceNum
+        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'reduce' and oic.audit_status = 'AGREED') reduceNum
+        , (select oic.num from t_order_item_check oic where oic.order_item_id = oi.id and oic.type = 'lack' and oic.audit_status = 'AGREED') lackNum
+        FROM t_order_item oi
+        WHERE oi.deleted = 0
+        and oi.order_id in
+        <foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/payment/OrderMapper.xml b/src/main/resources/mapper/payment/OrderMapper.xml
index 3ace381..6639b8c 100644
--- a/src/main/resources/mapper/payment/OrderMapper.xml
+++ b/src/main/resources/mapper/payment/OrderMapper.xml
@@ -244,4 +244,31 @@
         and o.receive_time &lt; #{endTime}
         and o.bill_id is null
     </select>
+
+    <select id="getUserLastOrder" resultType="com.mzl.flower.entity.payment.Order">
+        select o.*
+        from t_order o
+        where o.receive_time is not null
+        AND o.create_by = #{userId}
+        order by o.receive_time desc
+        limit 1
+    </select>
+
+    <select id="getPointGoodsList" resultType="com.mzl.flower.dto.response.payment.OrderPointGoodsListDTO">
+        select gr.*
+        from t_point_goods_record gr
+        join t_order_point_goods opg on opg.goods_record_id = gr.id
+        where opg.order_id = #{orderId}
+    </select>
+    <select id="getFlowerCompleteNumToday" resultType="java.lang.Integer">
+        select IFNULL(sum(oi.num),0) as complete_num
+        from t_order o
+        left join t_order_item oi
+        on o.id=oi.order_id
+        where o.DELETEd=0 and oi.DELETEd=0
+        and o.status_backend not in ('PENDING','CANCEL','REFUND')
+        and o.create_by=#{userId}
+        AND oi.flower_id=#{flowerId}
+        AND o.complete_time BETWEEN  DATE_SUB(CURDATE(), INTERVAL 1 DAY) + INTERVAL 17 HOUR  AND CURDATE() + INTERVAL 17 HOUR
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml b/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml
index 987c63d..6c199d5 100644
--- a/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml
+++ b/src/main/resources/mapper/payment/OrderSettlementDetailMapper.xml
@@ -3,12 +3,13 @@
 <mapper namespace="com.mzl.flower.mapper.payment.OrderSettlementDetailMapper">
 
     <select id="selectSettlementDetailList" resultType="com.mzl.flower.dto.response.payment.OrderSettlementDetailDTO">
-        SELECT s.*, oi.flower_name, oi.flower_level
+        SELECT s.*, oi.flower_name, oi.flower_level, o.receive_time, oi.check_time, o.order_no, s.order_id
         FROM t_order_settlement_detail s
         join t_order_item oi on oi.id = s.order_item_id
+        join t_order o on o.id = s.order_id
         WHERE s.deleted = 0
         AND s.settlement_id = #{settlementId}
-        ORDER BY s.create_time desc
+        ORDER BY o.receive_time desc, o.id, oi.flower_name
     </select>
 
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/point/CustomerPointDetailMapper.xml b/src/main/resources/mapper/point/CustomerPointDetailMapper.xml
new file mode 100644
index 0000000..6c228fb
--- /dev/null
+++ b/src/main/resources/mapper/point/CustomerPointDetailMapper.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.mzl.flower.mapper.point.CustomerPointDetailMapper">
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.point.CustomerPointDetailVO">
+        select * from t_customer_point_detail t where t.deleted= 0
+        <if test="dto.userId != null and dto.userId != ''">
+            and t.userId = #{dto.userId}
+        </if>
+        <if test="dto.customerId != null and dto.customerId != ''">
+            and t.customerId = #{dto.customerId}
+        </if>
+        <if test="dto.changeType != null and dto.changeType != ''">
+            and t.changeType = #{dto.changeType}
+        </if>
+        <if test="dto.type != null and dto.type != ''">
+            and t.type = #{dto.type}
+        </if>
+        order by t.c desc
+    </select>
+    <select id="tongjiExpiredPoint" resultType="com.mzl.flower.dto.response.point.ExpiredPointDTO"
+            parameterType="java.time.LocalDate">
+        SELECT
+            p.user_id,
+            p.customer_id,
+            SUM(CASE WHEN p.change_type = 'add' THEN point ELSE 0 END) AS addPoint,
+            SUM(CASE WHEN p.change_type = 'reduce' THEN point ELSE 0 END) AS reducePoint
+        FROM
+            t_customer_point_detail p
+        WHERE p.deleted= 0
+        <if test="lastYear!=null ">
+            <![CDATA[
+               and p.record_date <= #{lastYear}
+            ]]>
+        </if>
+        <if test="userId!=null and userId!=''">
+            and p.user_id = #{userId}
+        </if>
+        GROUP BY
+        p.user_id,
+        p.customer_id
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/point/CustomerPointMapper.xml b/src/main/resources/mapper/point/CustomerPointMapper.xml
new file mode 100644
index 0000000..004ba1c
--- /dev/null
+++ b/src/main/resources/mapper/point/CustomerPointMapper.xml
@@ -0,0 +1,56 @@
+<?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.mzl.flower.mapper.point.CustomerPointMapper">
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.point.CustomerPointDTO">
+        SELECT
+            c.`name` as customerName,
+            c.user_id as userId,
+            p.id as id,
+            c.id as customerId,
+            IFNULL(p.total_point, 0) as totalPoint,
+            IFNULL(p.used_point, 0) as usedPoint,
+            IFNULL(p.expired_point, 0) as expiredPoint,
+            IFNULL(p.deduction_point, 0) as deductionPoint,
+            t.tel as customerTel
+        FROM
+            t_customer_info c
+        LEFT JOIN t_customer_point p ON c.id = p.customer_id
+        LEFT JOIN t_user t on c.user_id = t.id
+        WHERE
+            c.deleted = 0
+          <if test="dto.customerName!= null and dto.customerName != ''">
+              AND c.`name` LIKE CONCAT('%',#{dto.customerName},'%')
+          </if>
+        <if test="dto.customerTel!= null and dto.customerTel != ''">
+            and t.tel like CONCAT('%',#{dto.customerTel},'%')
+        </if>
+         order by p.create_time desc
+
+    </select>
+    <select id="queryCustomerDetails" resultType="com.mzl.flower.dto.response.point.CustomerPointDetailDTO">
+        SELECT * from t_customer_point_detail t where t.deleted= 0
+        <if test="dto.customerId!= null and dto.customerId != 0">
+            and t.customer_id = #{dto.customerId}
+        </if>
+        <if test="dto.userId!= null and dto.userId != ''">
+            and t.user_id = #{dto.userId}
+        </if>
+        <if test="dto.recordDateStart!=null and dto.recordDateStart!='' ">
+            <![CDATA[
+               AND t.record_date >= #{dto.recordDateStart}
+            ]]>
+        </if>
+        <if test="dto.recordDateEnd!=null and dto.recordDateEnd!='' ">
+            <![CDATA[
+               AND t.record_date <= #{dto.recordDateEnd}
+            ]]>
+        </if>
+        <if test="dto.type!=null and dto.type != null">
+            and t.type = #{dto.type}
+        </if>
+        <if test="dto.remarks!=null and dto.remarks != null">
+            and t.remarks like CONCAT('%',#{dto.remarks},'%')
+        </if>
+        order by t.create_time desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/point/PointGoodMapper.xml b/src/main/resources/mapper/point/PointGoodMapper.xml
new file mode 100644
index 0000000..3a8ee5c
--- /dev/null
+++ b/src/main/resources/mapper/point/PointGoodMapper.xml
@@ -0,0 +1,28 @@
+<?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.mzl.flower.mapper.point.PointGoodsRecordMapper">
+    <update id="updateExpiredPointGoodsRecord">
+        update t_point_goods_record p set p.`status`='E' where p.deleted = 0 and p.`status` = 'A' and
+        <![CDATA[
+            p.expire_time < NOW()
+        ]]>
+
+    </update>
+
+    <select id="selectMyExchangeGoods" resultType="com.mzl.flower.dto.response.point.PointGoodsRecordDTO">
+        SELECT
+            *
+        FROM
+            t_point_goods_record p
+        WHERE
+            p.deleted = 0
+          <if test="dto.userId != null and dto.userId != ''">
+              AND p.user_id = #{dto.userId}
+          </if>
+          <if test="dto.status != null and dto.status != ''">
+              AND p.`status` = #{dto.status}
+          </if>
+        ORDER BY
+            p.create_time DESC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/point/PointGoodsMapper.xml b/src/main/resources/mapper/point/PointGoodsMapper.xml
new file mode 100644
index 0000000..e6935ff
--- /dev/null
+++ b/src/main/resources/mapper/point/PointGoodsMapper.xml
@@ -0,0 +1,30 @@
+<?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.mzl.flower.mapper.point.PointGoodsMapper">
+
+    <select id="selectGoodsList" resultType="com.mzl.flower.dto.response.point.PointGoodsListDTO">
+        SELECT p.*
+        FROM t_point_goods p
+        WHERE p.deleted = 0
+        <if test="condition.name != null and condition.name != ''">
+            AND p.name LIKE concat('%', #{condition.name},'%')
+        </if>
+        <if test="condition.status != null and condition.status != ''">
+            AND p.status = #{condition.status}
+        </if>
+        <if test="condition.stockLower != null">
+            AND p.stock &gt; #{condition.stockLower}
+        </if>
+        <if test="condition.stockUpper != null">
+            AND p.stock &lt;= #{condition.stockUpper}
+        </if>
+        <if test="condition.pointLower != null">
+            AND p.point &gt;= #{condition.pointLower}
+        </if>
+        <if test="condition.pointUpper != null">
+            AND p.point &lt;= #{condition.pointUpper}
+        </if>
+        ORDER BY p.create_time desc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/script/db-v2.sql b/src/main/resources/script/db-v2.sql
new file mode 100644
index 0000000..1f28c6e
--- /dev/null
+++ b/src/main/resources/script/db-v2.sql
@@ -0,0 +1,26 @@
+==================================================20240831
+ALTER TABLE `t_order` ADD `member_coupon_id` varchar(50)  COMMENT '用户优惠券id';
+ALTER TABLE `t_order` ADD `member_coupon_code` varchar(50)  COMMENT '优惠券编码';
+ALTER TABLE `t_order` ADD `member_coupon_name` varchar(50)  COMMENT '优惠券名称';
+ALTER TABLE `t_order` ADD `member_coupon_amount` DECIMAL(11,2)  COMMENT '优惠券金额';
+ALTER TABLE `t_order` ADD `member_id` bigint(25)  COMMENT '会员等级id';
+ALTER TABLE `t_order` ADD `member_name` varchar(50)  COMMENT '会员等级名称';
+ALTER TABLE `t_order` ADD `member_discount_type` varchar(50)  COMMENT '折扣类型(discount_type)';
+ALTER TABLE `t_order` ADD `member_discount_ratio` DECIMAL(11,2)  COMMENT '会员折扣';
+ALTER TABLE `t_order` ADD `member_discount_amount` DECIMAL(11,2)  COMMENT '优惠金额(每扎)';
+
+ALTER TABLE `t_order_item` ADD `coupon_amount` DECIMAL(11,2)  COMMENT '优惠券金额/扎';
+ALTER TABLE `t_order_item` ADD `original_price` DECIMAL(11,2)  COMMENT '优惠前售价/扎';
+ALTER TABLE `t_order_item` ADD `real_price` DECIMAL(11,2)  COMMENT '真实成交价格/每扎';
+
+INSERT INTO t_code_value(ID,TYPE_CODE,VALUE,LABEL,DESCRIPTION,SEQ,STATUS) VALUES ('POINT_GOODS_STATUS_A','POINT_GOODS_STATUS','A','上架','上架',1,'A');
+INSERT INTO t_code_value(ID,TYPE_CODE,VALUE,LABEL,DESCRIPTION,SEQ,STATUS) VALUES ('POINT_GOODS_STATUS_I','POINT_GOODS_STATUS','I','下架','下架',2,'A');
+
+ALTER TABLE `t_bill` ADD `member_coupon_amount` DECIMAL(11,2)  COMMENT '优惠券金额';
+
+
+
+
+
+
+
diff --git a/src/main/v2_sql.sql b/src/main/v2_sql.sql
new file mode 100644
index 0000000..815b293
--- /dev/null
+++ b/src/main/v2_sql.sql
@@ -0,0 +1,33 @@
+CREATE TABLE `flower`.`t_coupon_template`  (
+  `id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
+  `coupon_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '优惠券代码(唯一)',
+  `coupon_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '优惠券名称',
+  `coupon_description` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '优惠券描述(使用规则)',
+  `coupon_amount` int(11) NULL DEFAULT NULL COMMENT '发放数量',
+  `coupon_discount_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '优惠券类型(COUPON_TYPE)满减和无门槛',
+  `coupon_discount_value` decimal(10, 2) NULL DEFAULT NULL COMMENT '优惠券面值  折扣值(百分比或金额)',
+  `min_order_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '使用条件,最小订单金额(可选)=》使用条件',
+  `max_discount_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大折扣金额(可选,仅对百分比折扣类型适用)',
+  `get_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '领取渠道(COUPON_GET_TYPE)首页弹窗、活动入口、领券中心',
+  `get_user_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '领取用户类型(COUPON_GET_USER_TYPE)全部用户,指定用户',
+  `get_start_date` datetime NULL DEFAULT NULL COMMENT '领取开始时间',
+  `get_end_date` datetime NULL DEFAULT NULL COMMENT '领取结束时间',
+  `get_limit` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '每人限领',
+  `usage_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '使用时间类型(COUPON_USAGE_TYPE)与领取时间一致、固定时间、领取后有效',
+  `usage_time_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '领取后有效类型(COUPON_USAGE_TIME_TYPE)天、小时、分钟',
+  `usage_time_num` int(11) NULL DEFAULT NULL COMMENT '领取后有效时间整数,比如90(天,小时,分钟)',
+  `usage_limit` int(11) NULL DEFAULT NULL COMMENT '使用次数限制',
+  `usage_per_user` int(11) NULL DEFAULT NULL COMMENT '每个用户的使用次数限制',
+  `usage_start_date` datetime NULL DEFAULT NULL COMMENT '使用开始时间',
+  `usage_end_date` datetime NULL DEFAULT NULL COMMENT '使用结束时间',
+  `status` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'active' COMMENT '优惠券状态(COUPON_STATUS)',
+  `vip_flag` tinyint(4) NULL DEFAULT 0 COMMENT '会员标志',
+  `vip_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '会员等级',
+  `create_by` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
+  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `update_by` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',
+  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+  `deleted` tinyint(4) NULL DEFAULT 0 COMMENT '删除标志',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `coupon_code`(`coupon_code`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
\ No newline at end of file
diff --git "a/src/main/\345\256\232\346\227\266\344\273\273\345\212\241\350\257\264\346\230\216.txt" "b/src/main/\345\256\232\346\227\266\344\273\273\345\212\241\350\257\264\346\230\216.txt"
index f6775e5..4f7d204 100644
--- "a/src/main/\345\256\232\346\227\266\344\273\273\345\212\241\350\257\264\346\230\216.txt"
+++ "b/src/main/\345\256\232\346\227\266\344\273\273\345\212\241\350\257\264\346\230\216.txt"
@@ -6,4 +6,5 @@
 6、计算上月供应商销售数量:每月1日凌晨执行一次
 7、自动收货:每隔1小时执行一次
 8、结算:每日凌晨0点钟执行
-9、确认转账:每隔10分钟执行一次
\ No newline at end of file
+9、确认转账:每隔10分钟执行一次
+10、统计过期积分:凌晨1:10执行一次
\ No newline at end of file
diff --git "a/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx"
index 57f66b2..9f1c3d5 100644
--- "a/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx"
+++ "b/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx"
Binary files differ
diff --git "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
index 2e1e3ae..3c4cf99 100644
--- "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
+++ "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx"
Binary files differ

--
Gitblit v1.9.3