diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/admin/RankController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/admin/RankController.java new file mode 100644 index 00000000..45cc462f --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/admin/RankController.java @@ -0,0 +1,70 @@ +package com.ruoyi.cai.controller.admin; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.cai.domain.Rank; +import com.ruoyi.cai.service.RankService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; + +/** + * 榜单 + * + * @author 77 + * @date 2024-01-20 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/cai/rank") +public class RankController extends BaseController { + + private final RankService rankService; + + /** + * 查询榜单列表 + */ + @SaCheckPermission("cai:rank:list") + @GetMapping("/list") + public TableDataInfo list(Rank bo, PageQuery pageQuery) { + Page page = rankService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)); + return TableDataInfo.build(page); + } + + /** + * 获取榜单详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("cai:rank:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Integer id) { + return R.ok(rankService.getById(id)); + } + + /** + * 删除榜单 + * + * @param ids 主键串 + */ + @SaCheckPermission("cai:rank:remove") + @Log(title = "榜单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Integer[] ids) { + return toAjax(rankService.removeBatchByIds(Arrays.asList(ids))); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Rank.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Rank.java new file mode 100644 index 00000000..6f7ba750 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/Rank.java @@ -0,0 +1,58 @@ +package com.ruoyi.cai.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.Date; +import java.math.BigDecimal; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 榜单对象 cai_rank + * + * @author 77 + * @date 2024-01-20 + */ +@Data +@TableName("cai_rank") +public class Rank implements Serializable { + + private static final long serialVersionUID=1L; + + /** + * + */ + @TableId(value = "id") + private Integer id; + /** + * 类型 1-魅力榜 2-邀请榜 + */ + private Integer type; + /** + * 日期类型 1-日榜 2-周榜 3-月榜 + */ + private Integer dataType; + /** + * 榜单期数 + */ + private String rankTime; + + private LocalDate rankBeginTime; + private LocalDate rankEndTime; + private Integer orderRank; + /** + * 数值 + */ + private Long num; + /** + * + */ + private Long userId; + /** + * 是否领取奖励 + */ + private boolean draw; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/RankMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/RankMapper.java new file mode 100644 index 00000000..244ba0b6 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/RankMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cai.domain.Rank; + +/** + * 榜单Mapper接口 + * + * @author 77 + * @date 2024-01-20 + */ +public interface RankMapper extends BaseMapper { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RankService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RankService.java new file mode 100644 index 00000000..f0c84028 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/RankService.java @@ -0,0 +1,21 @@ +package com.ruoyi.cai.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cai.domain.Rank; + +import java.time.LocalDate; + +/** + * 榜单Service接口 + * + * @author 77 + * @date 2024-01-20 + */ +public interface RankService extends IService { + + void saveDayRank(LocalDate date,Integer type); + + void saveWeekRank(LocalDate date,Integer type); + + void saveMonthRank(LocalDate date,Integer type); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RankServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RankServiceImpl.java new file mode 100644 index 00000000..c1f17722 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/RankServiceImpl.java @@ -0,0 +1,193 @@ +package com.ruoyi.cai.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cai.domain.Rank; +import com.ruoyi.cai.mapper.RankMapper; +import com.ruoyi.cai.rank.RankManager; +import com.ruoyi.cai.rank.RankNode; +import com.ruoyi.cai.service.RankService; +import com.ruoyi.cai.service.UserService; +import com.ruoyi.common.exception.ServiceException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 榜单Service业务层处理 + * + * @author 77 + * @date 2024-01-20 + */ +@RequiredArgsConstructor +@Service +@Slf4j +public class RankServiceImpl extends ServiceImpl implements RankService { + + @Autowired + private RankManager rankManager; + @Autowired + private UserService userService; + + @Override + public void saveDayRank(LocalDate date, Integer type) { + List rank; + if(type == 1){ + rank = rankManager.getLoveRankDay(date, 30); + }else if(type == 2){ + rank = rankManager.getInviteRankDay(date, 30); + }else{ + throw new ServiceException("type 参数错误"); + } + if(CollectionUtil.isEmpty(rank)){ + return; + } + boolean exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + ReentrantLock lock = new ReentrantLock(); + try { + lock.lock(); + exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + List res = new ArrayList<>(); + for (int i = 0; i < rank.size(); i++) { + RankNode rankNode = rank.get(i); + Rank db = new Rank(); + db.setType(type); + db.setDataType(1); + db.setRankTime(date.format(DateTimeFormatter.ofPattern("yyyyMMdd"))); + db.setRankBeginTime(date); + db.setRankEndTime(date); + db.setOrderRank(i+1); + db.setNum(rankNode.getScore()); + db.setUserId(rankNode.getUserId()); + res.add(db); + } + this.saveBatch(res); + }finally { + lock.unlock(); + } + + } + + @Override + public void saveWeekRank(LocalDate date, Integer type) { + List rank; + if(type == 1){ + rank = rankManager.getLoveRankWeek(date, 30); + }else if(type == 2){ + rank = rankManager.getInviteRankWeek(date, 30); + }else{ + throw new ServiceException("type 参数错误"); + } + if(CollectionUtil.isEmpty(rank)){ + return; + } + boolean exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + ReentrantLock lock = new ReentrantLock(); + try { + lock.lock(); + exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + List res = new ArrayList<>(); + LocalDate endDate = date.plusDays(7); + String rankTime = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) +"-"+endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + for (int i = 0; i < rank.size(); i++) { + RankNode rankNode = rank.get(i); + Rank db = new Rank(); + db.setType(type); + db.setDataType(2); + db.setRankTime(rankTime); + db.setRankBeginTime(date); + db.setRankEndTime(endDate); + db.setOrderRank(i+1); + db.setNum(rankNode.getScore()); + db.setUserId(rankNode.getUserId()); + res.add(db); + } + this.saveBatch(res); + }finally { + lock.unlock(); + } + } + + @Override + public void saveMonthRank(LocalDate date, Integer type) { + List rank; + if(type == 1){ + rank = rankManager.getLoveRankDay(date, 30); + }else if(type == 2){ + rank = rankManager.getInviteRankDay(date, 30); + }else{ + throw new ServiceException("type 参数错误"); + } + if(CollectionUtil.isEmpty(rank)){ + return; + } + boolean exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + ReentrantLock lock = new ReentrantLock(); + try { + lock.lock(); + exists = this.exists(Wrappers.lambdaQuery(Rank.class) + .eq(Rank::getType, type) + .eq(Rank::getRankBeginTime, date)); + if(exists){ + log.error("本期榜单已经持久化 date={},type={}",date,type); + return; + } + LocalDate endDate = date.plusMonths(1).plusDays(-1); + List res = new ArrayList<>(); + for (int i = 0; i < rank.size(); i++) { + RankNode rankNode = rank.get(i); + Rank db = new Rank(); + db.setType(type); + db.setDataType(3); + db.setRankTime(date.format(DateTimeFormatter.ofPattern("yyMM"))); + db.setRankBeginTime(date); + db.setRankEndTime(endDate); + db.setOrderRank(i+1); + db.setNum(rankNode.getScore()); + db.setUserId(rankNode.getUserId()); + res.add(db); + } + this.saveBatch(res); + }finally { + lock.unlock(); + } + } +} diff --git a/ruoyi-cai/src/main/resources/mapper/cai/RankMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/RankMapper.xml new file mode 100644 index 00000000..08782d6f --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/RankMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + +