Files
chatroom/app/Models/Position.php
lkddi ff57afe388 功能:职务奖励金币发放系统
数据库:
- positions 新增 daily_reward_limit(单日累计上限)
- positions 新增 recipient_daily_limit(同一接收者每日次数上限)

后端:
- CurrencySource::POSITION_REWARD 新枚举值
- AdminCommandController::reward() 三层限额校验
  ① 单次上限 ② 单日累计上限 ③ 同一接收者每日次数
  写履职记录(PositionAuthorityLog)+ UserCurrencyService
  聊天室悄悄话通知接收者
- POST /command/reward 路由注册

前端(user-actions.blade.php):
- 名片按钮行 2+1 布局(加好友/送礼物/送金币)
- 送金币仅在 myMaxReward>0 时显示(职务持有者)
- 内联奖励金币面板:金额输入 + 确认发放 + 说明文字
- sendReward() 前端校验 + API 调用 + chatDialog 反馈

后台(positions/index):
- 编辑表单新增两个奖励限额字段
- PositionController 验证规则同步更新
2026-03-01 11:09:29 +08:00

134 lines
3.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:职务模型
* 对应 positions 表,职务属于某个部门,包含等级、图标、人数上限和奖励上限
* 任命权限通过 position_appoint_limits 中间表多对多关联定义
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Position extends Model
{
/**
* 允许批量赋值的字段
*
* @var list<string>
*/
protected $fillable = [
'department_id',
'name',
'icon',
'rank',
'level',
'max_persons',
'max_reward',
'daily_reward_limit',
'recipient_daily_limit',
'sort_order',
];
/**
* 字段类型转换
*/
public function casts(): array
{
return [
'rank' => 'integer',
'level' => 'integer',
'max_persons' => 'integer',
'max_reward' => 'integer',
'daily_reward_limit' => 'integer',
'recipient_daily_limit' => 'integer',
'sort_order' => 'integer',
];
}
/**
* 所属部门
*/
public function department(): BelongsTo
{
return $this->belongsTo(Department::class);
}
/**
* 该职务当前在职的用户记录user_positions
*/
public function activeUserPositions(): HasMany
{
return $this->hasMany(UserPosition::class)->where('is_active', true);
}
/**
* 该职务的所有历史任职记录
*/
public function userPositions(): HasMany
{
return $this->hasMany(UserPosition::class);
}
/**
* 该职务可以任命的目标职务列表position_appoint_limits 中间表)
*/
public function appointablePositions(): BelongsToMany
{
return $this->belongsToMany(
Position::class,
'position_appoint_limits',
'appointer_position_id',
'appointable_position_id'
);
}
/**
* 哪些职务的持有者可以将用户任命到本职务
*/
public function appointedByPositions(): BelongsToMany
{
return $this->belongsToMany(
Position::class,
'position_appoint_limits',
'appointable_position_id',
'appointer_position_id'
);
}
/**
* 获取当前在职人数
*/
public function currentCount(): int
{
return $this->activeUserPositions()->count();
}
/**
* 是否已满员
*/
public function isFull(): bool
{
if ($this->max_persons === null) {
return false;
}
return $this->currentCount() >= $this->max_persons;
}
/**
* 查询范围:按位阶降序
*/
public function scopeOrdered($query): void
{
$query->orderBy('sort_order')->orderByDesc('rank');
}
}