Commit 2ec279c1530935b5bda2612210cc9c37e339dd1f

Authored by boyang
2 parents 3d50ebab 08b51e1d

Merge branch 'feature-installment' into 'dev'

Feature installment



See merge request !45
src/pages/Order/OrderList/CheckModal.tsx
... ... @@ -70,6 +70,8 @@ export default ({
70 70  
71 71 const [afterSalesInfo, setAfterSalesInfo] = useState<any>();
72 72 const [prepaidProofImages, setPrepaidProofImages] = useState<any[]>([]);
  73 + const [partialPaymentReceiptsImages, setPartialPaymentReceiptsImages] =
  74 + useState<any[]>([]);
73 75 /**
74 76 * 审核类型
75 77 */
... ... @@ -129,6 +131,7 @@ export default ({
129 131 }
130 132 getOrderAfterSalesInfo();
131 133  
  134 + // 常规回款凭证
132 135 let paymentReceiptsImagesList: any[] = [];
133 136 subOrders?.forEach((item: any) => {
134 137 if (item.paymentReceiptAnnexList) {
... ... @@ -139,6 +142,22 @@ export default ({
139 142 paymentReceiptsImagesList = [...new Set(paymentReceiptsImagesList)];
140 143 setPymentReceiptsImages(paymentReceiptsImagesList);
141 144  
  145 + // 分期付款凭证从 subOrderInformationLists 获取
  146 + let partialPaymentImages: any[] = [];
  147 + if (
  148 + checkType(CHECK_TYPE.PARTIAL_PAYMENT_RECEIPTS_AUDIT) &&
  149 + data?.subOrderInformationLists
  150 + ) {
  151 + data.subOrderInformationLists.forEach((subOrder: any) => {
  152 + if (subOrder.paymentReceiptAnnexPartialList) {
  153 + partialPaymentImages.push(...subOrder.paymentReceiptAnnexPartialList);
  154 + }
  155 + });
  156 + }
  157 + // 去重
  158 + partialPaymentImages = [...new Set(partialPaymentImages)];
  159 + setPartialPaymentReceiptsImages(partialPaymentImages);
  160 +
142 161 //预存审核的凭证
143 162 let proofImages: any[] = [];
144 163 subOrders?.forEach((item) => {
... ... @@ -403,7 +422,10 @@ export default ({
403 422 if (checkType(CHECK_TYPE.URGENT_INVOICE_AUDITING)) {
404 423 type = 'urgent_invoice_audit';
405 424 }
406   - if (checkType(CHECK_TYPE.PAYMENT_RECEIPTS_AUDIT)) {
  425 + if (
  426 + checkType(CHECK_TYPE.PAYMENT_RECEIPTS_AUDIT) ||
  427 + checkType(CHECK_TYPE.PARTIAL_PAYMENT_RECEIPTS_AUDIT)
  428 + ) {
407 429 type = 'payment_receipt_audit';
408 430 }
409 431 if (checkType(CHECK_TYPE.CONFIRM_REISSUE)) {
... ... @@ -585,6 +607,18 @@ export default ({
585 607 });
586 608 }
587 609  
  610 + // 分期回款审核处理
  611 + if (checkType(CHECK_TYPE.PARTIAL_PAYMENT_RECEIPTS_AUDIT)) {
  612 + let type = computeType();
  613 + return doCheck({
  614 + ...values,
  615 + pass: true,
  616 + subOrderIds: subOrderIds,
  617 + type: type,
  618 + notes: form.getFieldValue('name'),
  619 + });
  620 + }
  621 +
588 622 let type = '';
589 623 type = computeType();
590 624 doCheck({
... ... @@ -621,7 +655,6 @@ export default ({
621 655 <span className="text-sm">回款凭证</span>
622 656 </Divider>
623 657 <Image.PreviewGroup
624   - className="mr-10"
625 658 preview={{
626 659 onChange: (current, prev) =>
627 660 console.log(`current index: ${current}, prev index: ${prev}`),
... ... @@ -639,13 +672,60 @@ export default ({
639 672 ''
640 673 )}
641 674  
  675 + {checkType(CHECK_TYPE.PARTIAL_PAYMENT_RECEIPTS_AUDIT) ? (
  676 + <>
  677 + <Row gutter={[16, 16]}>
  678 + <Col span={24}>
  679 + <div className="mb-2">
  680 + <span className="font-semibold">回款类型:</span>
  681 + <span>分期付款</span>
  682 + </div>
  683 + </Col>
  684 + <Col span={24}>
  685 + <div className="mb-2">
  686 + <span className="font-semibold">回款金额:</span>
  687 + <span>{data?.installmentMoney || 0} 元</span>
  688 + </div>
  689 + </Col>
  690 + <Col span={24}>
  691 + <div className="mb-2 font-semibold">附件凭证:</div>
  692 + <div>
  693 + <Image.PreviewGroup
  694 + preview={{
  695 + onChange: (current, prev) =>
  696 + console.log(
  697 + `current index: ${current}, prev index: ${prev}`,
  698 + ),
  699 + }}
  700 + >
  701 + {partialPaymentReceiptsImages.map((url, index) => (
  702 + <span key={`img-${index}`}>
  703 + <Image width={120} src={url} />{' '}
  704 + <Divider type="vertical" />
  705 + </span>
  706 + ))}
  707 + </Image.PreviewGroup>
  708 + </div>
  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>
  717 + <Divider></Divider>
  718 + </>
  719 + ) : (
  720 + ''
  721 + )}
  722 +
642 723 {checkType(CHECK_TYPE.PREPAID_AUDIT) && (
643 724 <>
644 725 <Divider orientation="center">
645 726 <span className="text-sm">凭证</span>
646 727 </Divider>
647 728 <Image.PreviewGroup
648   - className="mr-10"
649 729 preview={{
650 730 onChange: (current, prev) =>
651 731 console.log(`current index: ${current}, prev index: ${prev}`),
... ...
src/pages/Order/OrderList/HirePurchaseUploadPayBillModal.tsx 0 → 100644
  1 +import { RESPONSE_CODE } from '@/constants/enum';
  2 +import {
  3 + postServiceOrderFileProcess,
  4 + postServiceOrderHirePurchase,
  5 +} from '@/services';
  6 +import { transImageFile } from '@/utils';
  7 +import { PlusOutlined } from '@ant-design/icons';
  8 +import { Button, Form, Input, Modal, Radio, Upload, message } from 'antd';
  9 +import { RcFile } from 'antd/lib/upload';
  10 +import { UploadFile, UploadProps } from 'antd/lib/upload/interface';
  11 +import { cloneDeep } from 'lodash';
  12 +import { useEffect, useRef, useState } from 'react';
  13 +import { COMFIR_RECEIPT_IMAGES_NUMBER } from '../constant';
  14 +
  15 +interface HirePurchaseUploadPayBillModalProps {
  16 + visible: boolean;
  17 + onCancel: () => void;
  18 + onOk: () => void;
  19 + orderAmount?: number;
  20 + paidAmount?: number;
  21 + record?: any;
  22 + subOrders?: any[];
  23 +}
  24 +
  25 +const HirePurchaseUploadPayBillModal: React.FC<
  26 + HirePurchaseUploadPayBillModalProps
  27 +> = ({
  28 + visible,
  29 + onCancel,
  30 + onOk,
  31 + orderAmount = 100000.0,
  32 + paidAmount = 0,
  33 + record,
  34 + subOrders = [],
  35 +}) => {
  36 + // 订单总金额
  37 + const totalPayment = record?.totalPayment || orderAmount;
  38 + // 已回款金额
  39 + const installedMoney = record?.installmentMoneyAudit || paidAmount;
  40 + // 待回款金额
  41 + const remainingMoney = totalPayment - installedMoney;
  42 + const [form] = Form.useForm();
  43 + const [fileList, setFileList] = useState<UploadFile[]>([]);
  44 + const [paymentType, setPaymentType] = useState<string>('INSTALLMENT');
  45 + const [previewOpen, setPreviewOpen] = useState(false);
  46 + const [previewImage, setPreviewImage] = useState('');
  47 + const [previewTitle, setPreviewTitle] = useState('');
  48 +
  49 + const fileListObj = useRef<UploadFile[]>([]);
  50 +
  51 + const getBase64 = (file: RcFile): Promise<string> =>
  52 + new Promise((resolve, reject) => {
  53 + const reader = new FileReader();
  54 + reader.readAsDataURL(file);
  55 + reader.onload = () => resolve(reader.result as string);
  56 + reader.onerror = (error) => reject(error);
  57 + });
  58 +
  59 + const handleCancel = () => setPreviewOpen(false);
  60 +
  61 + const uploadButton = (
  62 + <div>
  63 + <PlusOutlined />
  64 + <div style={{ marginTop: 8 }}>上传凭证</div>
  65 + </div>
  66 + );
  67 +
  68 + const handleTypeChange = (e: any) => {
  69 + const newType = e.target.value;
  70 + setPaymentType(newType);
  71 +
  72 + // 如果选择全部回款,自动填入待回款金额
  73 + if (newType === 'FULL') {
  74 + form.setFieldsValue({
  75 + amount: remainingMoney.toFixed(2),
  76 + });
  77 + }
  78 + };
  79 +
  80 + // 验证回款金额不能超过待回款金额
  81 + const validateAmount = (_: any, value: string) => {
  82 + if (!value) return Promise.reject('请输入回款金额');
  83 +
  84 + const amount = parseFloat(value);
  85 + if (isNaN(amount)) return Promise.reject('请输入有效的数字');
  86 + if (amount <= 0) return Promise.reject('回款金额必须大于0');
  87 + if (amount > remainingMoney)
  88 + return Promise.reject(
  89 + `回款金额不能超过待回款金额 ${remainingMoney.toFixed(2)}元`,
  90 + );
  91 +
  92 + return Promise.resolve();
  93 + };
  94 +
  95 + const handleBeforeUpload = (file: any) => {
  96 + setFileList([...fileList, file]);
  97 + return false;
  98 + };
  99 +
  100 + /** 粘贴快捷键的回调 */
  101 + const onPaste = async (e: any) => {
  102 + /** 获取剪切板的数据clipboardData */
  103 + let clipboardData = e.clipboardData,
  104 + i = 0,
  105 + items,
  106 + item,
  107 + types;
  108 +
  109 + /** 为空判断 */
  110 + if (clipboardData) {
  111 + items = clipboardData.items;
  112 + if (!items) {
  113 + message.info('您的剪贴板中没有照片');
  114 + return;
  115 + }
  116 +
  117 + item = items[0];
  118 + types = clipboardData.types || [];
  119 + /** 遍历剪切板的数据 */
  120 + for (; i < types.length; i++) {
  121 + if (types[i] === 'Files') {
  122 + item = items[i];
  123 + break;
  124 + }
  125 + }
  126 +
  127 + /** 判断文件是否为图片 */
  128 + if (item && item.kind === 'file' && item.type.match(/^image\//i)) {
  129 + const imgItem = item.getAsFile();
  130 + const newFileList = cloneDeep(fileListObj.current);
  131 + let filteredArray = newFileList.filter(
  132 + (obj) => obj.status !== 'removed',
  133 + ); //过滤掉状态为已删除的照片
  134 + const listItem = {
  135 + ...imgItem,
  136 + status: 'done',
  137 + url: await getBase64(imgItem),
  138 + originFileObj: imgItem,
  139 + };
  140 +
  141 + if (filteredArray.length >= COMFIR_RECEIPT_IMAGES_NUMBER) {
  142 + message.info('上传凭证数量不能超过3');
  143 + return;
  144 + }
  145 + fileListObj.current = filteredArray;
  146 + filteredArray.push(listItem);
  147 + setFileList(filteredArray);
  148 + return;
  149 + }
  150 + }
  151 +
  152 + message.info('您的剪贴板中没有照片');
  153 + };
  154 +
  155 + const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
  156 + fileListObj.current = newFileList;
  157 + setFileList(newFileList);
  158 + };
  159 +
  160 + const handlePreview = async (file: UploadFile) => {
  161 + if (!file.url && !file.preview) {
  162 + file.preview = await getBase64(file.originFileObj as RcFile);
  163 + }
  164 + setPreviewImage(file.url || (file.preview as string));
  165 + setPreviewOpen(true);
  166 + setPreviewTitle(
  167 + file.name ||
  168 + file.originFileObj?.name ||
  169 + file.url!.substring(file.url!.lastIndexOf('/') + 1),
  170 + );
  171 + };
  172 +
  173 + const props: UploadProps = {
  174 + onRemove: (file) => {
  175 + const index = fileList.indexOf(file);
  176 + const newFileList = fileList.slice();
  177 + newFileList.splice(index, 1);
  178 + setFileList(newFileList);
  179 + },
  180 + beforeUpload: handleBeforeUpload,
  181 + listType: 'picture-card',
  182 + onPreview: handlePreview,
  183 + fileList,
  184 + onChange: handleChange,
  185 + accept: 'image/png, image/jpeg, image/png',
  186 + name: 'files',
  187 + headers: { Authorization: localStorage.getItem('token') },
  188 + };
  189 +
  190 + useEffect(() => {
  191 + document.addEventListener('paste', onPaste);
  192 + return () => {
  193 + document.removeEventListener('paste', onPaste);
  194 + };
  195 + }, []);
  196 +
  197 + const handleOk = async () => {
  198 + try {
  199 + const values = await form.validateFields();
  200 +
  201 + if (fileList.length <= 0) {
  202 + message.error('请上传至少一张凭证');
  203 + return;
  204 + }
  205 +
  206 + message.open({
  207 + type: 'loading',
  208 + content: '正在上传凭证...',
  209 + duration: 0,
  210 + });
  211 +
  212 + // 附件处理
  213 + let formData = new FormData();
  214 + for (let file of fileList) {
  215 + if (file.originFileObj) {
  216 + formData.append('files', file.originFileObj as RcFile);
  217 + } else {
  218 + // 有url的话取url(源文件),没url取thumbUrl。有url的时候thumbUrl是略缩图
  219 + if (file?.url === undefined || file?.url === null) {
  220 + formData.append(
  221 + 'files',
  222 + transImageFile(file?.thumbUrl),
  223 + file?.originFileObj?.name,
  224 + );
  225 + } else {
  226 + formData.append(
  227 + 'files',
  228 + transImageFile(file?.url),
  229 + file?.originFileObj?.name,
  230 + );
  231 + }
  232 + }
  233 + }
  234 +
  235 + let res = await postServiceOrderFileProcess({
  236 + data: formData,
  237 + });
  238 +
  239 + message.destroy();
  240 +
  241 + if (res.result === RESPONSE_CODE.SUCCESS) {
  242 + let fileUrls = res?.data?.map((item) => {
  243 + return { url: item };
  244 + });
  245 +
  246 + // 分期付款提交
  247 + const installmentMoney = values.amount;
  248 + const installmentComment = values.remarks;
  249 +
  250 + // 获取子订单IDs
  251 + const subOrderIds =
  252 + subOrders?.map((item: any) => {
  253 + return item.id;
  254 + }) || [];
  255 +
  256 + const data = await postServiceOrderHirePurchase({
  257 + data: {
  258 + subOrderIds: subOrderIds,
  259 + filePaths: fileUrls,
  260 + installmentMoney: installmentMoney,
  261 + installmentComment: installmentComment,
  262 + },
  263 + });
  264 +
  265 + if (data.result === RESPONSE_CODE.SUCCESS) {
  266 + message.success(data.message || '提交成功');
  267 + onOk();
  268 + } else {
  269 + message.error(data.message || '提交失败');
  270 + }
  271 + } else {
  272 + message.error(res.message || '上传失败');
  273 + }
  274 + } catch (error) {
  275 + console.error('Validate Failed:', error);
  276 + message.error('提交失败');
  277 + }
  278 + };
  279 +
  280 + return (
  281 + <>
  282 + <Modal
  283 + title="回款"
  284 + open={visible}
  285 + onCancel={onCancel}
  286 + footer={[
  287 + <Button key="cancel" onClick={onCancel}>
  288 + 取消
  289 + </Button>,
  290 + <Button key="submit" type="primary" onClick={handleOk}>
  291 + 确认
  292 + </Button>,
  293 + ]}
  294 + width={500}
  295 + >
  296 + <Form form={form} layout="vertical">
  297 + <div style={{ marginBottom: 16 }}>
  298 + <div
  299 + style={{
  300 + display: 'flex',
  301 + justifyContent: 'space-between',
  302 + marginBottom: 8,
  303 + }}
  304 + >
  305 + <span>订单总金额:</span>
  306 + <span>{totalPayment.toFixed(2)}元</span>
  307 + </div>
  308 + <div
  309 + style={{
  310 + display: 'flex',
  311 + justifyContent: 'space-between',
  312 + marginBottom: 8,
  313 + }}
  314 + >
  315 + <span>已回款金额:</span>
  316 + <span>{installedMoney.toFixed(2)}元</span>
  317 + </div>
  318 + <div
  319 + style={{
  320 + display: 'flex',
  321 + justifyContent: 'space-between',
  322 + marginBottom: 8,
  323 + }}
  324 + >
  325 + <span>待回款金额:</span>
  326 + <span>{remainingMoney.toFixed(2)}元</span>
  327 + </div>
  328 + </div>
  329 +
  330 + <Form.Item
  331 + label="回款类型"
  332 + name="paymentType"
  333 + initialValue={paymentType}
  334 + >
  335 + <Radio.Group onChange={handleTypeChange}>
  336 + <Radio value="INSTALLMENT">分期回款</Radio>
  337 + <Radio value="FULL">全部回款</Radio>
  338 + </Radio.Group>
  339 + </Form.Item>
  340 +
  341 + <Form.Item
  342 + label="回款金额"
  343 + name="amount"
  344 + rules={[{ required: true, validator: validateAmount }]}
  345 + >
  346 + <Input
  347 + placeholder="请输入回款金额"
  348 + suffix="元"
  349 + disabled={paymentType === 'FULL'}
  350 + />
  351 + </Form.Item>
  352 +
  353 + <div className="pb-4 text-xs decoration-gray-50">可复制照片粘贴</div>
  354 + <Form.Item
  355 + label="附件凭证"
  356 + name="attachments"
  357 + rules={[{ required: true, message: '请上传回款凭证' }]}
  358 + >
  359 + <Upload {...props}>
  360 + {fileList.length < COMFIR_RECEIPT_IMAGES_NUMBER
  361 + ? uploadButton
  362 + : ''}
  363 + </Upload>
  364 + </Form.Item>
  365 +
  366 + <Form.Item label="备注" name="remarks">
  367 + <Input.TextArea rows={4} placeholder="请输入备注信息" />
  368 + </Form.Item>
  369 + </Form>
  370 + </Modal>
  371 +
  372 + <Modal
  373 + open={previewOpen}
  374 + title={previewTitle}
  375 + footer={null}
  376 + onCancel={handleCancel}
  377 + >
  378 + <img alt="图片预览" style={{ width: '100%' }} src={previewImage} />
  379 + </Modal>
  380 + </>
  381 + );
  382 +};
  383 +
  384 +export default HirePurchaseUploadPayBillModal;
... ...
src/pages/Order/OrderList/OrderDrawer.tsx
... ... @@ -75,6 +75,8 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
75 75 const [kingdeeCstomerModalVisible, setKingdeeCstomerModalVisible] =
76 76 useState(false);
77 77 const [paymentMethod, setPaymentMethod] = useState('');
  78 + const [paymentMethodDisabled, setPaymentMethodDisabled] = useState(false);
  79 + const [paymentChannelDisabled, setPaymentChannelDisabled] = useState(false);
78 80 const [customerRequestCount, setCustomerRequestCount] = useState(0);
79 81 const [
80 82 productParametersDisabledFlagList,
... ... @@ -1096,8 +1098,31 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1096 1098 placeholder="请输入销售代表"
1097 1099 rules={[{ required: true, message: '销售代表必填' }]}
1098 1100 options={salesCodeOptions}
1099   - onChange={(_, option) => {
  1101 + onChange={(value, option) => {
1100 1102 autoFillSalesInfo(option);
  1103 +
  1104 + // 检查是否是特殊的淘宝销售代码
  1105 + const isTaobaoSalesCode = ['TB', 'TBHC', 'HCTB'].includes(value);
  1106 +
  1107 + if (isTaobaoSalesCode) {
  1108 + // 设置支付渠道为淘宝并锁定
  1109 + form.setFieldsValue({ paymentChannel: 'TAOBAO' });
  1110 + setPaymentChannelDisabled(true);
  1111 +
  1112 + // 支付方式默认锁定为预付
  1113 + form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_ADVANCE' });
  1114 + setPaymentMethod('PAYMENT_IN_ADVANCE');
  1115 + setPaymentMethodDisabled(true);
  1116 + } else {
  1117 + // 如果不是淘宝销售代码,解除锁定
  1118 + setPaymentChannelDisabled(false);
  1119 + // 只有当前支付渠道不是扣预存时才解除付款方式的锁定
  1120 + const currentPaymentChannel =
  1121 + form.getFieldValue('paymentChannel');
  1122 + if (currentPaymentChannel !== 'BALANCE') {
  1123 + setPaymentMethodDisabled(false);
  1124 + }
  1125 + }
1101 1126 }}
1102 1127 disabled={optType('after-sales-check')}
1103 1128 />
... ... @@ -1767,9 +1792,26 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1767 1792 width="lg"
1768 1793 key="paymentChannel"
1769 1794 label="支付渠道"
1770   - options={enumToSelect(PAYMENT_CHANNEL_OPTIONS)}
  1795 + options={enumToSelect(PAYMENT_CHANNEL_OPTIONS).map((option) => {
  1796 + // 将淘宝选项设置为禁用状态,使其无法手动选择
  1797 + if (option.value === 'TAOBAO') {
  1798 + return { ...option, disabled: true };
  1799 + }
  1800 + return option;
  1801 + })}
1771 1802 rules={[{ required: true, message: '支付渠道必填' }]}
1772   - disabled={optType('after-sales-check')}
  1803 + disabled={optType('after-sales-check') || paymentChannelDisabled}
  1804 + onChange={(val: any) => {
  1805 + // 当支付渠道选为扣预存或淘宝时,付款方式默认锁定为预付
  1806 + if (val === 'BALANCE' || val === 'TAOBAO') {
  1807 + setPaymentMethodDisabled(true);
  1808 + form.setFieldsValue({ paymentMethod: 'PAYMENT_IN_ADVANCE' });
  1809 + setPaymentMethod('PAYMENT_IN_ADVANCE');
  1810 + } else {
  1811 + // 支付渠道修改为其他的去除锁定状态
  1812 + setPaymentMethodDisabled(false);
  1813 + }
  1814 + }}
1773 1815 />
1774 1816 <ProFormSelect
1775 1817 placeholder="请输入支付方式"
... ... @@ -1780,9 +1822,36 @@ export default ({ onClose, data, subOrders, orderOptType }) =&gt; {
1780 1822 onChange={(val: any) => {
1781 1823 setPaymentMethod(val);
1782 1824 }}
1783   - options={enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD)}
  1825 + options={[
  1826 + // 默认可选项
  1827 + ...enumToSelect(PAYMENT_METHOD_OPTIONS_4_ADD),
  1828 + // 强制禁用项
  1829 + { label: '未付款', value: 'UNPAID', disabled: true },
  1830 + {
  1831 + label: '淘宝订单已付款',
  1832 + value: 'TAOBAO_ORDER_HAS_BEEN_PAID',
  1833 + disabled: true,
  1834 + },
  1835 + {
  1836 + label: '官网订单已付款',
  1837 + value: 'OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID',
  1838 + disabled: true,
  1839 + },
  1840 + {
  1841 + label: '扣预存',
  1842 + value: 'WITHHOLDING_ADVANCE_DEPOSIT',
  1843 + disabled: true,
  1844 + },
  1845 + { label: '平台结算', value: 'PLATFORM_SETTLEMENT', disabled: true },
  1846 + { label: '已回款', value: 'PAYMENT_RECEIPT', disabled: true },
  1847 + {
  1848 + label: '预存款无需发货',
  1849 + value: 'PREPAID_NO_NEED_SEND',
  1850 + disabled: true,
  1851 + },
  1852 + ]}
1784 1853 rules={[{ required: true, message: '支付方式必填' }]}
1785   - disabled={optType('after-sales-check')}
  1854 + disabled={optType('after-sales-check') || paymentMethodDisabled}
1786 1855 />
1787 1856 {/* 隐藏字段用于存储真实UID和privatePocket标志 */}
1788 1857 <ProFormText name="realPrepaidUid" hidden />
... ...
src/pages/Order/OrderList/OrderList.tsx
... ... @@ -115,6 +115,7 @@ import FinancialDrawer from &#39;./FinancialDrawer&#39;;
115 115 import FinancialEditDrawer from './FinancialEditDrawer';
116 116 import FinancialMergeDrawer from './FinancialMergeDrawer';
117 117 import FinancialReceiptsModal from './FinancialReceiptsModal';
  118 +import HirePurchaseUploadPayBillModal from './HirePurchaseUploadPayBillModal';
118 119 import HistoryModal from './HistoryModal';
119 120 import ImagesViewerModal from './ImagesViewerModal';
120 121 import ImportModal from './ImportModal';
... ... @@ -147,6 +148,10 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
147 148 const [uploadPayBillModalVisible, setUploadPayBillModalVisible] =
148 149 useState<boolean>(false);
149 150 const [
  151 + hirePurchaseUploadPayBillModalVisible,
  152 + setHirePurchaseUploadPayBillModalVisible,
  153 + ] = useState<boolean>(false);
  154 + const [
150 155 feedbackRegistrationModalVisible,
151 156 setFeedbackRegistrationModalVisible,
152 157 ] = useState<boolean>(false);
... ... @@ -909,14 +914,14 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
909 914 {/* 商品名称 */}
910 915 <div>
911 916 <div
912   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis hover:cursor-pointer"
  917 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap hover:cursor-pointer"
913 918 onClick={() => {
914 919 copyToClipboard(optRecord.productName);
915 920 message.info('商品名称复制成功:' + optRecord.productName);
916 921 }}
917 922 title={optRecord.productName}
918 923 >
919   - <span className="font-medium text-black ">
  924 + <span className="font-medium text-black">
920 925 {optRecord.productName}
921 926 </span>
922 927 </div>
... ... @@ -976,7 +981,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
976 981 </div>
977 982  
978 983 <div
979   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis hover:cursor-pointer"
  984 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap hover:cursor-pointer"
980 985 title={optRecord.parameters}
981 986 onClick={() => {
982 987 copyToClipboard(optRecord.parameters);
... ... @@ -992,7 +997,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
992 997 {!isSupplier() ? (
993 998 <>
994 999 <div
995   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1000 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
996 1001 title={optRecord.productPrice}
997 1002 >
998 1003 <span className="text-[#8C8C8C]">单价:</span>
... ... @@ -1006,7 +1011,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1006 1011 )}
1007 1012  
1008 1013 <div
1009   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1014 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
1010 1015 title={optRecord.quantity}
1011 1016 >
1012 1017 <span className="text-[#8C8C8C]">数量:</span>
... ... @@ -1018,7 +1023,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1018 1023  
1019 1024 {!isSupplier() ? (
1020 1025 <div
1021   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1026 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
1022 1027 title={optRecord.subOrderPayment}
1023 1028 >
1024 1029 <span className="text-[#8C8C8C]">合计:</span>
... ... @@ -1032,7 +1037,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1032 1037  
1033 1038 {optRecord.deliveryDate && (
1034 1039 <div
1035   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1040 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
1036 1041 title={optRecord.deliveryDate}
1037 1042 >
1038 1043 <span className="text-[#8C8C8C]">产品交期:</span>
... ... @@ -1045,13 +1050,13 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1045 1050 {!isSupplier() ? (
1046 1051 <>
1047 1052 {/* 支付方式 */}
1048   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1053 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1049 1054 <span className="text-slate-700">
1050 1055 {optRecord.paymentMethodText}
1051 1056 </span>
1052 1057 </div>
1053 1058 {/* 支付渠道 */}
1054   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1059 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1055 1060 <span className="text-slate-700">
1056 1061 {enumValueToLabel(
1057 1062 optRecord.paymentChannel,
... ... @@ -1059,9 +1064,18 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1059 1064 )}
1060 1065 </span>
1061 1066 </div>
  1067 + {/* 回款状态 */}
  1068 + {/* <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
  1069 + <span className="text-slate-700">
  1070 + {enumValueToLabel(
  1071 + optRecord.paymentReceiptStatus,
  1072 + PAYMENT_RECEIPTS_STATUS_OPTIONS,
  1073 + )}
  1074 + </span>
  1075 + </div> */}
1062 1076 {/* 回款审核状态 */}
1063 1077 {optRecord.paymentReceiptStatus !== null ? (
1064   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1078 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1065 1079 <Tag
1066 1080 className="hover:cursor-pointer"
1067 1081 onMouseEnter={(e: any) => {
... ... @@ -1100,7 +1114,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1100 1114 <>
1101 1115 {/* 所属部门 */}
1102 1116 <div
1103   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1117 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
1104 1118 title={enumValueToLabel(
1105 1119 optRecord.productBelongBusiness,
1106 1120 PRODUCT_BELONG_DEPARTMENT_OPTIONS,
... ... @@ -1116,7 +1130,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1116 1130  
1117 1131 {/* 开票类型 */}
1118 1132 {optRecord.invoicingStatus !== null ? (
1119   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1133 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1120 1134 <span className="text-slate-700">
1121 1135 {getInvoicingType(optRecord)}
1122 1136 </span>
... ... @@ -1127,7 +1141,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1127 1141  
1128 1142 {/* 开票状态 */}
1129 1143 {optRecord.afterInvoicingStatus !== null ? (
1130   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1144 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1131 1145 <Tooltip
1132 1146 title={
1133 1147 optRecord.invoicingUrgentCause !== null &&
... ... @@ -1156,7 +1170,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1156 1170  
1157 1171 {/* 是否加急图标显示 */}
1158 1172 {optRecord.isUrgent ? (
1159   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1173 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1160 1174 <Tooltip
1161 1175 title={'期望开票时间:' + formatdate(optRecord.deadline)}
1162 1176 >
... ... @@ -1170,7 +1184,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1170 1184 {(roleCode === 'warehouseKeeper' || roleCode === 'admin') &&
1171 1185 optRecord.shippingWarehouse !== null ? (
1172 1186 <div
1173   - className="overflow-hidden whitespace-no-wrap overflow-ellipsis"
  1187 + className="overflow-hidden overflow-ellipsis whitespace-no-wrap"
1174 1188 title={enumValueToLabel(
1175 1189 optRecord.shippingWarehouse,
1176 1190 SHIPPING_WAREHOUSE_OPTIONS,
... ... @@ -1188,7 +1202,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1188 1202 )}
1189 1203  
1190 1204 {/* 生产时间 */}
1191   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1205 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1192 1206 {optRecord.productionStartTime !== null ||
1193 1207 optRecord.productionEndTime !== null ? (
1194 1208 <MyToolTip
... ... @@ -1216,7 +1230,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1216 1230 <Flex className="w-[10%]" vertical gap="small">
1217 1231 {/* 开票状态 */}
1218 1232 {!isSupplier() ? (
1219   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1233 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1220 1234 <Tag
1221 1235 color={
1222 1236 optRecord.afterInvoicingStatus !== 'COMPLETE_INVOICING' &&
... ... @@ -1233,13 +1247,13 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1233 1247 )}
1234 1248  
1235 1249 {/* 订单状态 */}
1236   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1250 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1237 1251 {getOrderStatusTag(optRecord)}
1238 1252 </div>
1239 1253  
1240 1254 {/* 确认发票状态 */}
1241 1255 {optRecord.invoiceConfirmStatusText !== null && (
1242   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1256 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1243 1257 <Tag color={'success'} style={{ marginRight: '4px' }}>
1244 1258 {optRecord.invoiceConfirmStatusText}
1245 1259 </Tag>
... ... @@ -1248,7 +1262,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1248 1262  
1249 1263 {/* 确认发票状态 */}
1250 1264 {optRecord.deliveryStatusText !== null && (
1251   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1265 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1252 1266 <Tag color={'success'} style={{ marginRight: '4px' }}>
1253 1267 {optRecord.deliveryStatusText}
1254 1268 </Tag>
... ... @@ -1257,7 +1271,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1257 1271  
1258 1272 {/* 后置审核状态 */}
1259 1273 {optRecord.postAuditStatus !== null ? (
1260   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1274 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1261 1275 {getPostAuditStatusTag(optRecord)}
1262 1276 </div>
1263 1277 ) : (
... ... @@ -1265,7 +1279,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1265 1279 )}
1266 1280 {/* 后置审核状态 */}
1267 1281 {optRecord.orderStatus === 'PROCURE_REJECT' ? (
1268   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1282 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1269 1283 <Tag color={'red'} style={{ marginRight: '4px' }}>
1270 1284 {'采购驳回'}
1271 1285 </Tag>
... ... @@ -1277,7 +1291,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1277 1291 {/**采购是否已下单状态 */}
1278 1292 {optRecord.procureOrderStatus !== null &&
1279 1293 optRecord.procureOrderStatus !== undefined ? (
1280   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1294 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1281 1295 <Tag color="success">
1282 1296 {enumValueToLabel(
1283 1297 optRecord.procureOrderStatus,
... ... @@ -1290,7 +1304,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1290 1304 )}
1291 1305  
1292 1306 {/* 物流信息 */}
1293   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1307 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1294 1308 {optRecord.orderStatus === 'CONFIRM_RECEIPT' ||
1295 1309 optRecord.orderStatus === 'AFTER_SALES_COMPLETION' ||
1296 1310 optRecord.orderStatus === 'IN_AFTER_SALES' ||
... ... @@ -1321,7 +1335,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
1321 1335 {/* 修改审核状态 */}
1322 1336 {optRecord.modifiedAuditStatus !== null &&
1323 1337 optRecord.modifiedAuditStatus !== 'AUDIT_FAILURE' ? (
1324   - <div className="overflow-hidden whitespace-no-wrap overflow-ellipsis">
  1338 + <div className="overflow-hidden overflow-ellipsis whitespace-no-wrap">
1325 1339 <Tooltip
1326 1340 title={recordOptNode ? recordOptNode : <Spin />}
1327 1341 onOpenChange={(open) => {
... ... @@ -2254,7 +2268,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2254 2268 </div>
2255 2269 {!isSupplier() && (isSales() || isWarehousekeeper() || isAdmin()) && (
2256 2270 <EditTwoTone
2257   - className="pl-1 pr-1 hover:curcor-pointer"
  2271 + className="pr-1 pl-1 hover:curcor-pointer"
2258 2272 onClick={() => {
2259 2273 setNotesEditVisible(true);
2260 2274 setSelectedRows([optRecord.id]);
... ... @@ -2280,7 +2294,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2280 2294  
2281 2295 <Divider type="vertical" />
2282 2296  
2283   - <div className="overflow-hidden whitespace-normal overflow-ellipsis hover:cursor-pointer">
  2297 + <div className="overflow-hidden overflow-ellipsis whitespace-normal hover:cursor-pointer">
2284 2298 <span className="text-[#8C8C8C]">
2285 2299 采购备注:
2286 2300 {optRecord.procureNotes === null
... ... @@ -2291,7 +2305,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2291 2305 {/* 编辑备注按钮 */}
2292 2306 {(isProcure() || isAdmin()) && (
2293 2307 <EditTwoTone
2294   - className="pl-1 pr-1 hover:curcor-pointer"
  2308 + className="pr-1 pl-1 hover:curcor-pointer"
2295 2309 onClick={() => {
2296 2310 setSelectedRows([optRecord.id]);
2297 2311 setNotes(optRecord.procureNotes);
... ... @@ -2333,7 +2347,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2333 2347 <Flex title={optRecord.notes} className="pt-2">
2334 2348 <div className="flex items-center">
2335 2349 <div className="flex items-center max-w-[500px]">
2336   - <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2350 + <div className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap">
2337 2351 <Tooltip
2338 2352 title={optRecord.applyInvoicingNotes}
2339 2353 placement="topLeft"
... ... @@ -2364,7 +2378,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2364 2378 </div>
2365 2379 <Divider type="vertical" className="mx-5" />
2366 2380 <div className="flex items-center max-w-[500px]">
2367   - <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2381 + <div className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap">
2368 2382 <Tooltip title={optRecord.checkNotes} placement="topLeft">
2369 2383 <span className="text-[#8C8C8C] mr-3">
2370 2384 财务审核备注:
... ... @@ -2388,7 +2402,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2388 2402 <Flex title={optRecord.notes} className="pt-2">
2389 2403 <div className="flex items-center">
2390 2404 <div className="flex items-center max-w-[500px]">
2391   - <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2405 + <div className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap">
2392 2406 <Tooltip title={optRecord.reissueNotes} placement="topLeft">
2393 2407 <span className="text-[#8C8C8C]">
2394 2408 重新开票备注:
... ... @@ -2423,7 +2437,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2423 2437 <Flex title={optRecord.notes} className="pt-2">
2424 2438 <div className="flex items-center">
2425 2439 <div className="flex items-center max-w-[500px]">
2426   - <div className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis">
  2440 + <div className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap">
2427 2441 <Tooltip
2428 2442 title={optRecord.feedbackRegistrationContent}
2429 2443 placement="topLeft"
... ... @@ -2452,7 +2466,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2452 2466 return (
2453 2467 <ProTable
2454 2468 id="sub-table"
2455   - className="w-full "
  2469 + className="w-full"
2456 2470 showHeader={false}
2457 2471 columns={[
2458 2472 {
... ... @@ -2770,7 +2784,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2770 2784 {record.goodsWeight !== null ? (
2771 2785 <div title={record.goodsWeight + 'kg'} className="pl-3">
2772 2786 <div
2773   - className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis hover:cursor-pointer"
  2787 + className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap hover:cursor-pointer"
2774 2788 onClick={() => {
2775 2789 copyToClipboard(record.goodsWeight + 'kg');
2776 2790 message.info(
... ... @@ -2789,7 +2803,7 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2789 2803 {record.goodsVolume !== null ? (
2790 2804 <div title={record.goodsVolume + 'm³'} className="pl-3">
2791 2805 <div
2792   - className="max-w-md overflow-hidden whitespace-no-wrap overflow-ellipsis hover:cursor-pointer"
  2806 + className="overflow-hidden max-w-md overflow-ellipsis whitespace-no-wrap hover:cursor-pointer"
2793 2807 onClick={() => {
2794 2808 copyToClipboard(record.goodsVolume + 'm³');
2795 2809 message.info(
... ... @@ -2957,6 +2971,40 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2957 2971 ) : (
2958 2972 ''
2959 2973 )}
  2974 + {record.paths?.includes('updateHirePurchase') ? (
  2975 + <Button
  2976 + className="p-0"
  2977 + type="link"
  2978 + onClick={() => {
  2979 + createOptObject(record.id, record.id);
  2980 + setHirePurchaseUploadPayBillModalVisible(true);
  2981 + }}
  2982 + >
  2983 + 回款
  2984 + </Button>
  2985 + ) : (
  2986 + ''
  2987 + )}
  2988 +
  2989 + {/* 输出日志以检查权限和支付方式 */}
  2990 + {console.log('Order info:', record.id, record.paths)}
  2991 + {record.paths?.includes('auditPartialPaymentReceipt') ? (
  2992 + <Button
  2993 + className="p-0"
  2994 + type="link"
  2995 + onClick={() => {
  2996 + createOptObject(null, record.id);
  2997 + setCheckVisible(true);
  2998 + setOrderCheckType(
  2999 + CHECK_TYPE.PARTIAL_PAYMENT_RECEIPTS_AUDIT,
  3000 + );
  3001 + }}
  3002 + >
  3003 + 回款审核(分期)
  3004 + </Button>
  3005 + ) : (
  3006 + ''
  3007 + )}
2960 3008  
2961 3009 {record.paths?.includes('modifiedAuditRequest') ? (
2962 3010 <Button
... ... @@ -2990,6 +3038,8 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
2990 3038 ''
2991 3039 )}
2992 3040  
  3041 + {/* 第二个回款审核(分期)按钮已被移除,使用上面的带权限检查的按钮 */}
  3042 +
2993 3043 {record.paths?.includes('modifiedLeaderAuditRequest') ? (
2994 3044 <Button
2995 3045 className="p-0"
... ... @@ -5295,6 +5345,27 @@ const OrderList = ({ paramsNew, searchShow, toolbarShow }) =&gt; {
5295 5345 }}
5296 5346 />
5297 5347 )}
  5348 +
  5349 + {hirePurchaseUploadPayBillModalVisible && data && currentOptMainId && (
  5350 + <HirePurchaseUploadPayBillModal
  5351 + visible={hirePurchaseUploadPayBillModalVisible}
  5352 + onCancel={() => {
  5353 + setHirePurchaseUploadPayBillModalVisible(false);
  5354 + clearOptObject();
  5355 + }}
  5356 + onOk={() => {
  5357 + setHirePurchaseUploadPayBillModalVisible(false);
  5358 + message.success('回款凭证上传成功');
  5359 + refreshTable();
  5360 + }}
  5361 + record={data.find((item) => item.id === currentOptMainId) || {}}
  5362 + subOrders={
  5363 + data.find((item) => item.id === currentOptMainId)
  5364 + ?.subOrderInformationLists || []
  5365 + }
  5366 + />
  5367 + )}
  5368 +
5298 5369 {feedbackRegistrationModalVisible && (
5299 5370 <FeedbackRegistrationModal
5300 5371 setVisible={(val: boolean) => {
... ...
src/pages/Order/constant.ts
... ... @@ -7,11 +7,13 @@ import { getReceivingCompanyOptions, isSupplier } from &#39;@/utils/order&#39;;
7 7 export const COMFIR_RECEIPT_IMAGES_NUMBER = 3;
8 8  
9 9 export const PAYMENT_CHANNEL_OPTIONS = {
10   - ALIPAY: '支付宝',
11   - WECHAT: '微信',
12 10 BANK_TRANSFER: '银行转账',
13   - BALANCE: '预存款',
14   - OFFLINE: '线下付款',
  11 + WECHAT: '微信支付',
  12 + ALIPAY: '支付宝支付',
  13 + BALANCE: '扣预存',
  14 + PLATFORM: '平台结算',
  15 + OFFLINE: '线下支付',
  16 + TAOBAO: '淘宝',
15 17 };
16 18  
17 19 export const RECEIPTS_RECORD_TYPES = {
... ... @@ -35,15 +37,9 @@ export const PAYMENT_METHOD_OPTIONS = {
35 37 };
36 38  
37 39 export const PAYMENT_METHOD_OPTIONS_4_ADD = {
38   - UNPAID: '未付款',
39   - TAOBAO_ORDER_HAS_BEEN_PAID: '淘宝订单已付款',
40   - OFFICIAL_WEBSITE_ORDER_HAS_BEEN_PAID: '官网订单已付款',
41   - PAYMENT_IN_ADVANCE: '预付款',
42   - WITHHOLDING_ADVANCE_DEPOSIT: '扣预存',
43   - PLATFORM_SETTLEMENT: '平台结算',
  40 + PAYMENT_IN_ADVANCE: '预付',
44 41 CASH_ON_DELIVERY: '货到付款',
45 42 HIRE_PURCHASE: '分期付款',
46   - PREPAID_NO_NEED_SEND: '预存款无需发货',
47 43 };
48 44  
49 45 export const PRODUCT_BELONG_DEPARTMENT_OPTIONS = {
... ... @@ -125,6 +121,7 @@ export const CHECK_TYPE = {
125 121 URGENT_INVOICE_AUDITING: 'URGENT_INVOICE_AUDITING',
126 122 URGENT_INVOICE_AUDITING_OLD: 'URGENT_INVOICE_AUDITING_OLD',
127 123 PAYMENT_RECEIPTS_AUDIT: 'PAYMENT_RECEIPTS_AUDIT',
  124 + PARTIAL_PAYMENT_RECEIPTS_AUDIT: 'PARTIAL_PAYMENT_RECEIPTS_AUDIT',
128 125 CONFIRM_REISSUE: 'CONFIRM_REISSUE',
129 126 CONFIRM_REISSUE_OLD: 'CONFIRM_REISSUE_OLD',
130 127 PREPAID_AUDIT: 'PREPAID_AUDIT',
... ... @@ -193,9 +190,11 @@ export const POST_AUDIT_OPTIONS = {
193 190 };
194 191  
195 192 export const PAYMENT_RECEIPTS_STATUS_OPTIONS = {
196   - WAIT_AUDIT: '回款待审核',
197   - AUDIT_PASS: '回款已审核',
  193 + WAIT_AUDIT: '回款审核中',
  194 + AUDIT_PASS: '已回款',
198 195 AUDIT_NOTPASS: '回款审核失败',
  196 + NOT_RECEIVED: '未回款',
  197 + PARTIAL_RECEIVED: '部分回款',
199 198 };
200 199  
201 200 export const ORDER_STATUS_OPTIONS = {
... ...
src/services/definition.ts
... ... @@ -1556,32 +1556,6 @@ export interface ExchangeRecordsRequestDto {
1556 1556 total?: number;
1557 1557 }
1558 1558  
1559   -export interface File {
1560   - absolute?: boolean;
1561   - absoluteFile?: File;
1562   - absolutePath?: string;
1563   - canonicalFile?: File;
1564   - canonicalPath?: string;
1565   - directory?: boolean;
1566   - executable?: boolean;
1567   - file?: boolean;
1568   - /** @format int64 */
1569   - freeSpace?: number;
1570   - hidden?: boolean;
1571   - /** @format int64 */
1572   - lastModified?: number;
1573   - name?: string;
1574   - parent?: string;
1575   - parentFile?: File;
1576   - path?: string;
1577   - readable?: boolean;
1578   - /** @format int64 */
1579   - totalSpace?: number;
1580   - /** @format int64 */
1581   - usableSpace?: number;
1582   - writable?: boolean;
1583   -}
1584   -
1585 1559 export interface FilePathDto {
1586 1560 url?: string;
1587 1561 }
... ... @@ -1613,6 +1587,30 @@ export interface GroupExchangeRecordsRequestDto {
1613 1587  
1614 1588 export type InputStream = any;
1615 1589  
  1590 +export interface InstallmentPaymentDTO {
  1591 + /**
  1592 + * @description
  1593 + * 回款单
  1594 + */
  1595 + filePaths?: Array<FilePathDto>;
  1596 + /**
  1597 + * @description
  1598 + * 分期付款备注
  1599 + */
  1600 + installmentComment?: string;
  1601 + /**
  1602 + * @description
  1603 + * 分期付款金额
  1604 + * @format int64
  1605 + */
  1606 + installmentMoney?: number;
  1607 + /**
  1608 + * @description
  1609 + * 子订单id
  1610 + */
  1611 + subOrderIds?: Array<number>;
  1612 +}
  1613 +
1616 1614 export interface InventoryMaterialStockReq {
1617 1615 auxPropId?: string;
1618 1616 isShowStockPosition?: boolean;
... ... @@ -4282,7 +4280,7 @@ export interface ResetPwdVO {
4282 4280  
4283 4281 export interface Resource {
4284 4282 description?: string;
4285   - file?: File;
  4283 + file?: TsgFile;
4286 4284 filename?: string;
4287 4285 inputStream?: InputStream;
4288 4286 open?: boolean;
... ... @@ -4904,6 +4902,11 @@ export interface UserPrivatePocketBalanceUpdateRequest {
4904 4902 * @format int32
4905 4903 */
4906 4904 uid?: number;
  4905 + /**
  4906 + * @description
  4907 + * 修改人
  4908 + */
  4909 + updateBy?: string;
4907 4910 }
4908 4911  
4909 4912 export interface UserPrivatePocketDeleteRequest {
... ... @@ -5138,6 +5141,32 @@ export interface CompanyInfo {
5138 5141 taxIdIsNotNull?: boolean;
5139 5142 }
5140 5143  
  5144 +export interface TsgFile {
  5145 + absolute?: boolean;
  5146 + absoluteFile?: TsgFile;
  5147 + absolutePath?: string;
  5148 + canonicalFile?: TsgFile;
  5149 + canonicalPath?: string;
  5150 + directory?: boolean;
  5151 + executable?: boolean;
  5152 + file?: boolean;
  5153 + /** @format int64 */
  5154 + freeSpace?: number;
  5155 + hidden?: boolean;
  5156 + /** @format int64 */
  5157 + lastModified?: number;
  5158 + name?: string;
  5159 + parent?: string;
  5160 + parentFile?: TsgFile;
  5161 + path?: string;
  5162 + readable?: boolean;
  5163 + /** @format int64 */
  5164 + totalSpace?: number;
  5165 + /** @format int64 */
  5166 + usableSpace?: number;
  5167 + writable?: boolean;
  5168 +}
  5169 +
5141 5170 export interface InvoiceDetail {
5142 5171 createByName?: string;
5143 5172 /** @format date-time */
... ...
src/services/request.ts
... ... @@ -60,6 +60,7 @@ import type {
60 60 ExchangeRecordsRequestDto,
61 61 FeedbackRegistrationDTO,
62 62 GroupExchangeRecordsRequestDto,
  63 + InstallmentPaymentDTO,
63 64 InventoryMaterialStockReq,
64 65 InvoiceBatchDownloadDto,
65 66 InvoiceDto,
... ... @@ -74,7 +75,6 @@ import type {
74 75 MeasureUnitListRes,
75 76 MergeIntegralDto,
76 77 MessageQueryDTO,
77   - ModelAndView,
78 78 OrderAddVO,
79 79 OrderAuditLogQueryVO,
80 80 OrderBaseInfoQueryVO,
... ... @@ -4267,7 +4267,9 @@ export interface GetErrorResponse {
4267 4267 * @description
4268 4268 * OK
4269 4269 */
4270   - 200: ModelAndView;
  4270 + 200: {
  4271 + [propertyName: string]: any;
  4272 + };
4271 4273 /**
4272 4274 * @description
4273 4275 * Unauthorized
... ... @@ -4288,9 +4290,9 @@ export interface GetErrorResponse {
4288 4290 export type GetErrorResponseSuccess = GetErrorResponse[200];
4289 4291 /**
4290 4292 * @description
4291   - * errorHtml
  4293 + * error
4292 4294 * @tags basic-error-controller
4293   - * @produces text/html
  4295 + * @produces *
4294 4296 */
4295 4297 export const getError = /* #__PURE__ */ (() => {
4296 4298 const method = 'get';
... ... @@ -4314,7 +4316,9 @@ export interface PutErrorResponse {
4314 4316 * @description
4315 4317 * OK
4316 4318 */
4317   - 200: ModelAndView;
  4319 + 200: {
  4320 + [propertyName: string]: any;
  4321 + };
4318 4322 /**
4319 4323 * @description
4320 4324 * Created
... ... @@ -4340,9 +4344,9 @@ export interface PutErrorResponse {
4340 4344 export type PutErrorResponseSuccess = PutErrorResponse[200];
4341 4345 /**
4342 4346 * @description
4343   - * errorHtml
  4347 + * error
4344 4348 * @tags basic-error-controller
4345   - * @produces text/html
  4349 + * @produces *
4346 4350 * @consumes application/json
4347 4351 */
4348 4352 export const putError = /* #__PURE__ */ (() => {
... ... @@ -4367,7 +4371,9 @@ export interface PostErrorResponse {
4367 4371 * @description
4368 4372 * OK
4369 4373 */
4370   - 200: ModelAndView;
  4374 + 200: {
  4375 + [propertyName: string]: any;
  4376 + };
4371 4377 /**
4372 4378 * @description
4373 4379 * Created
... ... @@ -4393,9 +4399,9 @@ export interface PostErrorResponse {
4393 4399 export type PostErrorResponseSuccess = PostErrorResponse[200];
4394 4400 /**
4395 4401 * @description
4396   - * errorHtml
  4402 + * error
4397 4403 * @tags basic-error-controller
4398   - * @produces text/html
  4404 + * @produces *
4399 4405 * @consumes application/json
4400 4406 */
4401 4407 export const postError = /* #__PURE__ */ (() => {
... ... @@ -4420,7 +4426,9 @@ export interface DeleteErrorResponse {
4420 4426 * @description
4421 4427 * OK
4422 4428 */
4423   - 200: ModelAndView;
  4429 + 200: {
  4430 + [propertyName: string]: any;
  4431 + };
4424 4432 /**
4425 4433 * @description
4426 4434 * No Content
... ... @@ -4441,9 +4449,9 @@ export interface DeleteErrorResponse {
4441 4449 export type DeleteErrorResponseSuccess = DeleteErrorResponse[200];
4442 4450 /**
4443 4451 * @description
4444   - * errorHtml
  4452 + * error
4445 4453 * @tags basic-error-controller
4446   - * @produces text/html
  4454 + * @produces *
4447 4455 */
4448 4456 export const deleteError = /* #__PURE__ */ (() => {
4449 4457 const method = 'delete';
... ... @@ -4467,7 +4475,9 @@ export interface OptionsErrorResponse {
4467 4475 * @description
4468 4476 * OK
4469 4477 */
4470   - 200: ModelAndView;
  4478 + 200: {
  4479 + [propertyName: string]: any;
  4480 + };
4471 4481 /**
4472 4482 * @description
4473 4483 * No Content
... ... @@ -4488,9 +4498,9 @@ export interface OptionsErrorResponse {
4488 4498 export type OptionsErrorResponseSuccess = OptionsErrorResponse[200];
4489 4499 /**
4490 4500 * @description
4491   - * errorHtml
  4501 + * error
4492 4502 * @tags basic-error-controller
4493   - * @produces text/html
  4503 + * @produces *
4494 4504 * @consumes application/json
4495 4505 */
4496 4506 export const optionsError = /* #__PURE__ */ (() => {
... ... @@ -4515,7 +4525,9 @@ export interface HeadErrorResponse {
4515 4525 * @description
4516 4526 * OK
4517 4527 */
4518   - 200: ModelAndView;
  4528 + 200: {
  4529 + [propertyName: string]: any;
  4530 + };
4519 4531 /**
4520 4532 * @description
4521 4533 * No Content
... ... @@ -4536,9 +4548,9 @@ export interface HeadErrorResponse {
4536 4548 export type HeadErrorResponseSuccess = HeadErrorResponse[200];
4537 4549 /**
4538 4550 * @description
4539   - * errorHtml
  4551 + * error
4540 4552 * @tags basic-error-controller
4541   - * @produces text/html
  4553 + * @produces *
4542 4554 * @consumes application/json
4543 4555 */
4544 4556 export const headError = /* #__PURE__ */ (() => {
... ... @@ -4563,7 +4575,9 @@ export interface PatchErrorResponse {
4563 4575 * @description
4564 4576 * OK
4565 4577 */
4566   - 200: ModelAndView;
  4578 + 200: {
  4579 + [propertyName: string]: any;
  4580 + };
4567 4581 /**
4568 4582 * @description
4569 4583 * No Content
... ... @@ -4584,9 +4598,9 @@ export interface PatchErrorResponse {
4584 4598 export type PatchErrorResponseSuccess = PatchErrorResponse[200];
4585 4599 /**
4586 4600 * @description
4587   - * errorHtml
  4601 + * error
4588 4602 * @tags basic-error-controller
4589   - * @produces text/html
  4603 + * @produces *
4590 4604 * @consumes application/json
4591 4605 */
4592 4606 export const patchError = /* #__PURE__ */ (() => {
... ... @@ -23367,6 +23381,77 @@ export const postServiceOrderGetReissueInfo = /* #__PURE__ */ (() =&gt; {
23367 23381 return request;
23368 23382 })();
23369 23383  
  23384 +/** @description request parameter type for postServiceOrderHirePurchase */
  23385 +export interface PostServiceOrderHirePurchaseOption {
  23386 + /**
  23387 + * @description
  23388 + * dto
  23389 + */
  23390 + body: {
  23391 + /**
  23392 + @description
  23393 + dto */
  23394 + dto: InstallmentPaymentDTO;
  23395 + };
  23396 +}
  23397 +
  23398 +/** @description response type for postServiceOrderHirePurchase */
  23399 +export interface PostServiceOrderHirePurchaseResponse {
  23400 + /**
  23401 + * @description
  23402 + * OK
  23403 + */
  23404 + 200: ServerResult;
  23405 + /**
  23406 + * @description
  23407 + * Created
  23408 + */
  23409 + 201: any;
  23410 + /**
  23411 + * @description
  23412 + * Unauthorized
  23413 + */
  23414 + 401: any;
  23415 + /**
  23416 + * @description
  23417 + * Forbidden
  23418 + */
  23419 + 403: any;
  23420 + /**
  23421 + * @description
  23422 + * Not Found
  23423 + */
  23424 + 404: any;
  23425 +}
  23426 +
  23427 +export type PostServiceOrderHirePurchaseResponseSuccess =
  23428 + PostServiceOrderHirePurchaseResponse[200];
  23429 +/**
  23430 + * @description
  23431 + * 分期付款
  23432 + * @tags 内部订单
  23433 + * @produces *
  23434 + * @consumes application/json
  23435 + */
  23436 +export const postServiceOrderHirePurchase = /* #__PURE__ */ (() => {
  23437 + const method = 'post';
  23438 + const url = '/service/order/hirePurchase';
  23439 + function request(
  23440 + option: PostServiceOrderHirePurchaseOption,
  23441 + ): Promise<PostServiceOrderHirePurchaseResponseSuccess> {
  23442 + return requester(request.url, {
  23443 + method: request.method,
  23444 + ...option,
  23445 + }) as unknown as Promise<PostServiceOrderHirePurchaseResponseSuccess>;
  23446 + }
  23447 +
  23448 + /** http method */
  23449 + request.method = method;
  23450 + /** request url */
  23451 + request.url = url;
  23452 + return request;
  23453 +})();
  23454 +
23370 23455 /** @description request parameter type for postServiceOrderImportExcel */
23371 23456 export interface PostServiceOrderImportExcelOption {
23372 23457 /**
... ...