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/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
@@ -71,6 +71,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,77 @@ 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.after(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) { System.out.println("进行中"); return !now.before(activity.getReportStartTime()) && !now.after(activity.getReportEndTime()); } private boolean isRecruiting(Date now, Activity activity) { System.out.println("报名中"); return !now.before(activity.getStartTime()) && !now.after(activity.getEndTime()); } }