Commit 941782fb1057c2d0ba8324af6dc2cebfad9099ea
1 parent
6d48bd1e
promotion:完善限时折扣的修改逻辑
Showing
8 changed files
with
165 additions
and
51 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/discount/DiscountActivityController.java
| @@ -2,12 +2,10 @@ package cn.iocoder.yudao.module.promotion.controller.admin.discount; | @@ -2,12 +2,10 @@ package cn.iocoder.yudao.module.promotion.controller.admin.discount; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | ||
| 6 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO; | ||
| 7 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityRespVO; | ||
| 8 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; | 5 | +import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.*; |
| 9 | import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert; | 6 | import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert; |
| 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 8 | +import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | ||
| 11 | import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; | 9 | import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; |
| 12 | import io.swagger.annotations.Api; | 10 | import io.swagger.annotations.Api; |
| 13 | import io.swagger.annotations.ApiImplicitParam; | 11 | import io.swagger.annotations.ApiImplicitParam; |
| @@ -18,6 +16,7 @@ import org.springframework.web.bind.annotation.*; | @@ -18,6 +16,7 @@ import org.springframework.web.bind.annotation.*; | ||
| 18 | 16 | ||
| 19 | import javax.annotation.Resource; | 17 | import javax.annotation.Resource; |
| 20 | import javax.validation.Valid; | 18 | import javax.validation.Valid; |
| 19 | +import java.util.List; | ||
| 21 | 20 | ||
| 22 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 23 | 22 | ||
| @@ -67,9 +66,14 @@ public class DiscountActivityController { | @@ -67,9 +66,14 @@ public class DiscountActivityController { | ||
| 67 | @ApiOperation("获得限时折扣活动") | 66 | @ApiOperation("获得限时折扣活动") |
| 68 | @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) | 67 | @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) |
| 69 | @PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')") | 68 | @PreAuthorize("@ss.hasPermission('promotion:discount-activity:query')") |
| 70 | - public CommonResult<DiscountActivityRespVO> getDiscountActivity(@RequestParam("id") Long id) { | 69 | + public CommonResult<DiscountActivityDetailRespVO> getDiscountActivity(@RequestParam("id") Long id) { |
| 71 | DiscountActivityDO discountActivity = discountActivityService.getDiscountActivity(id); | 70 | DiscountActivityDO discountActivity = discountActivityService.getDiscountActivity(id); |
| 72 | - return success(DiscountActivityConvert.INSTANCE.convert(discountActivity)); | 71 | + if (discountActivity == null) { |
| 72 | + return success(null); | ||
| 73 | + } | ||
| 74 | + // 拼接结果 | ||
| 75 | + List<DiscountProductDO> discountProducts = discountActivityService.getDiscountProductsByActivityId(id); | ||
| 76 | + return success(DiscountActivityConvert.INSTANCE.convert(discountActivity, discountProducts)); | ||
| 73 | } | 77 | } |
| 74 | 78 | ||
| 75 | @GetMapping("/page") | 79 | @GetMapping("/page") |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/discount/vo/DiscountActivityDetailRespVO.java
0 → 100755
| 1 | +package cn.iocoder.yudao.module.promotion.controller.admin.discount.vo; | ||
| 2 | + | ||
| 3 | +import io.swagger.annotations.ApiModel; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.EqualsAndHashCode; | ||
| 6 | +import lombok.ToString; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +@ApiModel("管理后台 - 限时折扣活动的详细 Response VO") | ||
| 11 | +@Data | ||
| 12 | +@EqualsAndHashCode(callSuper = true) | ||
| 13 | +@ToString(callSuper = true) | ||
| 14 | +public class DiscountActivityDetailRespVO extends DiscountActivityRespVO { | ||
| 15 | + | ||
| 16 | + /** | ||
| 17 | + * 商品列表 | ||
| 18 | + */ | ||
| 19 | + private List<Product> products; | ||
| 20 | + | ||
| 21 | +} |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/discount/DiscountActivityConvert.java
| 1 | package cn.iocoder.yudao.module.promotion.convert.discount; | 1 | package cn.iocoder.yudao.module.promotion.convert.discount; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.ObjectUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 5 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 6 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 6 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO; | ||
| 7 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityRespVO; | ||
| 9 | -import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO; | 7 | +import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.*; |
| 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; | 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 10 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | ||
| 12 | import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO; | 11 | import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO; |
| 13 | import org.mapstruct.Mapper; | 12 | import org.mapstruct.Mapper; |
| 14 | import org.mapstruct.factory.Mappers; | 13 | import org.mapstruct.factory.Mappers; |
| @@ -50,4 +49,54 @@ public interface DiscountActivityConvert { | @@ -50,4 +49,54 @@ public interface DiscountActivityConvert { | ||
| 50 | 49 | ||
| 51 | DiscountProductDO convert(DiscountActivityBaseVO.Product bean); | 50 | DiscountProductDO convert(DiscountActivityBaseVO.Product bean); |
| 52 | 51 | ||
| 52 | + DiscountActivityDetailRespVO convert(DiscountActivityDO activity, List<DiscountProductDO> products); | ||
| 53 | + | ||
| 54 | + // =========== 比较是否相等 ========== | ||
| 55 | + /** | ||
| 56 | + * 比较两个限时折扣商品是否相等 | ||
| 57 | + * | ||
| 58 | + * @param productDO 数据库中的商品 | ||
| 59 | + * @param productVO 前端传入的商品 | ||
| 60 | + * @return 是否匹配 | ||
| 61 | + */ | ||
| 62 | + @SuppressWarnings("DuplicatedCode") | ||
| 63 | + default boolean isEquals(DiscountProductDO productDO, DiscountActivityBaseVO.Product productVO) { | ||
| 64 | + if (ObjectUtil.notEqual(productDO.getSpuId(), productVO.getSpuId()) | ||
| 65 | + || ObjectUtil.notEqual(productDO.getSkuId(), productVO.getSkuId()) | ||
| 66 | + || ObjectUtil.notEqual(productDO.getDiscountType(), productVO.getDiscountType())) { | ||
| 67 | + return false; | ||
| 68 | + } | ||
| 69 | + if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PRICE.getType())) { | ||
| 70 | + return ObjectUtil.equal(productDO.getDiscountPrice(), productVO.getDiscountPrice()); | ||
| 71 | + } | ||
| 72 | + if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PERCENT.getType())) { | ||
| 73 | + return ObjectUtil.equal(productDO.getDiscountPercent(), productVO.getDiscountPercent()); | ||
| 74 | + } | ||
| 75 | + return true; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + /** | ||
| 79 | + * 比较两个限时折扣商品是否相等 | ||
| 80 | + * 注意,比较时忽略 id 编号 | ||
| 81 | + * | ||
| 82 | + * @param productDO 商品 1 | ||
| 83 | + * @param productVO 商品 2 | ||
| 84 | + * @return 是否匹配 | ||
| 85 | + */ | ||
| 86 | + @SuppressWarnings("DuplicatedCode") | ||
| 87 | + default boolean isEquals(DiscountProductDO productDO, DiscountProductDO productVO) { | ||
| 88 | + if (ObjectUtil.notEqual(productDO.getSpuId(), productVO.getSpuId()) | ||
| 89 | + || ObjectUtil.notEqual(productDO.getSkuId(), productVO.getSkuId()) | ||
| 90 | + || ObjectUtil.notEqual(productDO.getDiscountType(), productVO.getDiscountType())) { | ||
| 91 | + return false; | ||
| 92 | + } | ||
| 93 | + if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PRICE.getType())) { | ||
| 94 | + return ObjectUtil.equal(productDO.getDiscountPrice(), productVO.getDiscountPrice()); | ||
| 95 | + } | ||
| 96 | + if (productDO.getDiscountType().equals(PromotionDiscountTypeEnum.PERCENT.getType())) { | ||
| 97 | + return ObjectUtil.equal(productDO.getDiscountPercent(), productVO.getDiscountPercent()); | ||
| 98 | + } | ||
| 99 | + return true; | ||
| 100 | + } | ||
| 101 | + | ||
| 53 | } | 102 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityService.java
| @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProduct | @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProduct | ||
| 9 | 9 | ||
| 10 | import javax.validation.Valid; | 10 | import javax.validation.Valid; |
| 11 | import java.util.Collection; | 11 | import java.util.Collection; |
| 12 | +import java.util.List; | ||
| 12 | import java.util.Map; | 13 | import java.util.Map; |
| 13 | 14 | ||
| 14 | /** | 15 | /** |
| @@ -73,4 +74,12 @@ public interface DiscountActivityService { | @@ -73,4 +74,12 @@ public interface DiscountActivityService { | ||
| 73 | */ | 74 | */ |
| 74 | PageResult<DiscountActivityDO> getDiscountActivityPage(DiscountActivityPageReqVO pageReqVO); | 75 | PageResult<DiscountActivityDO> getDiscountActivityPage(DiscountActivityPageReqVO pageReqVO); |
| 75 | 76 | ||
| 77 | + /** | ||
| 78 | + * 获得活动编号,对应对应的商品列表 | ||
| 79 | + * | ||
| 80 | + * @param activityId 活动编号 | ||
| 81 | + * @return 活动的商品列表 | ||
| 82 | + */ | ||
| 83 | + List<DiscountProductDO> getDiscountProductsByActivityId(Long activityId); | ||
| 84 | + | ||
| 76 | } | 85 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImpl.java
| @@ -91,8 +91,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -91,8 +91,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 91 | // 计算要删除的记录 | 91 | // 计算要删除的记录 |
| 92 | List<Long> deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId, | 92 | List<Long> deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId, |
| 93 | discountProductDO -> updateReqVO.getProducts().stream() | 93 | discountProductDO -> updateReqVO.getProducts().stream() |
| 94 | - .noneMatch(product -> product.getSkuId().equals(discountProductDO.getSkuId()) | ||
| 95 | - && product.getDiscountPrice().equals(discountProductDO.getDiscountPrice()))); | 94 | + .noneMatch(product -> DiscountActivityConvert.INSTANCE.isEquals(discountProductDO, product))); |
| 96 | if (CollUtil.isNotEmpty(deleteIds)) { | 95 | if (CollUtil.isNotEmpty(deleteIds)) { |
| 97 | discountProductMapper.deleteBatchIds(deleteIds); | 96 | discountProductMapper.deleteBatchIds(deleteIds); |
| 98 | } | 97 | } |
| @@ -100,8 +99,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -100,8 +99,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 100 | List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(), | 99 | List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(), |
| 101 | product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId())); | 100 | product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId())); |
| 102 | newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch( | 101 | newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch( |
| 103 | - dbProduct -> dbProduct.getSkuId().equals(product.getSkuId()) | ||
| 104 | - && dbProduct.getDiscountPrice().equals(product.getDiscountPrice()))); // 如果匹配到,说明是更新的 | 102 | + dbProduct -> DiscountActivityConvert.INSTANCE.isEquals(dbProduct, product))); // 如果匹配到,说明是更新的 |
| 105 | if (CollectionUtil.isNotEmpty(newDiscountProducts)) { | 103 | if (CollectionUtil.isNotEmpty(newDiscountProducts)) { |
| 106 | discountProductMapper.insertBatch(newDiscountProducts); | 104 | discountProductMapper.insertBatch(newDiscountProducts); |
| 107 | } | 105 | } |
| @@ -194,4 +192,9 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | @@ -194,4 +192,9 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { | ||
| 194 | return discountActivityMapper.selectPage(pageReqVO); | 192 | return discountActivityMapper.selectPage(pageReqVO); |
| 195 | } | 193 | } |
| 196 | 194 | ||
| 195 | + @Override | ||
| 196 | + public List<DiscountProductDO> getDiscountProductsByActivityId(Long activityId) { | ||
| 197 | + return discountProductMapper.selectListByActivityId(activityId); | ||
| 198 | + } | ||
| 199 | + | ||
| 197 | } | 200 | } |
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImplTest.java
| @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProduct | @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProduct | ||
| 11 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper; | 11 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper; |
| 12 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper; | 12 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper; |
| 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; |
| 14 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | ||
| 14 | import org.junit.jupiter.api.Test; | 15 | import org.junit.jupiter.api.Test; |
| 15 | import org.springframework.context.annotation.Import; | 16 | import org.springframework.context.annotation.Import; |
| 16 | 17 | ||
| @@ -53,8 +54,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | @@ -53,8 +54,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | ||
| 53 | // 用于触发进行中的状态 | 54 | // 用于触发进行中的状态 |
| 54 | o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); | 55 | o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); |
| 55 | // 设置商品 | 56 | // 设置商品 |
| 56 | - o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L).setDiscountPrice(3), | ||
| 57 | - new DiscountActivityBaseVO.Product().setSpuId(10L).setSkuId(20L).setDiscountPrice(30))); | 57 | + o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L) |
| 58 | + .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3), | ||
| 59 | + new DiscountActivityBaseVO.Product().setSpuId(10L).setSkuId(20L) | ||
| 60 | + .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30))); | ||
| 58 | }); | 61 | }); |
| 59 | 62 | ||
| 60 | // 调用 | 63 | // 调用 |
| @@ -74,7 +77,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | @@ -74,7 +77,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | ||
| 74 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); | 77 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); |
| 75 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); | 78 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); |
| 76 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); | 79 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); |
| 80 | + assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); | ||
| 77 | assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); | 81 | assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); |
| 82 | + assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent()); | ||
| 78 | } | 83 | } |
| 79 | } | 84 | } |
| 80 | 85 | ||
| @@ -85,9 +90,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | @@ -85,9 +90,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | ||
| 85 | discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 | 90 | discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 |
| 86 | // mock 数据(活动) | 91 | // mock 数据(活动) |
| 87 | DiscountProductDO dbDiscountProduct01 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) | 92 | DiscountProductDO dbDiscountProduct01 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) |
| 88 | - .setSpuId(1L).setSkuId(2L)); | 93 | + .setSpuId(1L).setSkuId(2L).setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null)); |
| 89 | DiscountProductDO dbDiscountProduct02 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) | 94 | DiscountProductDO dbDiscountProduct02 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId()) |
| 90 | - .setSpuId(10L).setSkuId(20L)); | 95 | + .setSpuId(10L).setSkuId(20L).setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null)); |
| 91 | discountProductMapper.insert(dbDiscountProduct01); | 96 | discountProductMapper.insert(dbDiscountProduct01); |
| 92 | discountProductMapper.insert(dbDiscountProduct02); | 97 | discountProductMapper.insert(dbDiscountProduct02); |
| 93 | // 准备参数 | 98 | // 准备参数 |
| @@ -96,8 +101,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | @@ -96,8 +101,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | ||
| 96 | // 用于触发进行中的状态 | 101 | // 用于触发进行中的状态 |
| 97 | o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); | 102 | o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); |
| 98 | // 设置商品 | 103 | // 设置商品 |
| 99 | - o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L).setDiscountPrice(3), | ||
| 100 | - new DiscountActivityBaseVO.Product().setSpuId(100L).setSkuId(200L).setDiscountPrice(30))); | 104 | + o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L) |
| 105 | + .setDiscountType(PromotionDiscountTypeEnum.PRICE.getType()).setDiscountPrice(3).setDiscountPercent(null), | ||
| 106 | + new DiscountActivityBaseVO.Product().setSpuId(100L).setSkuId(200L) | ||
| 107 | + .setDiscountType(PromotionDiscountTypeEnum.PERCENT.getType()).setDiscountPercent(30).setDiscountPrice(null))); | ||
| 101 | }); | 108 | }); |
| 102 | 109 | ||
| 103 | // 调用 | 110 | // 调用 |
| @@ -115,7 +122,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | @@ -115,7 +122,9 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { | ||
| 115 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); | 122 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); |
| 116 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); | 123 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); |
| 117 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); | 124 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); |
| 125 | + assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); | ||
| 118 | assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); | 126 | assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice()); |
| 127 | + assertEquals(discountProduct.getDiscountPercent(), product.getDiscountPercent()); | ||
| 119 | } | 128 | } |
| 120 | } | 129 | } |
| 121 | 130 |
yudao-module-mall/yudao-module-promotion-biz/src/test/resources/sql/create_tables.sql
| @@ -112,7 +112,9 @@ CREATE TABLE IF NOT EXISTS "promotion_discount_product" ( | @@ -112,7 +112,9 @@ CREATE TABLE IF NOT EXISTS "promotion_discount_product" ( | ||
| 112 | "activity_id" bigint NOT NULL, | 112 | "activity_id" bigint NOT NULL, |
| 113 | "spu_id" bigint NOT NULL, | 113 | "spu_id" bigint NOT NULL, |
| 114 | "sku_id" bigint NOT NULL, | 114 | "sku_id" bigint NOT NULL, |
| 115 | - "discount_price" int NOT NULL, | 115 | + "discount_type" int NOT NULL, |
| 116 | + "discount_percent" int, | ||
| 117 | + "discount_price" int, | ||
| 116 | "creator" varchar DEFAULT '', | 118 | "creator" varchar DEFAULT '', |
| 117 | "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | 119 | "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| 118 | "updater" varchar DEFAULT '', | 120 | "updater" varchar DEFAULT '', |
yudao-ui-admin/src/views/mall/promotion/discountActivity/index.vue
| @@ -84,8 +84,8 @@ | @@ -84,8 +84,8 @@ | ||
| 84 | </el-form-item> | 84 | </el-form-item> |
| 85 | <el-form-item label="商品选择"> | 85 | <el-form-item label="商品选择"> |
| 86 | <el-select v-model="form.skuIds" placeholder="请选择活动商品" clearable size="small" | 86 | <el-select v-model="form.skuIds" placeholder="请选择活动商品" clearable size="small" |
| 87 | - multiple filterable style="width: 400px" @change="changeFormSku"> | ||
| 88 | - <el-option v-for="item in productSkus" :key="item.id" :label="item.name" :value="item.id"> | 87 | + multiple filterable style="width: 880px" @change="changeFormSku"> |
| 88 | + <el-option v-for="item in productSkus" :key="item.id" :label="item.spuName + ' ' + item.name" :value="item.id"> | ||
| 89 | <span style="float: left">{{ item.spuName }} {{ item.name}}</span> | 89 | <span style="float: left">{{ item.spuName }} {{ item.name}}</span> |
| 90 | <span style="float: right; color: #8492a6; font-size: 13px">¥{{ (item.price / 100.0).toFixed(2) }}</span> | 90 | <span style="float: right; color: #8492a6; font-size: 13px">¥{{ (item.price / 100.0).toFixed(2) }}</span> |
| 91 | </el-option> | 91 | </el-option> |
| @@ -102,7 +102,7 @@ | @@ -102,7 +102,7 @@ | ||
| 102 | </template> | 102 | </template> |
| 103 | </el-table-column> | 103 | </el-table-column> |
| 104 | <el-table-column label="库存" align="center" prop="stock" /> | 104 | <el-table-column label="库存" align="center" prop="stock" /> |
| 105 | - <el-table-column label="优惠类型" align="center"> | 105 | + <el-table-column label="优惠类型" align="center" property="discountType"> |
| 106 | <template slot-scope="scope"> | 106 | <template slot-scope="scope"> |
| 107 | <el-select v-model="scope.row.discountType" placeholder="请选择优惠类型"> | 107 | <el-select v-model="scope.row.discountType" placeholder="请选择优惠类型"> |
| 108 | <el-option v-for="dict in getDictDatas(DICT_TYPE.PROMOTION_DISCOUNT_TYPE)" | 108 | <el-option v-for="dict in getDictDatas(DICT_TYPE.PROMOTION_DISCOUNT_TYPE)" |
| @@ -114,7 +114,7 @@ | @@ -114,7 +114,7 @@ | ||
| 114 | <template slot-scope="scope"> | 114 | <template slot-scope="scope"> |
| 115 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PRICE.type" prop="discountPrice"> | 115 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PRICE.type" prop="discountPrice"> |
| 116 | 减 <el-input-number v-model="scope.row.discountPrice" placeholder="请输入优惠金额" | 116 | 减 <el-input-number v-model="scope.row.discountPrice" placeholder="请输入优惠金额" |
| 117 | - style="width: 190px" :precision="2" :min="0" /> 元 | 117 | + style="width: 190px" :precision="2" :min="0" :max="scope.row.price / 100.0 - 0.01" /> 元 |
| 118 | </el-form-item> | 118 | </el-form-item> |
| 119 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PERCENT.type" prop="discountPercent"> | 119 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PERCENT.type" prop="discountPercent"> |
| 120 | 打 <el-input-number v-model="scope.row.discountPercent" placeholder="请输入优惠折扣" | 120 | 打 <el-input-number v-model="scope.row.discountPercent" placeholder="请输入优惠折扣" |
| @@ -139,12 +139,20 @@ | @@ -139,12 +139,20 @@ | ||
| 139 | </template> | 139 | </template> |
| 140 | 140 | ||
| 141 | <script> | 141 | <script> |
| 142 | -import { createDiscountActivity, updateDiscountActivity, deleteDiscountActivity, getDiscountActivity, getDiscountActivityPage } from "@/api/mall/promotion/discountActivity"; | 142 | +import { |
| 143 | + createDiscountActivity, | ||
| 144 | + updateDiscountActivity, | ||
| 145 | + deleteDiscountActivity, | ||
| 146 | + getDiscountActivity, | ||
| 147 | + getDiscountActivityPage, | ||
| 148 | + closeDiscountActivity | ||
| 149 | +} from "@/api/mall/promotion/discountActivity"; | ||
| 143 | import { | 150 | import { |
| 144 | PromotionActivityStatusEnum, PromotionDiscountTypeEnum, | 151 | PromotionActivityStatusEnum, PromotionDiscountTypeEnum, |
| 145 | PromotionProductScopeEnum | 152 | PromotionProductScopeEnum |
| 146 | } from "@/utils/constants"; | 153 | } from "@/utils/constants"; |
| 147 | import { getSkuOptionList } from "@/api/mall/product/sku"; | 154 | import { getSkuOptionList } from "@/api/mall/product/sku"; |
| 155 | +import { deepClone } from "@/utils"; | ||
| 148 | 156 | ||
| 149 | export default { | 157 | export default { |
| 150 | name: "DiscountActivity", | 158 | name: "DiscountActivity", |
| @@ -165,7 +173,7 @@ export default { | @@ -165,7 +173,7 @@ export default { | ||
| 165 | // 弹出层名称 | 173 | // 弹出层名称 |
| 166 | title: "", | 174 | title: "", |
| 167 | // 是否显示弹出层 | 175 | // 是否显示弹出层 |
| 168 | - open: true, | 176 | + open: false, |
| 169 | // 查询参数 | 177 | // 查询参数 |
| 170 | queryParams: { | 178 | queryParams: { |
| 171 | pageNo: 1, | 179 | pageNo: 1, |
| @@ -178,28 +186,12 @@ export default { | @@ -178,28 +186,12 @@ export default { | ||
| 178 | form: { | 186 | form: { |
| 179 | skuIds: [], // 选中的 SKU | 187 | skuIds: [], // 选中的 SKU |
| 180 | products: [], // 商品信息 | 188 | products: [], // 商品信息 |
| 181 | - // products: [{ | ||
| 182 | - // id: 2, | ||
| 183 | - // name: '白色', | ||
| 184 | - // price: 500, | ||
| 185 | - // stock: 20, | ||
| 186 | - // spuId: 1, | ||
| 187 | - // spuName: 'iPhone 14 Pro', | ||
| 188 | - // discountType: 1, | ||
| 189 | - // }, { | ||
| 190 | - // id: 10, | ||
| 191 | - // name: '蓝色', | ||
| 192 | - // price: 1000, | ||
| 193 | - // stock: 100, | ||
| 194 | - // spuId: 20, | ||
| 195 | - // spuName: 'iPhone 14 Pro', | ||
| 196 | - // discountType: 2, | ||
| 197 | - // }] | ||
| 198 | }, | 189 | }, |
| 199 | // 表单校验 | 190 | // 表单校验 |
| 200 | rules: { | 191 | rules: { |
| 201 | name: [{ required: true, message: "活动名称不能为空", trigger: "blur" }], | 192 | name: [{ required: true, message: "活动名称不能为空", trigger: "blur" }], |
| 202 | startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], | 193 | startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], |
| 194 | + skuIds: [{ required: true, message: "选择商品不能为空", trigger: "blur" }], | ||
| 203 | }, | 195 | }, |
| 204 | // 商品 SKU 列表 | 196 | // 商品 SKU 列表 |
| 205 | productSkus: [], | 197 | productSkus: [], |
| @@ -268,7 +260,24 @@ export default { | @@ -268,7 +260,24 @@ export default { | ||
| 268 | const id = row.id; | 260 | const id = row.id; |
| 269 | getDiscountActivity(id).then(response => { | 261 | getDiscountActivity(id).then(response => { |
| 270 | this.form = response.data; | 262 | this.form = response.data; |
| 263 | + // 修改数据 | ||
| 271 | this.form.startAndEndTime = [response.data.startTime, response.data.endTime]; | 264 | this.form.startAndEndTime = [response.data.startTime, response.data.endTime]; |
| 265 | + this.form.skuIds = response.data.products.map(item => item.skuId); | ||
| 266 | + this.form.products.forEach(product => { | ||
| 267 | + // 获得对应的 SKU 信息 | ||
| 268 | + const sku = this.productSkus.find(item => item.id === product.skuId); | ||
| 269 | + if (!sku) { | ||
| 270 | + return; | ||
| 271 | + } | ||
| 272 | + // 设置商品信息 | ||
| 273 | + product.name = sku.name; | ||
| 274 | + product.spuName = sku.spuName; | ||
| 275 | + product.price = sku.price; | ||
| 276 | + product.stock = sku.stock; | ||
| 277 | + product.discountPrice = product.discountPrice !== undefined ? product.discountPrice / 100.0 : undefined; | ||
| 278 | + product.discountPercent = product.discountPercent !== undefined ? product.discountPercent / 10.0 : undefined; | ||
| 279 | + }); | ||
| 280 | + // 打开弹窗 | ||
| 272 | this.open = true; | 281 | this.open = true; |
| 273 | this.title = "修改限时折扣活动"; | 282 | this.title = "修改限时折扣活动"; |
| 274 | }); | 283 | }); |
| @@ -279,11 +288,21 @@ export default { | @@ -279,11 +288,21 @@ export default { | ||
| 279 | if (!valid) { | 288 | if (!valid) { |
| 280 | return; | 289 | return; |
| 281 | } | 290 | } |
| 282 | - this.form.startTime = this.form.startAndEndTime[0]; | ||
| 283 | - this.form.endTime = this.form.startAndEndTime[1]; | 291 | + // 处理数据 |
| 292 | + const data = deepClone(this.form); // 必须深拷贝,不然后面的 products 操作会有影响 | ||
| 293 | + data.startTime = this.form.startAndEndTime[0]; | ||
| 294 | + data.endTime = this.form.startAndEndTime[1]; | ||
| 295 | + data.products.forEach(product => { | ||
| 296 | + product.discountPrice = product.discountPrice !== undefined ? product.discountPrice * 100 : undefined; | ||
| 297 | + product.discountPercent = product.discountPercent !== undefined ? product.discountPercent * 10 : undefined; | ||
| 298 | + }); | ||
| 299 | + if (!valid) { | ||
| 300 | + return; | ||
| 301 | + } | ||
| 302 | + | ||
| 284 | // 修改的提交 | 303 | // 修改的提交 |
| 285 | if (this.form.id != null) { | 304 | if (this.form.id != null) { |
| 286 | - updateDiscountActivity(this.form).then(response => { | 305 | + updateDiscountActivity(data).then(response => { |
| 287 | this.$modal.msgSuccess("修改成功"); | 306 | this.$modal.msgSuccess("修改成功"); |
| 288 | this.open = false; | 307 | this.open = false; |
| 289 | this.getList(); | 308 | this.getList(); |
| @@ -291,7 +310,7 @@ export default { | @@ -291,7 +310,7 @@ export default { | ||
| 291 | return; | 310 | return; |
| 292 | } | 311 | } |
| 293 | // 添加的提交 | 312 | // 添加的提交 |
| 294 | - createDiscountActivity(this.form).then(response => { | 313 | + createDiscountActivity(data).then(response => { |
| 295 | this.$modal.msgSuccess("新增成功"); | 314 | this.$modal.msgSuccess("新增成功"); |
| 296 | this.open = false; | 315 | this.open = false; |
| 297 | this.getList(); | 316 | this.getList(); |
| @@ -312,7 +331,7 @@ export default { | @@ -312,7 +331,7 @@ export default { | ||
| 312 | handleClose(row) { | 331 | handleClose(row) { |
| 313 | const id = row.id; | 332 | const id = row.id; |
| 314 | this.$modal.confirm('是否确认关闭限时折扣活动编号为"' + id + '"的数据项?').then(function() { | 333 | this.$modal.confirm('是否确认关闭限时折扣活动编号为"' + id + '"的数据项?').then(function() { |
| 315 | - return closeRewardActivity(id); | 334 | + return closeDiscountActivity(id); |
| 316 | }).then(() => { | 335 | }).then(() => { |
| 317 | this.getList(); | 336 | this.getList(); |
| 318 | this.$modal.msgSuccess("关闭成功"); | 337 | this.$modal.msgSuccess("关闭成功"); |
| @@ -325,13 +344,11 @@ export default { | @@ -325,13 +344,11 @@ export default { | ||
| 325 | // 获得对应的 SKU 信息 | 344 | // 获得对应的 SKU 信息 |
| 326 | const sku = this.productSkus.find(item => item.id === skuId); | 345 | const sku = this.productSkus.find(item => item.id === skuId); |
| 327 | if (!sku) { | 346 | if (!sku) { |
| 328 | - // debugger | ||
| 329 | return; | 347 | return; |
| 330 | } | 348 | } |
| 331 | // 判断已存在,直接跳过 | 349 | // 判断已存在,直接跳过 |
| 332 | const product = this.form.products.find(item => item.skuId === skuId); | 350 | const product = this.form.products.find(item => item.skuId === skuId); |
| 333 | if (product) { | 351 | if (product) { |
| 334 | - // debugger | ||
| 335 | return; | 352 | return; |
| 336 | } | 353 | } |
| 337 | this.form.products.push({ | 354 | this.form.products.push({ |