xiangpei
2025-05-26 e1350e5565e0119d63e95069d6b0ee135795426d
Merge remote-tracking branch 'origin/dev' into dev
6个文件已修改
9个文件已添加
414 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/MyActivityController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/common/enums/ActivityStatusEnum.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/ActivityForm.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/ActivityReportQuery.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/MyActivityQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ActivityReportVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ActivityVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/MyActivityVo.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/ActivityMapper.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/ActivityService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/MyActivityService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/ActivityServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/MyActivityServiceImpl.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/ActivityMapper.xml 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lmk-job/src/main/java/cn/lili/job/ActivityJob.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/MyActivityController.java
New file
@@ -0,0 +1,35 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.query.ActivityReportQuery;
import cn.lili.modules.lmk.domain.query.MyActivityQuery;
import cn.lili.modules.lmk.service.ActivityService;
import cn.lili.modules.lmk.service.MyActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RequiredArgsConstructor
@Api(value = "我的活动", tags = "我的活动管理")
@RestController
@RequestMapping("/buyer/lmk/my-activity")
public class MyActivityController {
    private final MyActivityService myActivityService;
    @GetMapping("/getMyActivityList")
    @ApiOperation(value = "获得我的活动列表", notes = "获得我的活动列表")
    public Result getMyActivityList(MyActivityQuery query){
        return myActivityService.getMyActivityList(query);
    }
    @PutMapping("/cancelActivity")
    @ApiOperation(value = "获得我的活动列表", notes = "获得我的活动列表")
    public Result cancelActivity(@RequestBody ActivityReportQuery query){
        return myActivityService.cancelActivity(query);
    }
}
framework/src/main/java/cn/lili/common/enums/ActivityStatusEnum.java
New file
@@ -0,0 +1,20 @@
package cn.lili.common.enums;
import lombok.Getter;
@Getter
public enum ActivityStatusEnum {
    NOT_STARTED("未开始"),
    REPORT("报名中"),
    IN_PROGRESS("进行中"),
    ENDED("已结束");
    private String type;
    ActivityStatusEnum(String type) {
        this.type = type;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/ActivityForm.java
@@ -62,7 +62,6 @@
    private Date endTime;
    /** 活动状态 */
    @NotBlank(message = "活动状态不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty(value = "活动状态")
    private String status;
framework/src/main/java/cn/lili/modules/lmk/domain/query/ActivityReportQuery.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.domain.query;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "ActivityReport查询参数", description = "活动查询参数")
public class ActivityReportQuery {
    /** 用户id*/
    private String userId;
    /** 活动id*/
    private String activityId;
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/MyActivityQuery.java
New file
@@ -0,0 +1,22 @@
package cn.lili.modules.lmk.domain.query;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "小程序端我的活动活动查询参数", description = "小程序端我的活动活动查询参数")
public class MyActivityQuery {
    /** 活动状态*/
    private String status;
    /** 是否取消*/
    private Boolean cancel;
    @NotBlank
    private String id;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ActivityReportVO.java
New file
@@ -0,0 +1,15 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "ActivityReport中间表响应数据", description = "响应数据")
public class ActivityReportVO extends AbsVo {
    /** 活动id*/
    private String activityId;
    /** 用户id*/
    private String userId;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ActivityVO.java
@@ -16,7 +16,7 @@
import java.util.List;
@Data
@ApiModel(value = "Activity查询参数", description = "活动查表单")
@ApiModel(value = "Activity响应数据", description = "响应数据")
public class ActivityVO extends AbsVo {
    /** 活动名称 */
framework/src/main/java/cn/lili/modules/lmk/domain/vo/MyActivityVo.java
New file
@@ -0,0 +1,57 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@ApiModel(value = "MyActivity响应数据", description = "MyActivity响应数据")
public class MyActivityVo extends AbsVo {
    /** 活动封面*/
    private String cover;
    /** 封面类型 */
    @ApiModelProperty(value = "封面类型:视频、文字、图片", example = "图片")
    private String coverType;
    /** 活动封面url*/
    private String url;
    /** 活动类型 */
    @ApiModelProperty(value = "活动类型:线上/线下,目前默认都是线下", example = "线下")
    private String activityType;
    /** 活动名*/
    private String activityName;
    @ApiModelProperty(value = "活动开始时间", example = "2025-06-01 08:30:00")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;
    /** 活动结束时间 */
    @ApiModelProperty(value = "活动结束时间", example = "2025-06-01 17:00:00")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;
    /** 活动状态 */
    @ApiModelProperty(value = "活动状态", example = "进行中/已结束/已取消")
    private String status;
    /** 活动地点 */
    @ApiModelProperty(value = "活动地点", example = "北京市朝阳区奥林匹克公园")
    private String activityLocation;
    /** 是否取消*/
    private boolean cancel;
    /** 报名中间表id*/
    private String activityReportId;
}
framework/src/main/java/cn/lili/modules/lmk/mapper/ActivityMapper.java
@@ -2,11 +2,11 @@
import cn.lili.modules.lmk.domain.entity.Activity;
import cn.lili.modules.lmk.domain.entity.CustomerBlack;
import cn.lili.modules.lmk.domain.query.ActivityMembersQuery;
import cn.lili.modules.lmk.domain.query.ActivityQuery;
import cn.lili.modules.lmk.domain.query.CustomerBlackQuery;
import cn.lili.modules.lmk.domain.query.*;
import cn.lili.modules.lmk.domain.vo.ActivityReportVO;
import cn.lili.modules.lmk.domain.vo.ActivityVO;
import cn.lili.modules.lmk.domain.vo.CustomerBlackVO;
import cn.lili.modules.lmk.domain.vo.MyActivityVo;
import cn.lili.modules.member.entity.vo.MemberVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -38,4 +38,17 @@
    IPage getMembers(IPage page, @Param("query") ActivityMembersQuery query);
    List<MyActivityVo> getMyActivityList(@Param("query")MyActivityQuery query);
    int cancelActivity(String id);
    ActivityReportVO getActivityReport(@Param("query")ActivityReportQuery query);
    /**
     * 批量更新活动
     * @param activityList 待更新实体列表(必须包含ID)
     * @return 受影响的行数
     */
    int batchUpdateActivities(@Param("list") List<Activity> activityList);
}
framework/src/main/java/cn/lili/modules/lmk/service/ActivityService.java
@@ -5,6 +5,7 @@
import cn.lili.modules.lmk.domain.form.ActivityForm;
import cn.lili.modules.lmk.domain.query.ActivityMembersQuery;
import cn.lili.modules.lmk.domain.query.ActivityQuery;
import cn.lili.modules.lmk.domain.query.MyActivityQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
@@ -71,4 +72,5 @@
    Result activityChangeRecommend(ActivityForm form);
    Result activityMembersPage(ActivityMembersQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/MyActivityService.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.service;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.entity.Activity;
import cn.lili.modules.lmk.domain.query.ActivityReportQuery;
import cn.lili.modules.lmk.domain.query.MyActivityQuery;
import com.baomidou.mybatisplus.extension.service.IService;
public interface MyActivityService extends IService<Activity> {
    public Result getMyActivityList(MyActivityQuery query);
    public Result cancelActivity(ActivityReportQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/ActivityServiceImpl.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.service.impl;
import cn.lili.base.Result;
import cn.lili.common.enums.ActivityStatusEnum;
import cn.lili.modules.lmk.domain.entity.Activity;
import cn.lili.modules.lmk.domain.entity.CustomerBlack;
import cn.lili.modules.lmk.domain.entity.CustomerTagRef;
@@ -42,7 +43,7 @@
    public Result add(ActivityForm form) {
        Activity entity = ActivityForm.getEntityByForm(form, null);
        //默认新增活动为
        entity.setStatus("未开始");
        entity.setStatus(ActivityStatusEnum.NOT_STARTED.getType());
        //默认不为推荐
        entity.setRecommend(false);
@@ -71,6 +72,10 @@
        return Result.ok("修改成功");
    }
    public void updateByList(List<Activity> vo){
    }
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
framework/src/main/java/cn/lili/modules/lmk/service/impl/MyActivityServiceImpl.java
New file
@@ -0,0 +1,64 @@
package cn.lili.modules.lmk.service.impl;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.entity.Activity;
import cn.lili.modules.lmk.domain.query.ActivityReportQuery;
import cn.lili.modules.lmk.domain.query.MyActivityQuery;
import cn.lili.modules.lmk.domain.vo.ActivityReportVO;
import cn.lili.modules.lmk.domain.vo.ActivityVO;
import cn.lili.modules.lmk.domain.vo.MyActivityVo;
import cn.lili.modules.lmk.mapper.ActivityMapper;
import cn.lili.modules.lmk.service.LmkFileService;
import cn.lili.modules.lmk.service.MyActivityService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
@RequiredArgsConstructor
public class MyActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> implements MyActivityService {
    private final ActivityMapper activityMapper;
    private final LmkFileService lmkFileService;
    @Override
    public Result getMyActivityList(MyActivityQuery query) {
        List<MyActivityVo>  myActivityList = activityMapper.getMyActivityList(query);
        for (MyActivityVo vo : myActivityList) {
            System.out.println(vo);
            if (!"文字".equals(vo.getCoverType())){
//                String url = lmkFileService.getPreviewUrl(vo.getCover());
//                vo.setUrl(url);
            }
        }
        return Result.ok().data(myActivityList);
    }
    @Override
    public Result cancelActivity(ActivityReportQuery query) {
       //  TODO  判断是否在报名时间内 在的话可以取消报名, (若有报名费需要退款)
        ActivityReportVO vo = activityMapper.getActivityReport(query);
        Activity activity = activityMapper.selectById(vo.getActivityId());
        Date date = new Date();
        if(!date.before(activity.getReportStartTime()) && !date.after(activity.getReportEndTime())){
            int affectedRows = activityMapper.cancelActivity(vo.getId());
            if (affectedRows > 0) {
                return Result.ok("活动取消成功");
            } else {
                // 可选:记录警告日志
                throw new RuntimeException("活动不存在或已取消");
            }
        }else {
            throw new RuntimeException("活动已不在报名时间内无法取消");
        }
    }
}
framework/src/main/resources/mapper/lmk/ActivityMapper.xml
@@ -20,9 +20,50 @@
        <result column="activity_content" property="activityContent" />
    </resultMap>
    <resultMap id="MyActivityResultMap" type="cn.lili.modules.lmk.domain.vo.MyActivityVo">
        <result column="activity_name" property="activityName" />
        <result column="activity_type" property="activityType"/>
        <result column="end_time" property="endTime" />
        <result column="status" property="status" />
        <result column="cover" property="cover" />
        <result column="cover_type" property="coverType" />
        <result column="activity_location" property="activityLocation" />
        <result column="cancel" property="cancel"/>
        <result column="activity_report_id" property="activityReportId"/>
    </resultMap>
    <resultMap id="ActivityReportMap" type="cn.lili.modules.lmk.domain.vo.ActivityReportVO">
        <result column="activity_id" property="activityId"/>
        <result column="user_id" property="userId"/>
    </resultMap>
    <select id="getMyActivityList" resultMap="MyActivityResultMap">
        SELECT
            LA.id,
            LA.activity_name,
            LA.activity_type,
            LA.start_time,
            LA.end_time,
            LA.status,
            LA.cover,
            LA.cover_type,
            LA.activity_location,
            LAR.cancel,
            LA.id as activity_report_id
        FROM lmk_activity_report LAR
                 LEFT JOIN lmk_activity LA ON LAR.activity_id = LA.id
        where  LA.delete_flag = 0
          AND LAR.delete_flag = 0
          AND LAR.user_id = #{query.id}
          AND LAR.cancel = #{query.cancel}
        <if test="query.status == null or query.status == ''">
            AND LA.status != '已结束'
        </if>
        <if test="query.status != null and query.status != ''">
          AND LA.status = #{query.status}
          </if>
    </select>
@@ -107,4 +148,31 @@
        WHERE LAR.activity_id = #{query.id}
    </select>
    <update id="cancelActivity" >
        UPDATE
            lmk_activity_report LAR
        SET LAR.cancel = true where LAR.id = #{id}
    </update>
    <select id="getActivityReport" resultMap="ActivityReportMap">
        SELECT LAR.* FROM lmk_activity_report LAR
        WHERE LAR.user_id = #{query.userId} and LAR.activity_id = #{query.activityId}
    </select>
    <update id="batchUpdateActivities">
        UPDATE lmk_activity
        <trim prefix="SET" suffixOverrides=",">
            <trim prefix="status = CASE id" suffix="END,">
                <foreach collection="list" item="item">
                    WHEN #{item.id} THEN #{item.status}
                </foreach>
            </trim>
        </trim>
        WHERE id IN
        <foreach collection="list" item="item" open="(" separator="," close=")">
            #{item.id}
        </foreach>
    </update>
</mapper>
lmk-job/src/main/java/cn/lili/job/ActivityJob.java
New file
@@ -0,0 +1,74 @@
package cn.lili.job;
import cn.lili.common.enums.ActivityStatusEnum;
import cn.lili.modules.lmk.domain.entity.Activity;
import cn.lili.modules.lmk.domain.entity.CustomerBlack;
import cn.lili.modules.lmk.domain.vo.ActivityVO;
import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO;
import cn.lili.modules.lmk.enums.general.CollectTypeEnum;
import cn.lili.modules.lmk.mapper.ActivityMapper;
import cn.lili.modules.lmk.service.ActivityService;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 活动相关任务
 * */
@Component
@RequiredArgsConstructor
public class ActivityJob {
    private final ActivityMapper activityMapper;
    /**
     * 更具报名时间段与活冻时间段,改变活动状态
     *
     * */
    @XxlJob("activityStatusJob")
    public void activityStatusJob() throws Exception {
        XxlJobHelper.log("开始执行:活动状态改变");
        //获得所有 活动
        List<Activity> activeActivities = new LambdaQueryChainWrapper<Activity>(activityMapper)
                .orderByAsc(Activity::getCreateTime)  // 按创建时间升序
                .list();
        Date now = new Date(); // 获取当前时间
        for (Activity activity : activeActivities) {
            if (isInProgress(now, activity)) {
                activity.setStatus(ActivityStatusEnum.IN_PROGRESS.getType());
            } else if (isRecruiting(now, activity)) {
                activity.setStatus(ActivityStatusEnum.REPORT.getType());
            } else if (now.before(activity.getReportStartTime())) {
                activity.setStatus(ActivityStatusEnum.NOT_STARTED.getType());
            } else {
                activity.setStatus(ActivityStatusEnum.ENDED.getType());
            }
        }
        activityMapper.batchUpdateActivities(activeActivities);
        // 修改
        XxlJobHelper.log("执行完成:活动状态改变");
    }
    private boolean isInProgress(Date now, Activity activity) {
        return  !now.before(activity.getStartTime()) && !now.after(activity.getEndTime());
    }
    private boolean isRecruiting(Date now, Activity activity) {
        return !now.before(activity.getReportStartTime()) && !now.after(activity.getReportEndTime());
    }
}