1.优化开奖逻辑
2.优化后台开奖派彩 3.优化接口规范
This commit is contained in:
@@ -20,7 +20,7 @@ class User extends Backend
|
||||
*/
|
||||
protected ?object $model = null;
|
||||
|
||||
protected array|string $preExcludeFields = ['id', 'uuid', 'create_time', 'update_time'];
|
||||
protected array|string $preExcludeFields = ['id', 'uuid', 'create_time', 'update_time', 'invite_code'];
|
||||
|
||||
protected array $withJoinTable = ['channel', 'admin'];
|
||||
|
||||
@@ -35,7 +35,7 @@ class User extends Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加(重写:password 使用 Admin 同款加密;uuid 由 username+channel_id 生成)
|
||||
* 添加(重写:password 使用 Admin 同款加密;uuid 为 10 位唯一对外标识)
|
||||
* @throws Throwable
|
||||
*/
|
||||
protected function _add(): Response
|
||||
@@ -47,6 +47,10 @@ class User extends Backend
|
||||
}
|
||||
|
||||
$data = $this->applyInputFilter($data);
|
||||
$inviteResolved = $this->applyInviteCodeToUserChannel($data);
|
||||
if ($inviteResolved !== null) {
|
||||
return $inviteResolved;
|
||||
}
|
||||
$data = $this->excludeFields($data);
|
||||
|
||||
$password = $data['password'] ?? null;
|
||||
@@ -60,7 +64,7 @@ class User extends Backend
|
||||
if (!is_string($username) || trim($username) === '' || $channelId === null || $channelId === '') {
|
||||
return $this->error(__('Parameter %s can not be empty', ['username/channel_id']));
|
||||
}
|
||||
$data['uuid'] = md5(trim($username) . '|' . $channelId);
|
||||
$data['uuid'] = \app\common\model\User::generateUniquePublicCode10();
|
||||
|
||||
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
||||
$data[$this->dataLimitField] = $this->auth->id;
|
||||
@@ -95,7 +99,7 @@ class User extends Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑(重写:password 使用 Admin 同款加密;uuid 由 username+channel_id 生成)
|
||||
* 编辑(重写:password 使用 Admin 同款加密;uuid 创建后不因改名改渠道自动变更)
|
||||
* @throws Throwable
|
||||
*/
|
||||
protected function _edit(): Response
|
||||
@@ -130,18 +134,6 @@ class User extends Backend
|
||||
}
|
||||
}
|
||||
|
||||
$nextUsername = array_key_exists('username', $data) ? $data['username'] : $row['username'];
|
||||
$nextChannelId = null;
|
||||
if (array_key_exists('channel_id', $data)) {
|
||||
$nextChannelId = $data['channel_id'];
|
||||
} else {
|
||||
$nextChannelId = $row['channel_id'] ?? null;
|
||||
}
|
||||
|
||||
if (is_string($nextUsername) && trim($nextUsername) !== '' && $nextChannelId !== null && $nextChannelId !== '') {
|
||||
$data['uuid'] = md5(trim($nextUsername) . '|' . $nextChannelId);
|
||||
}
|
||||
|
||||
$result = false;
|
||||
$this->model->startTrans();
|
||||
try {
|
||||
@@ -337,6 +329,63 @@ class User extends Backend
|
||||
return array_values(array_unique(array_merge($own, $children)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求中的 `invite_code`(子代理 admin.invite_code)解析为 `channel_id`,并写入 `register_invite_code`、`admin_id`。
|
||||
* 若同时提交 `channel_id` / `admin_id`,须与邀请码对应记录一致。
|
||||
*/
|
||||
private function applyInviteCodeToUserChannel(array &$data): ?Response
|
||||
{
|
||||
if (!array_key_exists('invite_code', $data)) {
|
||||
return null;
|
||||
}
|
||||
$raw = $data['invite_code'];
|
||||
unset($data['invite_code']);
|
||||
$inviteCode = is_string($raw) ? trim($raw) : '';
|
||||
if ($inviteCode === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$row = Db::name('admin')->field(['id', 'channel_id'])->where('invite_code', $inviteCode)->find();
|
||||
if (!$row) {
|
||||
return $this->error(__('Invite code does not exist'));
|
||||
}
|
||||
$cid = $row['channel_id'] ?? null;
|
||||
if ($cid === null || $cid === '') {
|
||||
return $this->error(__('Invite code not bound to channel'));
|
||||
}
|
||||
$cidInt = intval(trim((string) $cid));
|
||||
if ($cidInt <= 0) {
|
||||
return $this->error(__('Invite code not bound to channel'));
|
||||
}
|
||||
|
||||
if (isset($data['channel_id']) && $data['channel_id'] !== null && $data['channel_id'] !== '') {
|
||||
$existing = intval(trim((string) $data['channel_id']));
|
||||
if ($existing > 0 && $existing !== $cidInt) {
|
||||
return $this->error(__('Parameter error'));
|
||||
}
|
||||
}
|
||||
$data['channel_id'] = $cidInt;
|
||||
$data['register_invite_code'] = $inviteCode;
|
||||
|
||||
$aidRaw = $row['id'] ?? null;
|
||||
if ($aidRaw === null || $aidRaw === '') {
|
||||
return $this->error(__('Parameter error'));
|
||||
}
|
||||
$aidInt = intval(trim((string) $aidRaw));
|
||||
if ($aidInt <= 0) {
|
||||
return $this->error(__('Parameter error'));
|
||||
}
|
||||
if (isset($data['admin_id']) && $data['admin_id'] !== null && $data['admin_id'] !== '') {
|
||||
$reqAid = intval(trim((string) $data['admin_id']));
|
||||
if ($reqAid > 0 && $reqAid !== $aidInt) {
|
||||
return $this->error(__('Parameter error'));
|
||||
}
|
||||
}
|
||||
$data['admin_id'] = $aidInt;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 若需重写查看、编辑、删除等方法,请复制 @see \app\admin\library\traits\Backend 中对应的方法至此进行重写
|
||||
*/
|
||||
|
||||
129
app/admin/controller/user/UserWalletRecord.php
Normal file
129
app/admin/controller/user/UserWalletRecord.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
namespace app\admin\controller\user;
|
||||
|
||||
use app\common\controller\Backend;
|
||||
use support\think\Db;
|
||||
use support\Response;
|
||||
use Webman\Http\Request as WebmanRequest;
|
||||
|
||||
/**
|
||||
* 玩家钱包流水(只读列表,数据由业务入账写入本表)
|
||||
*/
|
||||
class UserWalletRecord extends Backend
|
||||
{
|
||||
protected ?object $model = null;
|
||||
|
||||
protected bool $modelValidate = false;
|
||||
|
||||
protected string|array $quickSearchField = ['id', 'biz_type', 'ref_type', 'remark', 'idempotency_key'];
|
||||
|
||||
protected string|array $defaultSortField = ['id' => 'desc'];
|
||||
|
||||
protected string|array $orderGuarantee = ['id' => 'desc'];
|
||||
|
||||
protected array $withJoinTable = ['user', 'channel', 'operatorAdmin'];
|
||||
|
||||
protected function initController(WebmanRequest $request): ?Response
|
||||
{
|
||||
$this->model = new \app\common\model\UserWalletRecord();
|
||||
return null;
|
||||
}
|
||||
|
||||
public function add(WebmanRequest $request): Response
|
||||
{
|
||||
$response = $this->initializeBackend($request);
|
||||
if ($response !== null) {
|
||||
return $response;
|
||||
}
|
||||
return $this->error('钱包流水仅允许业务入账,禁止后台手工新增');
|
||||
}
|
||||
|
||||
public function edit(WebmanRequest $request): Response
|
||||
{
|
||||
$response = $this->initializeBackend($request);
|
||||
if ($response !== null) {
|
||||
return $response;
|
||||
}
|
||||
return $this->error('钱包流水不可编辑');
|
||||
}
|
||||
|
||||
public function del(WebmanRequest $request): Response
|
||||
{
|
||||
$response = $this->initializeBackend($request);
|
||||
if ($response !== null) {
|
||||
return $response;
|
||||
}
|
||||
return $this->error('钱包流水不可删除');
|
||||
}
|
||||
|
||||
public function sortable(WebmanRequest $request): Response
|
||||
{
|
||||
$response = $this->initializeBackend($request);
|
||||
if ($response !== null) {
|
||||
return $response;
|
||||
}
|
||||
return $this->error('不支持排序');
|
||||
}
|
||||
|
||||
/**
|
||||
* 列表:渠道管理员仅看本渠道流水(channel_id 快照)
|
||||
*/
|
||||
protected function _index(): Response
|
||||
{
|
||||
if ($this->request && $this->request->get('select')) {
|
||||
return $this->select($this->request);
|
||||
}
|
||||
|
||||
list($where, $alias, $limit, $order) = $this->queryBuilder();
|
||||
$table = strtolower($this->model->getTable());
|
||||
$mainShort = $alias[$table] ?? '';
|
||||
if ($mainShort !== '' && $this->auth && !$this->auth->isSuperAdmin()) {
|
||||
$channelIds = $this->getScopedChannelIdsForFilter();
|
||||
$where[] = [$mainShort . '.channel_id', 'in', $channelIds !== [] ? $channelIds : [0]];
|
||||
}
|
||||
|
||||
$res = $this->model
|
||||
->withJoin($this->withJoinTable, $this->withJoinType)
|
||||
->with($this->withJoinTable)
|
||||
->visible([
|
||||
'user' => ['username', 'phone'],
|
||||
'channel' => ['name'],
|
||||
'operatorAdmin' => ['username'],
|
||||
])
|
||||
->alias($alias)
|
||||
->where($where)
|
||||
->order($order)
|
||||
->paginate($limit);
|
||||
|
||||
return $this->success('', [
|
||||
'list' => $res->items(),
|
||||
'total' => $res->total(),
|
||||
'remark' => get_route_remark(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 非超管:与渠道管理一致,仅本账号相关渠道
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
private function getScopedChannelIdsForFilter(): array
|
||||
{
|
||||
if (!$this->auth) {
|
||||
return [0];
|
||||
}
|
||||
if ($this->auth->isSuperAdmin()) {
|
||||
return [];
|
||||
}
|
||||
$admin = Db::name('admin')
|
||||
->field(['id', 'channel_id'])
|
||||
->where('id', $this->auth->id)
|
||||
->find();
|
||||
$ids = [];
|
||||
if ($admin && !empty($admin['channel_id'])) {
|
||||
$ids[] = $admin['channel_id'];
|
||||
}
|
||||
return array_values(array_unique($ids));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user