提交
This commit is contained in:
@@ -3,6 +3,7 @@ package com.ruoyi.admin.controller;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.ruoyi.admin.domain.body.AddRobotBody;
|
||||
import com.ruoyi.admin.service.TtRollCdkService;
|
||||
import com.ruoyi.admin.service.TtRollService;
|
||||
import com.ruoyi.admin.service.TtRollUserService;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
@@ -16,6 +17,7 @@ import com.ruoyi.domain.dto.roll.GetRollPrizePool;
|
||||
import com.ruoyi.domain.dto.roll.InviteRollUser;
|
||||
import com.ruoyi.domain.entity.roll.TtRoll;
|
||||
import com.ruoyi.domain.entity.roll.TtRollBody;
|
||||
import com.ruoyi.domain.entity.roll.TtRollCdk;
|
||||
import com.ruoyi.domain.entity.roll.TtRollUser;
|
||||
import com.ruoyi.domain.entity.sys.TtUser;
|
||||
import com.ruoyi.domain.vo.TtRollPrizeDataVO;
|
||||
@@ -37,11 +39,14 @@ public class TtRollController extends BaseController {
|
||||
|
||||
private final TtRollService rollService;
|
||||
private final TtRollUserService rollUserService;
|
||||
private final TtRollCdkService rollCdkService;
|
||||
|
||||
public TtRollController(TtRollService rollService,
|
||||
TtRollUserService rollUserService) {
|
||||
TtRollUserService rollUserService,
|
||||
TtRollCdkService rollCdkService) {
|
||||
this.rollService = rollService;
|
||||
this.rollUserService = rollUserService;
|
||||
this.rollCdkService = rollCdkService;
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@@ -177,4 +182,37 @@ public class TtRollController extends BaseController {
|
||||
public AjaxResult addRobot(@RequestBody AddRobotBody addRobotBody) {
|
||||
return rollService.addRobot(addRobotBody);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class GenerateCdkBody {
|
||||
/** Roll房ID */
|
||||
@NotNull(message = "rollId不能为空")
|
||||
private Integer rollId;
|
||||
/** 要生成的CDK数量 */
|
||||
@NotNull(message = "数量不能为空")
|
||||
private Integer count;
|
||||
}
|
||||
|
||||
/** 为Roll房批量生成CDK */
|
||||
@ApiOperation("为Roll房批量生成CDK")
|
||||
@PostMapping("/cdk/generate")
|
||||
public AjaxResult generateCdk(@RequestBody @Validated GenerateCdkBody body) {
|
||||
rollCdkService.generateCdks(body.getRollId(), body.getCount());
|
||||
return success("生成成功");
|
||||
}
|
||||
|
||||
/** 查看Roll房所有CDK列表 */
|
||||
@ApiOperation("查看Roll房CDK列表")
|
||||
@GetMapping("/cdk/list/{rollId}")
|
||||
public AjaxResult getCdkList(@PathVariable("rollId") Integer rollId) {
|
||||
List<TtRollCdk> list = rollCdkService.listByRollId(rollId);
|
||||
return success(list);
|
||||
}
|
||||
|
||||
/** 删除指定CDK */
|
||||
@ApiOperation("删除CDK")
|
||||
@DeleteMapping("/cdk/{cdkId}")
|
||||
public AjaxResult deleteCdk(@PathVariable("cdkId") Integer cdkId) {
|
||||
return toAjax(rollCdkService.removeById(cdkId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ruoyi.admin.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.ruoyi.domain.entity.roll.TtRollCdk;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface TtRollCdkMapper extends BaseMapper<TtRollCdk> {
|
||||
|
||||
/**
|
||||
* 查询Roll房的所有CDK列表
|
||||
*/
|
||||
List<TtRollCdk> listByRollId(@Param("rollId") Integer rollId);
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.ruoyi.admin.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.ruoyi.domain.entity.roll.TtRollCdk;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TtRollCdkService extends IService<TtRollCdk> {
|
||||
|
||||
/**
|
||||
* 为指定Roll房批量生成 count 个 CDK
|
||||
*/
|
||||
void generateCdks(Integer rollId, int count);
|
||||
|
||||
/**
|
||||
* 查询Roll房所有CDK列表
|
||||
*/
|
||||
List<TtRollCdk> listByRollId(Integer rollId);
|
||||
|
||||
/**
|
||||
* 使用CDK(验证并占用):成功返回 true,失败返回错误信息
|
||||
* @param rollId Roll房ID
|
||||
* @param cdkCode 用户输入的CDK码
|
||||
* @param userId 使用者ID
|
||||
* @return null 表示验证通过;非 null 字符串为错误原因
|
||||
*/
|
||||
String useCdk(Integer rollId, String cdkCode, Integer userId);
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.ruoyi.admin.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.ruoyi.admin.mapper.TtRollCdkMapper;
|
||||
import com.ruoyi.admin.service.TtRollCdkService;
|
||||
import com.ruoyi.domain.entity.roll.TtRollCdk;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
public class TtRollCdkServiceImpl extends ServiceImpl<TtRollCdkMapper, TtRollCdk>
|
||||
implements TtRollCdkService {
|
||||
|
||||
@Override
|
||||
public void generateCdks(Integer rollId, int count) {
|
||||
List<TtRollCdk> cdkList = new ArrayList<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
// 生成32位随机码,去掉横线,全大写
|
||||
String code = UUID.randomUUID().toString().replace("-", "").toUpperCase();
|
||||
TtRollCdk cdk = TtRollCdk.builder()
|
||||
.rollId(rollId)
|
||||
.cdkCode(code)
|
||||
.status("0") // 0=未使用
|
||||
.createTime(new Date())
|
||||
.build();
|
||||
cdkList.add(cdk);
|
||||
}
|
||||
this.saveBatch(cdkList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TtRollCdk> listByRollId(Integer rollId) {
|
||||
return baseMapper.listByRollId(rollId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String useCdk(Integer rollId, String cdkCode, Integer userId) {
|
||||
// 1. 查找这个 CDK 是否存在且属于该Roll房
|
||||
TtRollCdk cdk = new LambdaQueryChainWrapper<>(baseMapper)
|
||||
.eq(TtRollCdk::getRollId, rollId)
|
||||
.eq(TtRollCdk::getCdkCode, cdkCode)
|
||||
.one();
|
||||
|
||||
if (cdk == null) {
|
||||
return "CDK不存在或不属于该房间!";
|
||||
}
|
||||
if ("1".equals(cdk.getStatus())) {
|
||||
return "该CDK已被使用,请使用新的CDK!";
|
||||
}
|
||||
|
||||
// 2. 原子更新:CAS 将 status 从 0 改为 1,防止并发
|
||||
boolean updated = new LambdaUpdateChainWrapper<>(baseMapper)
|
||||
.eq(TtRollCdk::getId, cdk.getId())
|
||||
.eq(TtRollCdk::getStatus, "0") // 乐观锁:只有未使用才能更新
|
||||
.set(TtRollCdk::getStatus, "1")
|
||||
.set(TtRollCdk::getUsedUserId, userId)
|
||||
.set(TtRollCdk::getUsedTime, new Date())
|
||||
.update();
|
||||
|
||||
if (!updated) {
|
||||
return "该CDK已被使用,请使用新的CDK!";
|
||||
}
|
||||
|
||||
return null; // null 表示成功
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.admin.mapper.TtRollCdkMapper">
|
||||
|
||||
<select id="listByRollId" resultType="com.ruoyi.domain.entity.roll.TtRollCdk">
|
||||
SELECT id, roll_id, cdk_code, status, used_user_id, used_time, create_time
|
||||
FROM tt_roll_cdk
|
||||
WHERE roll_id = #{rollId}
|
||||
ORDER BY id ASC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user