Commit 941782fb1057c2d0ba8324af6dc2cebfad9099ea

Authored by YunaiV
1 parent 6d48bd1e

promotion:完善限时折扣的修改逻辑

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 &quot;promotion_discount_product&quot; ( @@ -112,7 +112,9 @@ CREATE TABLE IF NOT EXISTS &quot;promotion_discount_product&quot; (
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 }} &nbsp; {{ item.name}}</span> 89 <span style="float: left">{{ item.spuName }} &nbsp; {{ 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({