Procházet zdrojové kódy

秒杀代码生成

guomengjiao před 1 měsícem
rodič
revize
0f2767c610

+ 17 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -4,6 +4,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
 
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
@@ -187,4 +189,19 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
             return null;
         }
     }
+
+    /**
+     * 字符串转换成日期
+     *
+     * @param strDate 日期字符串
+     *                日期的格式yyyy-MM-dd HH:mm
+     */
+    public static Date stringToDate(String strDate) {
+        if (StringUtils.isBlank(strDate)) {
+            return null;
+        }
+
+        DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");
+        return fmt.parseLocalDateTime(strDate).toDate();
+    }
 }

+ 99 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/enums/ActiveState.java

@@ -0,0 +1,99 @@
+package com.ruoyi.shop.enums;
+
+import com.ruoyi.common.enums.IIntegerEnum;
+import com.ruoyi.common.utils.DateCustomUtils;
+import com.ruoyi.common.utils.DateUtils;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * 活动状态
+ * @author lubo
+ */
+public enum ActiveState implements IIntegerEnum<Integer> {
+    NOT_START(0, "未开始"),
+    UNDERWAY(1, "进行中"),
+    FINISHED(2, "已结束"),
+    ;
+
+    private Integer code;
+
+    private String msg;
+
+    ActiveState(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    @Override
+    public String getMsg() {
+        return msg;
+    }
+
+
+    public static ActiveState getByCode(int code, ActiveState[] values) {
+        for (ActiveState value : values) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public static ActiveState getByCode(int code) {
+        for (ActiveState value : ActiveState.values()) {
+            if (Objects.equals(code, value.getCode())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获得秒杀活动状态
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public static ActiveState getSeckillActiveState(Date startTime, Date endTime, String startHour, String endHour) {
+        Date date = new Date();
+        ActiveState activeState;//活动状态
+
+        try {
+            if (startTime.getTime() > date.getTime()) {
+                //未开始
+                activeState = ActiveState.NOT_START;
+            } else if (DateUtils.addDateDays(endTime, 1).getTime() < date.getTime()) {
+                //已结束
+                activeState = ActiveState.FINISHED;
+            } else {
+                //当天有活动
+                //开始时间
+                Date startDate = DateUtils.stringToDate(DateCustomUtils.dateToString(date) + " " + startHour);
+                //结束时间
+                Date endDate = DateUtils.stringToDate(DateCustomUtils.dateToString(date) + " " + endHour);
+                if (date.getTime() < startDate.getTime()) {
+                    //未开始
+                    activeState = ActiveState.NOT_START;
+                } else if (date.getTime() <= endDate.getTime()) {
+                    //进行中
+                    activeState = ActiveState.UNDERWAY;
+                } else {
+                    //已结束
+                    activeState = ActiveState.FINISHED;
+                }
+            }
+        } catch (Exception e) {
+            activeState = ActiveState.FINISHED;
+        }
+
+        return activeState;
+    }
+}

+ 17 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/seckill/domain/bo/SeckillActivityBo.java

@@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.core.validate.AddGroup;
 import com.ruoyi.common.core.validate.EditGroup;
 import com.ruoyi.common.filepathsplicing.FilePathValue;
+import com.ruoyi.shop.enums.ActiveState;
 import com.ruoyi.shop.enums.CycleMode;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -114,5 +115,21 @@ public class SeckillActivityBo extends BaseEntity {
     @NotNull(message = "订单自动关闭时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private Integer closeTime;
 
+    /**
+     * 活动状态
+        0:未开始
+        1:进行中
+        2:已结束
+     */
+    private ActiveState activeState;
+
+    /**
+     * 活动状态(按每天的开始和结束)
+     *
+     * @return
+     */
+    public ActiveState getActiveState() {
+        return ActiveState.getSeckillActiveState(this.startTime, this.endTime, this.startHour, this.endHour);
+    }
 
 }

+ 5 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/seckill/domain/vo/SeckillActivityVo.java

@@ -118,5 +118,10 @@ public class SeckillActivityVo {
     @ApiModelProperty("订单自动关闭时间(商品按下单减库存,请设置未付款订单自动取消时间及时释放库存,可输入3-360分钟)")
     private Integer closeTime;
 
+    /**
+     * 商品数量
+     */
+    @ApiModelProperty("商品数量")
+    private Integer productNum;
 
 }

+ 6 - 6
ruoyi-shop/src/main/resources/mapper/marketing/seckill/SeckillActivityMapper.xml

@@ -30,20 +30,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT sa.*,(SELECT COUNT(sap.id) FROM `tb_seckill_activity_product` sap WHERE sa.id = sap.seckill_id) productNum
         FROM `tb_seckill_activity` sa
         <where>
-            sa.shop_id = #{vo.shop_id}
-            <if test="vo.name != null and vo.name != ''">
-                AND sa.`name` LIKE CONCAT('%',#{vo.name},'%')
+            sa.shop_id = #{bo.shop_id}
+            <if test="bo.name != null and bo.name != ''">
+                AND sa.`name` LIKE CONCAT('%',#{bo.name},'%')
             </if>
-            <if test="vo.active_state!=null and vo.active_state!= '' and vo.active_state==0">
+            <if test="bo.activeState!=null and bo.activeState!= '' and bo.activeState==0">
                 AND (start_time &gt; DATE_FORMAT(NOW(),'%Y-%m-%d')
                 OR (start_time &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt;= end_time
                 AND CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),' ',start_hour) &gt;= NOW()))
             </if>
-            <if test="vo.active_state!=null and vo.active_state!= '' and vo.active_state==1">
+            <if test="bo.activeState!=null and bo.activeState!= '' and bo.activeState==1">
                 AND start_time &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt;= end_time
                 AND CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),' ',start_hour) &lt;= NOW() AND NOW() &lt;= CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),' ',end_hour)
             </if>
-            <if test="vo.active_state!=null and vo.active_state!= '' and vo.active_state==2">
+            <if test="bo.activeState!=null and bo.activeState!= '' and bo.activeState==2">
                 AND (end_time &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d')
                 OR (start_time &lt;= DATE_FORMAT(NOW(),'%Y-%m-%d') AND DATE_FORMAT(NOW(),'%Y-%m-%d') &lt;= end_time
                 AND CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),' ',end_hour) &lt;= NOW()))