完善账单功能,移除状态字段并优化支付资源创建逻辑
This commit is contained in:
@@ -7,7 +7,6 @@ export async function listBills(params: {
|
|||||||
size?: number
|
size?: number
|
||||||
bill_no?: string
|
bill_no?: string
|
||||||
type?: number
|
type?: number
|
||||||
status?: number
|
|
||||||
create_after?: Date
|
create_after?: Date
|
||||||
create_before?: Date
|
create_before?: Date
|
||||||
}) {
|
}) {
|
||||||
|
|||||||
@@ -46,11 +46,15 @@ async function prepareResourceByWechat(props: CreateResourceReq) {
|
|||||||
return await callByUser<CreateResourceResp>('/api/resource/prepare/wechat', props)
|
return await callByUser<CreateResourceResp>('/api/resource/prepare/wechat', props)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createResourceByAlipay(props: CreateResourceReq) {
|
type PaidResourceReq = {
|
||||||
|
trade_no: string
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createResourceByAlipay(props: PaidResourceReq) {
|
||||||
return await callByUser('/api/resource/create/alipay', props)
|
return await callByUser('/api/resource/create/alipay', props)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createResourceByWechat(props: CreateResourceReq) {
|
async function createResourceByWechat(props: PaidResourceReq) {
|
||||||
return await callByUser('/api/resource/create/wechat', props)
|
return await callByUser('/api/resource/create/wechat', props)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
src/app/(api)/alipay/callback/rouute.ts
Normal file
5
src/app/(api)/alipay/callback/rouute.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import {NextRequest} from 'next/server'
|
||||||
|
|
||||||
|
export async function GET(req: NextRequest) {
|
||||||
|
|
||||||
|
}
|
||||||
5
src/app/(api)/wechatpay/callback/rouute.ts
Normal file
5
src/app/(api)/wechatpay/callback/rouute.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import {NextRequest} from 'next/server'
|
||||||
|
|
||||||
|
export async function GET(req: NextRequest) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import {Button} from '@/components/ui/button'
|
|
||||||
import Link from 'next/link'
|
|
||||||
|
|
||||||
export type PayPageProps = {}
|
|
||||||
|
|
||||||
export default async function PayPage(props: PayPageProps) {
|
|
||||||
return (
|
|
||||||
<div className={`w-screen h-screen items-center justify-start pt-60 flex flex-col gap-8`}>
|
|
||||||
<div className={`w-36 h-36 bg-gray-50 rounded-lg flex items-center justify-center`}>
|
|
||||||
模拟支付页
|
|
||||||
</div>
|
|
||||||
<Link href={'/admin/resources'} className={`p-4 bg-blue-500 text-white rounded-md`}>
|
|
||||||
模拟支付成功
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@ import {PageRecord} from '@/lib/api'
|
|||||||
import {Bill} from '@/lib/models'
|
import {Bill} from '@/lib/models'
|
||||||
import {useStatus} from '@/lib/states'
|
import {useStatus} from '@/lib/states'
|
||||||
import {listBills} from '@/actions/bill'
|
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 {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@/components/ui/select'
|
||||||
import {Button} from '@/components/ui/button'
|
import {Button} from '@/components/ui/button'
|
||||||
import DataTable from '@/components/data-table'
|
import DataTable from '@/components/data-table'
|
||||||
@@ -20,7 +20,6 @@ import Link from 'next/link'
|
|||||||
|
|
||||||
const filterSchema = zod.object({
|
const filterSchema = zod.object({
|
||||||
type: zod.enum(['all', '0', '1', '2']).default('all'),
|
type: zod.enum(['all', '0', '1', '2']).default('all'),
|
||||||
status: zod.enum(['all', '0', '1', '2']).default('all'),
|
|
||||||
create_after: zod.date().optional(),
|
create_after: zod.date().optional(),
|
||||||
create_before: zod.date().optional(),
|
create_before: zod.date().optional(),
|
||||||
})
|
})
|
||||||
@@ -47,14 +46,12 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
setStatus('load')
|
setStatus('load')
|
||||||
try {
|
try {
|
||||||
const typeValue = form.getValues('type')
|
const typeValue = form.getValues('type')
|
||||||
const statusValue = form.getValues('status')
|
|
||||||
const type = typeValue === 'all' ? undefined : parseInt(typeValue)
|
const type = typeValue === 'all' ? undefined : parseInt(typeValue)
|
||||||
const statusParam = statusValue === 'all' ? undefined : parseInt(statusValue)
|
|
||||||
const create_after = form.getValues('create_after')
|
const create_after = form.getValues('create_after')
|
||||||
const create_before = form.getValues('create_before')
|
const create_before = form.getValues('create_before')
|
||||||
|
|
||||||
const res = await listBills({
|
const res = await listBills({
|
||||||
page, size, type, status: statusParam, create_after, create_before,
|
page, size, type, create_after, create_before,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (res.success) {
|
if (res.success) {
|
||||||
@@ -82,7 +79,6 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
resolver: zodResolver(filterSchema),
|
resolver: zodResolver(filterSchema),
|
||||||
defaultValues: {
|
defaultValues: {
|
||||||
type: 'all',
|
type: 'all',
|
||||||
status: 'all',
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -91,34 +87,6 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
await refresh(1, data.size)
|
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
|
// render
|
||||||
// ======================
|
// ======================
|
||||||
@@ -136,7 +104,7 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
<FormField name={`type`} label={<span className={`text-sm`}>账单类型</span>}>
|
<FormField name={`type`} label={<span className={`text-sm`}>账单类型</span>}>
|
||||||
{({id, field}) => (
|
{({id, field}) => (
|
||||||
<Select value={field.value} onValueChange={field.onChange}>
|
<Select value={field.value} onValueChange={field.onChange}>
|
||||||
<SelectTrigger className={`w-24`}>
|
<SelectTrigger className={`w-24 h-9`}>
|
||||||
<SelectValue placeholder={`选择类型`}/>
|
<SelectValue placeholder={`选择类型`}/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
@@ -148,21 +116,6 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
</Select>
|
</Select>
|
||||||
)}
|
)}
|
||||||
</FormField>
|
</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`}>
|
<div className={`flex flex-col gap-2`}>
|
||||||
<Label className={`text-sm`}>创建时间</Label>
|
<Label className={`text-sm`}>创建时间</Label>
|
||||||
<div className={`flex items-center`}>
|
<div className={`flex items-center`}>
|
||||||
@@ -243,47 +196,41 @@ export default function BillsPage(props: BillsPageProps) {
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'info', header: `账单详情`, cell: ({row}) => (
|
accessorKey: 'info', header: `账单详情`,
|
||||||
<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: 'status', header: `状态`, cell: ({row}) => (
|
accessorKey: 'status', header: `状态`, cell: ({row}) => (
|
||||||
<>
|
<>
|
||||||
{row.original.status === 0 && (
|
{row.original.trade && (
|
||||||
<div className={`flex gap-1 items-center text-orange-500`}>
|
row.original.trade.status === 0 ? (
|
||||||
<AlertCircle size={16}/>
|
<div className={`flex flex-col gap-1`}>
|
||||||
<span>未完成</span>
|
<div className={`flex gap-1 items-center text-warn`}>
|
||||||
</div>
|
<ClockIcon size={16}/>
|
||||||
)}
|
<span>订单待支付</span>
|
||||||
{row.original.status === 1 && (
|
<Link href={`/admin/bills`} className={`text-sm underline text-blue-500`}>
|
||||||
<div className={`flex gap-1 items-center text-green-500`}>
|
{row.original.trade.inner_no}
|
||||||
<CheckCircle size={16}/>
|
</Link>
|
||||||
<span>已完成</span>
|
</div>
|
||||||
</div>
|
|
||||||
)}
|
</div>
|
||||||
{row.original.status === 2 && (
|
) : row.original.trade.status === 1 ? (
|
||||||
<div className={`flex gap-1 items-center text-gray-500`}>
|
<div className={`flex gap-1 items-center text-done`}>
|
||||||
<AlertCircle size={16}/>
|
<CheckCircle size={16}/>
|
||||||
<span>已作废</span>
|
<span>已完成</span>
|
||||||
</div>
|
</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>
|
||||||
|
)
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -293,7 +293,7 @@ export default function ResourcesPage(props: ResourcesPageProps) {
|
|||||||
{
|
{
|
||||||
accessorKey: 'daily_last', header: '最近使用时间', cell: ({row}) => {
|
accessorKey: 'daily_last', header: '最近使用时间', cell: ({row}) => {
|
||||||
return (
|
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')
|
: format(row.original.pss.daily_last, 'yyyy-MM-dd HH:mm')
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -66,10 +66,14 @@ export default function Pay(props: PayProps) {
|
|||||||
try {
|
try {
|
||||||
switch (props.method) {
|
switch (props.method) {
|
||||||
case 'alipay':
|
case 'alipay':
|
||||||
resp = await createResourceByAlipay(props.resource)
|
resp = await createResourceByAlipay({
|
||||||
|
trade_no: payInfo!.trade_no,
|
||||||
|
})
|
||||||
break
|
break
|
||||||
case 'wechat':
|
case 'wechat':
|
||||||
resp = await createResourceByWechat(props.resource)
|
resp = await createResourceByWechat({
|
||||||
|
trade_no: payInfo!.trade_no,
|
||||||
|
})
|
||||||
break
|
break
|
||||||
case 'balance':
|
case 'balance':
|
||||||
resp = await createResourceByBalance(props.resource)
|
resp = await createResourceByBalance(props.resource)
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ export type Bill = {
|
|||||||
bill_no: string
|
bill_no: string
|
||||||
info: string
|
info: string
|
||||||
type: number
|
type: number
|
||||||
status: number
|
|
||||||
amount: number
|
amount: number
|
||||||
created_at: Date
|
created_at: Date
|
||||||
updated_at: Date
|
updated_at: Date
|
||||||
|
|||||||
Reference in New Issue
Block a user