Commit 19e4d1a16036d533bb50fb37aef943e609030178

Authored by boyang
2 parents 630d5f83 e82d7a13

Merge branch 'feature-installment2' into 'dev'

Feature installment2



See merge request !57
src/pages/Invoice/Invoice/index.tsx
@@ -52,6 +52,11 @@ const InvoiceRecord = () => { @@ -52,6 +52,11 @@ const InvoiceRecord = () => {
52 let dataIndex = item.dataIndex; 52 let dataIndex = item.dataIndex;
53 let dataType = item.valueType; 53 let dataType = item.valueType;
54 54
  55 + // 如果是mainOrderIds列并且已经有自己的render函数,不要覆盖
  56 + if (dataIndex === 'mainOrderIds' && item.render) {
  57 + return newItem;
  58 + }
  59 +
55 newItem.render = (text, record) => { 60 newItem.render = (text, record) => {
56 let textValue = record[dataIndex]; 61 let textValue = record[dataIndex];
57 62
@@ -108,16 +113,17 @@ const InvoiceRecord = () => { @@ -108,16 +113,17 @@ const InvoiceRecord = () => {
108 if (record.paths?.includes('edit')) { 113 if (record.paths?.includes('edit')) {
109 btns.push( 114 btns.push(
110 <a 115 <a
  116 + className="p-0"
111 key="editable" 117 key="editable"
112 onClick={() => { 118 onClick={() => {
113 action?.startEditable?.(record.id); 119 action?.startEditable?.(record.id);
114 }} 120 }}
  121 + style={{ marginRight: 8, whiteSpace: 'nowrap' }}
115 > 122 >
116 编辑 123 编辑
117 </a>, 124 </a>,
118 ); 125 );
119 } 126 }
120 -  
121 if (record.paths?.includes('writeOff') && !record.writeOffId) { 127 if (record.paths?.includes('writeOff') && !record.writeOffId) {
122 btns.push( 128 btns.push(
123 <InvoiceWriteOffModal 129 <InvoiceWriteOffModal
src/pages/Invoice/constant.tsx
  1 +import EllipsisDiv from '@/components/Div/EllipsisDiv';
1 import { enumToProTableEnumValue } from '@/utils'; 2 import { enumToProTableEnumValue } from '@/utils';
2 import { PAYEE_OPTIONS } from '../Order/constant'; 3 import { PAYEE_OPTIONS } from '../Order/constant';
3 4
@@ -45,6 +46,53 @@ export const INVOICE_COLUMNS = [ @@ -45,6 +46,53 @@ export const INVOICE_COLUMNS = [
45 width: 100, 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 dataIndex: 'mainOrderId', 96 dataIndex: 'mainOrderId',
49 title: '主订单id', 97 title: '主订单id',
50 valueType: 'text', 98 valueType: 'text',
@@ -65,7 +113,7 @@ export const INVOICE_COLUMNS = [ @@ -65,7 +113,7 @@ export const INVOICE_COLUMNS = [
65 title: '状态', 113 title: '状态',
66 dataIndex: 'statusText', 114 dataIndex: 'statusText',
67 valueType: 'text', 115 valueType: 'text',
68 - width: 180, 116 + width: 100,
69 readonly: true, 117 readonly: true,
70 hideInSearch: true, 118 hideInSearch: true,
71 }, 119 },
@@ -73,7 +121,7 @@ export const INVOICE_COLUMNS = [ @@ -73,7 +121,7 @@ export const INVOICE_COLUMNS = [
73 title: '状态', 121 title: '状态',
74 dataIndex: 'writeOffIdIsNull', 122 dataIndex: 'writeOffIdIsNull',
75 valueType: 'select', 123 valueType: 'select',
76 - width: 100, 124 + width: 80,
77 valueEnum: { 125 valueEnum: {
78 true: { 126 true: {
79 text: '未核销', 127 text: '未核销',
src/pages/Order/Order/index.tsx
@@ -120,7 +120,7 @@ const OrderPage = () =&gt; { @@ -120,7 +120,7 @@ const OrderPage = () =&gt; {
120 <div className="order-page-container"> 120 <div className="order-page-container">
121 <div id="resizeDiv"></div> 121 <div id="resizeDiv"></div>
122 <div id="resizeDiv"></div> 122 <div id="resizeDiv"></div>
123 - {roleCode !== 'SALES_MANAGER' && ( 123 + {roleCode === 'SALES_MANAGER' && (
124 <Modal 124 <Modal
125 title="订单预警提醒" 125 title="订单预警提醒"
126 open={open} 126 open={open}
src/pages/Order/OrderList/CheckModal.tsx
@@ -707,12 +707,6 @@ export default ({ @@ -707,12 +707,6 @@ export default ({
707 </Image.PreviewGroup> 707 </Image.PreviewGroup>
708 </div> 708 </div>
709 </Col> 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 </Row> 710 </Row>
717 <Divider></Divider> 711 <Divider></Divider>
718 </> 712 </>
src/pages/Order/OrderList/HirePurchaseUploadPayBillModal.tsx
@@ -5,7 +5,7 @@ import { @@ -5,7 +5,7 @@ import {
5 } from '@/services'; 5 } from '@/services';
6 import { transImageFile } from '@/utils'; 6 import { transImageFile } from '@/utils';
7 import { PlusOutlined } from '@ant-design/icons'; 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 import { RcFile } from 'antd/lib/upload'; 9 import { RcFile } from 'antd/lib/upload';
10 import { UploadFile, UploadProps } from 'antd/lib/upload/interface'; 10 import { UploadFile, UploadProps } from 'antd/lib/upload/interface';
11 import { cloneDeep } from 'lodash'; 11 import { cloneDeep } from 'lodash';
@@ -41,7 +41,7 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -41,7 +41,7 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
41 const remainingMoney = totalPayment - installedMoney; 41 const remainingMoney = totalPayment - installedMoney;
42 const [form] = Form.useForm(); 42 const [form] = Form.useForm();
43 const [fileList, setFileList] = useState<UploadFile[]>([]); 43 const [fileList, setFileList] = useState<UploadFile[]>([]);
44 - const [paymentType, setPaymentType] = useState<string>('INSTALLMENT'); 44 + const [paymentType] = useState<string>('INSTALLMENT');
45 const [previewOpen, setPreviewOpen] = useState(false); 45 const [previewOpen, setPreviewOpen] = useState(false);
46 const [previewImage, setPreviewImage] = useState(''); 46 const [previewImage, setPreviewImage] = useState('');
47 const [previewTitle, setPreviewTitle] = useState(''); 47 const [previewTitle, setPreviewTitle] = useState('');
@@ -65,17 +65,17 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -65,17 +65,17 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
65 </div> 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 const validateAmount = (_: any, value: string) => { 81 const validateAmount = (_: any, value: string) => {
@@ -332,18 +332,6 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -332,18 +332,6 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
332 <span>{remainingMoney.toFixed(2)}元</span> 332 <span>{remainingMoney.toFixed(2)}元</span>
333 </div> 333 </div>
334 </div> 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 <Form.Item 335 <Form.Item
348 label="回款金额" 336 label="回款金额"
349 name="amount" 337 name="amount"
@@ -371,10 +359,6 @@ const HirePurchaseUploadPayBillModal: React.FC&lt; @@ -371,10 +359,6 @@ const HirePurchaseUploadPayBillModal: React.FC&lt;
371 : ''} 359 : ''}
372 </Upload> 360 </Upload>
373 </Form.Item> 361 </Form.Item>
374 -  
375 - <Form.Item label="备注" name="remarks">  
376 - <Input.TextArea rows={4} placeholder="请输入备注信息" />  
377 - </Form.Item>  
378 </Form> 362 </Form>
379 </Modal> 363 </Modal>
380 364
src/pages/Order/OrderList/OrderList.tsx
@@ -2,6 +2,7 @@ import ButtonConfirm from &#39;@/components/ButtomConfirm&#39;; @@ -2,6 +2,7 @@ import ButtonConfirm from &#39;@/components/ButtomConfirm&#39;;
2 import { RESPONSE_CODE } from '@/constants/enum'; 2 import { RESPONSE_CODE } from '@/constants/enum';
3 import ImportExpressBillModal from '@/pages/Order/OrderList/ImportExpressBillModal'; 3 import ImportExpressBillModal from '@/pages/Order/OrderList/ImportExpressBillModal';
4 import InvoicingDrawerForm from '@/pages/Order/OrderList/InvoicingDrawerForm'; 4 import InvoicingDrawerForm from '@/pages/Order/OrderList/InvoicingDrawerForm';
  5 +import PaymentRecordModal from '@/pages/Order/OrderList/PaymentRecordModal';
5 import ReissueModal from '@/pages/Order/OrderList/ReissueModal'; 6 import ReissueModal from '@/pages/Order/OrderList/ReissueModal';
6 import ReissueModal_old from '@/pages/Order/OrderList/ReissueModal_old'; 7 import ReissueModal_old from '@/pages/Order/OrderList/ReissueModal_old';
7 import { 8 import {
@@ -151,6 +152,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -151,6 +152,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
151 hirePurchaseUploadPayBillModalVisible, 152 hirePurchaseUploadPayBillModalVisible,
152 setHirePurchaseUploadPayBillModalVisible, 153 setHirePurchaseUploadPayBillModalVisible,
153 ] = useState<boolean>(false); 154 ] = useState<boolean>(false);
  155 + const [paymentRecordModalVisible, setPaymentRecordModalVisible] =
  156 + useState<boolean>(false);
154 const [ 157 const [
155 feedbackRegistrationModalVisible, 158 feedbackRegistrationModalVisible,
156 setFeedbackRegistrationModalVisible, 159 setFeedbackRegistrationModalVisible,
@@ -1454,20 +1457,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -1454,20 +1457,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
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 {optRecord.paths?.includes('confirmReissue_old') ? ( 1461 {optRecord.paths?.includes('confirmReissue_old') ? (
1473 <Button 1462 <Button
@@ -1536,22 +1525,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -1536,22 +1525,6 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
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 {optRecord.paths?.includes('modifiedAuditRequest') ? ( 1528 {optRecord.paths?.includes('modifiedAuditRequest') ? (
1556 <Button 1529 <Button
1557 className="p-0" 1530 className="p-0"
@@ -2986,6 +2959,21 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -2986,6 +2959,21 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
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 {console.log('Order info:', record.id, record.paths)} 2978 {console.log('Order info:', record.id, record.paths)}
2991 {record.paths?.includes('auditPartialPaymentReceipt') ? ( 2979 {record.paths?.includes('auditPartialPaymentReceipt') ? (
@@ -4379,6 +4367,13 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -4379,6 +4367,13 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
4379 refreshTable(); 4367 refreshTable();
4380 }} 4368 }}
4381 defaultValue={0} 4369 defaultValue={0}
  4370 + style={{
  4371 + display: 'flex',
  4372 + flexDirection: 'row',
  4373 + alignItems: 'center',
  4374 + gap: 8,
  4375 + whiteSpace: 'nowrap',
  4376 + }}
4382 > 4377 >
4383 {radios} 4378 {radios}
4384 </Radio.Group> 4379 </Radio.Group>
@@ -5366,6 +5361,17 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; { @@ -5366,6 +5361,17 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
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 {feedbackRegistrationModalVisible && ( 5375 {feedbackRegistrationModalVisible && (
5370 <FeedbackRegistrationModal 5376 <FeedbackRegistrationModal
5371 setVisible={(val: boolean) => { 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 }) =&gt; { @@ -216,10 +216,24 @@ export default ({ setVisible, subOrders, mainOrder, onClose }) =&gt; {
216 }} 216 }}
217 onOpenChange={setVisible} 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 </ModalForm> 237 </ModalForm>
224 238
225 <Modal 239 <Modal
src/pages/Order/OrderList/index.css
@@ -2,6 +2,14 @@ @@ -2,6 +2,14 @@
2 margin-inline: 0 !important; 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 .order-page-container td { 13 .order-page-container td {
6 font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial, 14 font-family: 'San Francisco', 'Helvetica Neue', Helvetica, Arial,
7 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', 15 'Microsoft YaHei', 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC',
@@ -53,6 +61,8 @@ @@ -53,6 +61,8 @@
53 .order-page-container .ant-table-thead .ant-table-cell { 61 .order-page-container .ant-table-thead .ant-table-cell {
54 background-color: #fff !important; 62 background-color: #fff !important;
55 border-radius: 8px !important; 63 border-radius: 8px !important;
  64 + overflow: hidden;
  65 + white-space: normal !important;
56 } 66 }
57 67
58 #sub-table tbody td { 68 #sub-table tbody td {
@@ -98,3 +108,78 @@ @@ -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,3 +106,78 @@
106 // .order-tooltip .ant-tooltip-inner{ 106 // .order-tooltip .ant-tooltip-inner{
107 // color: black !important; 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
@@ -181,7 +181,6 @@ const OrderReportPage = () =&gt; { @@ -181,7 +181,6 @@ const OrderReportPage = () =&gt; {
181 }, [selectedMonth, selectedYear]); 181 }, [selectedMonth, selectedYear]);
182 182
183 useEffect(() => { 183 useEffect(() => {
184 - loadData();  
185 getSalesCodeOptions(); 184 getSalesCodeOptions();
186 }, []); 185 }, []);
187 186
src/pages/ResearchGroup/ResearchGroup/constant.tsx
@@ -20,7 +20,6 @@ export const RESEARCH_GROUP_COLUMNS = [ @@ -20,7 +20,6 @@ export const RESEARCH_GROUP_COLUMNS = [
20 key: 'id', 20 key: 'id',
21 valueType: 'index', 21 valueType: 'index',
22 hideInSearch: true, 22 hideInSearch: true,
23 - hideInTable: true,  
24 }, 23 },
25 { 24 {
26 title: '课题组名称', 25 title: '课题组名称',
src/services/definition.ts
@@ -1601,7 +1601,6 @@ export interface InstallmentPaymentDTO { @@ -1601,7 +1601,6 @@ export interface InstallmentPaymentDTO {
1601 /** 1601 /**
1602 * @description 1602 * @description
1603 * 分期付款金额 1603 * 分期付款金额
1604 - * @format int64  
1605 */ 1604 */
1606 installmentMoney?: number; 1605 installmentMoney?: number;
1607 /** 1606 /**
@@ -4401,6 +4400,7 @@ export interface SubOrder { @@ -4401,6 +4400,7 @@ export interface SubOrder {
4401 paymentChannel?: string; 4400 paymentChannel?: string;
4402 paymentMethod?: string; 4401 paymentMethod?: string;
4403 paymentReceiptAnnex?: string; 4402 paymentReceiptAnnex?: string;
  4403 + paymentReceiptAnnexPartial?: string;
4404 paymentReceiptNotes?: string; 4404 paymentReceiptNotes?: string;
4405 paymentReceiptStatus?: string; 4405 paymentReceiptStatus?: string;
4406 paymentStatus?: string; 4406 paymentStatus?: string;
src/services/request.ts
@@ -75,6 +75,7 @@ import type { @@ -75,6 +75,7 @@ import type {
75 MeasureUnitListRes, 75 MeasureUnitListRes,
76 MergeIntegralDto, 76 MergeIntegralDto,
77 MessageQueryDTO, 77 MessageQueryDTO,
  78 + ModelAndView,
78 OrderAddVO, 79 OrderAddVO,
79 OrderAuditLogQueryVO, 80 OrderAuditLogQueryVO,
80 OrderBaseInfoQueryVO, 81 OrderBaseInfoQueryVO,
@@ -4267,9 +4268,7 @@ export interface GetErrorResponse { @@ -4267,9 +4268,7 @@ export interface GetErrorResponse {
4267 * @description 4268 * @description
4268 * OK 4269 * OK
4269 */ 4270 */
4270 - 200: {  
4271 - [propertyName: string]: any;  
4272 - }; 4271 + 200: ModelAndView;
4273 /** 4272 /**
4274 * @description 4273 * @description
4275 * Unauthorized 4274 * Unauthorized
@@ -4290,9 +4289,9 @@ export interface GetErrorResponse { @@ -4290,9 +4289,9 @@ export interface GetErrorResponse {
4290 export type GetErrorResponseSuccess = GetErrorResponse[200]; 4289 export type GetErrorResponseSuccess = GetErrorResponse[200];
4291 /** 4290 /**
4292 * @description 4291 * @description
4293 - * error 4292 + * errorHtml
4294 * @tags basic-error-controller 4293 * @tags basic-error-controller
4295 - * @produces * 4294 + * @produces text/html
4296 */ 4295 */
4297 export const getError = /* #__PURE__ */ (() => { 4296 export const getError = /* #__PURE__ */ (() => {
4298 const method = 'get'; 4297 const method = 'get';
@@ -4316,9 +4315,7 @@ export interface PutErrorResponse { @@ -4316,9 +4315,7 @@ export interface PutErrorResponse {
4316 * @description 4315 * @description
4317 * OK 4316 * OK
4318 */ 4317 */
4319 - 200: {  
4320 - [propertyName: string]: any;  
4321 - }; 4318 + 200: ModelAndView;
4322 /** 4319 /**
4323 * @description 4320 * @description
4324 * Created 4321 * Created
@@ -4344,9 +4341,9 @@ export interface PutErrorResponse { @@ -4344,9 +4341,9 @@ export interface PutErrorResponse {
4344 export type PutErrorResponseSuccess = PutErrorResponse[200]; 4341 export type PutErrorResponseSuccess = PutErrorResponse[200];
4345 /** 4342 /**
4346 * @description 4343 * @description
4347 - * error 4344 + * errorHtml
4348 * @tags basic-error-controller 4345 * @tags basic-error-controller
4349 - * @produces * 4346 + * @produces text/html
4350 * @consumes application/json 4347 * @consumes application/json
4351 */ 4348 */
4352 export const putError = /* #__PURE__ */ (() => { 4349 export const putError = /* #__PURE__ */ (() => {
@@ -4371,9 +4368,7 @@ export interface PostErrorResponse { @@ -4371,9 +4368,7 @@ export interface PostErrorResponse {
4371 * @description 4368 * @description
4372 * OK 4369 * OK
4373 */ 4370 */
4374 - 200: {  
4375 - [propertyName: string]: any;  
4376 - }; 4371 + 200: ModelAndView;
4377 /** 4372 /**
4378 * @description 4373 * @description
4379 * Created 4374 * Created
@@ -4399,9 +4394,9 @@ export interface PostErrorResponse { @@ -4399,9 +4394,9 @@ export interface PostErrorResponse {
4399 export type PostErrorResponseSuccess = PostErrorResponse[200]; 4394 export type PostErrorResponseSuccess = PostErrorResponse[200];
4400 /** 4395 /**
4401 * @description 4396 * @description
4402 - * error 4397 + * errorHtml
4403 * @tags basic-error-controller 4398 * @tags basic-error-controller
4404 - * @produces * 4399 + * @produces text/html
4405 * @consumes application/json 4400 * @consumes application/json
4406 */ 4401 */
4407 export const postError = /* #__PURE__ */ (() => { 4402 export const postError = /* #__PURE__ */ (() => {
@@ -4426,9 +4421,7 @@ export interface DeleteErrorResponse { @@ -4426,9 +4421,7 @@ export interface DeleteErrorResponse {
4426 * @description 4421 * @description
4427 * OK 4422 * OK
4428 */ 4423 */
4429 - 200: {  
4430 - [propertyName: string]: any;  
4431 - }; 4424 + 200: ModelAndView;
4432 /** 4425 /**
4433 * @description 4426 * @description
4434 * No Content 4427 * No Content
@@ -4449,9 +4442,9 @@ export interface DeleteErrorResponse { @@ -4449,9 +4442,9 @@ export interface DeleteErrorResponse {
4449 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200]; 4442 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
4450 /** 4443 /**
4451 * @description 4444 * @description
4452 - * error 4445 + * errorHtml
4453 * @tags basic-error-controller 4446 * @tags basic-error-controller
4454 - * @produces * 4447 + * @produces text/html
4455 */ 4448 */
4456 export const deleteError = /* #__PURE__ */ (() => { 4449 export const deleteError = /* #__PURE__ */ (() => {
4457 const method = 'delete'; 4450 const method = 'delete';
@@ -4475,9 +4468,7 @@ export interface OptionsErrorResponse { @@ -4475,9 +4468,7 @@ export interface OptionsErrorResponse {
4475 * @description 4468 * @description
4476 * OK 4469 * OK
4477 */ 4470 */
4478 - 200: {  
4479 - [propertyName: string]: any;  
4480 - }; 4471 + 200: ModelAndView;
4481 /** 4472 /**
4482 * @description 4473 * @description
4483 * No Content 4474 * No Content
@@ -4498,9 +4489,9 @@ export interface OptionsErrorResponse { @@ -4498,9 +4489,9 @@ export interface OptionsErrorResponse {
4498 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200]; 4489 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
4499 /** 4490 /**
4500 * @description 4491 * @description
4501 - * error 4492 + * errorHtml
4502 * @tags basic-error-controller 4493 * @tags basic-error-controller
4503 - * @produces * 4494 + * @produces text/html
4504 * @consumes application/json 4495 * @consumes application/json
4505 */ 4496 */
4506 export const optionsError = /* #__PURE__ */ (() => { 4497 export const optionsError = /* #__PURE__ */ (() => {
@@ -4525,9 +4516,7 @@ export interface HeadErrorResponse { @@ -4525,9 +4516,7 @@ export interface HeadErrorResponse {
4525 * @description 4516 * @description
4526 * OK 4517 * OK
4527 */ 4518 */
4528 - 200: {  
4529 - [propertyName: string]: any;  
4530 - }; 4519 + 200: ModelAndView;
4531 /** 4520 /**
4532 * @description 4521 * @description
4533 * No Content 4522 * No Content
@@ -4548,9 +4537,9 @@ export interface HeadErrorResponse { @@ -4548,9 +4537,9 @@ export interface HeadErrorResponse {
4548 export type HeadErrorResponseSuccess = HeadErrorResponse[200]; 4537 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
4549 /** 4538 /**
4550 * @description 4539 * @description
4551 - * error 4540 + * errorHtml
4552 * @tags basic-error-controller 4541 * @tags basic-error-controller
4553 - * @produces * 4542 + * @produces text/html
4554 * @consumes application/json 4543 * @consumes application/json
4555 */ 4544 */
4556 export const headError = /* #__PURE__ */ (() => { 4545 export const headError = /* #__PURE__ */ (() => {
@@ -4575,9 +4564,7 @@ export interface PatchErrorResponse { @@ -4575,9 +4564,7 @@ export interface PatchErrorResponse {
4575 * @description 4564 * @description
4576 * OK 4565 * OK
4577 */ 4566 */
4578 - 200: {  
4579 - [propertyName: string]: any;  
4580 - }; 4567 + 200: ModelAndView;
4581 /** 4568 /**
4582 * @description 4569 * @description
4583 * No Content 4570 * No Content
@@ -4598,9 +4585,9 @@ export interface PatchErrorResponse { @@ -4598,9 +4585,9 @@ export interface PatchErrorResponse {
4598 export type PatchErrorResponseSuccess = PatchErrorResponse[200]; 4585 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
4599 /** 4586 /**
4600 * @description 4587 * @description
4601 - * error 4588 + * errorHtml
4602 * @tags basic-error-controller 4589 * @tags basic-error-controller
4603 - * @produces * 4590 + * @produces text/html
4604 * @consumes application/json 4591 * @consumes application/json
4605 */ 4592 */
4606 export const patchError = /* #__PURE__ */ (() => { 4593 export const patchError = /* #__PURE__ */ (() => {
@@ -25903,6 +25890,77 @@ export const postServiceOrderQuerySupplier = /* #__PURE__ */ (() =&gt; { @@ -25903,6 +25890,77 @@ export const postServiceOrderQuerySupplier = /* #__PURE__ */ (() =&gt; {
25903 return request; 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 /** @description request parameter type for postServiceOrderRemindShipping */ 25964 /** @description request parameter type for postServiceOrderRemindShipping */
25907 export interface PostServiceOrderRemindShippingOption { 25965 export interface PostServiceOrderRemindShippingOption {
25908 /** 25966 /**