Browse Source

提交积分规则相关代码

wangzhijun 5 days ago
parent
commit
7e32a362e1

+ 17 - 11
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java

@@ -3,7 +3,9 @@ package com.ylx.web.controller.point;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.annotation.Log;
 import com.ylx.common.core.controller.BaseController;
+import com.ylx.common.core.domain.AjaxResult;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.core.page.TableDataInfo;
 import com.ylx.common.enums.BusinessType;
 import com.ylx.point.domain.PointActivity;
 import com.ylx.point.domain.dto.PointActivityDTO;
@@ -16,8 +18,11 @@ import com.ylx.point.service.IPointActivityService;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 积分活动主Controller
  *
@@ -37,9 +42,10 @@ public class PointActivityController extends BaseController {
     @PreAuthorize("@ss.hasPermi('point:activity:list')")
     @ApiOperation("根据条件分页查询积分活动")
     @GetMapping("/page")
-    public R<Page<PointActivityPageVo>> page(Page<PointActivity> page, PointActivityPageDTO dto) {
-        Page<PointActivityPageVo> pageResult = this.pointActivityService.page(page, dto);
-        return R.ok(pageResult);
+    public TableDataInfo page(PointActivityPageDTO dto) {
+        startPage();
+        List<PointActivityPageVo> list = this.pointActivityService.list(dto);
+        return getDataTable(list);
     }
 
     /**
@@ -60,9 +66,9 @@ public class PointActivityController extends BaseController {
     @ApiOperation("新增积分活动")
     @Log(title = "积分活动添加", businessType = BusinessType.INSERT)
     @PostMapping
-    public R add(@RequestBody PointActivityDTO dto) {
+    public AjaxResult add(@Validated @RequestBody PointActivityDTO dto) {
         this.pointActivityService.add(dto);
-        return R.ok();
+        return success();
     }
 
     /**
@@ -72,9 +78,9 @@ public class PointActivityController extends BaseController {
     @ApiOperation("编辑积分活动")
     @Log(title = "积分活动编辑", businessType = BusinessType.UPDATE)
     @PutMapping
-    public R edit(@RequestBody PointActivityDTO dto) {
+    public AjaxResult edit(@Validated @RequestBody PointActivityDTO dto) {
         this.pointActivityService.edit(dto);
-        return R.ok();
+        return success();
     }
 
     /**
@@ -83,9 +89,9 @@ public class PointActivityController extends BaseController {
     @PreAuthorize("@ss.hasPermi('point:activity:query')")
     @ApiOperation("根据id获取积分活动统计数据")
     @GetMapping(value = "/stat/{id}")
-    public R<PointActivityStatVo> getStatInfo(@PathVariable("id") String id) {
+    public AjaxResult getStatInfo(@PathVariable("id") String id) {
         PointActivityStatVo vo = this.pointActivityService.getStatInfo(id);
-        return R.ok(vo);
+        return success(vo);
     }
 
     /**
@@ -95,9 +101,9 @@ public class PointActivityController extends BaseController {
     @ApiOperation("编辑积分活动时效")
     @Log(title = "积分活动时效编辑", businessType = BusinessType.UPDATE)
     @PutMapping(value = "/validity")
-    public R editValidity(@RequestBody PointActivityValidityDTO dto) {
+    public AjaxResult editValidity(@Validated @RequestBody PointActivityValidityDTO dto) {
         this.pointActivityService.editValidity(dto);
-        return R.ok();
+        return success();
     }
 
 }

+ 27 - 0
nightFragrance-common/src/main/java/com/ylx/common/annotation/EnumTranslate.java

@@ -0,0 +1,27 @@
+package com.ylx.common.annotation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target({FIELD})
+@Retention(RUNTIME)
+public @interface EnumTranslate {
+
+    /**
+     * 枚举类
+     */
+    Class<? extends Enum<?>> enumClass();
+
+    /**
+     * 枚举中获取code的方法名
+     */
+    String codeMethod() default "getCode";
+
+    /**
+     * 枚举中获取描述的方法名
+     */
+    String descMethod() default "getInfo";
+}

+ 119 - 0
nightFragrance-common/src/main/java/com/ylx/common/aspect/EnumTranslateAspect.java

@@ -0,0 +1,119 @@
+package com.ylx.common.aspect;
+
+import com.ylx.common.annotation.EnumTranslate;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collection;
+
+@Aspect
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE + 1)
+public class EnumTranslateAspect {
+
+    // 【改成你自己的 controller 包路径】
+    @Pointcut("execution(public * com.ylx.web.controller..*.*(..))")
+    public void pointcut() {}
+
+    @Around("pointcut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        Object result = point.proceed();
+        if (result == null) return null;
+
+        // 全局翻译:支持 单个对象 / List / 分页对象
+        translate(result);
+        return result;
+    }
+
+    // ==========================================
+    // 核心方法:递归翻译所有类型
+    // ==========================================
+    private void translate(Object obj) {
+        if (obj == null) return;
+
+        // 1. 集合 List Set
+        if (obj instanceof Collection) {
+            ((Collection<?>) obj).forEach(this::translate);
+            return;
+        }
+
+        // 2. 分页对象(这里是关键!自动提取分页里的 rows)
+        Class<?> clazz = obj.getClass();
+        try {
+            // 通用分页字段:rows / list / data 三个都兼容
+            for (String fieldName : Arrays.asList("rows", "list", "data")) {
+                Field listField = clazz.getDeclaredField(fieldName);
+                listField.setAccessible(true);
+                Object listObj = listField.get(obj);
+                if (listObj instanceof Collection) {
+                    translate(listObj);
+                }
+            }
+        } catch (NoSuchFieldException ignored) {
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        // 3. 翻译当前对象自身的字段
+        translateFields(obj);
+    }
+
+    // ==========================================
+    // 翻译单个对象的枚举字段
+    // ==========================================
+    private void translateFields(Object obj) {
+        Field[] fields = obj.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            EnumTranslate anno = field.getAnnotation(EnumTranslate.class);
+            if (anno == null) continue;
+
+            try {
+                field.setAccessible(true);
+                Object code = field.get(obj);
+                if (code == null) continue;
+
+                // 拿到枚举描述
+                String desc = getEnumDesc(
+                        anno.enumClass(),
+                        code,
+                        anno.codeMethod(),
+                        anno.descMethod()
+                );
+
+                // 自动赋值给 statusDesc
+                Field descField = obj.getClass().getDeclaredField(field.getName() + "Desc");
+                descField.setAccessible(true);
+                descField.set(obj, desc);
+            } catch (NoSuchFieldException ignored) {
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // ==========================================
+    // 根据code获取枚举描述
+    // ==========================================
+    private String getEnumDesc(Class<? extends Enum<?>> enumClass, Object code, String codeMethod, String descMethod) {
+        try {
+            Method getCode = enumClass.getMethod(codeMethod);
+            Method getDesc = enumClass.getMethod(descMethod);
+
+            for (Enum<?> e : enumClass.getEnumConstants()) {
+                Object enumCode = getCode.invoke(e);
+                if (enumCode.equals(code)) {
+                    return String.valueOf(getDesc.invoke(e));
+                }
+            }
+        } catch (Exception ignored) {}
+        return "";
+    }
+}

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivity.java

@@ -90,7 +90,7 @@ public class PointActivity extends BaseEntity {
      * 状态: 0=未开始, 1=进行中, 2=已结束, 3=草稿
      */
     @Excel(name = "状态: 0=未开始, 1=进行中, 2=已结束, 3=草稿")
-    private Long status;
+    private Integer status;
 
     /**
      * 前端展示排序

+ 1 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityDTO.java

@@ -48,6 +48,7 @@ public class PointActivityDTO {
     private PointSignTaskDTO signTaskDTO;
 
     @ApiModelProperty("状态:草稿=3, 发布=4")
+    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Data

+ 3 - 2
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityPageDTO.java

@@ -1,12 +1,13 @@
 package com.ylx.point.domain.dto;
 
+import com.ylx.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 @ApiModel("积分活动分页查询请求DTO")
-public class PointActivityPageDTO {
+public class PointActivityPageDTO extends BaseEntity {
 
     @ApiModelProperty("活动类型")
     private Integer activityType;
@@ -15,7 +16,7 @@ public class PointActivityPageDTO {
     private String cityCode;
 
     @ApiModelProperty("状态")
-    private Long status;
+    private Integer status;
 
     @ApiModelProperty("活动开始时间")
     private String startTime;

+ 8 - 3
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityPageVo.java

@@ -2,6 +2,9 @@ package com.ylx.point.domain.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ylx.common.annotation.EnumTranslate;
+import com.ylx.point.enums.PointActivityStatusEnum;
+import com.ylx.point.enums.PointActivityTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -19,10 +22,11 @@ public class PointActivityPageVo {
     private String name;
 
     @JsonIgnore
+    @EnumTranslate(enumClass = PointActivityTypeEnum.class)
     private Integer activityType;
 
     @ApiModelProperty(name = "活动类型")
-    private Integer activityTypeName;
+    private String activityTypeDesc;
 
     @JsonIgnore
     private String cityCode;
@@ -42,9 +46,10 @@ public class PointActivityPageVo {
     private Integer isPermanent;
 
     @JsonIgnore
-    private Long status;
+    @EnumTranslate(enumClass = PointActivityStatusEnum.class)
+    private Integer status;
 
     @ApiModelProperty(name = "状态")
-    private Long statusName;
+    private String statusDesc;
 
 }

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/point/enums/PointActivityStatusEnum.java

@@ -0,0 +1,22 @@
+package com.ylx.point.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum PointActivityStatusEnum {
+
+    NOT_START(0, "未开始"),
+    IN_PROGRESS(1, "进行中"),
+    FINISHED(2, "已结束"),
+    DRAFT(3, "草稿"),
+    PUBLISHED(4, "发布");
+
+    private final Integer code;
+    private final String info;
+
+    PointActivityStatusEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+}

+ 4 - 1
nightFragrance-massage/src/main/java/com/ylx/point/enums/PointActivityTypeEnum.java

@@ -6,7 +6,10 @@ import lombok.Getter;
 public enum PointActivityTypeEnum {
 
     SIGN_TASK(0, "签到任务"),
-    ACTIVITY_TASK(1, "活动任务");
+    NEW_USER_ACTIVITY(1, "新手活动"),
+    DAILY_ACTIVITY(2, "每日活动"),
+    MONTHLY_ACTIVITY(3, "每月活动");
+
 
 
     private final Integer code;

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointActivityMapper.java

@@ -1,6 +1,8 @@
 package com.ylx.point.mapper;
 
 import com.ylx.point.domain.PointActivity;
+import com.ylx.point.domain.dto.PointActivityPageDTO;
+import com.ylx.point.domain.vo.PointActivityPageVo;
 
 import java.util.List;
 
@@ -59,4 +61,6 @@ public interface PointActivityMapper
      * @return 结果
      */
     public int deletePointActivityByIds(String[] ids);
+
+    List<PointActivityPageVo> list(PointActivityPageDTO dto);
 }

+ 3 - 1
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java

@@ -9,6 +9,8 @@ import com.ylx.point.domain.vo.PointActivityDetailsVo;
 import com.ylx.point.domain.vo.PointActivityPageVo;
 import com.ylx.point.domain.vo.PointActivityStatVo;
 
+import java.util.List;
+
 /**
  * 积分活动主Service接口
  *
@@ -17,7 +19,7 @@ import com.ylx.point.domain.vo.PointActivityStatVo;
  */
 public interface IPointActivityService {
 
-    Page<PointActivityPageVo> page(Page<PointActivity> page, PointActivityPageDTO dto);
+    List<PointActivityPageVo> list(PointActivityPageDTO dto);
 
     PointActivityDetailsVo<?> getDetailsInfo(Long id);
 

+ 64 - 27
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -1,5 +1,9 @@
 package com.ylx.point.service.impl;
 
+import java.time.DateTimeException;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -17,6 +21,7 @@ import com.ylx.point.domain.PointSignReward;
 import com.ylx.point.domain.PointSignTask;
 import com.ylx.point.domain.dto.*;
 import com.ylx.point.domain.vo.*;
+import com.ylx.point.enums.PointActivityStatusEnum;
 import com.ylx.point.enums.PointActivityTypeEnum;
 import com.ylx.point.service.IPointActivityTaskService;
 import com.ylx.point.service.IPointSignRewardService;
@@ -48,8 +53,8 @@ public class PointActivityServiceImpl implements IPointActivityService {
 
 
     @Override
-    public Page<PointActivityPageVo> page(Page<PointActivity> page, PointActivityPageDTO dto) {
-        return null;
+    public List<PointActivityPageVo> list(PointActivityPageDTO dto) {
+        return pointActivityMapper.list(dto);
     }
 
     @Override
@@ -57,23 +62,22 @@ public class PointActivityServiceImpl implements IPointActivityService {
 
         PointActivity pointActivity = this.pointActivityMapper.selectPointActivityById(id);
         if (ObjectUtil.isNull(pointActivity)) {
-            return null;
+            throw new BaseException("参数有误,活动不存在");
         }
 
         Integer activityType = pointActivity.getActivityType();
         if (PointActivityTypeEnum.SIGN_TASK.getCode().equals(activityType)) {
             PointSignTaskVo vo = this.pointSignTaskService.selectPointSignTaskByActivityId(pointActivity.getId());
             BeanUtil.copyProperties(pointActivity, vo);
-            return PointActivityDetailsVo.of(PointActivityTypeEnum.SIGN_TASK.getCode(), vo);
-        } else if (PointActivityTypeEnum.ACTIVITY_TASK.getCode().equals(activityType)) {
+            return PointActivityDetailsVo.of(activityType, vo);
+        } else {
             PointActivityTaskVo vo = new PointActivityTaskVo();
             BeanUtil.copyProperties(pointActivity, vo);
             List<PointActivityTaskDTO> activityTaskList = this.pointActivityTaskService.selectPointActivityTaskByActivityId(pointActivity.getId());
             vo.setActivityTaskList(activityTaskList);
-            return PointActivityDetailsVo.of(PointActivityTypeEnum.ACTIVITY_TASK.getCode(), vo);
+            return PointActivityDetailsVo.of(activityType, vo);
         }
 
-        return PointActivityDetailsVo.of(activityType, new PointActivityBaseVo());
     }
 
     @Override
@@ -122,32 +126,26 @@ public class PointActivityServiceImpl implements IPointActivityService {
     }
 
     private PointActivity createActivityEntity(PointActivityDTO dto) {
+
+        // 创建基础实体
         PointActivity entity = new PointActivity();
         BeanUtil.copyProperties(dto, entity);
 
+        // 处理时间配置
         PointActivityDTO.ActivityTimeConfig timeConfig = dto.getTimeConfig();
         entity.setStartTime(DateUtil.beginOfDay(timeConfig.getStartTime()));
-        
-        // 处理endTime,确保时间部分正确设置为23:59:59
-        Date endTime = timeConfig.getEndTime();
-        if (endTime != null) {
-            // 使用Java 8的日期时间API处理时区问题
-            java.time.LocalDateTime localDateTime = java.time.LocalDateTime.ofInstant(
-                endTime.toInstant(),
-                java.time.ZoneId.systemDefault()
-            );
-            // 设置为当天的23:59:59
-            java.time.LocalDateTime endOfDay = localDateTime.with(
-                java.time.LocalTime.of(23, 59, 59)
-            );
-            // 转换回Date对象
-            endTime = Date.from(
-                endOfDay.atZone(java.time.ZoneId.systemDefault()).toInstant()
-            );
-        }
-        entity.setEndTime(endTime);
+        entity.setEndTime(processEndTime(timeConfig.getEndTime()));
         entity.setIsPermanent(timeConfig.isPermanent() ? 1 : 0);
 
+        // 处理状态
+        if (PointActivityStatusEnum.PUBLISHED.getCode().equals(dto.getStatus())) {
+            entity.setStatus(determineActivityStatus(
+                    entity.getStartTime(),
+                    entity.getEndTime(),
+                    timeConfig.isPermanent()
+            ));
+        }
+
         return entity;
     }
 
@@ -161,7 +159,7 @@ public class PointActivityServiceImpl implements IPointActivityService {
     private void saveActivityDetails(PointActivityDTO dto, Long activityId) {
         if (PointActivityTypeEnum.SIGN_TASK.getCode().equals(dto.getActivityType())) {
             saveSignTaskDetails(dto, activityId);
-        } else if (PointActivityTypeEnum.ACTIVITY_TASK.getCode().equals(dto.getActivityType())) {
+        } else {
             saveActivityTaskDetails(dto, activityId);
         }
     }
@@ -228,4 +226,43 @@ public class PointActivityServiceImpl implements IPointActivityService {
 
         pointActivityTaskService.batchInsertPointActivityTask(activityTasks);
     }
+
+    /**
+     * 处理结束时间,设置为当天的23:59:59
+     */
+    private Date processEndTime(Date endTime) {
+        if (endTime == null) {
+            return null;
+        }
+
+        try {
+            LocalDateTime localDateTime = LocalDateTime.ofInstant(
+                    endTime.toInstant(),
+                    ZoneId.systemDefault()
+            );
+            LocalDateTime endOfDay = localDateTime.with(
+                    java.time.LocalTime.of(23, 59, 59));
+            return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
+        } catch (DateTimeException e) {
+            throw new IllegalArgumentException("Invalid end time", e);
+        }
+    }
+
+    /**
+     * 确定活动状态
+     */
+    private Integer determineActivityStatus(Date startTime, Date endTime, boolean isPermanent) {
+        if (isPermanent) {
+            return PointActivityStatusEnum.IN_PROGRESS.getCode();
+        }
+
+        Date now = DateUtils.getNowDate();
+        if (startTime.after(now)) {
+            return PointActivityStatusEnum.NOT_START.getCode();
+        } else if (endTime != null && endTime.before(now)) {
+            return PointActivityStatusEnum.FINISHED.getCode();
+        } else {
+            return PointActivityStatusEnum.IN_PROGRESS.getCode();
+        }
+    }
 }

+ 24 - 1
nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml

@@ -50,7 +50,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectPointActivityVo"/>
         where id = #{id}
     </select>
-        
+    <select id="list" parameterType="PointActivityPageDTO" resultType="com.ylx.point.domain.vo.PointActivityPageVo">
+        <include refid="selectPointActivityVo"/>
+        <where>
+            <if test="activityType != null">
+                AND activity_type = #{activityType}
+            </if>
+            <if test="cityCode != null and cityCode != ''">
+                AND city_code = #{cityCode}
+            </if>
+            <if test="status != null">
+                AND status = #{status}
+            </if>
+            <if test="startTime != null and startTime != ''"><!-- 开始时间检索 -->
+                and date_format(start_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')
+            </if>
+            <if test="endTime != null and endTime != ''"><!-- 结束时间检索 -->
+                and date_format(end_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')
+            </if>
+        </where>
+        order by create_time desc ,sort_order desc
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+
     <insert id="insertPointActivity" parameterType="PointActivity" useGeneratedKeys="true" keyProperty="id">
         insert into point_activity
         <trim prefix="(" suffix=")" suffixOverrides=",">