From 7688f24fe1c1ebe4135e6d3b206d9f75960d9d5b Mon Sep 17 00:00:00 2001 From: callmeyan Date: Wed, 24 Jul 2024 23:49:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ID=E6=8E=92=E5=BA=8F=E5=8F=8A?= =?UTF-8?q?=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/bill/list.tsx | 2 +- src/components/bill/search-form.tsx | 7 ++++ src/i18n/translations/en.json | 6 ++++ src/i18n/translations/sc.json | 6 ++++ src/i18n/translations/tc.json | 6 ++++ src/pages/bill/query.tsx | 56 +++++++++++++++++++++++++++-- src/service/api/bill.ts | 4 +-- src/types/bill.d.ts | 2 ++ 8 files changed, 83 insertions(+), 6 deletions(-) diff --git a/src/components/bill/list.tsx b/src/components/bill/list.tsx index 3e92cf8..2a187eb 100644 --- a/src/components/bill/list.tsx +++ b/src/components/bill/list.tsx @@ -50,7 +50,7 @@ export const BillList: React.FC = (props) => { const columns = useMemo[]>(() => { const cols: ColumnProps[] = [ { - title: '#', + title: '#ID', dataIndex: 'id', width: 120, }, diff --git a/src/components/bill/search-form.tsx b/src/components/bill/search-form.tsx index a08d92b..ad5122d 100644 --- a/src/components/bill/search-form.tsx +++ b/src/components/bill/search-form.tsx @@ -15,6 +15,7 @@ type SearchFormProps = { type SearchFormFields = { dateRange?: Date[]; student_number?: string; + id?: string; application_number?: string; bill_number?: string; payment_channel?: string; @@ -29,6 +30,9 @@ const SearchForm: React.FC = (props) => { params.start_date = dayjs(value.dateRange[0]).format('YYYY-MM-DD'); params.end_date = dayjs(value.dateRange[1]).format('YYYY-MM-DD'); } + if (value.id) { + params.id = value.id; + } if (value.student_number) { params.student_number = value.student_number; } @@ -73,6 +77,9 @@ const SearchForm: React.FC = (props) => {
onSubmit={formSubmit}> + + + diff --git a/src/i18n/translations/en.json b/src/i18n/translations/en.json index ca20ec3..0c90f56 100644 --- a/src/i18n/translations/en.json +++ b/src/i18n/translations/en.json @@ -2,8 +2,12 @@ "base": { "bill_number": "Bill Number", "btn_search_submit": "Search", + "cancel": "Cancel", "close": "Close", + "confirm": "Confirm", + "confirm_paid": "Confirm paid", "operate_fail": "Operation failed", + "operate_success": "Operation success", "please_enter": "Please Enter", "please_select": "Please Select", "qr-code": "QRCode", @@ -25,6 +29,8 @@ "confirmed": "Confirmed", "download-qr-code": "Download QR Code", "download_receipt": "Download receipt", + "paid": "Paid", + "paid_confirm": "Please confirm the order status is set to paid", "pay_status": "Bill Status", "pay_status_canceled": "CANCELLED", "pay_status_paid": "PAID", diff --git a/src/i18n/translations/sc.json b/src/i18n/translations/sc.json index 6351117..4ab0cce 100644 --- a/src/i18n/translations/sc.json +++ b/src/i18n/translations/sc.json @@ -2,8 +2,12 @@ "base": { "bill_number": "账单编号", "btn_search_submit": "搜索", + "cancel": "取消", "close": "关闭", + "confirm": "确定", + "confirm_paid": "确认已支付", "operate_fail": "操作失败", + "operate_success": "操作成功", "please_enter": "请输入", "please_select": "请选择", "qr-code": "二维码", @@ -25,6 +29,8 @@ "confirmed": "已对账", "download-qr-code": "下载二维码", "download_receipt": "下载收据", + "paid": "已支付", + "paid_confirm": "是否将此订单状态设为已支付", "pay_status": "账单状态", "pay_status_canceled": "已作废", "pay_status_paid": "已支付", diff --git a/src/i18n/translations/tc.json b/src/i18n/translations/tc.json index 970d543..d0bba0c 100644 --- a/src/i18n/translations/tc.json +++ b/src/i18n/translations/tc.json @@ -2,8 +2,12 @@ "base": { "bill_number": "帳單編號", "btn_search_submit": "搜尋", + "cancel": "取消", "close": "關閉", + "confirm": "確定", + "confirm_paid": "確認已支付", "operate_fail": "操作失敗", + "operate_success": "操作成功", "please_enter": "請輸入", "please_select": "請選擇", "qr-code": "QRCode", @@ -25,6 +29,8 @@ "confirmed": "已對帳", "download-qr-code": "下載二維碼", "download_receipt": "下載收據", + "paid": "已支付", + "paid_confirm": "是否將此訂單狀態設為已支付", "pay_status": "帳單狀態", "pay_status_canceled": "已作廢", "pay_status_paid": "已付款", diff --git a/src/pages/bill/query.tsx b/src/pages/bill/query.tsx index 25e2676..d1e34e7 100644 --- a/src/pages/bill/query.tsx +++ b/src/pages/bill/query.tsx @@ -1,15 +1,16 @@ import {Button, Modal, Notification, Popconfirm, Space, Toast} from "@douyinfe/semi-ui"; import {useState} from "react"; -import {useRequest} from "ahooks"; +import {useRequest, useSetState} from "ahooks"; import {useTranslation} from "react-i18next"; import {BillList} from "@/components/bill/list.tsx"; import SearchForm from "@/components/bill/search-form.tsx"; import BillDetail from "@/components/bill/detail.tsx"; -import {billList, BillQueryParams, cancelBill} from "@/service/api/bill.ts"; +import {billList, BillQueryParams, modifyBillStatus} from "@/service/api/bill.ts"; import {BillStatus, BizError} from "@/service/types.ts"; import {useDownloadReceiptPDF} from "@/service/generate-pdf.ts"; import useAuth from "@/hooks/useAuth.ts"; +import {BillDetailItems} from "@/components/bill"; const DownloadButton = ({bill,text}: { bill: BillModel;text:string }) => { @@ -18,8 +19,17 @@ const DownloadButton = ({bill,text}: { bill: BillModel;text:string }) => { onClick={() => downloadPDF(bill)} size={'small'} theme={'solid'} type={'primary'} loading={downloading}>{text}) } + +// const ConfirmPaidBill =({bill,onRefresh}: { bill: BillModel;onRefresh:()=>void }) => { +// return +// } + const BillQuery = () => { const {user} = useAuth(); + const [state,setState] = useSetState<{ + updateBill?: BillModel + updateLoading?:boolean + }>({}) const [showBill, setShowBill] = useState() const [queryParams, setBillQueryParams] = useState({}); const {data, loading, refresh} = useRequest(() => billList({ @@ -34,7 +44,7 @@ const BillQuery = () => { const {t} = useTranslation() const onConfirmCancel = (bill: BillModel) => { - cancelBill(bill.id).then(() => { + modifyBillStatus(bill.id,'CANCELLED').then(() => { Notification.success({title: 'Notice', content: t('bill.cancel_success')}) refresh() }).catch((e:BizError) => { @@ -44,14 +54,39 @@ const BillQuery = () => { }) }) } + + const onConfirmPaid = () => { + if(!state.updateBill) return; + setState({ + updateLoading: true + }) + modifyBillStatus(state.updateBill.id,'PAID').then(() => { + setState({ + updateBill: undefined,updateLoading: false + }) + Notification.success({title: 'Notice', content: t('base.operate_success')}) + refresh() + }).catch((e:BizError) => { + setState({ + updateLoading: false + }) + Toast.error({ + content: `${t('base.operate_fail')}:${e.message}`, + duration: 3 + }) + }) + } const operation = (bill: BillModel) => { return ( + {bill.status != BillStatus.PAID && + } {bill.status == BillStatus.PENDING && <> onConfirmCancel(bill)} + position={'topRight'} > @@ -87,6 +122,21 @@ const BillQuery = () => { > {showBill && setShowBill(undefined)}/>} + { + setState({updateBill:undefined,updateLoading:false}) + }} + confirmLoading={state.updateLoading} + onOk={onConfirmPaid} + okText={t('base.confirm_paid')} + maskClosable={false} + > + {state.updateBill &&
} +

{t('bill.paid_confirm')}

+
) } export default BillQuery \ No newline at end of file diff --git a/src/service/api/bill.ts b/src/service/api/bill.ts index 93dcc2b..522e28f 100644 --- a/src/service/api/bill.ts +++ b/src/service/api/bill.ts @@ -47,8 +47,8 @@ export function getFlywirePayUrl(id: number, return_cta: string, return_cta_name } // 作废订单 -export function cancelBill(id: number) { - return put(`/bills/${id}/cancel`) +export function modifyBillStatus(id: number,status: BillStatus) { + return put(`/bills/${id}/cancel`,{status}) } export function confirmBills(bill_ids: number[]) { diff --git a/src/types/bill.d.ts b/src/types/bill.d.ts index 720304a..7f1e5fc 100644 --- a/src/types/bill.d.ts +++ b/src/types/bill.d.ts @@ -1,5 +1,6 @@ declare type BaseDate = number | Date | string | null; +declare type BillStatus = 'PAID' | 'CANCELLED' | 'PENDING' // 现场支付账单数据 declare type ManualCreateBillParam = { @@ -21,6 +22,7 @@ declare type BillQueryParam = { page_number:int; status:string; apply_status:string; + id:string|number; student_number:string; application_number:string; payment_channel:string;