完善职务礼包红包默认配置

This commit is contained in:
2026-04-24 23:09:32 +08:00
parent 4486a87326
commit 5273b4ee4b
12 changed files with 394 additions and 93 deletions
@@ -27,6 +27,8 @@
max_reward: '',
daily_reward_limit: '',
recipient_daily_limit: '',
red_packet_amount: 8888,
red_packet_count: 10,
sort_order: 0
},
@@ -34,7 +36,7 @@
this.editing = null;
this.selectedIds = [];
this.selectedPermissions = [];
this.form = { department_id: '', name: '', icon: '🎖️', rank: 50, level: 60, max_persons: 1, max_reward: '', daily_reward_limit: '', recipient_daily_limit: '', sort_order: 0 };
this.form = { department_id: '', name: '', icon: '🎖️', rank: 50, level: 60, max_persons: 1, max_reward: '', daily_reward_limit: '', recipient_daily_limit: '', red_packet_amount: 8888, red_packet_count: 10, sort_order: 0 };
this.showForm = true;
},
openEdit(pos, appointableIds, permissions) {
@@ -51,6 +53,8 @@
max_reward: pos.max_reward !== null && pos.max_reward !== undefined ? pos.max_reward : '',
daily_reward_limit: pos.daily_reward_limit !== null && pos.daily_reward_limit !== undefined ? pos.daily_reward_limit : '',
recipient_daily_limit: pos.recipient_daily_limit !== null && pos.recipient_daily_limit !== undefined ? pos.recipient_daily_limit : '',
red_packet_amount: pos.red_packet_amount || 8888,
red_packet_count: pos.red_packet_count || 10,
sort_order: pos.sort_order,
};
this.showForm = true;
@@ -185,6 +189,7 @@
<th class="px-4 py-3 text-center">单次上限</th>
<th class="px-4 py-3 text-center">单日上限</th>
<th class="px-4 py-3 text-center">任命权</th>
<th class="px-4 py-3 text-center">礼包默认</th>
<th class="px-4 py-3 text-center">聊天室权限</th>
@php $superLvl = (int) \App\Models\Sysparam::getValue('superlevel', '100'); @endphp
@if (Auth::user()->user_level >= $superLvl)
@@ -254,6 +259,12 @@
<span class="text-xs text-gray-400"></span>
@endif
</td>
<td class="px-4 py-3 text-center">
<div class="text-xs leading-5 text-red-700">
<div class="font-bold">{{ number_format((int) ($pos->red_packet_amount ?? 8888)) }}</div>
<div class="text-gray-400">{{ (int) ($pos->red_packet_count ?? 10) }} </div>
</div>
</td>
<td class="px-4 py-3">
@if (! empty($pos->permissions))
@php
@@ -297,6 +308,8 @@
max_reward: {{ $pos->max_reward ?? 'null' }},
daily_reward_limit: {{ $pos->daily_reward_limit ?? 'null' }},
recipient_daily_limit: {{ $pos->recipient_daily_limit ?? 'null' }},
red_packet_amount: {{ $pos->red_packet_amount ?? 8888 }},
red_packet_count: {{ $pos->red_packet_count ?? 10 }},
sort_order: {{ $pos->sort_order }},
requestUrl: '{{ route('admin.positions.update', $pos->id) }}'
}, {{ json_encode($appointableIds) }}, {{ json_encode($pos->permissions ?? []) }})"
@@ -447,6 +460,30 @@
<span class="min-w-0">
<span class="block font-bold text-gray-700">{{ $permissionMeta['label'] }}</span>
<span class="block text-xs text-gray-500">{{ $permissionMeta['description'] }}</span>
@if ($permissionCode === \App\Support\PositionPermissionRegistry::ROOM_RED_PACKET)
<span class="mt-3 grid grid-cols-2 gap-2 rounded-lg border border-red-100 bg-red-50/70 p-2"
@click.stop>
<span>
<span class="mb-1 block text-[11px] font-bold text-red-700">默认礼包总量</span>
<input type="number" name="red_packet_amount"
x-model="form.red_packet_amount" required min="1"
max="999999999"
class="w-full rounded-md border border-red-200 bg-white p-1.5 text-xs text-red-800"
placeholder="金币/经验共用">
</span>
<span>
<span class="mb-1 block text-[11px] font-bold text-red-700">默认礼包份数</span>
<input type="number" name="red_packet_count"
x-model="form.red_packet_count" required min="1"
max="100"
class="w-full rounded-md border border-red-200 bg-white p-1.5 text-xs text-red-800"
placeholder="拆成几份">
</span>
<span class="col-span-2 text-[11px] leading-4 text-red-600">
勾选后发金币/经验礼包都使用这组默认值;取消权限不会清空配置。
</span>
</span>
@endif
</span>
</label>
@endforeach
@@ -296,42 +296,82 @@
/**
* superlevel 点击「礼包」按钮,弹出 chatBanner 三按钮选择类型后发包。
*/
window.sendRedPacket = function() {
window.chatBanner.show({
icon: '🧧',
title: '发出礼包',
name: '选择礼包类型',
body: '将发出 <b>8888</b> 数量共 <b>10</b> 份的礼包,系统凭空发放,房间成员先到先得!',
gradient: ['#991b1b', '#dc2626', '#ea580c'],
titleColor: '#fde68a',
autoClose: 0,
buttons: [{
label: '💰 金币礼包',
color: '#d97706',
onClick(btn, close) {
close();
doSendRedPacket('gold');
window.sendRedPacket = async function() {
const btn = document.getElementById('red-packet-btn');
if (btn) {
btn.disabled = true;
btn.textContent = '读取中…';
}
try {
const config = await fetchRedPacketConfig();
const amountText = Number(config.amount || 0).toLocaleString('zh-CN');
const countText = Number(config.count || 0).toLocaleString('zh-CN');
window.chatBanner.show({
icon: '🧧',
title: '发出礼包',
name: '选择礼包类型',
body: `将发出 ${amountText} 数量共 ${countText} 份的礼包,系统凭空发放,房间成员先到先得!`,
gradient: ['#991b1b', '#dc2626', '#ea580c'],
titleColor: '#fde68a',
autoClose: 0,
buttons: [{
label: '💰 金币礼包',
color: '#d97706',
onClick(button, close) {
close();
doSendRedPacket('gold');
},
},
},
{
label: '✨ 经验礼包',
color: '#7c3aed',
onClick(btn, close) {
close();
doSendRedPacket('exp');
{
label: '✨ 经验礼包',
color: '#7c3aed',
onClick(button, close) {
close();
doSendRedPacket('exp');
},
},
},
{
label: '取消',
color: 'rgba(255,255,255,0.15)',
onClick(btn, close) {
close();
{
label: '取消',
color: 'rgba(255,255,255,0.15)',
onClick(button, close) {
close();
},
},
},
],
});
],
});
} catch (e) {
await window.chatDialog.alert(e.message || '读取礼包配置失败', '操作失败', '#cc4444');
} finally {
if (btn) {
btn.disabled = false;
btn.innerHTML = '🧧 礼包';
}
}
};
/**
* 读取当前职务的礼包红包默认配置。
*
* @returns {Promise<{amount:number,count:number,expire_seconds:number}>}
*/
async function fetchRedPacketConfig() {
const res = await fetch('/command/red-packet/config', {
headers: {
'Accept': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
},
});
const data = await res.json();
if (!res.ok || data.status !== 'success') {
throw new Error(data.message || '读取礼包配置失败');
}
return data;
}
/**
* 实际发包请求(由 chatBanner 按钮回调触发)。
*
@@ -624,7 +664,7 @@
// 弹出全局 Toast
window.chatToast.show({
title: '🧧 礼包到账',
message: `恭喜您抢到了礼包 <b>${data.amount}</b> ${typeLabel}`,
message: `恭喜您抢到了礼包 ${data.amount} ${typeLabel}`,
icon: '🧧',
color: (_rpType === 'exp') ? '#7c3aed' : '#dc2626',
duration: 8000,