diff --git a/.idea/compiler.xml b/.idea/compiler.xml index de73cb1..6931629 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -16,6 +16,7 @@ + @@ -23,6 +24,7 @@ + @@ -37,9 +39,11 @@ + + diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 226ecd6..336a426 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -17,5 +17,36 @@ jdbc:mysql://82.157.68.223:3306/shequ-activity $ProjectFileDir$ + + mysql.8 + true + 权限表 + com.mysql.cj.jdbc.Driver + jdbc:mysql://82.157.68.223:3306/shequ-order + $ProjectFileDir$ + + + mysql.8 + true + 权限表 + com.mysql.cj.jdbc.Driver + jdbc:mysql://82.157.68.223:3306 + $ProjectFileDir$ + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://82.157.68.223:3306/shequ-user + $ProjectFileDir$ + + + mysql.8 + true + 权限表 + com.mysql.cj.jdbc.Driver + jdbc:mysql://82.157.68.223:3306 + $ProjectFileDir$ + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index aa991e1..3afc4a8 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -8,6 +8,7 @@ + @@ -18,6 +19,7 @@ + diff --git a/guigu-ssyx-parent/common/common-util/src/main/java/com/atguigu/ssyx/common/utils/DateUtil.java b/guigu-ssyx-parent/common/common-util/src/main/java/com/atguigu/ssyx/common/utils/DateUtil.java new file mode 100644 index 0000000..4821ea2 --- /dev/null +++ b/guigu-ssyx-parent/common/common-util/src/main/java/com/atguigu/ssyx/common/utils/DateUtil.java @@ -0,0 +1,126 @@ +package com.atguigu.ssyx.common.utils; + +import org.apache.commons.lang.time.DateUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * ClassName: DateUtil + * Package: com.atguigu.ssyx.common.utils + * 日期操作工具类 + * + * @author yovinchen + * @Create 2023/10/12 18:04 + */ +public class DateUtil { + + private static final String dateFormat = "yyyy-MM-dd"; + private static final String timeFormat = "HH:mm:ss"; + + /** + * 格式化日期 + * + * @param date + * @return + */ + public static String formatDate(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); + return sdf.format(date); + + } + + /** + * 格式化日期 + * + * @param date + * @return + */ + public static String formatTime(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat(timeFormat); + return sdf.format(date); + + } + + public static Date parseTime(String date) { + SimpleDateFormat sdf = new SimpleDateFormat(timeFormat); + try { + return sdf.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 截取比较断两个日期对象的field处的值 。 + * 如果第一个日期小于、等于、大于第二个,则对应返回负整数、0、正整数 + * + * @param date1 第一个日期对象,非null + * @param date2 第二个日期对象,非null + * @param field Calendar中的阈值 + *

+ * date1 > date2 返回:1 + * date1 = date2 返回:0 + * date1 < date2 返回:-1 + */ + public static int truncatedCompareTo(final Date date1, final Date date2, final int field) { + return DateUtils.truncatedCompareTo(date1, date2, field); + } + + /** + * 比对日期与时间大小 + * + * @param beginDate + * @param endDate + * @return + */ + public static boolean dateCompare(Date beginDate, Date endDate) { + // endDate > beginDate + return DateUtil.truncatedCompareTo(beginDate, endDate, Calendar.SECOND) != 1; + } + + /** + * 比对日期与时间大小 + * + * @param beginDate + * @param endDate + * @return + */ + public static boolean timeCompare(Date beginDate, Date endDate) { + Calendar instance1 = Calendar.getInstance(); + instance1.setTime(beginDate); //设置时间为当前时间 + instance1.set(Calendar.YEAR, 0); + instance1.set(Calendar.MONTH, 0); + instance1.set(Calendar.DAY_OF_MONTH, 0); + + Calendar instance2 = Calendar.getInstance(); + instance2.setTime(endDate); //设置时间为当前时间 + instance2.set(Calendar.YEAR, 0); + instance2.set(Calendar.MONTH, 0); + instance2.set(Calendar.DAY_OF_MONTH, 0); + // endDate > beginDate + return DateUtil.truncatedCompareTo(instance1.getTime(), instance2.getTime(), Calendar.SECOND) != 1; + } + + /** + * 获取当前时间到晚上23点59分59秒的时间间隔,单位:秒 + * + * @return + */ + public static Long getCurrentExpireTimes() { + //过期截止时间 + Calendar instance = Calendar.getInstance(); + instance.setTime(new Date()); //设置时间为当前时间 + instance.set(Calendar.HOUR_OF_DAY, 23); + instance.set(Calendar.MINUTE, 59); + instance.set(Calendar.SECOND, 59); + Date endTime = instance.getTime(); + //当前时间与截止时间间隔,单位:秒 + long interval = (endTime.getTime() - new Date().getTime()) / 1000; + return 100 * 60 * 60 * 24 * 365L; + } +} + diff --git a/guigu-ssyx-parent/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedissonConfig.java b/guigu-ssyx-parent/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedissonConfig.java new file mode 100644 index 0000000..1b36436 --- /dev/null +++ b/guigu-ssyx-parent/common/service-util/src/main/java/com/atguigu/ssyx/common/config/RedissonConfig.java @@ -0,0 +1,60 @@ +package com.atguigu.ssyx.common.config; + +import lombok.Data; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.redisson.config.SingleServerConfig; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +/** + * ClassName: RedissonConfig + * Package: com.atguigu.ssyx.common.config + * + * @author yovinchen + * @Create 2023/10/12 16:48 + */ +@Data +@Configuration +@ConfigurationProperties("spring.redis") +public class RedissonConfig { + + private static String ADDRESS_PREFIX = "redis://"; + private String host; + private String addresses; + private String password; + private String port; + private int timeout = 3000; + private int connectionPoolSize = 64; + private int connectionMinimumIdleSize = 10; + private int pingConnectionInterval = 60000; + + /** + * 自动装配 + */ + @Bean + RedissonClient redissonSingle() { + Config config = new Config(); + // 判断redis 的host是否为空 + if (StringUtils.isEmpty(host)) { + throw new RuntimeException("host is empty"); + } + // 配置host,port等参数 + SingleServerConfig serverConfig = config.useSingleServer() + //redis://127.0.0.1:7181 + .setAddress(ADDRESS_PREFIX + this.host + ":" + port) + .setTimeout(this.timeout) + .setPingConnectionInterval(pingConnectionInterval) + .setConnectionPoolSize(this.connectionPoolSize) + .setConnectionMinimumIdleSize(this.connectionMinimumIdleSize); + // 判断进入redis 是否密码 + if (!StringUtils.isEmpty(this.password)) { + serverConfig.setPassword(this.password); + } + // RedissonClient redisson = Redisson.create(config); + return Redisson.create(config); + } +} diff --git a/guigu-ssyx-parent/common/service-util/src/test/java/com/atguigu/ssyx/CodeGet.java b/guigu-ssyx-parent/common/service-util/src/test/java/com/atguigu/ssyx/CodeGet.java index 643d2cc..5762ea6 100644 --- a/guigu-ssyx-parent/common/service-util/src/test/java/com/atguigu/ssyx/CodeGet.java +++ b/guigu-ssyx-parent/common/service-util/src/test/java/com/atguigu/ssyx/CodeGet.java @@ -25,7 +25,7 @@ public class CodeGet { // 2、全局配置 // 全局配置 GlobalConfig gc = new GlobalConfig(); - gc.setOutputDir("guigu-ssyx-parent/service/service-activity" + "/src/main/java"); + gc.setOutputDir("guigu-ssyx-parent/service/service-order" + "/src/main/java"); gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setAuthor("atguigu"); @@ -34,17 +34,17 @@ public class CodeGet { // 3、数据源配置 DataSourceConfig dsc = new DataSourceConfig(); - dsc.setUrl("jdbc:mysql://82.157.68.223:3306/shequ-activity?serverTimezone=GMT%2B8&useSSL=false"); + dsc.setUrl("jdbc:mysql://82.157.68.223:3306/shequ-order?serverTimezone=GMT%2B8&useSSL=false"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); - dsc.setUsername("shequ-activity"); - dsc.setPassword("shequ-activity"); + dsc.setUsername("shequ-order"); + dsc.setPassword("shequ-order"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.atguigu.ssyx"); - pc.setModuleName("activity"); //模块名 + pc.setModuleName("order"); //模块名 pc.setController("controller"); pc.setService("service"); pc.setMapper("mapper"); @@ -53,7 +53,7 @@ public class CodeGet { // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); - strategy.setInclude("activity_info", "activity_rule", "activity_sku", "coupon_info", "coupon_range", "coupon_use", "home_subject", "home_subject_sku", "seckill", "seckill_sku", "seckill_sku_notice", "seckill_time", "sku_info"); + strategy.setInclude("cart_info", "order_info", "order_deliver", "order_item", "order_log", "order_return_apply", "order_return_reason", "order_set", "payment_info", "refund_info"); strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 diff --git a/guigu-ssyx-parent/service-client/pom.xml b/guigu-ssyx-parent/service-client/pom.xml index f18d027..2cf6840 100644 --- a/guigu-ssyx-parent/service-client/pom.xml +++ b/guigu-ssyx-parent/service-client/pom.xml @@ -16,6 +16,7 @@ service-user-client service-search-client service-activity-client + service-cart-client diff --git a/guigu-ssyx-parent/service-client/service-activity-client/src/main/java/com/atguigu/ssyx/client/activity/ActivityFeignClient.java b/guigu-ssyx-parent/service-client/service-activity-client/src/main/java/com/atguigu/ssyx/client/activity/ActivityFeignClient.java index c661b41..611b6b6 100644 --- a/guigu-ssyx-parent/service-client/service-activity-client/src/main/java/com/atguigu/ssyx/client/activity/ActivityFeignClient.java +++ b/guigu-ssyx-parent/service-client/service-activity-client/src/main/java/com/atguigu/ssyx/client/activity/ActivityFeignClient.java @@ -1,5 +1,9 @@ package com.atguigu.ssyx.client.activity; +import com.atguigu.ssyx.model.activity.CouponInfo; +import com.atguigu.ssyx.model.order.CartInfo; +import com.atguigu.ssyx.vo.order.CartInfoVo; +import com.atguigu.ssyx.vo.order.OrderConfirmVo; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -20,10 +24,30 @@ import java.util.Map; @FeignClient(value = "service-activity") public interface ActivityFeignClient { + @ApiOperation(value = "根据skuId列表获取促销信息") @PostMapping("/api/activity/inner/findActivity") Map> findActivity(@RequestBody List skuIdList); @ApiOperation("根据skuID获取营销数据和优惠卷") @GetMapping("/api/activity/inner/findActivityAndCoupon/{skuId}/{userId}") Map findActivityAndCoupon(@PathVariable("skuId") Long skuId, @PathVariable("userId") Long userId); + + @ApiOperation("获取购物车中满足条件优惠券和活动") + @PostMapping("/api/activity/inner/findCartActivityAndCoupon/{userId}") + OrderConfirmVo findCartActivityAndCoupon( + @RequestBody List cartInfoList, @PathVariable("userId") Long userId); + + @ApiOperation("获取购物车对应规则数据") + @PostMapping("/api/activity/inner/findCartActivityList") + List findCartActivityList(@RequestBody List cartInfoList); + + @ApiOperation("获取购物车对应优惠券数据") + @PostMapping("/api/activity/inner/findRangeSkuIdList") + CouponInfo findRangeSkuIdList(@RequestBody List cartInfoList, @PathVariable("couponId") Long couponId); + + @ApiOperation(value = "更新优惠卷使用状态") + @GetMapping("/api/activity/inner/updateCouponInfoUseStatus/{couponId}/{userId}/{orderId}") + Boolean updateCouponInfoUseStatus(@PathVariable("couponId") Long couponId, + @PathVariable("userId") Long userId, + @PathVariable("orderId") Long orderId); } diff --git a/guigu-ssyx-parent/service-client/service-cart-client/pom.xml b/guigu-ssyx-parent/service-client/service-cart-client/pom.xml new file mode 100644 index 0000000..57383d6 --- /dev/null +++ b/guigu-ssyx-parent/service-client/service-cart-client/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.atguigu + service-client + 1.0-SNAPSHOT + + + service-cart-client + + + 8 + 8 + UTF-8 + + + diff --git a/guigu-ssyx-parent/service-client/service-cart-client/src/main/java/com/atguigu/ssyx/client/cart/CartFeignClient.java b/guigu-ssyx-parent/service-client/service-cart-client/src/main/java/com/atguigu/ssyx/client/cart/CartFeignClient.java new file mode 100644 index 0000000..cb292a3 --- /dev/null +++ b/guigu-ssyx-parent/service-client/service-cart-client/src/main/java/com/atguigu/ssyx/client/cart/CartFeignClient.java @@ -0,0 +1,24 @@ +package com.atguigu.ssyx.client.cart; + +import com.atguigu.ssyx.model.order.CartInfo; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +/** + * ClassName: CartFeignClient + * Package: com.atguigu.ssyx.client.cart + * + * @author yovinchen + * @Create 2023/10/12 15:49 + */ +@FeignClient(value = "service-cart") +public interface CartFeignClient { + + @ApiOperation(value = "根据用户Id查询购物车列表") + @PostMapping("/api/cart/inner/getCartCheckedList/{userId}") + List getCartCheckedList(@PathVariable("userId") Long userId); +} diff --git a/guigu-ssyx-parent/service-client/service-product-client/src/main/java/com/atguigu/ssyx/client/product/ProductFeignClient.java b/guigu-ssyx-parent/service-client/service-product-client/src/main/java/com/atguigu/ssyx/client/product/ProductFeignClient.java index 29836ec..fad0d02 100644 --- a/guigu-ssyx-parent/service-client/service-product-client/src/main/java/com/atguigu/ssyx/client/product/ProductFeignClient.java +++ b/guigu-ssyx-parent/service-client/service-product-client/src/main/java/com/atguigu/ssyx/client/product/ProductFeignClient.java @@ -3,6 +3,7 @@ package com.atguigu.ssyx.client.product; import com.atguigu.ssyx.model.product.Category; import com.atguigu.ssyx.model.product.SkuInfo; import com.atguigu.ssyx.vo.product.SkuInfoVo; +import com.atguigu.ssyx.vo.product.SkuStockLockVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -53,7 +54,7 @@ public interface ProductFeignClient { * @param skuIdList * @return */ - @GetMapping("/api/product/inner/findSkuInfoList") + @PostMapping("/api/product/inner/findSkuInfoList") List findSkuInfoList(@RequestBody List skuIdList); /** @@ -89,4 +90,7 @@ public interface ProductFeignClient { */ @GetMapping("/api/product/inner/getSkuInfoVo/{skuId}") SkuInfoVo getSkuInfoVo(@PathVariable Long skuId); + + @PostMapping("/api/product/inner/checkAndLock/{orderNo}") + Boolean checkAndLock(@RequestBody List commonStockLockVoList, @PathVariable("orderNo") String orderNo); } diff --git a/guigu-ssyx-parent/service/pom.xml b/guigu-ssyx-parent/service/pom.xml index d01cdd6..9c16709 100644 --- a/guigu-ssyx-parent/service/pom.xml +++ b/guigu-ssyx-parent/service/pom.xml @@ -20,6 +20,7 @@ service-user service-home service-cart + service-order diff --git a/guigu-ssyx-parent/service/service-acl/src/main/resources/application-dev.yml b/guigu-ssyx-parent/service/service-acl/src/main/resources/application-dev.yml index 8628cc6..c4ffc96 100644 --- a/guigu-ssyx-parent/service/service-acl/src/main/resources/application-dev.yml +++ b/guigu-ssyx-parent/service/service-acl/src/main/resources/application-dev.yml @@ -14,7 +14,18 @@ spring: url: jdbc:p6spy:mysql://82.157.68.223:3306/shequ-acl?characterEncoding=utf-8&useSSL=false username: shequ-acl password: shequ-acl - + redis: + host: 82.157.68.223 + port: 6379 + database: 0 + timeout: 1800000 + password: + lettuce: + pool: + max-active: 20 #最大连接数 + max-wait: -1 #最大阻塞等待时间(负数表示没限制) + max-idle: 5 #最大空闲 + min-idle: 0 #最小空闲 jackson: date-format: yyyy-MM-dd HH:mm:ss diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/api/ActivityApiController.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/api/ActivityApiController.java index ce33a3e..ed622f7 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/api/ActivityApiController.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/api/ActivityApiController.java @@ -1,9 +1,15 @@ package com.atguigu.ssyx.activity.api; import com.atguigu.ssyx.activity.service.ActivityInfoService; +import com.atguigu.ssyx.activity.service.CouponInfoService; +import com.atguigu.ssyx.model.activity.CouponInfo; +import com.atguigu.ssyx.model.order.CartInfo; +import com.atguigu.ssyx.vo.order.CartInfoVo; +import com.atguigu.ssyx.vo.order.OrderConfirmVo; 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.web.bind.annotation.*; import javax.annotation.Resource; @@ -26,6 +32,17 @@ public class ActivityApiController { @Resource private ActivityInfoService activityInfoService; + @Autowired + private CouponInfoService couponInfoService; + + @ApiOperation("获取购物车中满足条件优惠券和活动") + @PostMapping("inner/findCartActivityAndCoupon/{userId}") + public OrderConfirmVo findCartActivityAndCoupon( + @RequestBody List cartInfoList, @PathVariable("userId") Long userId) { + return activityInfoService.findCartActivityAndCoupon(cartInfoList, userId); + + } + @ApiOperation(value = "根据skuId列表获取促销信息") @PostMapping("inner/findActivity") public Map> findActivity(@RequestBody List skuIdList) { @@ -34,7 +51,29 @@ public class ActivityApiController { @ApiOperation("根据skuID获取营销数据和优惠卷") @GetMapping("inner/findActivityAndCoupon/{skuId}/{userId}") - public Map findActivityAndCoupon(@PathVariable Long skuId, @PathVariable Long userId) { + public Map findActivityAndCoupon( + @PathVariable("skuId") Long skuId, @PathVariable("userId") Long userId) { return activityInfoService.findActivityAndCoupon(skuId, userId); } + + @ApiOperation("获取购物车对应规则数据") + @PostMapping("inner/findCartActivityList") + List findCartActivityList(@RequestBody List cartInfoList) { + return activityInfoService.findCartActivityList(cartInfoList); + } + + @ApiOperation("获取购物车对应优惠券数据") + @PostMapping("inner/findRangeSkuIdList") + CouponInfo findRangeSkuIdList(@RequestBody List cartInfoList, @PathVariable("couponId") Long couponId) { + return couponInfoService.findRangeSkuIdList(cartInfoList, couponId); + } + + @ApiOperation(value = "更新优惠卷使用状态") + @GetMapping("inner/updateCouponInfoUseStatus/{couponId}/{userId}/{orderId}") + public Boolean updateCouponInfoUseStatus(@PathVariable("couponId") Long couponId, + @PathVariable("userId") Long userId, + @PathVariable("orderId") Long orderId) { + couponInfoService.updateCouponInfoUseStatus(couponId, userId, orderId); + return true; + } } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/ActivityInfoMapper.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/ActivityInfoMapper.java index f3b630f..7acf362 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/ActivityInfoMapper.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/ActivityInfoMapper.java @@ -2,6 +2,7 @@ package com.atguigu.ssyx.activity.mapper; import com.atguigu.ssyx.model.activity.ActivityInfo; import com.atguigu.ssyx.model.activity.ActivityRule; +import com.atguigu.ssyx.model.activity.ActivitySku; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import feign.Param; import org.springframework.stereotype.Repository; @@ -33,5 +34,13 @@ public interface ActivityInfoMapper extends BaseMapper { * @param skuId * @return */ - List findActivityRule(Long skuId); + List findActivityRule(@Param("skuId") Long skuId); + + /** + * 根据所有skuId列表获取参与活动 + * + * @param skuIdList + * @return + */ + List selectCartActivity(@Param("skuIdList") List skuIdList); } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponInfoMapper.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponInfoMapper.java index 7bd5e7b..3cace09 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponInfoMapper.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponInfoMapper.java @@ -26,4 +26,12 @@ public interface CouponInfoMapper extends BaseMapper { */ List selectCouponInfoList( @Param("skuId") Long id, @Param("categoryId") Long categoryId, @Param("userId") Long userId); + + /** + * 根据userId获取用户全部优惠卷 + * + * @param userId + * @return + */ + List selectCartCouponInfoList(@Param("userId") Long userId); } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponUseMapper.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponUseMapper.java index f0c0865..a807af4 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponUseMapper.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/mapper/CouponUseMapper.java @@ -2,6 +2,7 @@ package com.atguigu.ssyx.activity.mapper; import com.atguigu.ssyx.model.activity.CouponUse; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; /** *

@@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @author atguigu * @since 2023-09-17 */ +@Repository public interface CouponUseMapper extends BaseMapper { } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/ActivityInfoService.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/ActivityInfoService.java index f424299..0cb7f92 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/ActivityInfoService.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/ActivityInfoService.java @@ -2,8 +2,11 @@ package com.atguigu.ssyx.activity.service; import com.atguigu.ssyx.model.activity.ActivityInfo; +import com.atguigu.ssyx.model.order.CartInfo; import com.atguigu.ssyx.model.product.SkuInfo; import com.atguigu.ssyx.vo.activity.ActivityRuleVo; +import com.atguigu.ssyx.vo.order.CartInfoVo; +import com.atguigu.ssyx.vo.order.OrderConfirmVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -69,4 +72,21 @@ public interface ActivityInfoService extends IService { * @return */ Map findActivityAndCoupon(Long skuId, Long userId); + + /** + * 获取购物车中满足条件优惠券和活动 + * + * @param cartInfoList + * @param userId + * @return + */ + OrderConfirmVo findCartActivityAndCoupon(List cartInfoList, Long userId); + + /** + * 获取购物车对应规则数据 + * + * @param cartInfoList + * @return + */ + List findCartActivityList(List cartInfoList); } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/CouponInfoService.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/CouponInfoService.java index 4573e02..6e053d8 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/CouponInfoService.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/CouponInfoService.java @@ -1,6 +1,7 @@ package com.atguigu.ssyx.activity.service; import com.atguigu.ssyx.model.activity.CouponInfo; +import com.atguigu.ssyx.model.order.CartInfo; import com.atguigu.ssyx.vo.activity.CouponRuleVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -68,4 +69,31 @@ public interface CouponInfoService extends IService { */ List findCouponInfoList(Long skuId, Long userId); + + /** + * 获取购物车可以使用优惠卷列表 + * + * @param cartInfoList + * @param userId + * @return + */ + List findCartCouponInfo(List cartInfoList, Long userId); + + /** + * 获取购物车对应优惠券数据 + * + * @param cartInfoList + * @param couponId + * @return + */ + CouponInfo findRangeSkuIdList(List cartInfoList, Long couponId); + + /** + * 更新优惠卷使用状态 + * + * @param couponId + * @param userId + * @param orderId + */ + void updateCouponInfoUseStatus(Long couponId, Long userId, Long orderId); } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/ActivityInfoServiceImpl.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/ActivityInfoServiceImpl.java index 4d158e8..f257e0f 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/ActivityInfoServiceImpl.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/ActivityInfoServiceImpl.java @@ -11,8 +11,11 @@ import com.atguigu.ssyx.model.activity.ActivityInfo; import com.atguigu.ssyx.model.activity.ActivityRule; import com.atguigu.ssyx.model.activity.ActivitySku; import com.atguigu.ssyx.model.activity.CouponInfo; +import com.atguigu.ssyx.model.order.CartInfo; import com.atguigu.ssyx.model.product.SkuInfo; import com.atguigu.ssyx.vo.activity.ActivityRuleVo; +import com.atguigu.ssyx.vo.order.CartInfoVo; +import com.atguigu.ssyx.vo.order.OrderConfirmVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -23,10 +26,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.math.BigDecimal; +import java.util.*; import java.util.stream.Collectors; /** @@ -245,6 +246,265 @@ public class ActivityInfoServiceImpl extends ServiceImpl cartInfoList, Long userId) { + //1 获取购物车,每个购物项参与活动,根据活动规则分组, + //一个规则对应多个商品 + List cartInfoVoList = this.findCartActivityList(cartInfoList); + + //2 计算参与活动之后金额 + BigDecimal activityReduceAmount = cartInfoVoList.stream() + .filter(cartInfoVo -> cartInfoVo.getActivityRule() != null) + .map(cartInfoVo -> cartInfoVo.getActivityRule() + .getReduceAmount()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + //3 获取购物车可以使用优惠卷列表 + List couponInfoList = couponInfoService.findCartCouponInfo(cartInfoList, userId); + + //4 计算商品使用优惠卷之后金额,一次只能使用一张优惠卷 + BigDecimal couponReduceAmount = new BigDecimal(0); + if (!CollectionUtils.isEmpty(couponInfoList)) { + couponReduceAmount = couponInfoList.stream() + .filter(couponInfo -> couponInfo.getIsOptimal() + .intValue() == 1) + .map(couponInfo -> couponInfo.getAmount()) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + //5 计算没有参与活动,没有使用优惠卷原始金额 + BigDecimal originalTotalAmount = cartInfoList.stream() + .filter(cartInfo -> cartInfo.getIsChecked() == 1) + .map(cartInfo -> cartInfo.getCartPrice() + .multiply(new BigDecimal(cartInfo.getSkuNum()))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + //6 最终金额 + BigDecimal totalAmount = originalTotalAmount.subtract(activityReduceAmount) + .subtract(couponReduceAmount); + + //7 封装需要数据到OrderConfirmVo,返回 + OrderConfirmVo orderTradeVo = new OrderConfirmVo(); + orderTradeVo.setCarInfoVoList(cartInfoVoList); + orderTradeVo.setActivityReduceAmount(activityReduceAmount); + orderTradeVo.setCouponInfoList(couponInfoList); + orderTradeVo.setCouponReduceAmount(couponReduceAmount); + orderTradeVo.setOriginalTotalAmount(originalTotalAmount); + orderTradeVo.setTotalAmount(totalAmount); + return orderTradeVo; + } + + /** + * 获取购物车对应规则数据 + * + * @param cartInfoList + * @return + */ + @Override + public List findCartActivityList(List cartInfoList) { + //创建最终返回集合 + List cartInfoVoList = new ArrayList<>(); + //获取所有skuId + List skuIdList = cartInfoList.stream() + .map(CartInfo::getSkuId) + .collect(Collectors.toList()); + //根据所有skuId列表获取参与活动 + List activitySkuList = baseMapper.selectCartActivity(skuIdList); + //根据活动进行分组,每个活动里面有哪些skuId信息 + //map里面key是分组字段 活动id + // value是每组里面sku列表数据,set集合 + Map> activityIdToSkuIdListMap = activitySkuList.stream() + .collect(Collectors.groupingBy(ActivitySku::getActivityId, Collectors.mapping(ActivitySku::getSkuId, Collectors.toSet()))); + + //获取活动里面规则数据 + //key是活动id value是活动里面规则列表数据 + Map> activityIdToActivityRuleListMap = new HashMap<>(); + //所有活动id + Set activityIdSet = activitySkuList.stream() + .map(ActivitySku::getActivityId) + .collect(Collectors.toSet()); + if (!CollectionUtils.isEmpty(activityIdSet)) { + //activity_rule表 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.orderByDesc(ActivityRule::getConditionAmount, ActivityRule::getConditionNum); + wrapper.in(ActivityRule::getActivityId, activityIdSet); + List activityRuleList = activityRuleMapper.selectList(wrapper); + + //封装到activityIdToActivityRuleListMap里面 + //根据活动id进行分组 + activityIdToActivityRuleListMap = activityRuleList.stream() + .collect(Collectors.groupingBy(activityRule -> activityRule.getActivityId())); + } + + //有活动的购物项skuId + Set activitySkuIdSet = new HashSet<>(); + if (!CollectionUtils.isEmpty(activityIdToSkuIdListMap)) { + //遍历activityIdToSkuIdListMap集合 + Iterator>> iterator = activityIdToSkuIdListMap.entrySet() + .iterator(); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + //活动id + Long activityId = entry.getKey(); + //每个活动对应skuId列表 + Set currentActivitySkuIdSet = entry.getValue(); + //获取当前活动对应的购物项列表 + List currentActivityCartInfoList = cartInfoList.stream() + .filter(cartInfo -> currentActivitySkuIdSet.contains(cartInfo.getSkuId())) + .collect(Collectors.toList()); + //计数购物项总金额和总数量 + BigDecimal activityTotalAmount = this.computeTotalAmount(currentActivityCartInfoList); + int activityTotalNum = this.computeCartNum(currentActivityCartInfoList); + + //计算活动对应规则 + //根据activityId获取活动对应规则 + List currentActivityRuleList = activityIdToActivityRuleListMap.get(activityId); + ActivityType activityType = currentActivityRuleList.get(0) + .getActivityType(); + //判断活动类型:满减和打折 + ActivityRule activityRule = null; + if (activityType == ActivityType.FULL_REDUCTION) {//满减" + activityRule = this.computeFullReduction(activityTotalAmount, currentActivityRuleList); + } else {//满量 + activityRule = this.computeFullDiscount(activityTotalNum, activityTotalAmount, currentActivityRuleList); + } + + //CartInfoVo封装 + CartInfoVo cartInfoVo = new CartInfoVo(); + cartInfoVo.setActivityRule(activityRule); + cartInfoVo.setCartInfoList(currentActivityCartInfoList); + cartInfoVoList.add(cartInfoVo); + + //记录哪些购物项参与活动 + activitySkuIdSet.addAll(currentActivitySkuIdSet); + } + } + + //没有活动购物项skuId + //获取哪些skuId没有参加活动 + skuIdList.removeAll(activitySkuIdSet); + if (!CollectionUtils.isEmpty(skuIdList)) { + //skuId对应购物项 + Map skuIdCartInfoMap = cartInfoList.stream() + .collect(Collectors.toMap(CartInfo::getSkuId, CartInfo -> CartInfo)); + for (Long skuId : skuIdList) { + CartInfoVo cartInfoVo = new CartInfoVo(); + cartInfoVo.setActivityRule(null);//没有活动 + + List cartInfos = new ArrayList<>(); + cartInfos.add(skuIdCartInfoMap.get(skuId)); + cartInfoVo.setCartInfoList(cartInfos); + + cartInfoVoList.add(cartInfoVo); + } + } + + return cartInfoVoList; + } + + /** + * 计算满量打折最优规则 + * 该活动规则skuActivityRuleList数据,已经按照优惠折扣从大到小排序了 + * + * @param totalNum + * @param activityRuleList + */ + private ActivityRule computeFullDiscount(Integer totalNum, BigDecimal totalAmount, List activityRuleList) { + ActivityRule optimalActivityRule = null; + //该活动规则skuActivityRuleList数据,已经按照优惠金额从大到小排序了 + for (ActivityRule activityRule : activityRuleList) { + //如果订单项购买个数大于等于满减件数,则优化打折 + if (totalNum.intValue() >= activityRule.getConditionNum()) { + BigDecimal skuDiscountTotalAmount = totalAmount.multiply(activityRule.getBenefitDiscount() + .divide(new BigDecimal("10"))); + BigDecimal reduceAmount = totalAmount.subtract(skuDiscountTotalAmount); + activityRule.setReduceAmount(reduceAmount); + optimalActivityRule = activityRule; + break; + } + } + if (null == optimalActivityRule) { + //如果没有满足条件的取最小满足条件的一项 + optimalActivityRule = activityRuleList.get(activityRuleList.size() - 1); + optimalActivityRule.setReduceAmount(new BigDecimal("0")); + optimalActivityRule.setSelectType(1); + + String ruleDesc = "满" + + optimalActivityRule.getConditionNum() + + "元打" + + optimalActivityRule.getBenefitDiscount() + + "折,还差" + + (totalNum - optimalActivityRule.getConditionNum()) + + "件"; + optimalActivityRule.setRuleDesc(ruleDesc); + } else { + String ruleDesc = "满" + + optimalActivityRule.getConditionNum() + + "元打" + + optimalActivityRule.getBenefitDiscount() + + "折,已减" + + optimalActivityRule.getReduceAmount() + + "元"; + optimalActivityRule.setRuleDesc(ruleDesc); + optimalActivityRule.setSelectType(2); + } + return optimalActivityRule; + } + + /** + * 计算满减最优规则 + * 该活动规则skuActivityRuleList数据,已经按照优惠金额从大到小排序了 + * + * @param totalAmount + * @param activityRuleList + */ + private ActivityRule computeFullReduction(BigDecimal totalAmount, List activityRuleList) { + ActivityRule optimalActivityRule = null; + //该活动规则skuActivityRuleList数据,已经按照优惠金额从大到小排序了 + for (ActivityRule activityRule : activityRuleList) { + //如果订单项金额大于等于满减金额,则优惠金额 + if (totalAmount.compareTo(activityRule.getConditionAmount()) > -1) { + //优惠后减少金额 + activityRule.setReduceAmount(activityRule.getBenefitAmount()); + optimalActivityRule = activityRule; + break; + } + } + if (null == optimalActivityRule) { + //如果没有满足条件的取最小满足条件的一项 + optimalActivityRule = activityRuleList.get(activityRuleList.size() - 1); + optimalActivityRule.setReduceAmount(new BigDecimal("0")); + optimalActivityRule.setSelectType(1); + + String ruleDesc = "满" + + optimalActivityRule.getConditionAmount() + + "元减" + + optimalActivityRule.getBenefitAmount() + + "元,还差" + + totalAmount.subtract(optimalActivityRule.getConditionAmount()) + + "元"; + optimalActivityRule.setRuleDesc(ruleDesc); + } else { + String ruleDesc = "满" + + optimalActivityRule.getConditionAmount() + + "元减" + + optimalActivityRule.getBenefitAmount() + + "元,已减" + + optimalActivityRule.getReduceAmount() + + "元"; + optimalActivityRule.setRuleDesc(ruleDesc); + optimalActivityRule.setSelectType(2); + } + return optimalActivityRule; + } + //根据skuId获取活动规则数据 public List findActivityRuleBySkuId(Long skuId) { List activityRuleList = baseMapper.findActivityRule(skuId); @@ -255,4 +515,32 @@ public class ActivityInfoServiceImpl extends ServiceImpl cartInfoList) { + BigDecimal total = new BigDecimal("0"); + for (CartInfo cartInfo : cartInfoList) { + //是否选中 + if (cartInfo.getIsChecked() + .intValue() == 1) { + BigDecimal itemTotal = cartInfo.getCartPrice() + .multiply(new BigDecimal(cartInfo.getSkuNum())); + total = total.add(itemTotal); + } + } + return total; + } + + //计算购物车中总数量 + private int computeCartNum(List cartInfoList) { + int total = 0; + for (CartInfo cartInfo : cartInfoList) { + //是否选中 + if (cartInfo.getIsChecked() + .intValue() == 1) { + total += cartInfo.getSkuNum(); + } + } + return total; + } } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/CouponInfoServiceImpl.java b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/CouponInfoServiceImpl.java index 1877179..a838f67 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/CouponInfoServiceImpl.java +++ b/guigu-ssyx-parent/service/service-activity/src/main/java/com/atguigu/ssyx/activity/service/impl/CouponInfoServiceImpl.java @@ -2,11 +2,16 @@ package com.atguigu.ssyx.activity.service.impl; import com.atguigu.ssyx.activity.mapper.CouponInfoMapper; import com.atguigu.ssyx.activity.mapper.CouponRangeMapper; +import com.atguigu.ssyx.activity.mapper.CouponUseMapper; import com.atguigu.ssyx.activity.service.CouponInfoService; import com.atguigu.ssyx.client.product.ProductFeignClient; import com.atguigu.ssyx.enums.CouponRangeType; +import com.atguigu.ssyx.enums.CouponStatus; import com.atguigu.ssyx.model.activity.CouponInfo; import com.atguigu.ssyx.model.activity.CouponRange; +import com.atguigu.ssyx.model.activity.CouponUse; +import com.atguigu.ssyx.model.base.BaseEntity; +import com.atguigu.ssyx.model.order.CartInfo; import com.atguigu.ssyx.model.product.Category; import com.atguigu.ssyx.model.product.SkuInfo; import com.atguigu.ssyx.vo.activity.CouponRuleVo; @@ -18,9 +23,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.math.BigDecimal; +import java.util.*; import java.util.stream.Collectors; /** @@ -34,12 +38,12 @@ import java.util.stream.Collectors; @Service public class CouponInfoServiceImpl extends ServiceImpl implements CouponInfoService { - @Autowired CouponRangeMapper couponRangeMapper; - @Autowired ProductFeignClient productFeignClient; + @Autowired + private CouponUseMapper couponUseMapper; /** * 获取分页列表 @@ -55,7 +59,7 @@ public class CouponInfoServiceImpl extends ServiceImpl couponInfoList = couponInfoPage.getRecords(); couponInfoList.forEach(item -> { item.setCouponTypeString(item.getCouponType() - .getComment()); + .getComment()); CouponRangeType rangeType = item.getRangeType(); if (rangeType != null) { item.setRangeTypeString(rangeType.getComment()); @@ -74,10 +78,10 @@ public class CouponInfoServiceImpl extends ServiceImpl randIdList = couponRangeList.stream() - .map(CouponRange::getRangeId) - .collect(Collectors.toList()); + .map(CouponRange::getRangeId) + .collect(Collectors.toList()); Map result = new HashMap<>(); //第三步 分别判断封装不同数据 @@ -172,4 +176,186 @@ public class CouponInfoServiceImpl extends ServiceImpl findCartCouponInfo(List cartInfoList, Long userId) { + //1 根据userId获取用户全部优惠卷 + //coupon_use coupon_info + List userAllCouponInfoList = baseMapper.selectCartCouponInfoList(userId); + if (CollectionUtils.isEmpty(userAllCouponInfoList)) { + return new ArrayList(); + } + + //2 从第一步返回list集合中,获取所有优惠卷id列表 + List couponIdList = userAllCouponInfoList.stream() + .map(BaseEntity::getId) + .collect(Collectors.toList()); + + //3 查询优惠卷对应的范围 coupon_range + //couponRangeList + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + // id in (1,2,3) + wrapper.in(CouponRange::getCouponId, couponIdList); + List couponRangeList = couponRangeMapper.selectList(wrapper); + + //4 获取优惠卷id 对应skuId列表 + //优惠卷id进行分组,得到map集合 + // Map> + Map> couponIdToSkuIdMap = this.findCouponIdToSkuIdMap(cartInfoList, couponRangeList); + + //5 遍历全部优惠卷集合,判断优惠卷类型 + //全场通用 sku和分类 + BigDecimal reduceAmount = new BigDecimal(0); + CouponInfo optimalCouponInfo = null; + for (CouponInfo couponInfo : userAllCouponInfoList) { + //全场通用 + if (CouponRangeType.ALL == couponInfo.getRangeType()) { + //全场通用 + //判断是否满足优惠使用门槛 + //计算购物车商品的总价 + BigDecimal totalAmount = computeTotalAmount(cartInfoList); + if (totalAmount.subtract(couponInfo.getConditionAmount()) + .doubleValue() >= 0) { + couponInfo.setIsSelect(1); + } + } else { + //优惠卷id获取对应skuId列表 + List skuIdList = couponIdToSkuIdMap.get(couponInfo.getId()); + //满足使用范围购物项 + List currentCartInfoList = cartInfoList.stream() + .filter(cartInfo -> skuIdList.contains(cartInfo.getSkuId())) + .collect(Collectors.toList()); + BigDecimal totalAmount = computeTotalAmount(currentCartInfoList); + if (totalAmount.subtract(couponInfo.getConditionAmount()) + .doubleValue() >= 0) { + couponInfo.setIsSelect(1); + } + } + if (couponInfo.getIsSelect() + .intValue() == 1 && couponInfo.getAmount() + .subtract(reduceAmount) + .doubleValue() > 0) { + reduceAmount = couponInfo.getAmount(); + optimalCouponInfo = couponInfo; + } + + } + //6 返回List + if (null != optimalCouponInfo) { + optimalCouponInfo.setIsOptimal(1); + } + return userAllCouponInfoList; + } + + /** + * 获取购物车对应优惠券数据 + * + * @param cartInfoList + * @param couponId + * @return + */ + @Override + public CouponInfo findRangeSkuIdList(List cartInfoList, Long couponId) { + //根据优惠卷id基本信息查询 + CouponInfo couponInfo = baseMapper.selectById(couponId); + if (couponInfo == null) { + return null; + } + //根据couponId查询对应CouponRange数据 + List couponRangeList = couponRangeMapper.selectList(new LambdaQueryWrapper().eq(CouponRange::getCouponId, couponId)); + //对应sku信息 + Map> couponIdToSkuIdMap = this.findCouponIdToSkuIdMap(cartInfoList, couponRangeList); + //遍历map,得到value值,封装到couponInfo对象 + List skuIdList = couponIdToSkuIdMap.entrySet() + .iterator() + .next() + .getValue(); + couponInfo.setSkuIdList(skuIdList); + return couponInfo; + } + + /** + * 更新优惠卷使用状态 + * + * @param couponId + * @param userId + * @param orderId + */ + @Override + public void updateCouponInfoUseStatus(Long couponId, Long userId, Long orderId) { + //根据couponId查询优惠卷信息 + CouponUse couponUse = couponUseMapper.selectOne( + new LambdaQueryWrapper() + .eq(CouponUse::getCouponId, couponId) + .eq(CouponUse::getUserId, userId) + .eq(CouponUse::getOrderId, orderId) + ); + + //设置修改值 + couponUse.setCouponStatus(CouponStatus.USED); + + //调用方法修改 + couponUseMapper.updateById(couponUse); + } + + //获取优惠卷id 对应skuId列表 + private Map> findCouponIdToSkuIdMap(List cartInfoList, List couponRangeList) { + Map> couponIdToSkuIdMap = new HashMap<>(); + + //couponRangeList数据处理,根据优惠卷id分组 + Map> couponRangeToRangeListMap = couponRangeList.stream() + .collect(Collectors.groupingBy(CouponRange::getCouponId)); + + //遍历map集合 + Iterator>> iterator = couponRangeToRangeListMap.entrySet() + .iterator(); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + Long couponId = entry.getKey(); + List rangeList = entry.getValue(); + + //创建集合 set + Set skuIdSet = new HashSet<>(); + for (CartInfo cartInfo : cartInfoList) { + for (CouponRange couponRange : rangeList) { + //判断 + if (couponRange.getRangeType() == CouponRangeType.SKU && couponRange.getRangeId() + .longValue() == cartInfo.getSkuId() + .longValue()) { + skuIdSet.add(cartInfo.getSkuId()); + } else if (couponRange.getRangeType() == CouponRangeType.CATEGORY && couponRange.getRangeId() + .longValue() == cartInfo.getCategoryId() + .longValue()) { + skuIdSet.add(cartInfo.getSkuId()); + } else { + + } + } + } + couponIdToSkuIdMap.put(couponId, new ArrayList<>(skuIdSet)); + } + return couponIdToSkuIdMap; + } + + //计算购物车商品的总价 + private BigDecimal computeTotalAmount(List cartInfoList) { + BigDecimal total = new BigDecimal("0"); + for (CartInfo cartInfo : cartInfoList) { + //是否选中 + if (cartInfo.getIsChecked() + .intValue() == 1) { + BigDecimal itemTotal = cartInfo.getCartPrice() + .multiply(new BigDecimal(cartInfo.getSkuNum())); + total = total.add(itemTotal); + } + } + return total; + } } diff --git a/guigu-ssyx-parent/service/service-activity/src/main/resources/application-dev.yml b/guigu-ssyx-parent/service/service-activity/src/main/resources/application-dev.yml index efd324e..95bf3f1 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/resources/application-dev.yml +++ b/guigu-ssyx-parent/service/service-activity/src/main/resources/application-dev.yml @@ -13,6 +13,18 @@ spring: url: jdbc:mysql://82.157.68.223:3306/shequ-activity?characterEncoding=utf-8&useSSL=false username: shequ-activity password: shequ-activity + redis: + host: 82.157.68.223 + port: 6379 + database: 0 + timeout: 1800000 + password: + lettuce: + pool: + max-active: 20 #最大连接数 + max-wait: -1 #最大阻塞等待时间(负数表示没限制) + max-idle: 5 #最大空闲 + min-idle: 0 #最小空闲 jackson: date-format: yyyy-MM-dd HH:mm:ss diff --git a/guigu-ssyx-parent/service/service-activity/src/main/resources/mapper/ActivityInfoMapper.xml b/guigu-ssyx-parent/service/service-activity/src/main/resources/mapper/ActivityInfoMapper.xml index c1e351e..fd9bdb3 100644 --- a/guigu-ssyx-parent/service/service-activity/src/main/resources/mapper/ActivityInfoMapper.xml +++ b/guigu-ssyx-parent/service/service-activity/src/main/resources/mapper/ActivityInfoMapper.xml @@ -21,41 +21,6 @@ and now() between info.start_time and info.end_time - - - - + select id, + category_id, + sku_type, + sku_name, + img_url, + per_limit, + publish_status, + check_status, + is_new_person, + sort, + sku_code, + price, + market_price, + stock, + lock_stock, + low_stock, + sale, + ware_id, + create_time, + update_time, + is_deleted + from sku_info + where id = #{skuId} + and stock - lock_stock > #{skuNum} for + update + + + + + update sku_info + set lock_stock = lock_stock + #{skuNum} + where id = #{skuId} + + + + + update sku_info + set lock_stock = lock_stock - #{skuNum} + where id = #{skuId} + + + + + update sku_info + set stock = stock - #{skuNum}, + lock_stock = lock_stock - #{skuNum}, + sale = sale + #{skuNum} + where id = #{skuId} + + diff --git a/guigu-ssyx-parent/service/service-product/src/main/resources/application-dev.yml b/guigu-ssyx-parent/service/service-product/src/main/resources/application-dev.yml index ea7670f..eced426 100644 --- a/guigu-ssyx-parent/service/service-product/src/main/resources/application-dev.yml +++ b/guigu-ssyx-parent/service/service-product/src/main/resources/application-dev.yml @@ -24,7 +24,18 @@ spring: prefetch: 1 concurrency: 3 acknowledge-mode: manual #消费端手动确认 - + redis: + host: 82.157.68.223 + port: 6379 + database: 0 + timeout: 1800000 + password: + lettuce: + pool: + max-active: 20 #最大连接数 + max-wait: -1 #最大阻塞等待时间(负数表示没限制) + max-idle: 5 #最大空闲 + min-idle: 0 #最小空闲 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 diff --git a/guigu-ssyx-parent/service/service-sys/src/main/resources/application-dev.yml b/guigu-ssyx-parent/service/service-sys/src/main/resources/application-dev.yml index 15a66c2..817b6d1 100644 --- a/guigu-ssyx-parent/service/service-sys/src/main/resources/application-dev.yml +++ b/guigu-ssyx-parent/service/service-sys/src/main/resources/application-dev.yml @@ -12,7 +12,18 @@ spring: url: jdbc:mysql://82.157.68.223:3306/shequ-sys?characterEncoding=utf-8&useSSL=false username: shequ-sys password: shequ-sys - + redis: + host: 82.157.68.223 + port: 6379 + database: 0 + timeout: 1800000 + password: + lettuce: + pool: + max-active: 20 #最大连接数 + max-wait: -1 #最大阻塞等待时间(负数表示没限制) + max-idle: 5 #最大空闲 + min-idle: 0 #最小空闲 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8