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 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | 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 | 6 | import cn.iocoder.yudao.module.promotion.convert.discount.DiscountActivityConvert; |
| 10 | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 8 | +import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | |
| 11 | 9 | import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService; |
| 12 | 10 | import io.swagger.annotations.Api; |
| 13 | 11 | import io.swagger.annotations.ApiImplicitParam; |
| ... | ... | @@ -18,6 +16,7 @@ import org.springframework.web.bind.annotation.*; |
| 18 | 16 | |
| 19 | 17 | import javax.annotation.Resource; |
| 20 | 18 | import javax.validation.Valid; |
| 19 | +import java.util.List; | |
| 21 | 20 | |
| 22 | 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 23 | 22 | |
| ... | ... | @@ -67,9 +66,14 @@ public class DiscountActivityController { |
| 67 | 66 | @ApiOperation("获得限时折扣活动") |
| 68 | 67 | @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) |
| 69 | 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 | 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 | 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 | 1 | package cn.iocoder.yudao.module.promotion.convert.discount; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.util.ObjectUtil; | |
| 3 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 5 | 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 | 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 11 | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 10 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | |
| 12 | 11 | import cn.iocoder.yudao.module.promotion.service.discount.bo.DiscountProductDetailBO; |
| 13 | 12 | import org.mapstruct.Mapper; |
| 14 | 13 | import org.mapstruct.factory.Mappers; |
| ... | ... | @@ -50,4 +49,54 @@ public interface DiscountActivityConvert { |
| 50 | 49 | |
| 51 | 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 | 9 | |
| 10 | 10 | import javax.validation.Valid; |
| 11 | 11 | import java.util.Collection; |
| 12 | +import java.util.List; | |
| 12 | 13 | import java.util.Map; |
| 13 | 14 | |
| 14 | 15 | /** |
| ... | ... | @@ -73,4 +74,12 @@ public interface DiscountActivityService { |
| 73 | 74 | */ |
| 74 | 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 | 91 | // 计算要删除的记录 |
| 92 | 92 | List<Long> deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId, |
| 93 | 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 | 95 | if (CollUtil.isNotEmpty(deleteIds)) { |
| 97 | 96 | discountProductMapper.deleteBatchIds(deleteIds); |
| 98 | 97 | } |
| ... | ... | @@ -100,8 +99,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { |
| 100 | 99 | List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(), |
| 101 | 100 | product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId())); |
| 102 | 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 | 103 | if (CollectionUtil.isNotEmpty(newDiscountProducts)) { |
| 106 | 104 | discountProductMapper.insertBatch(newDiscountProducts); |
| 107 | 105 | } |
| ... | ... | @@ -194,4 +192,9 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { |
| 194 | 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 | 11 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper; |
| 12 | 12 | import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper; |
| 13 | 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; |
| 14 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionDiscountTypeEnum; | |
| 14 | 15 | import org.junit.jupiter.api.Test; |
| 15 | 16 | import org.springframework.context.annotation.Import; |
| 16 | 17 | |
| ... | ... | @@ -53,8 +54,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { |
| 53 | 54 | // 用于触发进行中的状态 |
| 54 | 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 | 77 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); |
| 75 | 78 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); |
| 76 | 79 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); |
| 80 | + assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); | |
| 77 | 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 | 90 | discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据 |
| 86 | 91 | // mock 数据(活动) |
| 87 | 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 | 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 | 96 | discountProductMapper.insert(dbDiscountProduct01); |
| 92 | 97 | discountProductMapper.insert(dbDiscountProduct02); |
| 93 | 98 | // 准备参数 |
| ... | ... | @@ -96,8 +101,10 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest { |
| 96 | 101 | // 用于触发进行中的状态 |
| 97 | 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 | 122 | assertEquals(discountProduct.getActivityId(), discountActivity.getId()); |
| 116 | 123 | assertEquals(discountProduct.getSpuId(), product.getSpuId()); |
| 117 | 124 | assertEquals(discountProduct.getSkuId(), product.getSkuId()); |
| 125 | + assertEquals(discountProduct.getDiscountType(), product.getDiscountType()); | |
| 118 | 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 | 112 | "activity_id" bigint NOT NULL, |
| 113 | 113 | "spu_id" bigint NOT NULL, |
| 114 | 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 | 118 | "creator" varchar DEFAULT '', |
| 117 | 119 | "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| 118 | 120 | "updater" varchar DEFAULT '', | ... | ... |
yudao-ui-admin/src/views/mall/promotion/discountActivity/index.vue
| ... | ... | @@ -84,8 +84,8 @@ |
| 84 | 84 | </el-form-item> |
| 85 | 85 | <el-form-item label="商品选择"> |
| 86 | 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 | 89 | <span style="float: left">{{ item.spuName }} {{ item.name}}</span> |
| 90 | 90 | <span style="float: right; color: #8492a6; font-size: 13px">¥{{ (item.price / 100.0).toFixed(2) }}</span> |
| 91 | 91 | </el-option> |
| ... | ... | @@ -102,7 +102,7 @@ |
| 102 | 102 | </template> |
| 103 | 103 | </el-table-column> |
| 104 | 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 | 106 | <template slot-scope="scope"> |
| 107 | 107 | <el-select v-model="scope.row.discountType" placeholder="请选择优惠类型"> |
| 108 | 108 | <el-option v-for="dict in getDictDatas(DICT_TYPE.PROMOTION_DISCOUNT_TYPE)" |
| ... | ... | @@ -114,7 +114,7 @@ |
| 114 | 114 | <template slot-scope="scope"> |
| 115 | 115 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PRICE.type" prop="discountPrice"> |
| 116 | 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 | 118 | </el-form-item> |
| 119 | 119 | <el-form-item v-if="scope.row.discountType === PromotionDiscountTypeEnum.PERCENT.type" prop="discountPercent"> |
| 120 | 120 | 打 <el-input-number v-model="scope.row.discountPercent" placeholder="请输入优惠折扣" |
| ... | ... | @@ -139,12 +139,20 @@ |
| 139 | 139 | </template> |
| 140 | 140 | |
| 141 | 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 | 150 | import { |
| 144 | 151 | PromotionActivityStatusEnum, PromotionDiscountTypeEnum, |
| 145 | 152 | PromotionProductScopeEnum |
| 146 | 153 | } from "@/utils/constants"; |
| 147 | 154 | import { getSkuOptionList } from "@/api/mall/product/sku"; |
| 155 | +import { deepClone } from "@/utils"; | |
| 148 | 156 | |
| 149 | 157 | export default { |
| 150 | 158 | name: "DiscountActivity", |
| ... | ... | @@ -165,7 +173,7 @@ export default { |
| 165 | 173 | // 弹出层名称 |
| 166 | 174 | title: "", |
| 167 | 175 | // 是否显示弹出层 |
| 168 | - open: true, | |
| 176 | + open: false, | |
| 169 | 177 | // 查询参数 |
| 170 | 178 | queryParams: { |
| 171 | 179 | pageNo: 1, |
| ... | ... | @@ -178,28 +186,12 @@ export default { |
| 178 | 186 | form: { |
| 179 | 187 | skuIds: [], // 选中的 SKU |
| 180 | 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 | 191 | rules: { |
| 201 | 192 | name: [{ required: true, message: "活动名称不能为空", trigger: "blur" }], |
| 202 | 193 | startAndEndTime: [{ required: true, message: "活动时间不能为空", trigger: "blur" }], |
| 194 | + skuIds: [{ required: true, message: "选择商品不能为空", trigger: "blur" }], | |
| 203 | 195 | }, |
| 204 | 196 | // 商品 SKU 列表 |
| 205 | 197 | productSkus: [], |
| ... | ... | @@ -268,7 +260,24 @@ export default { |
| 268 | 260 | const id = row.id; |
| 269 | 261 | getDiscountActivity(id).then(response => { |
| 270 | 262 | this.form = response.data; |
| 263 | + // 修改数据 | |
| 271 | 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 | 281 | this.open = true; |
| 273 | 282 | this.title = "修改限时折扣活动"; |
| 274 | 283 | }); |
| ... | ... | @@ -279,11 +288,21 @@ export default { |
| 279 | 288 | if (!valid) { |
| 280 | 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 | 304 | if (this.form.id != null) { |
| 286 | - updateDiscountActivity(this.form).then(response => { | |
| 305 | + updateDiscountActivity(data).then(response => { | |
| 287 | 306 | this.$modal.msgSuccess("修改成功"); |
| 288 | 307 | this.open = false; |
| 289 | 308 | this.getList(); |
| ... | ... | @@ -291,7 +310,7 @@ export default { |
| 291 | 310 | return; |
| 292 | 311 | } |
| 293 | 312 | // 添加的提交 |
| 294 | - createDiscountActivity(this.form).then(response => { | |
| 313 | + createDiscountActivity(data).then(response => { | |
| 295 | 314 | this.$modal.msgSuccess("新增成功"); |
| 296 | 315 | this.open = false; |
| 297 | 316 | this.getList(); |
| ... | ... | @@ -312,7 +331,7 @@ export default { |
| 312 | 331 | handleClose(row) { |
| 313 | 332 | const id = row.id; |
| 314 | 333 | this.$modal.confirm('是否确认关闭限时折扣活动编号为"' + id + '"的数据项?').then(function() { |
| 315 | - return closeRewardActivity(id); | |
| 334 | + return closeDiscountActivity(id); | |
| 316 | 335 | }).then(() => { |
| 317 | 336 | this.getList(); |
| 318 | 337 | this.$modal.msgSuccess("关闭成功"); |
| ... | ... | @@ -325,13 +344,11 @@ export default { |
| 325 | 344 | // 获得对应的 SKU 信息 |
| 326 | 345 | const sku = this.productSkus.find(item => item.id === skuId); |
| 327 | 346 | if (!sku) { |
| 328 | - // debugger | |
| 329 | 347 | return; |
| 330 | 348 | } |
| 331 | 349 | // 判断已存在,直接跳过 |
| 332 | 350 | const product = this.form.products.find(item => item.skuId === skuId); |
| 333 | 351 | if (product) { |
| 334 | - // debugger | |
| 335 | 352 | return; |
| 336 | 353 | } |
| 337 | 354 | this.form.products.push({ | ... | ... |