完善账单功能,移除状态字段并优化支付资源创建逻辑

This commit is contained in:
2025-04-17 18:30:16 +08:00
parent 9a438491be
commit c9e65b6617
9 changed files with 57 additions and 111 deletions

View File

@@ -4,7 +4,7 @@ import {PageRecord} from '@/lib/api'
import {Bill} from '@/lib/models'
import {useStatus} from '@/lib/states'
import {listBills} from '@/actions/bill'
import {Search, Eraser, CreditCard, AlertCircle, CheckCircle} from 'lucide-react'
import {Search, Eraser, CreditCard, AlertCircle, CheckCircle, Clock, ClockIcon} from 'lucide-react'
import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@/components/ui/select'
import {Button} from '@/components/ui/button'
import DataTable from '@/components/data-table'
@@ -20,7 +20,6 @@ import Link from 'next/link'
const filterSchema = zod.object({
type: zod.enum(['all', '0', '1', '2']).default('all'),
status: zod.enum(['all', '0', '1', '2']).default('all'),
create_after: zod.date().optional(),
create_before: zod.date().optional(),
})
@@ -47,14 +46,12 @@ export default function BillsPage(props: BillsPageProps) {
setStatus('load')
try {
const typeValue = form.getValues('type')
const statusValue = form.getValues('status')
const type = typeValue === 'all' ? undefined : parseInt(typeValue)
const statusParam = statusValue === 'all' ? undefined : parseInt(statusValue)
const create_after = form.getValues('create_after')
const create_before = form.getValues('create_before')
const res = await listBills({
page, size, type, status: statusParam, create_after, create_before,
page, size, type, create_after, create_before,
})
if (res.success) {
@@ -82,7 +79,6 @@ export default function BillsPage(props: BillsPageProps) {
resolver: zodResolver(filterSchema),
defaultValues: {
type: 'all',
status: 'all',
},
})
@@ -91,34 +87,6 @@ export default function BillsPage(props: BillsPageProps) {
await refresh(1, data.size)
}
// 获取类型显示内容
const getBillTypeText = (type: number) => {
switch (type) {
case 1:
return '充值'
case 2:
return '消费'
case 3:
return '退款'
default:
return '未知'
}
}
// 获取状态显示内容
const getBillStatusText = (status: number) => {
switch (status) {
case 1:
return '待支付'
case 2:
return '已完成'
case 3:
return '已取消'
default:
return '未知'
}
}
// ======================
// render
// ======================
@@ -136,7 +104,7 @@ export default function BillsPage(props: BillsPageProps) {
<FormField name={`type`} label={<span className={`text-sm`}></span>}>
{({id, field}) => (
<Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger className={`w-24`}>
<SelectTrigger className={`w-24 h-9`}>
<SelectValue placeholder={`选择类型`}/>
</SelectTrigger>
<SelectContent>
@@ -148,21 +116,6 @@ export default function BillsPage(props: BillsPageProps) {
</Select>
)}
</FormField>
<FormField name={`status`} label={<span className={`text-sm`}></span>}>
{({id, field}) => (
<Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger className={`w-24`}>
<SelectValue placeholder={`选择状态`}/>
</SelectTrigger>
<SelectContent>
<SelectItem value={`all`}></SelectItem>
<SelectItem value={`0`}></SelectItem>
<SelectItem value={`1`}></SelectItem>
<SelectItem value={`2`}></SelectItem>
</SelectContent>
</Select>
)}
</FormField>
<div className={`flex flex-col gap-2`}>
<Label className={`text-sm`}></Label>
<div className={`flex items-center`}>
@@ -243,47 +196,41 @@ export default function BillsPage(props: BillsPageProps) {
),
},
{
accessorKey: 'info', header: `账单详情`, cell: ({row}) => (
<div className={`flex flex-col gap-1`}>
<span>{row.original.info}</span>
{row.original.type === 1 && row.original.trade.status === 1 && (
<Link
href={`/admin/resources?resource_no=${row.original.resource.resource_no}`}
className={`text-sm text-blue-500 hover:underline`}>
<span>
{row.original.resource.pss.type === 1 && `包时`}
{row.original.resource.pss.type === 2 && `包量`}
</span>
<span>-</span>
<span>
{row.original.resource.pss.live / 60 + `分钟`}
</span>
</Link>
)}
</div>
),
accessorKey: 'info', header: `账单详情`,
},
{
accessorKey: 'status', header: `状态`, cell: ({row}) => (
<>
{row.original.status === 0 && (
<div className={`flex gap-1 items-center text-orange-500`}>
<AlertCircle size={16}/>
<span></span>
</div>
)}
{row.original.status === 1 && (
<div className={`flex gap-1 items-center text-green-500`}>
<CheckCircle size={16}/>
<span></span>
</div>
)}
{row.original.status === 2 && (
<div className={`flex gap-1 items-center text-gray-500`}>
<AlertCircle size={16}/>
<span></span>
</div>
{row.original.trade && (
row.original.trade.status === 0 ? (
<div className={`flex flex-col gap-1`}>
<div className={`flex gap-1 items-center text-warn`}>
<ClockIcon size={16}/>
<span></span>
<Link href={`/admin/bills`} className={`text-sm underline text-blue-500`}>
{row.original.trade.inner_no}
</Link>
</div>
</div>
) : row.original.trade.status === 1 ? (
<div className={`flex gap-1 items-center text-done`}>
<CheckCircle size={16}/>
<span></span>
</div>
) : row.original.trade.status === 2 ? (
<div className={`flex gap-1 items-center text-weak`}>
<AlertCircle size={16}/>
<span></span>
</div>
) : row.original.trade.status === 3 ? (
<div className={`flex gap-1 items-center text-fail`}>
<AlertCircle size={16}/>
<span>退</span>
</div>
) : (
<span>-</span>
)
)}
</>
),

View File

@@ -293,7 +293,7 @@ export default function ResourcesPage(props: ResourcesPageProps) {
{
accessorKey: 'daily_last', header: '最近使用时间', cell: ({row}) => {
return (
isEqual(row.original.pss.daily_last, parse('0001-01-01 00:05:43', 'yyyy-MM-dd HH:mm:ss', new Date()))
format(row.original.pss.daily_last, "yyyy-MM-dd") === "0001-01-01"
? '-'
: format(row.original.pss.daily_last, 'yyyy-MM-dd HH:mm')
)