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 < 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 <= NOW() + AND NOW() <= 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 <= NOW() + AND NOW() <= 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 >= #{param.minPoint} + </if> + <if test="param.maxPoint != null "> + AND point <= #{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 <= #{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 > #{startDate} - AND q.create_time <= #{endDate} + <if test="startDate != null"> + AND q.create_time > #{startDate} + </if> + <if test="endDate != null"> + AND q.create_time <= #{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 < #{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 > #{condition.stockLower} + </if> + <if test="condition.stockUpper != null"> + AND p.stock <= #{condition.stockUpper} + </if> + <if test="condition.pointLower != null"> + AND p.point >= #{condition.pointLower} + </if> + <if test="condition.pointUpper != null"> + AND p.point <= #{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