Commit 19e4d1a16036d533bb50fb37aef943e609030178
Merge branch 'feature-installment2' into 'dev'
Feature installment2 See merge request !57
Showing
14 changed files
with
509 additions
and
110 deletions
src/pages/Invoice/Invoice/index.tsx
... | ... | @@ -52,6 +52,11 @@ const InvoiceRecord = () => { |
52 | 52 | let dataIndex = item.dataIndex; |
53 | 53 | let dataType = item.valueType; |
54 | 54 | |
55 | + // 如果是mainOrderIds列并且已经有自己的render函数,不要覆盖 | |
56 | + if (dataIndex === 'mainOrderIds' && item.render) { | |
57 | + return newItem; | |
58 | + } | |
59 | + | |
55 | 60 | newItem.render = (text, record) => { |
56 | 61 | let textValue = record[dataIndex]; |
57 | 62 | |
... | ... | @@ -108,16 +113,17 @@ const InvoiceRecord = () => { |
108 | 113 | if (record.paths?.includes('edit')) { |
109 | 114 | btns.push( |
110 | 115 | <a |
116 | + className="p-0" | |
111 | 117 | key="editable" |
112 | 118 | onClick={() => { |
113 | 119 | action?.startEditable?.(record.id); |
114 | 120 | }} |
121 | + style={{ marginRight: 8, whiteSpace: 'nowrap' }} | |
115 | 122 | > |
116 | 123 | 编辑 |
117 | 124 | </a>, |
118 | 125 | ); |
119 | 126 | } |
120 | - | |
121 | 127 | if (record.paths?.includes('writeOff') && !record.writeOffId) { |
122 | 128 | btns.push( |
123 | 129 | <InvoiceWriteOffModal | ... | ... |
src/pages/Invoice/constant.tsx
1 | +import EllipsisDiv from '@/components/Div/EllipsisDiv'; | |
1 | 2 | import { enumToProTableEnumValue } from '@/utils'; |
2 | 3 | import { PAYEE_OPTIONS } from '../Order/constant'; |
3 | 4 | |
... | ... | @@ -45,6 +46,53 @@ export const INVOICE_COLUMNS = [ |
45 | 46 | width: 100, |
46 | 47 | }, |
47 | 48 | { |
49 | + dataIndex: 'mainOrderIds', | |
50 | + title: '主订单id', | |
51 | + valueType: 'text', | |
52 | + width: 160, | |
53 | + hideInTable: false, | |
54 | + hideInSearch: true, | |
55 | + readonly: true, | |
56 | + render: (text: any, record: any) => { | |
57 | + if (!record.mainOrderIds || record.mainOrderIds.length === 0) { | |
58 | + return '-'; | |
59 | + } | |
60 | + | |
61 | + let content = ''; | |
62 | + | |
63 | + // 直接从text参数中处理,可能是已处理过的数组 | |
64 | + if (text && Array.isArray(text)) { | |
65 | + content = text.join(', '); | |
66 | + } | |
67 | + // 如果record.mainOrderIds是数组,直接join | |
68 | + else if (Array.isArray(record.mainOrderIds)) { | |
69 | + content = record.mainOrderIds.join(', '); | |
70 | + } | |
71 | + // 如果是字符串,检查是否为JSON格式的数组 | |
72 | + else if (typeof record.mainOrderIds === 'string') { | |
73 | + try { | |
74 | + // 尝试解析JSON | |
75 | + const parsedData = JSON.parse(record.mainOrderIds); | |
76 | + if (Array.isArray(parsedData)) { | |
77 | + content = parsedData.join(', '); | |
78 | + } else { | |
79 | + content = record.mainOrderIds; | |
80 | + } | |
81 | + } catch (e) { | |
82 | + // 不是JSON格式,使用原始字符串 | |
83 | + content = record.mainOrderIds; | |
84 | + } | |
85 | + } | |
86 | + // 其他情况直接返回原值 | |
87 | + else { | |
88 | + content = String(record.mainOrderIds); | |
89 | + } | |
90 | + | |
91 | + // 使用EllipsisDiv组件显示带省略号的内容 | |
92 | + return <EllipsisDiv text={content} />; | |
93 | + }, | |
94 | + }, | |
95 | + { | |
48 | 96 | dataIndex: 'mainOrderId', |
49 | 97 | title: '主订单id', |
50 | 98 | valueType: 'text', |
... | ... | @@ -65,7 +113,7 @@ export const INVOICE_COLUMNS = [ |
65 | 113 | title: '状态', |
66 | 114 | dataIndex: 'statusText', |
67 | 115 | valueType: 'text', |
68 | - width: 180, | |
116 | + width: 100, | |
69 | 117 | readonly: true, |
70 | 118 | hideInSearch: true, |
71 | 119 | }, |
... | ... | @@ -73,7 +121,7 @@ export const INVOICE_COLUMNS = [ |
73 | 121 | title: '状态', |
74 | 122 | dataIndex: 'writeOffIdIsNull', |
75 | 123 | valueType: 'select', |
76 | - width: 100, | |
124 | + width: 80, | |
77 | 125 | valueEnum: { |
78 | 126 | true: { |
79 | 127 | text: '未核销', | ... | ... |
src/pages/Order/Order/index.tsx
... | ... | @@ -120,7 +120,7 @@ const OrderPage = () => { |
120 | 120 | <div className="order-page-container"> |
121 | 121 | <div id="resizeDiv"></div> |
122 | 122 | <div id="resizeDiv"></div> |
123 | - {roleCode !== 'SALES_MANAGER' && ( | |
123 | + {roleCode === 'SALES_MANAGER' && ( | |
124 | 124 | <Modal |
125 | 125 | title="订单预警提醒" |
126 | 126 | open={open} | ... | ... |
src/pages/Order/OrderList/CheckModal.tsx
... | ... | @@ -707,12 +707,6 @@ export default ({ |
707 | 707 | </Image.PreviewGroup> |
708 | 708 | </div> |
709 | 709 | </Col> |
710 | - <Col span={24}> | |
711 | - <div className="mb-2"> | |
712 | - <span className="font-semibold">备注:</span> | |
713 | - <span>{data?.installmentComment || '-'}</span> | |
714 | - </div> | |
715 | - </Col> | |
716 | 710 | </Row> |
717 | 711 | <Divider></Divider> |
718 | 712 | </> | ... | ... |
src/pages/Order/OrderList/HirePurchaseUploadPayBillModal.tsx
... | ... | @@ -5,7 +5,7 @@ import { |
5 | 5 | } from '@/services'; |
6 | 6 | import { transImageFile } from '@/utils'; |
7 | 7 | import { PlusOutlined } from '@ant-design/icons'; |
8 | -import { Button, Form, Input, Modal, Radio, Upload, message } from 'antd'; | |
8 | +import { Button, Form, Input, Modal, Upload, message } from 'antd'; | |
9 | 9 | import { RcFile } from 'antd/lib/upload'; |
10 | 10 | import { UploadFile, UploadProps } from 'antd/lib/upload/interface'; |
11 | 11 | import { cloneDeep } from 'lodash'; |
... | ... | @@ -41,7 +41,7 @@ const HirePurchaseUploadPayBillModal: React.FC< |
41 | 41 | const remainingMoney = totalPayment - installedMoney; |
42 | 42 | const [form] = Form.useForm(); |
43 | 43 | const [fileList, setFileList] = useState<UploadFile[]>([]); |
44 | - const [paymentType, setPaymentType] = useState<string>('INSTALLMENT'); | |
44 | + const [paymentType] = useState<string>('INSTALLMENT'); | |
45 | 45 | const [previewOpen, setPreviewOpen] = useState(false); |
46 | 46 | const [previewImage, setPreviewImage] = useState(''); |
47 | 47 | const [previewTitle, setPreviewTitle] = useState(''); |
... | ... | @@ -65,17 +65,17 @@ const HirePurchaseUploadPayBillModal: React.FC< |
65 | 65 | </div> |
66 | 66 | ); |
67 | 67 | |
68 | - const handleTypeChange = (e: any) => { | |
69 | - const newType = e.target.value; | |
70 | - setPaymentType(newType); | |
68 | + // const handleTypeChange = (e: any) => { | |
69 | + // const newType = e.target.value; | |
70 | + // setPaymentType(newType); | |
71 | 71 | |
72 | - // 如果选择全部回款,自动填入待回款金额 | |
73 | - if (newType === 'FULL') { | |
74 | - form.setFieldsValue({ | |
75 | - amount: remainingMoney.toFixed(2), | |
76 | - }); | |
77 | - } | |
78 | - }; | |
72 | + // // 如果选择全部回款,自动填入待回款金额 | |
73 | + // if (newType === 'FULL') { | |
74 | + // form.setFieldsValue({ | |
75 | + // amount: remainingMoney.toFixed(2), | |
76 | + // }); | |
77 | + // } | |
78 | + // }; | |
79 | 79 | |
80 | 80 | // 验证回款金额不能超过待回款金额 |
81 | 81 | const validateAmount = (_: any, value: string) => { |
... | ... | @@ -332,18 +332,6 @@ const HirePurchaseUploadPayBillModal: React.FC< |
332 | 332 | <span>{remainingMoney.toFixed(2)}元</span> |
333 | 333 | </div> |
334 | 334 | </div> |
335 | - | |
336 | - <Form.Item | |
337 | - label="回款类型" | |
338 | - name="paymentType" | |
339 | - initialValue={paymentType} | |
340 | - > | |
341 | - <Radio.Group onChange={handleTypeChange}> | |
342 | - <Radio value="INSTALLMENT">分期回款</Radio> | |
343 | - <Radio value="FULL">全部回款</Radio> | |
344 | - </Radio.Group> | |
345 | - </Form.Item> | |
346 | - | |
347 | 335 | <Form.Item |
348 | 336 | label="回款金额" |
349 | 337 | name="amount" |
... | ... | @@ -371,10 +359,6 @@ const HirePurchaseUploadPayBillModal: React.FC< |
371 | 359 | : ''} |
372 | 360 | </Upload> |
373 | 361 | </Form.Item> |
374 | - | |
375 | - <Form.Item label="备注" name="remarks"> | |
376 | - <Input.TextArea rows={4} placeholder="请输入备注信息" /> | |
377 | - </Form.Item> | |
378 | 362 | </Form> |
379 | 363 | </Modal> |
380 | 364 | ... | ... |
src/pages/Order/OrderList/OrderList.tsx
... | ... | @@ -2,6 +2,7 @@ import ButtonConfirm from '@/components/ButtomConfirm'; |
2 | 2 | import { RESPONSE_CODE } from '@/constants/enum'; |
3 | 3 | import ImportExpressBillModal from '@/pages/Order/OrderList/ImportExpressBillModal'; |
4 | 4 | import InvoicingDrawerForm from '@/pages/Order/OrderList/InvoicingDrawerForm'; |
5 | +import PaymentRecordModal from '@/pages/Order/OrderList/PaymentRecordModal'; | |
5 | 6 | import ReissueModal from '@/pages/Order/OrderList/ReissueModal'; |
6 | 7 | import ReissueModal_old from '@/pages/Order/OrderList/ReissueModal_old'; |
7 | 8 | import { |
... | ... | @@ -151,6 +152,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
151 | 152 | hirePurchaseUploadPayBillModalVisible, |
152 | 153 | setHirePurchaseUploadPayBillModalVisible, |
153 | 154 | ] = useState<boolean>(false); |
155 | + const [paymentRecordModalVisible, setPaymentRecordModalVisible] = | |
156 | + useState<boolean>(false); | |
154 | 157 | const [ |
155 | 158 | feedbackRegistrationModalVisible, |
156 | 159 | setFeedbackRegistrationModalVisible, |
... | ... | @@ -1454,20 +1457,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
1454 | 1457 | }} |
1455 | 1458 | /> |
1456 | 1459 | )} |
1457 | - {optRecord.paths?.includes('uploadPaymentReceiptBill') ? ( | |
1458 | - <Button | |
1459 | - className="p-0" | |
1460 | - type="link" | |
1461 | - onClick={() => { | |
1462 | - createOptObject(optRecord.id, record.id); | |
1463 | - setUploadPayBillModalVisible(true); | |
1464 | - }} | |
1465 | - > | |
1466 | - 回款 | |
1467 | - </Button> | |
1468 | - ) : ( | |
1469 | - '' | |
1470 | - )} | |
1471 | 1460 | |
1472 | 1461 | {optRecord.paths?.includes('confirmReissue_old') ? ( |
1473 | 1462 | <Button |
... | ... | @@ -1536,22 +1525,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
1536 | 1525 | '' |
1537 | 1526 | )} |
1538 | 1527 | |
1539 | - {optRecord.paths?.includes('auditPaymentReceipt') ? ( | |
1540 | - <Button | |
1541 | - className="p-0" | |
1542 | - type="link" | |
1543 | - onClick={() => { | |
1544 | - createOptObject(optRecord.id, record.id); | |
1545 | - setCheckVisible(true); | |
1546 | - setOrderCheckType(CHECK_TYPE.PAYMENT_RECEIPTS_AUDIT); | |
1547 | - }} | |
1548 | - > | |
1549 | - 回款审核 | |
1550 | - </Button> | |
1551 | - ) : ( | |
1552 | - '' | |
1553 | - )} | |
1554 | - | |
1555 | 1528 | {optRecord.paths?.includes('modifiedAuditRequest') ? ( |
1556 | 1529 | <Button |
1557 | 1530 | className="p-0" |
... | ... | @@ -2986,6 +2959,21 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
2986 | 2959 | '' |
2987 | 2960 | )} |
2988 | 2961 | |
2962 | + {record.paths?.includes('refundHistory') ? ( | |
2963 | + <Button | |
2964 | + className="p-0" | |
2965 | + type="link" | |
2966 | + onClick={() => { | |
2967 | + createOptObject(record.id, record.id); | |
2968 | + setPaymentRecordModalVisible(true); | |
2969 | + }} | |
2970 | + > | |
2971 | + 付款记录 | |
2972 | + </Button> | |
2973 | + ) : ( | |
2974 | + '' | |
2975 | + )} | |
2976 | + | |
2989 | 2977 | {/* 输出日志以检查权限和支付方式 */} |
2990 | 2978 | {console.log('Order info:', record.id, record.paths)} |
2991 | 2979 | {record.paths?.includes('auditPartialPaymentReceipt') ? ( |
... | ... | @@ -4379,6 +4367,13 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
4379 | 4367 | refreshTable(); |
4380 | 4368 | }} |
4381 | 4369 | defaultValue={0} |
4370 | + style={{ | |
4371 | + display: 'flex', | |
4372 | + flexDirection: 'row', | |
4373 | + alignItems: 'center', | |
4374 | + gap: 8, | |
4375 | + whiteSpace: 'nowrap', | |
4376 | + }} | |
4382 | 4377 | > |
4383 | 4378 | {radios} |
4384 | 4379 | </Radio.Group> |
... | ... | @@ -5366,6 +5361,17 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) => { |
5366 | 5361 | /> |
5367 | 5362 | )} |
5368 | 5363 | |
5364 | + {paymentRecordModalVisible && currentOptMainId && ( | |
5365 | + <PaymentRecordModal | |
5366 | + visible={paymentRecordModalVisible} | |
5367 | + mainOrderId={currentOptMainId} | |
5368 | + onClose={() => { | |
5369 | + setPaymentRecordModalVisible(false); | |
5370 | + clearOptObject(); | |
5371 | + }} | |
5372 | + /> | |
5373 | + )} | |
5374 | + | |
5369 | 5375 | {feedbackRegistrationModalVisible && ( |
5370 | 5376 | <FeedbackRegistrationModal |
5371 | 5377 | setVisible={(val: boolean) => { | ... | ... |
src/pages/Order/OrderList/PaymentRecordModal.tsx
0 → 100644
1 | +import { postServiceOrderRefundHistory } from '@/services'; | |
2 | +import { Button, Empty, Image, Modal } from 'antd'; | |
3 | +import React, { useEffect, useState } from 'react'; | |
4 | + | |
5 | +interface PaymentRecordModalProps { | |
6 | + visible: boolean; | |
7 | + mainOrderId: number; | |
8 | + onClose: () => void; | |
9 | +} | |
10 | + | |
11 | +interface PaymentRecord { | |
12 | + id: number; | |
13 | + mainOrderId: number; | |
14 | + refundMoney: number; | |
15 | + createTime: string; | |
16 | + annex: string; | |
17 | + isAudit: number; | |
18 | + isDel: number; | |
19 | + updateTime: string | null; | |
20 | + paymentReceiptAnnexPartial: string | null; | |
21 | +} | |
22 | + | |
23 | +const PaymentRecordModal: React.FC<PaymentRecordModalProps> = ({ | |
24 | + visible, | |
25 | + mainOrderId, | |
26 | + onClose, | |
27 | +}) => { | |
28 | + const [paymentRecords, setPaymentRecords] = useState<PaymentRecord[]>([]); | |
29 | + | |
30 | + const fetchPaymentRecords = async () => { | |
31 | + if (!mainOrderId) return; | |
32 | + | |
33 | + try { | |
34 | + const response = await postServiceOrderRefundHistory({ | |
35 | + data: { mainOrderId }, | |
36 | + }); | |
37 | + | |
38 | + if (response.result === 0 && response.data) { | |
39 | + setPaymentRecords(response.data); | |
40 | + } else { | |
41 | + setPaymentRecords([]); | |
42 | + } | |
43 | + } catch (error) { | |
44 | + console.error('Failed to fetch payment records:', error); | |
45 | + setPaymentRecords([]); | |
46 | + } | |
47 | + }; | |
48 | + | |
49 | + useEffect(() => { | |
50 | + if (visible && mainOrderId) { | |
51 | + fetchPaymentRecords(); | |
52 | + } | |
53 | + }, [visible, mainOrderId]); | |
54 | + | |
55 | + const parseAnnex = (annexString: string): string[] => { | |
56 | + try { | |
57 | + const parsed = JSON.parse(annexString); | |
58 | + return parsed.map((item: { url: string }) => item.url); | |
59 | + } catch (e) { | |
60 | + console.error('Failed to parse annex:', e); | |
61 | + return []; | |
62 | + } | |
63 | + }; | |
64 | + | |
65 | + return ( | |
66 | + <Modal | |
67 | + title="付款记录" | |
68 | + open={visible} | |
69 | + onCancel={onClose} | |
70 | + footer={[ | |
71 | + <Button key="close" onClick={onClose}> | |
72 | + 关闭 | |
73 | + </Button>, | |
74 | + ]} | |
75 | + width={500} | |
76 | + > | |
77 | + <div className="payment-record-container"> | |
78 | + {paymentRecords.length > 0 ? ( | |
79 | + paymentRecords.map((record, index) => { | |
80 | + const imageUrls = record.annex ? parseAnnex(record.annex) : []; | |
81 | + | |
82 | + return ( | |
83 | + <div key={record.id} className="payment-record-item"> | |
84 | + <div className="payment-record-header"> | |
85 | + {index < paymentRecords.length - 1 && ( | |
86 | + <div className="payment-record-line" /> | |
87 | + )} | |
88 | + <div className="payment-record-circle" /> | |
89 | + </div> | |
90 | + <div className="payment-record-content"> | |
91 | + <div className="payment-record-info"> | |
92 | + <p> | |
93 | + <strong>提交时间:</strong> {record.createTime} | |
94 | + </p> | |
95 | + <p> | |
96 | + <strong>付款金额:</strong>{' '} | |
97 | + {record.refundMoney.toFixed(2)} | |
98 | + </p> | |
99 | + {imageUrls.length > 0 && ( | |
100 | + <p> | |
101 | + <strong>付款凭证:</strong> | |
102 | + </p> | |
103 | + )} | |
104 | + </div> | |
105 | + {imageUrls.length > 0 && ( | |
106 | + <div className="payment-record-images"> | |
107 | + <Image.PreviewGroup> | |
108 | + {imageUrls.map((url, imgIndex) => ( | |
109 | + <Image | |
110 | + key={imgIndex} | |
111 | + width={120} | |
112 | + src={url} | |
113 | + className="payment-record-image" | |
114 | + /> | |
115 | + ))} | |
116 | + </Image.PreviewGroup> | |
117 | + </div> | |
118 | + )} | |
119 | + </div> | |
120 | + </div> | |
121 | + ); | |
122 | + }) | |
123 | + ) : ( | |
124 | + <Empty description="暂无付款记录" className="payment-record-empty" /> | |
125 | + )} | |
126 | + </div> | |
127 | + </Modal> | |
128 | + ); | |
129 | +}; | |
130 | + | |
131 | +export default PaymentRecordModal; | ... | ... |
src/pages/Order/OrderList/UploadPayBillModal.tsx
... | ... | @@ -216,10 +216,24 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) => { |
216 | 216 | }} |
217 | 217 | onOpenChange={setVisible} |
218 | 218 | > |
219 | - <div className="pb-4 text-xs decoration-gray-50">可复制照片粘贴</div> | |
220 | - <Upload {...props}> | |
221 | - {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER ? uploadButton : ''} | |
222 | - </Upload> | |
219 | + <div className="pb-4 text-base font-medium"> | |
220 | + 付款金额:¥{mainOrder?.totalPayment?.toLocaleString() || '0.00'} | |
221 | + </div> | |
222 | + <div className="flex items-start pb-4 text-base font-medium"> | |
223 | + <div>付款凭证:</div> | |
224 | + | |
225 | + <div className="flex flex-col items-start ml-2"> | |
226 | + <div className="mb-1 text-xs decoration-gray-50"> | |
227 | + 可复制照片粘贴 | |
228 | + </div> | |
229 | + | |
230 | + <Upload {...props}> | |
231 | + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER | |
232 | + ? uploadButton | |
233 | + : null} | |
234 | + </Upload> | |
235 | + </div> | |
236 | + </div> | |
223 | 237 | </ModalForm> |
224 | 238 | |
225 | 239 | <Modal | ... | ... |
src/pages/Order/OrderList/index.css
... | ... | @@ -2,6 +2,14 @@ |
2 | 2 | margin-inline: 0 !important; |
3 | 3 | } |
4 | 4 | |
5 | +.order-page-container .ant-table-cell { | |
6 | + word-break: break-word; | |
7 | + white-space: normal !important; | |
8 | + overflow: hidden; | |
9 | + max-width: 500px; | |
10 | + box-sizing: border-box; | |
11 | +} | |
12 | + | |
5 | 13 | .order-page-container td { |
6 | 14 | font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial, |
7 | 15 | 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', |
... | ... | @@ -53,6 +61,8 @@ |
53 | 61 | .order-page-container .ant-table-thead .ant-table-cell { |
54 | 62 | background-color: #fff !important; |
55 | 63 | border-radius: 8px !important; |
64 | + overflow: hidden; | |
65 | + white-space: normal !important; | |
56 | 66 | } |
57 | 67 | |
58 | 68 | #sub-table tbody td { |
... | ... | @@ -98,3 +108,78 @@ |
98 | 108 | |
99 | 109 | /* 设置行与行之间分割线的颜色 */ |
100 | 110 | } |
111 | + | |
112 | +/* 付款记录样式 */ | |
113 | +.payment-record-container { | |
114 | + padding: 10px 0; | |
115 | +} | |
116 | + | |
117 | +.payment-record-item { | |
118 | + position: relative; | |
119 | + display: flex; | |
120 | + margin-bottom: 16px; | |
121 | +} | |
122 | + | |
123 | +.payment-record-header { | |
124 | + position: relative; | |
125 | + width: 24px; | |
126 | + margin-right: 12px; | |
127 | +} | |
128 | + | |
129 | +.payment-record-line { | |
130 | + position: absolute; | |
131 | + top: 0; | |
132 | + bottom: 0; | |
133 | + left: 50%; | |
134 | + width: 1px; | |
135 | + background-color: #e8e8e8; | |
136 | + transform: translateX(-50%); | |
137 | + z-index: 1; | |
138 | +} | |
139 | + | |
140 | +.payment-record-circle { | |
141 | + position: absolute; | |
142 | + top: 12px; | |
143 | + left: 50%; | |
144 | + width: 12px; | |
145 | + height: 12px; | |
146 | + background-color: #d4b106; | |
147 | + border-radius: 50%; | |
148 | + transform: translateX(-50%); | |
149 | + z-index: 2; | |
150 | +} | |
151 | + | |
152 | +.payment-record-content { | |
153 | + flex: 1; | |
154 | + background-color: #f5f5f5; | |
155 | + border-radius: 8px; | |
156 | + padding: 12px 16px; | |
157 | +} | |
158 | + | |
159 | +.payment-record-info p { | |
160 | + margin-bottom: 8px; | |
161 | +} | |
162 | + | |
163 | +.payment-record-images { | |
164 | + display: flex; | |
165 | + flex-wrap: wrap; | |
166 | + gap: 8px; | |
167 | + margin-top: 8px; | |
168 | +} | |
169 | + | |
170 | +.payment-record-image { | |
171 | + border: 1px solid #e8e8e8; | |
172 | + border-radius: 4px; | |
173 | +} | |
174 | + | |
175 | +.payment-record-divider { | |
176 | + height: 1px; | |
177 | + background-color: #e8e8e8; | |
178 | + margin: 16px 0; | |
179 | +} | |
180 | + | |
181 | +.payment-record-empty { | |
182 | + text-align: center; | |
183 | + color: #999; | |
184 | + padding: 20px 0; | |
185 | +} | ... | ... |
src/pages/Order/OrderList/index.less
... | ... | @@ -106,3 +106,78 @@ |
106 | 106 | // .order-tooltip .ant-tooltip-inner{ |
107 | 107 | // color: black !important; |
108 | 108 | // } |
109 | + | |
110 | +/* 付款记录样式 */ | |
111 | +.payment-record-container { | |
112 | + padding: 10px 0; | |
113 | +} | |
114 | + | |
115 | +.payment-record-item { | |
116 | + position: relative; | |
117 | + display: flex; | |
118 | + margin-bottom: 16px; | |
119 | +} | |
120 | + | |
121 | +.payment-record-header { | |
122 | + position: relative; | |
123 | + width: 24px; | |
124 | + margin-right: 12px; | |
125 | +} | |
126 | + | |
127 | +.payment-record-line { | |
128 | + position: absolute; | |
129 | + top: 0; | |
130 | + bottom: 0; | |
131 | + left: 50%; | |
132 | + width: 1px; | |
133 | + background-color: #e8e8e8; | |
134 | + transform: translateX(-50%); | |
135 | + z-index: 1; | |
136 | +} | |
137 | + | |
138 | +.payment-record-circle { | |
139 | + position: absolute; | |
140 | + top: 12px; | |
141 | + left: 50%; | |
142 | + width: 12px; | |
143 | + height: 12px; | |
144 | + background-color: #d4b106; | |
145 | + border-radius: 50%; | |
146 | + transform: translateX(-50%); | |
147 | + z-index: 2; | |
148 | +} | |
149 | + | |
150 | +.payment-record-content { | |
151 | + flex: 1; | |
152 | + background-color: #f5f5f5; | |
153 | + border-radius: 8px; | |
154 | + padding: 12px 16px; | |
155 | +} | |
156 | + | |
157 | +.payment-record-info p { | |
158 | + margin-bottom: 8px; | |
159 | +} | |
160 | + | |
161 | +.payment-record-images { | |
162 | + display: flex; | |
163 | + flex-wrap: wrap; | |
164 | + gap: 8px; | |
165 | + margin-top: 8px; | |
166 | +} | |
167 | + | |
168 | +.payment-record-image { | |
169 | + border: 1px solid #e8e8e8; | |
170 | + border-radius: 4px; | |
171 | +} | |
172 | + | |
173 | +.payment-record-divider { | |
174 | + height: 1px; | |
175 | + background-color: #e8e8e8; | |
176 | + margin: 16px 0; | |
177 | +} | |
178 | + | |
179 | +.payment-record-empty { | |
180 | + text-align: center; | |
181 | + color: #999; | |
182 | + padding: 20px 0; | |
183 | +} | ... | ... |
src/pages/OrderReport/index.tsx
src/pages/ResearchGroup/ResearchGroup/constant.tsx
src/services/definition.ts
... | ... | @@ -1601,7 +1601,6 @@ export interface InstallmentPaymentDTO { |
1601 | 1601 | /** |
1602 | 1602 | * @description |
1603 | 1603 | * 分期付款金额 |
1604 | - * @format int64 | |
1605 | 1604 | */ |
1606 | 1605 | installmentMoney?: number; |
1607 | 1606 | /** |
... | ... | @@ -4401,6 +4400,7 @@ export interface SubOrder { |
4401 | 4400 | paymentChannel?: string; |
4402 | 4401 | paymentMethod?: string; |
4403 | 4402 | paymentReceiptAnnex?: string; |
4403 | + paymentReceiptAnnexPartial?: string; | |
4404 | 4404 | paymentReceiptNotes?: string; |
4405 | 4405 | paymentReceiptStatus?: string; |
4406 | 4406 | paymentStatus?: string; | ... | ... |
src/services/request.ts
... | ... | @@ -75,6 +75,7 @@ import type { |
75 | 75 | MeasureUnitListRes, |
76 | 76 | MergeIntegralDto, |
77 | 77 | MessageQueryDTO, |
78 | + ModelAndView, | |
78 | 79 | OrderAddVO, |
79 | 80 | OrderAuditLogQueryVO, |
80 | 81 | OrderBaseInfoQueryVO, |
... | ... | @@ -4267,9 +4268,7 @@ export interface GetErrorResponse { |
4267 | 4268 | * @description |
4268 | 4269 | * OK |
4269 | 4270 | */ |
4270 | - 200: { | |
4271 | - [propertyName: string]: any; | |
4272 | - }; | |
4271 | + 200: ModelAndView; | |
4273 | 4272 | /** |
4274 | 4273 | * @description |
4275 | 4274 | * Unauthorized |
... | ... | @@ -4290,9 +4289,9 @@ export interface GetErrorResponse { |
4290 | 4289 | export type GetErrorResponseSuccess = GetErrorResponse[200]; |
4291 | 4290 | /** |
4292 | 4291 | * @description |
4293 | - * error | |
4292 | + * errorHtml | |
4294 | 4293 | * @tags basic-error-controller |
4295 | - * @produces * | |
4294 | + * @produces text/html | |
4296 | 4295 | */ |
4297 | 4296 | export const getError = /* #__PURE__ */ (() => { |
4298 | 4297 | const method = 'get'; |
... | ... | @@ -4316,9 +4315,7 @@ export interface PutErrorResponse { |
4316 | 4315 | * @description |
4317 | 4316 | * OK |
4318 | 4317 | */ |
4319 | - 200: { | |
4320 | - [propertyName: string]: any; | |
4321 | - }; | |
4318 | + 200: ModelAndView; | |
4322 | 4319 | /** |
4323 | 4320 | * @description |
4324 | 4321 | * Created |
... | ... | @@ -4344,9 +4341,9 @@ export interface PutErrorResponse { |
4344 | 4341 | export type PutErrorResponseSuccess = PutErrorResponse[200]; |
4345 | 4342 | /** |
4346 | 4343 | * @description |
4347 | - * error | |
4344 | + * errorHtml | |
4348 | 4345 | * @tags basic-error-controller |
4349 | - * @produces * | |
4346 | + * @produces text/html | |
4350 | 4347 | * @consumes application/json |
4351 | 4348 | */ |
4352 | 4349 | export const putError = /* #__PURE__ */ (() => { |
... | ... | @@ -4371,9 +4368,7 @@ export interface PostErrorResponse { |
4371 | 4368 | * @description |
4372 | 4369 | * OK |
4373 | 4370 | */ |
4374 | - 200: { | |
4375 | - [propertyName: string]: any; | |
4376 | - }; | |
4371 | + 200: ModelAndView; | |
4377 | 4372 | /** |
4378 | 4373 | * @description |
4379 | 4374 | * Created |
... | ... | @@ -4399,9 +4394,9 @@ export interface PostErrorResponse { |
4399 | 4394 | export type PostErrorResponseSuccess = PostErrorResponse[200]; |
4400 | 4395 | /** |
4401 | 4396 | * @description |
4402 | - * error | |
4397 | + * errorHtml | |
4403 | 4398 | * @tags basic-error-controller |
4404 | - * @produces * | |
4399 | + * @produces text/html | |
4405 | 4400 | * @consumes application/json |
4406 | 4401 | */ |
4407 | 4402 | export const postError = /* #__PURE__ */ (() => { |
... | ... | @@ -4426,9 +4421,7 @@ export interface DeleteErrorResponse { |
4426 | 4421 | * @description |
4427 | 4422 | * OK |
4428 | 4423 | */ |
4429 | - 200: { | |
4430 | - [propertyName: string]: any; | |
4431 | - }; | |
4424 | + 200: ModelAndView; | |
4432 | 4425 | /** |
4433 | 4426 | * @description |
4434 | 4427 | * No Content |
... | ... | @@ -4449,9 +4442,9 @@ export interface DeleteErrorResponse { |
4449 | 4442 | export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; |
4450 | 4443 | /** |
4451 | 4444 | * @description |
4452 | - * error | |
4445 | + * errorHtml | |
4453 | 4446 | * @tags basic-error-controller |
4454 | - * @produces * | |
4447 | + * @produces text/html | |
4455 | 4448 | */ |
4456 | 4449 | export const deleteError = /* #__PURE__ */ (() => { |
4457 | 4450 | const method = 'delete'; |
... | ... | @@ -4475,9 +4468,7 @@ export interface OptionsErrorResponse { |
4475 | 4468 | * @description |
4476 | 4469 | * OK |
4477 | 4470 | */ |
4478 | - 200: { | |
4479 | - [propertyName: string]: any; | |
4480 | - }; | |
4471 | + 200: ModelAndView; | |
4481 | 4472 | /** |
4482 | 4473 | * @description |
4483 | 4474 | * No Content |
... | ... | @@ -4498,9 +4489,9 @@ export interface OptionsErrorResponse { |
4498 | 4489 | export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; |
4499 | 4490 | /** |
4500 | 4491 | * @description |
4501 | - * error | |
4492 | + * errorHtml | |
4502 | 4493 | * @tags basic-error-controller |
4503 | - * @produces * | |
4494 | + * @produces text/html | |
4504 | 4495 | * @consumes application/json |
4505 | 4496 | */ |
4506 | 4497 | export const optionsError = /* #__PURE__ */ (() => { |
... | ... | @@ -4525,9 +4516,7 @@ export interface HeadErrorResponse { |
4525 | 4516 | * @description |
4526 | 4517 | * OK |
4527 | 4518 | */ |
4528 | - 200: { | |
4529 | - [propertyName: string]: any; | |
4530 | - }; | |
4519 | + 200: ModelAndView; | |
4531 | 4520 | /** |
4532 | 4521 | * @description |
4533 | 4522 | * No Content |
... | ... | @@ -4548,9 +4537,9 @@ export interface HeadErrorResponse { |
4548 | 4537 | export type HeadErrorResponseSuccess = HeadErrorResponse[200]; |
4549 | 4538 | /** |
4550 | 4539 | * @description |
4551 | - * error | |
4540 | + * errorHtml | |
4552 | 4541 | * @tags basic-error-controller |
4553 | - * @produces * | |
4542 | + * @produces text/html | |
4554 | 4543 | * @consumes application/json |
4555 | 4544 | */ |
4556 | 4545 | export const headError = /* #__PURE__ */ (() => { |
... | ... | @@ -4575,9 +4564,7 @@ export interface PatchErrorResponse { |
4575 | 4564 | * @description |
4576 | 4565 | * OK |
4577 | 4566 | */ |
4578 | - 200: { | |
4579 | - [propertyName: string]: any; | |
4580 | - }; | |
4567 | + 200: ModelAndView; | |
4581 | 4568 | /** |
4582 | 4569 | * @description |
4583 | 4570 | * No Content |
... | ... | @@ -4598,9 +4585,9 @@ export interface PatchErrorResponse { |
4598 | 4585 | export type PatchErrorResponseSuccess = PatchErrorResponse[200]; |
4599 | 4586 | /** |
4600 | 4587 | * @description |
4601 | - * error | |
4588 | + * errorHtml | |
4602 | 4589 | * @tags basic-error-controller |
4603 | - * @produces * | |
4590 | + * @produces text/html | |
4604 | 4591 | * @consumes application/json |
4605 | 4592 | */ |
4606 | 4593 | export const patchError = /* #__PURE__ */ (() => { |
... | ... | @@ -25903,6 +25890,77 @@ export const postServiceOrderQuerySupplier = /* #__PURE__ */ (() => { |
25903 | 25890 | return request; |
25904 | 25891 | })(); |
25905 | 25892 | |
25893 | +/** @description request parameter type for postServiceOrderRefundHistory */ | |
25894 | +export interface PostServiceOrderRefundHistoryOption { | |
25895 | + /** | |
25896 | + * @description | |
25897 | + * mainOrderId | |
25898 | + */ | |
25899 | + body: { | |
25900 | + /** | |
25901 | + @description | |
25902 | + mainOrderId */ | |
25903 | + mainOrderId: number; | |
25904 | + }; | |
25905 | +} | |
25906 | + | |
25907 | +/** @description response type for postServiceOrderRefundHistory */ | |
25908 | +export interface PostServiceOrderRefundHistoryResponse { | |
25909 | + /** | |
25910 | + * @description | |
25911 | + * OK | |
25912 | + */ | |
25913 | + 200: ServerResult; | |
25914 | + /** | |
25915 | + * @description | |
25916 | + * Created | |
25917 | + */ | |
25918 | + 201: any; | |
25919 | + /** | |
25920 | + * @description | |
25921 | + * Unauthorized | |
25922 | + */ | |
25923 | + 401: any; | |
25924 | + /** | |
25925 | + * @description | |
25926 | + * Forbidden | |
25927 | + */ | |
25928 | + 403: any; | |
25929 | + /** | |
25930 | + * @description | |
25931 | + * Not Found | |
25932 | + */ | |
25933 | + 404: any; | |
25934 | +} | |
25935 | + | |
25936 | +export type PostServiceOrderRefundHistoryResponseSuccess = | |
25937 | + PostServiceOrderRefundHistoryResponse[200]; | |
25938 | +/** | |
25939 | + * @description | |
25940 | + * 根据主订单ID查询退款历史记录 | |
25941 | + * @tags 内部订单 | |
25942 | + * @produces * | |
25943 | + * @consumes application/json | |
25944 | + */ | |
25945 | +export const postServiceOrderRefundHistory = /* #__PURE__ */ (() => { | |
25946 | + const method = 'post'; | |
25947 | + const url = '/service/order/refundHistory'; | |
25948 | + function request( | |
25949 | + option: PostServiceOrderRefundHistoryOption, | |
25950 | + ): Promise<PostServiceOrderRefundHistoryResponseSuccess> { | |
25951 | + return requester(request.url, { | |
25952 | + method: request.method, | |
25953 | + ...option, | |
25954 | + }) as unknown as Promise<PostServiceOrderRefundHistoryResponseSuccess>; | |
25955 | + } | |
25956 | + | |
25957 | + /** http method */ | |
25958 | + request.method = method; | |
25959 | + /** request url */ | |
25960 | + request.url = url; | |
25961 | + return request; | |
25962 | +})(); | |
25963 | + | |
25906 | 25964 | /** @description request parameter type for postServiceOrderRemindShipping */ |
25907 | 25965 | export interface PostServiceOrderRemindShippingOption { |
25908 | 25966 | /** | ... | ... |