src/main/java/cc/mrbird/febs/common/enumerates/ActivityTypeEnum.java
New file @@ -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; } } src/main/java/cc/mrbird/febs/common/enumerates/GoodsTypeEnum.java
New file @@ -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; } } 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); } /** 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; 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 } 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); } 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 src/main/java/cc/mrbird/febs/mall/vo/AdminActivityAddDto.java
New file @@ -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 } 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 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',