提交
This commit is contained in:
@@ -19,31 +19,10 @@
|
||||
|
||||
<!-- 统计信息卡片 -->
|
||||
<div class="knapsack-stats">
|
||||
<div class="stats-item">饰品总数:{{ totalOrnamentNumber }}</div>
|
||||
<div class="stats-divider"></div>
|
||||
<div class="stats-item">饰品总价值:{{ totalOrnamentPrice }}</div>
|
||||
<div class="stats-item">物品总数:{{ totalOrnamentNumber }}</div>
|
||||
</div>
|
||||
|
||||
<!-- 工具栏:排序 + 搜索 -->
|
||||
<div class="knapsack-toolbar">
|
||||
<div class="sort-btn" @click.stop="selectlist = !selectlist">
|
||||
{{ selected }}
|
||||
<div class="sort-dropdown" v-if="selectlist">
|
||||
<div class="sort-option" @click.stop="handlesort(0); playAudio();">默认排序</div>
|
||||
<div class="sort-option" @click.stop="handlesort(1); playAudio();">价格从低到高</div>
|
||||
<div class="sort-option" @click.stop="handlesort(2); playAudio();">价格从高到低</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-box">
|
||||
<input
|
||||
type="text"
|
||||
v-model="page.name"
|
||||
placeholder="请输入饰品名称"
|
||||
@keyup.enter="handlesearch"
|
||||
/>
|
||||
<span class="search-icon" @click="handlesearch">🔍</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 物品网格列表 -->
|
||||
<div class="knapsack-grid" @scroll="scroll">
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
name
|
||||
id
|
||||
style="serch"
|
||||
placeholder="请输入ROLL房密码"
|
||||
:placeholder="obj.hasCdk ? '请输入CDK码' : '请输入ROLL房密码'"
|
||||
/>
|
||||
</div>
|
||||
<div class="lvbu"></div>
|
||||
@@ -239,13 +239,6 @@ export default {
|
||||
this.RollPlayers();
|
||||
this.RollPrizePool();
|
||||
this.RollOpenPrize();
|
||||
// autoJoin: 如果是从列表页点击“立即加入”跳转过来
|
||||
if (localStorage.getItem('autoJoin') === '1') {
|
||||
localStorage.removeItem('autoJoin');
|
||||
this.$nextTick(() => {
|
||||
setTimeout(() => { this.handlejoin(); }, 600);
|
||||
});
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.countdownTimer) clearInterval(this.countdownTimer);
|
||||
@@ -347,7 +340,10 @@ export default {
|
||||
this.pass = "";
|
||||
},
|
||||
join() {
|
||||
joinRoll(this.id, this.pass).then((res) => {
|
||||
// CDK房间传 cdkCode,普通密码房间传 rollPassword
|
||||
const rollPassword = this.obj.hasCdk ? "" : this.pass;
|
||||
const cdkCode = this.obj.hasCdk ? this.pass : "";
|
||||
joinRoll(this.id, rollPassword, cdkCode).then((res) => {
|
||||
console.log("加入roll房", res);
|
||||
if (res.data.code == 200) {
|
||||
console.log("加入成功");
|
||||
@@ -374,7 +370,14 @@ export default {
|
||||
},
|
||||
handlejoin() {
|
||||
console.log(111);
|
||||
if (this.obj.hasPW) {
|
||||
// 已加入该房间则不再重复弹窗
|
||||
const myUserId = this.USER_INFO && this.USER_INFO.userId;
|
||||
if (myUserId && this.playerList.some(p => p.userId === myUserId)) {
|
||||
this.$message({ message: '您已在该房间内,请等待开奖', type: 'info', customClass: 'log_warning' });
|
||||
return;
|
||||
}
|
||||
// 有普通密码或有CDK,都需要弹出输入框
|
||||
if (this.obj.hasPW || this.obj.hasCdk) {
|
||||
this.isjoin = true;
|
||||
return;
|
||||
}
|
||||
@@ -391,8 +394,14 @@ export default {
|
||||
// this.getDetial();
|
||||
},
|
||||
getDetial() {
|
||||
// autoJoin: 如果是从列表页点击"立即加入"跳转过来,等详情加载完再触发
|
||||
const autoJoin = localStorage.getItem('autoJoin') === '1';
|
||||
if (autoJoin) localStorage.removeItem('autoJoin');
|
||||
getRollDetial(this.id).then((res) => {
|
||||
this.obj = res.data.data;
|
||||
if (autoJoin) {
|
||||
this.$nextTick(() => { this.handlejoin(); });
|
||||
}
|
||||
this.list = this.obj.jackpotOrnamentsDataList.sort((a, b) => {
|
||||
return b.price - a.price;
|
||||
});
|
||||
|
||||
@@ -212,4 +212,31 @@ export function addRobot(data) {
|
||||
method: "post",
|
||||
data: data
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// ---- CDK 相关接口 ----
|
||||
|
||||
/** 为Roll房批量生成CDK */
|
||||
export function generateRollCdk(data) {
|
||||
return request({
|
||||
url: '/admin/roll/cdk/generate',
|
||||
method: 'post',
|
||||
data: data
|
||||
});
|
||||
}
|
||||
|
||||
/** 查询Roll房CDK列表 */
|
||||
export function getRollCdkList(rollId) {
|
||||
return request({
|
||||
url: `/admin/roll/cdk/list/${rollId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
/** 删除CDK */
|
||||
export function deleteRollCdk(cdkId) {
|
||||
return request({
|
||||
url: `/admin/roll/cdk/${cdkId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -117,6 +117,7 @@
|
||||
<el-button type="text" size="mini" icon="el-icon-edit" @click="handleChange(scope.row)">修改</el-button>
|
||||
<el-button type="text" size="mini" icon="el-icon-view" @click="handleSelect(scope.row)">详情</el-button>
|
||||
<el-button type="text" size="mini" icon="el-icon-view" @click="handleRouter(scope.row)">装备列表</el-button>
|
||||
<el-button type="text" size="mini" icon="el-icon-key" @click="handleCdk(scope.row)">CDK</el-button>
|
||||
<el-button type="text" size="mini" icon="el-icon-view" @click="rollUser(scope.row)">房间用户</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -185,20 +186,14 @@
|
||||
<i class="el-icon-info"></i> 为空表示无密码
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="计算充值起始日期" prop="rechargeStartTime">
|
||||
<el-date-picker
|
||||
v-model="form.rechargeStartTime"
|
||||
type="datetime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
placeholder="选择日期时间"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="充值门槛" prop="minRecharge">
|
||||
<el-input v-model="form.minRecharge" autocomplete="off"></el-input>
|
||||
<span style="font-size: 12px;">
|
||||
<i class="el-icon-info"></i> 为0时表示不做限制
|
||||
</span>
|
||||
<!-- 新增:CDK数量 -->
|
||||
<el-form-item label="CDK数量" prop="cdkCount">
|
||||
<el-input-number v-model="form.cdkCount" :min="0" :max="500" label="CDK数量"></el-input-number>
|
||||
<span style="font-size: 12px; margin-left: 8px;">
|
||||
<i class="el-icon-info"></i> 填0则不启用CDK模式,使用普通密码
|
||||
</span>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogFormVisible = false">取 消</el-button>
|
||||
@@ -281,6 +276,53 @@
|
||||
<el-button @click="openView = false">关 闭</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!-- CDK 管理弹窗 -->
|
||||
<el-dialog title="CDK管理" :visible.sync="cdkDialogVisible" width="55%">
|
||||
<div style="margin-bottom:12px; display:flex; align-items:center; gap:12px;">
|
||||
<el-input-number v-model="cdkGenCount" :min="1" :max="500" size="small" label="生成数量" style="width:160px;"></el-input-number>
|
||||
<el-button type="primary" size="small" icon="el-icon-plus" @click="handleGenerateCdk">批量生成</el-button>
|
||||
</div>
|
||||
<el-table :data="cdkList" border size="small" v-loading="cdkLoading">
|
||||
<el-table-column prop="cdkCode" label="CDK码" width="280">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.cdkCode }}</span>
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-copy-document"
|
||||
style="margin-left:6px;"
|
||||
@click="handleCopyCdk(scope.row.cdkCode)"
|
||||
>复制</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status" label="状态" width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.status === '0'" type="success" size="small">未使用</el-tag>
|
||||
<el-tag v-else type="info" size="small">已使用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="usedUserId" label="使用者ID" width="100"></el-table-column>
|
||||
<el-table-column prop="usedTime" label="使用时间" width="160"></el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" width="160"></el-table-column>
|
||||
<el-table-column label="操作" width="80">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
size="mini"
|
||||
icon="el-icon-delete"
|
||||
style="color:#F56C6C;"
|
||||
@click="handleDeleteCdk(scope.row.id)"
|
||||
:disabled="scope.row.status === '1'"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button @click="cdkDialogVisible = false">关 闭</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
@@ -291,6 +333,7 @@ import {
|
||||
delRoll,
|
||||
rollChange
|
||||
} from "@/api/skins/ttRoll/api";
|
||||
import { generateRollCdk, getRollCdkList, deleteRollCdk } from "@/api/skins/ttRoll/api";
|
||||
import { listUser } from "@/api/skins/ttuser/api";
|
||||
|
||||
export default {
|
||||
@@ -327,9 +370,6 @@ export default {
|
||||
endTime: [
|
||||
{ required: true, message: "请选择开奖时间", trigger: "blur" }
|
||||
],
|
||||
minRecharge: [
|
||||
{ required: true, message: "请输入充值金额", trigger: "blur" }
|
||||
],
|
||||
peopleNum: [
|
||||
{ required: true, message: "请选择参与人数", trigger: "blur" }
|
||||
]
|
||||
@@ -355,7 +395,13 @@ export default {
|
||||
rollStatus: null
|
||||
},
|
||||
tableData: [],
|
||||
userList: []
|
||||
userList: [],
|
||||
// CDK 管理
|
||||
cdkDialogVisible: false,
|
||||
cdkList: [],
|
||||
cdkLoading: false,
|
||||
cdkGenCount: 10,
|
||||
currentCdkRollId: null
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
@@ -421,6 +467,11 @@ export default {
|
||||
this.$refs[formName].validate(valid => {
|
||||
if (valid) {
|
||||
roll(this.form).then(res => {
|
||||
// 若设置了CDK数量,创建成功后自动生成CDK
|
||||
const cdkCount = this.form.cdkCount;
|
||||
if (cdkCount > 0 && res.data) {
|
||||
generateRollCdk({ rollId: res.data, count: cdkCount });
|
||||
}
|
||||
this.$message({
|
||||
type: "success",
|
||||
message: "添加成功!"
|
||||
@@ -437,7 +488,8 @@ export default {
|
||||
rollPassword: null,
|
||||
rollType: null,
|
||||
sortBy: null,
|
||||
userId: null
|
||||
userId: null,
|
||||
cdkCount: 0
|
||||
};
|
||||
this.getList();
|
||||
});
|
||||
@@ -469,7 +521,8 @@ export default {
|
||||
rollPassword: null,
|
||||
rollType: null,
|
||||
sortBy: null,
|
||||
userId: null
|
||||
userId: null,
|
||||
cdkCount: 0
|
||||
};
|
||||
},
|
||||
handleSelectionChange(selection) {
|
||||
@@ -520,6 +573,46 @@ export default {
|
||||
this.loading = false;
|
||||
this.total = res.total;
|
||||
});
|
||||
},
|
||||
// 打开CDK管理弹窗
|
||||
handleCdk(row) {
|
||||
this.currentCdkRollId = row.id;
|
||||
this.cdkDialogVisible = true;
|
||||
this.loadCdkList();
|
||||
},
|
||||
// 加载CDK列表
|
||||
loadCdkList() {
|
||||
this.cdkLoading = true;
|
||||
getRollCdkList(this.currentCdkRollId).then(res => {
|
||||
this.cdkList = res.data || [];
|
||||
this.cdkLoading = false;
|
||||
});
|
||||
},
|
||||
// 批量生成CDK
|
||||
handleGenerateCdk() {
|
||||
generateRollCdk({ rollId: this.currentCdkRollId, count: this.cdkGenCount }).then(() => {
|
||||
this.$message.success('生成成功');
|
||||
this.loadCdkList();
|
||||
});
|
||||
},
|
||||
// 删除CDK
|
||||
handleDeleteCdk(cdkId) {
|
||||
this.$modal.confirm('确认删除该CDK?').then(() => {
|
||||
deleteRollCdk(cdkId).then(() => {
|
||||
this.$message.success('删除成功');
|
||||
this.loadCdkList();
|
||||
});
|
||||
}).catch(() => {});
|
||||
},
|
||||
// 复制CDK码
|
||||
handleCopyCdk(code) {
|
||||
const el = document.createElement('textarea');
|
||||
el.value = code;
|
||||
document.body.appendChild(el);
|
||||
el.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(el);
|
||||
this.$message.success('已复制:' + code);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -528,4 +621,4 @@ export default {
|
||||
.home {
|
||||
padding: 20px;
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.ruoyi.domain.entity.roll;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Accessors(chain = true)
|
||||
@Builder
|
||||
@TableName(value = "tt_roll_cdk")
|
||||
public class TtRollCdk implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/** 所属Roll房ID */
|
||||
private Integer rollId;
|
||||
|
||||
/** CDK码 */
|
||||
private String cdkCode;
|
||||
|
||||
/** 状态:0未使用 1已使用 */
|
||||
private String status;
|
||||
|
||||
/** 使用者用户ID */
|
||||
private Integer usedUserId;
|
||||
|
||||
/** 使用时间 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date usedTime;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTime;
|
||||
}
|
||||
@@ -19,6 +19,9 @@ public class RollDetailsDataVO {
|
||||
private Boolean hasPW;
|
||||
// private String pw;
|
||||
|
||||
/** 是否有CDK(true则需要输入CDK才能参与) */
|
||||
private Boolean hasCdk;
|
||||
|
||||
private String description;
|
||||
|
||||
// 房间类型
|
||||
|
||||
@@ -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>
|
||||
@@ -62,6 +62,8 @@ public class ApiRollController extends BaseController {
|
||||
@NotNull(message = "roll房id不能为空。")
|
||||
private Integer rollId;
|
||||
private String rollPassword;
|
||||
// 新增:CDK码(有CDK的房间必填)
|
||||
private String cdkCode;
|
||||
}
|
||||
|
||||
@ApiOperation("加入ROLL房")
|
||||
@@ -173,4 +175,5 @@ public class ApiRollController extends BaseController {
|
||||
return "1";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import com.ruoyi.admin.config.RedisConstants;
|
||||
import com.ruoyi.admin.mapper.*;
|
||||
import com.ruoyi.admin.service.TtBoxRecordsService;
|
||||
import com.ruoyi.admin.service.TtOrnamentsLevelService;
|
||||
import com.ruoyi.admin.service.TtRollCdkService;
|
||||
import com.ruoyi.admin.service.TtRollUserService;
|
||||
import com.ruoyi.admin.util.RandomUtils;
|
||||
import com.ruoyi.common.core.domain.R;
|
||||
@@ -121,9 +122,12 @@ public class ApiRollServiceImpl extends ServiceImpl<TtRollMapper, TtRoll> implem
|
||||
@Autowired
|
||||
private TtBoxRecordsMapper ttBoxRecordsMapper;
|
||||
|
||||
@Autowired
|
||||
private TtRollCdkService ttRollCdkService;
|
||||
|
||||
public R<TtRoll> joinRollCheck(TtRoll ttRoll, TtRollUser rollUser, TtUser player, JoinRollParam param) {
|
||||
|
||||
if (StringUtils.isNull(ttRoll)) return R.fail("当前Roll房已结束");
|
||||
/*if (StringUtils.isNull(ttRoll)) return R.fail("当前Roll房已结束");
|
||||
if (StringUtils.isNotNull(rollUser)) return R.fail("您当前已在该房间内,请勿重复加入房间!");
|
||||
|
||||
String password = ttRoll.getRollPassword();
|
||||
@@ -139,6 +143,41 @@ public class ApiRollServiceImpl extends ServiceImpl<TtRollMapper, TtRoll> implem
|
||||
if (minRecharge.compareTo(rechargeTotalAmount) > 0) return R.fail("未满足该房间的充值条件!");
|
||||
}
|
||||
|
||||
return R.ok();*/
|
||||
if (StringUtils.isNull(ttRoll)) return R.fail("当前Roll房已结束");
|
||||
if (StringUtils.isNotNull(rollUser)) return R.fail("您当前已在该房间内,请勿重复加入房间!");
|
||||
|
||||
// ---- CDK 模式校验(有CDK则走CDK,否则走普通密码)----
|
||||
boolean hasCdk = ttRollCdkService.count(
|
||||
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<TtRollCdk>()
|
||||
.eq(TtRollCdk::getRollId, ttRoll.getId())
|
||||
) > 0;
|
||||
|
||||
if (hasCdk) {
|
||||
// CDK 模式:必须提供 cdkCode
|
||||
if (StringUtils.isEmpty(param.getCdkCode())) {
|
||||
return R.fail("该房间需要CDK才能参与,请输入CDK!");
|
||||
}
|
||||
String cdkError = ttRollCdkService.useCdk(ttRoll.getId(), param.getCdkCode(), player.getUserId());
|
||||
if (cdkError != null) {
|
||||
return R.fail(cdkError);
|
||||
}
|
||||
} else {
|
||||
// 普通密码模式(兼容原有逻辑)
|
||||
String password = ttRoll.getRollPassword();
|
||||
if (StringUtils.isNotEmpty(password)) {
|
||||
if (StringUtils.isEmpty(param.getRollPassword())) return R.fail("请输入密码!");
|
||||
if (!password.equals(param.getRollPassword())) return R.fail("密码错误!");
|
||||
}
|
||||
}
|
||||
|
||||
// 检查加入条件:充值下限(原有逻辑保留)
|
||||
BigDecimal minRecharge = ttRoll.getMinRecharge();
|
||||
if (minRecharge != null && minRecharge.compareTo(BigDecimal.ZERO) > 0) {
|
||||
BigDecimal rechargeTotalAmount = getRechargeTotalAmount(player.getUserId(), ttRoll.getRechargeStartTime());
|
||||
if (minRecharge.compareTo(rechargeTotalAmount) > 0) return R.fail("未满足该房间的充值条件!");
|
||||
}
|
||||
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@@ -524,6 +563,12 @@ public class ApiRollServiceImpl extends ServiceImpl<TtRollMapper, TtRoll> implem
|
||||
RollDetailsDataVO data = apiRollMapper.getRollDetails(rollId);
|
||||
data.setHasPW(!StringUtils.isBlank(ttRoll.getRollPassword()));
|
||||
|
||||
// 判断是否有CDK
|
||||
long cdkCount = ttRollCdkService.count(
|
||||
new LambdaQueryWrapper<TtRollCdk>().eq(TtRollCdk::getRollId, rollId)
|
||||
);
|
||||
data.setHasCdk(cdkCount > 0);
|
||||
|
||||
// 成员
|
||||
// List<TtRollUser> list = new LambdaQueryChainWrapper<>(ttRollUserMapper)
|
||||
// .eq(TtRollUser::getRollId, rollId)
|
||||
|
||||
Reference in New Issue
Block a user