提交 41cc802b 作者: 龚洪江

功能:破损信息展示

上级 d91b2c60
...@@ -1716,6 +1716,41 @@ type rentReqType = { ...@@ -1716,6 +1716,41 @@ type rentReqType = {
*/ */
status?: number; status?: number;
}; };
storeDamageOrder?: {
/**
* 创建时间
*/
createTime?: Date;
/**
* 物流编号
*/
expressCode?: string;
/**
* 快递单号
*/
expressNum?: string;
/**
* 图片文件
*/
file?: string;
/**
* id
*/
id?: number;
/**
* 订单id
*/
leaseOrderId?: number;
/**
* 退款原因
*/
reason?: string;
/**
* 归还状态:0已归还 1无需归还
*/
status?: number;
modifiedDeposit?: number;
};
confirmReceipt?: { confirmReceipt?: {
/** /**
* 创建时间 * 创建时间
...@@ -2017,6 +2052,26 @@ export type rentPfConfirmOrderWareType = InterFunction< ...@@ -2017,6 +2052,26 @@ export type rentPfConfirmOrderWareType = InterFunction<
*/ */
damage?: number; damage?: number;
/** /**
* 扣除的押金
*/
deductionAmount?: number;
/**
* 物流编码
*/
expressCode?: string;
/**
* 物流单号
*/
expressNum?: string;
/**
* 图片文件
*/
file?: string;
/**
* id
*/
id?: number;
/**
* 订单id * 订单id
*/ */
orderId?: number; orderId?: number;
...@@ -2027,6 +2082,7 @@ export type rentPfConfirmOrderWareType = InterFunction< ...@@ -2027,6 +2082,7 @@ export type rentPfConfirmOrderWareType = InterFunction<
/** /**
* 归还状态 0已归还 1无需归还(注:发货后申请退款需要传,归还商品的时候不需要) * 归还状态 0已归还 1无需归还(注:发货后申请退款需要传,归还商品的时候不需要)
*/ */
status?: number;
}, },
any any
>; >;
import { Form, Input, Modal, ModalProps, Radio, RadioChangeEvent, Button, message } from 'antd'; import {
Form,
Input,
Modal,
ModalProps,
Radio,
RadioChangeEvent,
Button,
message,
InputNumber,
} from 'antd';
import React, { FC, useState } from 'react'; import React, { FC, useState } from 'react';
import { InterDataType } from '~/api/interface'; import { InterDataType } from '~/api/interface';
import { rentOrderDetailType } from '~/api/interface/orderManageType'; import { rentOrderDetailType } from '~/api/interface/orderManageType';
import LogisticsStepModal from '~/components/order/productOrder/logisticsStepModal'; import LogisticsStepModal from '~/components/order/productOrder/logisticsStepModal';
import { OrderManageAPI } from '~/api'; import { OrderManageAPI } from '~/api';
import { UploadOutlined } from '@ant-design/icons';
import { UploadFile } from 'antd/es/upload/interface';
import { Uploader } from '~/components/uploader';
import { isEmptyBol } from '~/utils/validateUtils';
// 租赁订单详情返回类型 // 租赁订单详情返回类型
type detailType = InterDataType<rentOrderDetailType>; type detailType = InterDataType<rentOrderDetailType>;
...@@ -23,11 +37,12 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({ ...@@ -23,11 +37,12 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({
modalTitle, modalTitle,
}) => { }) => {
const [form] = Form.useForm<{ damage: number; reason: string }>(); const [form] = Form.useForm<{ damage: number; reason: string }>();
const [isShowReason, setIsShowReason] = useState<boolean>(false); const [isDilapidation, setIsDilapidation] = useState<boolean>(false);
const [logisticsStepModalShow, setLogisticsStepModalShow] = useState<boolean>(false); const [logisticsStepModalShow, setLogisticsStepModalShow] = useState<boolean>(false);
const [dilapidationImgList, setDilapidationImgList] = useState<UploadFile[]>([]);
const radioChangeEvent = (e: RadioChangeEvent) => { const radioChangeEvent = (e: RadioChangeEvent) => {
setIsShowReason(!!e.target.value); setIsDilapidation(!!e.target.value);
}; };
// 物流弹窗 // 物流弹窗
const logisticsStepModalShowClick = () => { const logisticsStepModalShowClick = () => {
...@@ -46,7 +61,8 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({ ...@@ -46,7 +61,8 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({
if (code === '200') { if (code === '200') {
message.success('确认归还成功'); message.success('确认归还成功');
form.resetFields(); form.resetFields();
setIsShowReason(false); setDilapidationImgList([]);
setIsDilapidation(false);
onOk(); onOk();
} }
}); });
...@@ -55,7 +71,31 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({ ...@@ -55,7 +71,31 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({
const handleCancel = () => { const handleCancel = () => {
onCancel(); onCancel();
form.resetFields(); form.resetFields();
setIsShowReason(false); setDilapidationImgList([]);
setIsDilapidation(false);
};
// 破损图片上传
const uploadDilapidationImg = (value: any) => {
setDilapidationImgList(value);
form.setFieldValue('file', JSON.stringify(value.map((v: any) => v.url)));
};
// 破损金额限制
const priceValidator = (_rule: any, value: any, callback: any) => {
if (isEmptyBol(value)) {
return callback(new Error('金额不能为空'));
}
if (value < 0) {
return callback(new Error('金额不能小于0'));
}
if (value > (currentOrderItem?.deposit || 0) * (currentOrderItem?.wareNum || 0)) {
return callback(
new Error(
`金额不能大于${(currentOrderItem?.deposit || 0) * (currentOrderItem?.wareNum || 0)}`,
),
);
}
callback();
}; };
return ( return (
...@@ -67,10 +107,37 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({ ...@@ -67,10 +107,37 @@ const ConfirmReturn: FC<ModalProps & selfProps> = ({
<Radio value={1}>破损</Radio> <Radio value={1}>破损</Radio>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
{isShowReason ? ( {isDilapidation ? (
<Form.Item label='原因' name='reason'> <>
<Input.TextArea placeholder='请输入原因' maxLength={70} showCount rows={3} /> <Form.Item
</Form.Item> label='扣除金额'
name='deductionAmount'
rules={[{ required: true, validator: priceValidator }]}
>
<InputNumber placeholder='请输入抵扣金额' style={{ width: '200px' }} />
</Form.Item>
<Form.Item
label='破损图片'
name='file'
rules={[{ required: true, message: '请上传破损图片' }]}
>
<Uploader
listType='picture-card'
fileUpload
onChange={uploadDilapidationImg}
defaultFileList={dilapidationImgList}
>
<UploadOutlined />
</Uploader>
</Form.Item>
<Form.Item
label='破损描述'
name='reason'
rules={[{ required: true, message: '请输入破损描述' }]}
>
<Input.TextArea placeholder='请输入破损描述' maxLength={70} showCount rows={3} />
</Form.Item>
</>
) : ( ) : (
'' ''
)} )}
......
...@@ -92,22 +92,27 @@ const DetailPurchaser: React.FC<PropsType> = (props) => { ...@@ -92,22 +92,27 @@ const DetailPurchaser: React.FC<PropsType> = (props) => {
</div> </div>
</> </>
)} )}
{detail?.confirmReceipt?.file ? ( {detail?.confirmReceipt ? (
<div> <div>
<div className='detail-title'>收货信息</div> <div className='detail-title'>收货信息</div>
<div className='detail-text' style={{ display: 'flex' }}> {detail?.confirmReceipt.file ? (
<span>图片:</span> <div className='detail-text' style={{ display: 'flex' }}>
<div <span>图片:</span>
className='image-file' <div
style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }} className='image-file'
> style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}
{JSON.parse(detail?.confirmReceipt.file).map((v: any, index: number) => ( >
<div style={{ marginRight: '10px', marginBottom: '10px' }} key={index}> {JSON.parse(detail?.confirmReceipt.file).map((v: any, index: number) => (
<Image src={v.filePath} width={50} height={50} /> <div style={{ marginRight: '10px', marginBottom: '10px' }} key={index}>
</div> <Image src={v} width={50} height={50} />
))} </div>
))}
</div>
</div> </div>
</div> ) : (
''
)}
<div className='detail-text'>描述:{detail?.confirmReceipt.reason}</div>
</div> </div>
) : ( ) : (
'' ''
...@@ -132,7 +137,34 @@ const DetailPurchaser: React.FC<PropsType> = (props) => { ...@@ -132,7 +137,34 @@ const DetailPurchaser: React.FC<PropsType> = (props) => {
) : ( ) : (
'' ''
)} )}
{detail?.storeDamageOrder ? (
<div>
<div className='detail-title'>破损信息</div>
{detail?.storeDamageOrder.file ? (
<div className='detail-text' style={{ display: 'flex' }}>
<span>图片:</span>
<div
className='image-file'
style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}
>
{JSON.parse(detail?.storeDamageOrder.file).map((v: any, index: number) => (
<div style={{ marginRight: '10px', marginBottom: '10px' }} key={index}>
<Image src={v} width={50} height={50} />
</div>
))}
</div>
</div>
) : (
''
)}
<div className='detail-text'>
扣除金额:¥{detail?.storeDamageOrder.modifiedDeposit.toLocaleString()}
</div>
<div className='detail-text'>描述:{detail?.storeDamageOrder.reason}</div>
</div>
) : (
''
)}
<LogisticsStepModal <LogisticsStepModal
open={logisticsStepModalShow} open={logisticsStepModalShow}
onCancel={logisticsStepModalCancel} onCancel={logisticsStepModalCancel}
......
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import SearchBox from '~/components/search-box'; import SearchBox from '~/components/search-box';
import { Button, Image, Table } from 'antd'; import { Button, Image, Table, Tooltip } from 'antd';
import { ColumnsType } from 'antd/es/table'; import { ColumnsType } from 'antd/es/table';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import qs from 'query-string'; import qs from 'query-string';
...@@ -13,6 +13,7 @@ import TableItem from '~/components/order/selfTableItem'; ...@@ -13,6 +13,7 @@ import TableItem from '~/components/order/selfTableItem';
import './index.scss'; import './index.scss';
import { filterObjAttr } from '~/utils'; import { filterObjAttr } from '~/utils';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { CommentOutlined } from '@ant-design/icons';
// 表格数据类型 // 表格数据类型
type TableType = InterListType<rentOrderListType>; type TableType = InterListType<rentOrderListType>;
...@@ -226,7 +227,19 @@ function EquipmentOrderView() { ...@@ -226,7 +227,19 @@ function EquipmentOrderView() {
<TableItem <TableItem
tr={ tr={
<div> <div>
<div>{record.userName}</div> <div>
{record.userName || record.nickname}({record.userAccountId})
</div>
<div>{record.phoneNum}</div>
{record.userRemark ? (
<div>
<Tooltip placement='top' title={record.userRemark}>
<Button icon={<CommentOutlined />}></Button>
</Tooltip>
</div>
) : (
''
)}
</div> </div>
} }
/> />
...@@ -236,6 +249,7 @@ function EquipmentOrderView() { ...@@ -236,6 +249,7 @@ function EquipmentOrderView() {
title: '订单状态', title: '订单状态',
dataIndex: 'statusCode', dataIndex: 'statusCode',
align: 'center', align: 'center',
width: '10%',
render: (text: number) => ( render: (text: number) => (
<TableItem tr={tranStatusList.find((v) => v.value === String(text))?.label} /> <TableItem tr={tranStatusList.find((v) => v.value === String(text))?.label} />
), ),
...@@ -402,8 +416,8 @@ function EquipmentOrderView() { ...@@ -402,8 +416,8 @@ function EquipmentOrderView() {
<ShipmentsOrder <ShipmentsOrder
open={deliverVisible} open={deliverVisible}
currentOrderItem={currentOrderItem} currentOrderItem={currentOrderItem}
onCancel={shipmentsOrderOk} onCancel={shipmentsOrderCancel}
onOk={shipmentsOrderCancel} onOk={shipmentsOrderOk}
/> />
{/*确认归还*/} {/*确认归还*/}
<ConfirmReturn <ConfirmReturn
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论