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