From 3ec9370506559da6c9bb1fa788645f15ec9f582b Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Tue, 07 Jan 2025 15:23:55 +0800 Subject: [PATCH] feat(mall): 新增活动管理功能 --- src/main/java/cc/mrbird/febs/mall/vo/AdminActivityAddDto.java | 43 ++++++++ src/main/java/cc/mrbird/febs/common/enumerates/ActivityTypeEnum.java | 21 ++++ src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java | 1 src/main/java/cc/mrbird/febs/common/enumerates/GoodsTypeEnum.java | 23 ++++ src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java | 4 src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java | 136 ++++++++++++++++++++++++++ src/main/resources/application-test.yml | 4 src/main/resources/templates/febs/views/modules/activity/add.html | 43 +++++--- src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java | 5 src/main/java/cc/mrbird/febs/mall/service/IActivityService.java | 3 10 files changed, 257 insertions(+), 26 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/ActivityTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/ActivityTypeEnum.java new file mode 100644 index 0000000..d27a2ea --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/ActivityTypeEnum.java @@ -0,0 +1,21 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum ActivityTypeEnum { + + + YOU_HUI_JUAN(2, "优惠卷"), + + ZHE_KOU(1, "折扣活动"); + + private final int value; + + private final String desc; + + ActivityTypeEnum(int value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/GoodsTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/GoodsTypeEnum.java new file mode 100644 index 0000000..0b17cf7 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/GoodsTypeEnum.java @@ -0,0 +1,23 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum GoodsTypeEnum { + + + HUO_DONG(3, "活动商品"), + + JI_FEN(2, "积分商品"), + + PU_TONG(1, "普通商品"); + + private final int value; + + private final String desc; + + GoodsTypeEnum(int value, String desc) { + this.value = value; + this.desc = desc; + } +} diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java index 5d6a651..8de371f 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminActivityController.java @@ -6,6 +6,7 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.entity.MallActivity; import cc.mrbird.febs.mall.service.IActivityService; +import cc.mrbird.febs.mall.vo.AdminActivityAddDto; import cc.mrbird.febs.mall.vo.AdminDiscountVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -36,8 +37,8 @@ */ @PostMapping("add") @ControllerEndpoint(operation = "新增", exceptionMessage = "新增失败") - public FebsResponse addActivity(@RequestBody @Valid MallActivity mallActivity) { - return iActivityService.addActivity(mallActivity); + public FebsResponse addActivity(@RequestBody @Valid AdminActivityAddDto adminActivityAddDto) { + return iActivityService.addActivity(adminActivityAddDto); } /** diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java b/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java index 7f87e92..290b4ca 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallActivity.java @@ -16,10 +16,10 @@ //活动编码 private String code; //开始时间 - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; //结束时间 - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; //活动大图 private String maxImage; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java index fe7f3be..7194cdf 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java @@ -136,5 +136,6 @@ @TableField(exist = false) private List<Long> couponIds; + private Long activityId; //活动ID } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java b/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java index 0ac891d..e4a0bc6 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IActivityService.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.entity.MallActivity; +import cc.mrbird.febs.mall.vo.AdminActivityAddDto; import cc.mrbird.febs.mall.vo.AdminDiscountVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,7 +12,7 @@ IPage<MallActivity> getAdminListInPage(MallActivity mallActivity, QueryRequest request); - FebsResponse addActivity(MallActivity mallActivity); + FebsResponse addActivity(AdminActivityAddDto adminActivityAddDto); FebsResponse discountUpdate(AdminDiscountVO adminDiscountVO); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java index 740c408..53b8341 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ActivityServiceImpl.java @@ -2,11 +2,16 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.enumerates.ActivityTypeEnum; +import cc.mrbird.febs.common.enumerates.GoodsTypeEnum; +import cc.mrbird.febs.common.enumerates.YesOrNoOrIngEnum; import cc.mrbird.febs.common.utils.MallUtils; -import cc.mrbird.febs.mall.entity.MallActivity; -import cc.mrbird.febs.mall.mapper.MallActivityMapper; +import cc.mrbird.febs.mall.entity.*; +import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IActivityService; +import cc.mrbird.febs.mall.vo.AdminActivityAddDto; import cc.mrbird.febs.mall.vo.AdminDiscountVO; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -18,11 +23,21 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.stream.Collectors; + @Slf4j @Service @RequiredArgsConstructor @Transactional public class ActivityServiceImpl extends ServiceImpl<MallActivityMapper, MallActivity> implements IActivityService { + + private final CouponGoodsMapper couponGoodsMapper; + private final MallGoodsMapper mallGoodsMapper; + private final MallGoodsSkuMapper mallGoodsSkuMapper; + private final MallGoodsStyleMapper mallGoodsStyleMapper; @Override public IPage<MallActivity> getAdminListInPage(MallActivity mallActivity, QueryRequest request) { Page<MallActivity> page = new Page<>(request.getPageNum(), request.getPageSize()); @@ -40,11 +55,124 @@ } @Override - public FebsResponse addActivity(MallActivity mallActivity) { + public FebsResponse addActivity(AdminActivityAddDto adminActivityAddDto) { + + MallActivity mallActivity = new MallActivity(); + mallActivity.setName(adminActivityAddDto.getName()); String hd = MallUtils.getOrderNum("HD"); mallActivity.setCode(hd); + mallActivity.setStartTime(adminActivityAddDto.getStartTime()); + mallActivity.setEndTime(adminActivityAddDto.getEndTime()); + mallActivity.setMaxImage(adminActivityAddDto.getMaxImage()); + mallActivity.setMinImage(adminActivityAddDto.getMinImage()); + mallActivity.setState(YesOrNoOrIngEnum.NO.getValue()); + mallActivity.setType(adminActivityAddDto.getType()); + + List<Long> activityGoodsIds = adminActivityAddDto.getActivityGoodsIds(); + String collect = activityGoodsIds.stream() + .map(String::valueOf) // 将 Long 转换为 String + .collect(Collectors.joining(","));// 使用逗号连接 + mallActivity.setActivityGoodsIds(collect); this.baseMapper.insert(mallActivity); - return null; + + if(ActivityTypeEnum.ZHE_KOU.getValue() == adminActivityAddDto.getType()){ + BigDecimal discountSize = adminActivityAddDto.getDiscountSize(); + mallActivity.setDiscountSize(discountSize); + addDiscountGoods(mallActivity.getId(),discountSize,activityGoodsIds); + } + + if(ActivityTypeEnum.YOU_HUI_JUAN.getValue() == adminActivityAddDto.getType()){ + mallActivity.setCouponId(adminActivityAddDto.getCouponId()); + addCouponGoods(adminActivityAddDto.getCouponId(),activityGoodsIds); + } + + return new FebsResponse().success().data("操作成功"); + } + + private void addDiscountGoods(Long activityId,BigDecimal discountSize, List<Long> goodsIds){ + //将对应选中的商品按照这个折扣力度重新计算一遍 + List<MallGoods> mallGoods = mallGoodsMapper.selectList( + new LambdaQueryWrapper<MallGoods>() + .eq(MallGoods::getIsNormal, GoodsTypeEnum.PU_TONG.getValue()) + .in(MallGoods::getId, goodsIds) + ); + if(CollUtil.isNotEmpty(mallGoods)){ + //复制对应的商品的规则 + for(MallGoods mallGoodsItem:mallGoods){ + Long goodsId = mallGoodsItem.getId(); + //新增活动商品 + Long goodsIdNew = addGoodsEntity(activityId, discountSize, mallGoodsItem); + + List<MallGoodsStyle> mallGoodsStyles = mallGoodsStyleMapper.selectList( + new LambdaQueryWrapper<MallGoodsStyle>() + .eq(MallGoodsStyle::getGoodsId, goodsId) + ); + + if(CollUtil.isNotEmpty(mallGoodsStyles)){ + for(MallGoodsStyle mallGoodsStyleItem:mallGoodsStyles){ + Long styleItemId = mallGoodsStyleItem.getId(); + + Long styleItemIdNew = addGoodsStyleEntity(goodsIdNew, mallGoodsStyleItem); + List<MallGoodsSku> mallGoodsSkus = mallGoodsSkuMapper.selectList( + new LambdaQueryWrapper<MallGoodsSku>() + .eq(MallGoodsSku::getStyleId, styleItemId) + .eq(MallGoodsSku::getGoodsId, goodsId) + ); + if(CollUtil.isNotEmpty(mallGoodsSkus)){ + for(MallGoodsSku mallGoodsSkuItem:mallGoodsSkus){ + addGoodsSkuEntity(goodsIdNew,styleItemIdNew,discountSize,mallGoodsSkuItem); + } + } + } + } + } + } + } + + private Long addGoodsEntity(Long activityId,BigDecimal discountSize,MallGoods mallGoodsItem){ + MallActivity mallActivity = this.baseMapper.selectById(activityId); + mallGoodsItem.setIsNormal(GoodsTypeEnum.HUO_DONG.getValue()); + mallGoodsItem.setGoodsName(mallActivity.getName()+mallGoodsItem.getGoodsName()); + mallGoodsItem.setActivityId(mallActivity.getId()); + BigDecimal presentPrice = new BigDecimal(mallGoodsItem.getPresentPrice()).multiply(discountSize).setScale(2, RoundingMode.DOWN); + mallGoodsItem.setPresentPrice(presentPrice.toString()); + mallGoodsMapper.insert(mallGoodsItem); + return mallGoodsItem.getId(); + } + + private Long addGoodsStyleEntity(Long goodsId,MallGoodsStyle mallGoodsStyleItem){ + mallGoodsStyleItem.setGoodsId(goodsId); + mallGoodsStyleMapper.insert(mallGoodsStyleItem); + return mallGoodsStyleItem.getId(); + } + + private Long addGoodsSkuEntity(Long goodsId,Long styleId,BigDecimal discountSize,MallGoodsSku sku){ + sku.setGoodsId(goodsId); + sku.setStyleId(styleId); + BigDecimal presentPrice = sku.getPresentPrice().multiply(discountSize).setScale(2, RoundingMode.DOWN); + sku.setPresentPrice(presentPrice); + mallGoodsSkuMapper.insert(sku); + return sku.getId(); + } + + private void addCouponGoods(Long couponId,List<Long> goodsIds){ + // 先判断是否存在关联商品,再进行查询和删除 + if (CollUtil.isNotEmpty(couponGoodsMapper.selectList( + new LambdaQueryWrapper<CouponGoods>() + .select(CouponGoods::getId) + .eq(CouponGoods::getCouponId, couponId)))) { + couponGoodsMapper.delete(new LambdaQueryWrapper<CouponGoods>().eq(CouponGoods::getCouponId, couponId)); + } + + // 处理 goodsIds 为 null 或空的情况 + if (CollUtil.isNotEmpty(goodsIds)) { + for (Long goodsId : goodsIds) { + CouponGoods couponGoods = new CouponGoods(); + couponGoods.setGoodsId(goodsId); + couponGoods.setCouponId(couponId); + couponGoodsMapper.insert(couponGoods); + } + } } @Override diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminActivityAddDto.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminActivityAddDto.java new file mode 100644 index 0000000..bb8429a --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminActivityAddDto.java @@ -0,0 +1,43 @@ +package cc.mrbird.febs.mall.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +@ApiModel(value = "AdminActivityAddDto", description = "信息返回类") +public class AdminActivityAddDto { + + //活动名称 + private String name; + //活动编码 + private String code; + //开始时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + //结束时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + //活动大图 + private String maxImage; + //活动小图 + private String minImage; + //活动状态 1-开启 0-关闭 + private Integer state; + //活动说明 + private String actRemark; + /** + * 活动类型 1、折扣 2、优惠券 + */ + private Integer type; + + private Long couponId;//优惠券id + + private BigDecimal discountSize;//折扣粒度 + + private List<Long> activityGoodsIds;//关联的商品ids +} diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index bcdaf4f..06ca75a 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -84,8 +84,8 @@ static: resource: - url: http://blnka.csxuncong.com/file/ - path: /mnt/sdc/webresource/file/ + url: https://res.mye2u.com/ + path: /home/javaweb/resource/ system: job: true \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/activity/add.html b/src/main/resources/templates/febs/views/modules/activity/add.html index 427b8d5..7652ee0 100644 --- a/src/main/resources/templates/febs/views/modules/activity/add.html +++ b/src/main/resources/templates/febs/views/modules/activity/add.html @@ -13,7 +13,7 @@ <div class="layui-row layui-col-lg6 layui-form-item"> <label class="layui-form-label febs-form-item-require">名称:</label> <div class="layui-input-block"> - <input type="text" name="actName" lay-verify="required" + <input type="text" name="name" lay-verify="required" placeholder="" autocomplete="off" class="layui-input"> </div> </div> @@ -54,8 +54,8 @@ <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">开始时间:</label> <div class="layui-input-block"> - <input type="text" name="actStartTime" id="febs-form-group-date-start" lay-verify="date" - placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input"> + <input type="text" name="startTime" id="febs-form-group-date-start" lay-verify="datetime" + placeholder="yyyy-MM-dd hh:mm:ss" autocomplete="off" class="layui-input"> </div> </div> </div> @@ -64,8 +64,8 @@ <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">结束时间:</label> <div class="layui-input-block"> - <input type="text" name="actEndTime" id="febs-form-group-date-end" lay-verify="date" - placeholder="yyyy-MM-dd" autocomplete="off" class="layui-input"> + <input type="text" name="endTime" id="febs-form-group-date-end" lay-verify="datetime" + placeholder="yyyy-MM-dd hh:mm:ss" autocomplete="off" class="layui-input"> </div> </div> </div> @@ -112,14 +112,14 @@ </div> </div> - <div class="layui-form-item"> - <label class="layui-form-label">活动说明:</label> - <div class="layui-input-block"> - <label> - <textarea name="actRemark" rows="5" autocomplete="off" class="layui-textarea" ></textarea> - </label> - </div> - </div> +<!-- <div class="layui-form-item">--> +<!-- <label class="layui-form-label">活动说明:</label>--> +<!-- <div class="layui-input-block">--> +<!-- <label>--> +<!-- <textarea name="actRemark" rows="5" autocomplete="off" class="layui-textarea" ></textarea>--> +<!-- </label>--> +<!-- </div>--> +<!-- </div>--> </div> </div> @@ -231,11 +231,15 @@ }) laydate.render({ - elem: '#febs-form-group-date-start' + elem: '#febs-form-group-date-start', + type: 'datetime', // 选择器类型为日期时间 + format: 'yyyy-MM-dd HH:mm:ss' // 自定义格式 }); laydate.render({ - elem: '#febs-form-group-date-end' + elem: '#febs-form-group-date-end', + type: 'datetime', // 选择器类型为日期时间 + format: 'yyyy-MM-dd HH:mm:ss' // 自定义格式 }); formSelects.render(); @@ -261,6 +265,15 @@ }); form.on('submit(activity-add-form-submit)', function (data) { + data.field.couponId = couponRule.getValue('valueStr'); + let couponRuleList = activityGoodsIds.getValue(); + if (couponRuleList.length > 0) { + var couponIds = []; + layui.each(couponRuleList, function (key, item) { + couponIds.push(item.id) + }); + data.field.activityGoodsIds=couponIds; + } $.ajax({ 'url':ctx + 'admin/activity/add', 'type':'post', -- Gitblit v1.9.1