import {Button, Col, Divider, Form, InputNumber, Modal, Row, Select, Space} from "@douyinfe/semi-ui"; import {IconAlertCircle} from "@douyinfe/semi-icons"; import React from "react"; import {useTranslation} from "react-i18next"; import {useSetState} from "ahooks"; import {useBillTypes} from "@/hooks/useBillTypes.ts"; import {usePaymentChannels} from "@/hooks/usePaymentChannels.ts"; import {addBillRecord} from "@/service/api/bill.ts" import dayjs from "dayjs"; type BillPaidModalProps = { onConfirm: () => void onCancel?: () => void } type BillTypeListProps = { onClose?: (refresh?: boolean) => void; onChange?: (confirms: ConfirmedBillDetail[]) => void; } export const BillTypeList: React.FC = (props) => { const {t} = useTranslation() const [state, setState] = useSetState<{ confirmed: ConfirmedBillDetail[] }>({ confirmed: [{bill_type: '', amount: 0}] }) const BillTypes = useBillTypes() const onChange = (value: string, index: number, type: 'type' | 'amount') => { if (state.confirmed.length <= index || !value) return; const confirmed = [...state.confirmed] if (type == 'type') { confirmed[index].bill_type = value } else { confirmed[index].amount = Number(value) } setState({confirmed}) props.onChange?.(confirmed) } const addOrRemove = (index: number) => { // 不允许删除最后一个 if (index > -1 && state.confirmed.length <= 1) return; const confirmed = [...state.confirmed, ...(index == -1 ? [{bill_type: '', amount: 0}] : [])] if (index > -1) confirmed.splice(index, 1) setState({confirmed}) props.onChange?.(confirmed) } return (
{t('bill.title_bill_detail')} { state.confirmed.map((item, index) => (
onChange(String(v), index, 'amount')} style={{width: 140}}/>
)) }
) } export const AddBillModal: React.FC = (props) => { const {t} = useTranslation() const {paymentChannelList, paymentMethodList} = usePaymentChannels(); const [state, setState] = useSetState<{ loading?: boolean; open?: boolean; details: ConfirmedBillDetail[]; errorMessage?: string; }>({ details: [] }) const onSubmit = (values: CreateBillRecordModel) => { if (state.details.length == 0) { setState({errorMessage: t('base.validate.error_details_message')}) return; } for (const it of state.details) { if (!it.bill_type || it.amount <= 0) { setState({errorMessage: t('base.validate.error_details_message')}) return; } } setState({ loading: true, errorMessage: undefined }) values.details = state.details values.check_student = true; values.initiated_paid_date = dayjs(values.initiated_paid_date).format("YYYY-MM-DD") values.paid_date = dayjs(values.paid_date).format("YYYY-MM-DD") values.delivered_date = dayjs(values.delivered_date).format("YYYY-MM-DD") addBillRecord(values).then(()=>{ setState({open:false}) props.onConfirm() }).catch(e => { setState({errorMessage: e.message}) }).finally(() => { setState({ loading: false }) }) // } const handleClose = ()=>{ setState({ loading: false, open:false, errorMessage:undefined }) } return (<> onSubmit={onSubmit} initValues={{ merchant_ref: '', application_number: '', student_email: '', paid_area: '', initiated_paid_date: '', paid_date: '', delivered_date: '', payment_method: '', payment_channel: '', check_student: true, details: [] }}>
setState({details})}/> {state.errorMessage &&
{state.errorMessage}
}
) }