提交 fa75d691 作者: 龚洪江

功能:租赁订单

上级 109a33ba
......@@ -46,6 +46,14 @@ export type releaseReportDataType = InterFunction<
* 话题发布数量
*/
topicReleaseCount?: number;
/**
* 招标信息数量
*/
tenderReleaseCount?: number;
/**
* 新闻发布数量
*/
newsReleaseCount?: number;
}
>;
// 数据看板-加盟信息
......
......@@ -1632,3 +1632,335 @@ export type uavPoSellerRemarkType = InterFunction<
},
any
>;
//租赁-订单列表
type rentReqType = {
deposit: number;
/**
* 卖家企业名称
*/
companyName?: string;
/**
* 确认收货时间
*/
confirmReceiptTime?: Date;
/**
* 下单时间
*/
createTime?: Date;
/**
* 租赁结束时间
*/
endDate?: Date;
/**
* id
*/
id: number;
kdnExpDTO?: {
logisticCode?: string;
shipperCode?: string;
stateEx?: string;
traces?: {
acceptStation?: string;
acceptTime?: string;
action?: string;
location?: string;
}[];
};
/**
* 租赁商品id
*/
leaseGoodsId?: number;
leaseRefundOrder?: {
/**
* 创建时间
*/
createTime?: Date;
/**
* 物流编号
*/
expressCode?: string;
/**
* 快递单号
*/
expressNum?: string;
/**
* 图片文件
*/
file?: string;
/**
* id
*/
id?: number;
/**
* 订单id
*/
leaseOrderId?: number;
/**
* 退款原因
*/
reason?: string;
/**
* 归还状态:0已归还 1无需归还
*/
status?: number;
};
/**
* 运费
*/
modeOfDeliveryInfo?: string;
/**
* 订单需付金额
*/
needPayAmount?: number;
/**
* 买家昵称
*/
nickname?: string;
/**
* 订单名称
*/
orderName?: string;
/**
* 订单编号
*/
orderNo?: string;
/**
* 订单实付总额
*/
orderTotalAmount?: number;
/**
* 其他方式支付额度
*/
otherAmount?: number;
/**
* 支付时间
*/
payTime?: Date;
/**
* wechatpay微信,alipay支付宝,offline线下
*/
payType?: string;
/**
* 买家手机号
*/
phoneNum?: string;
/**
* 评价状态
*/
remarkStatus?: number;
/**
* 抵扣佣金余额
*/
salaryAmount?: number;
/**
* 卖家备注
*/
sellerRemark?: string;
/**
* 抵扣云享金余额
*/
shareAmount?: number;
/**
* 订单规格列表
*/
sku: string;
/**
* sku图片
*/
skuImg?: string;
/**
* 租赁开始时间
*/
startDate?: Date;
/**
* 订单状态
*/
statusCode: number;
storeReceiveOrder?: {
/**
* 创建时间
*/
createTime?: Date;
/**
* 物流编号
*/
expressCode?: string;
/**
* 快递单号
*/
expressNum?: string;
/**
* 图片文件
*/
file?: string;
/**
* id
*/
id?: number;
/**
* 订单id
*/
leaseOrderId?: number;
/**
* 退款原因
*/
reason?: string;
/**
* 归还状态:0已归还 1无需归还
*/
status?: number;
};
/**
* 卖家id
*/
thirdBackUserAccountId?: number;
uavOrderExpressDTO?: {
/**
* id
*/
id?: number;
/**
* 是否已取件,0未取,1已取
*/
receive?: number;
/**
* 取件时间
*/
receiveTime?: Date;
/**
* 快递编码
*/
sendExpCode?: string;
/**
* 快递编号
*/
sendExpNo?: string;
/**
* 发货-平台操作发货时间
*/
sendTime?: Date;
/**
* 发货-收货详细地址
*/
takeAddress?: string;
/**
* 取货人
*/
takeName?: string;
/**
* 取货人号码
*/
takePhone?: string;
/**
* 地区信息
*/
takeRegion?: string;
/**
* 订单id
*/
uavOrderId?: number;
};
/**
* 最近修改时间
*/
updateTime?: Date;
/**
* 买家id
*/
userAccountId?: number;
/**
* 买家姓名
*/
userName?: string;
/**
* 买家备注
*/
userRemark?: string;
/**
* 购买数量
*/
wareNum: number;
shareCashPledge?: number;
salaryCashPledge?: number;
};
export type rentOrderListType = InterListFunction<
{
/**
* 结束时间
*/
endTime?: string;
/**
* 关键字-订单编号
*/
keyword?: string;
/**
* 开始时间
*/
startTime?: string;
/**
* 订单状态码
*/
statusCode?: number;
/**
* 用户uid
*/
uid?: string;
},
rentReqType
>;
// 租赁-订单字典
export type rentOrderDictType = InterFunction<
any,
{
status: string;
doing: string;
waiting: string;
leaseOrderStatus: null;
}[]
>;
// 租赁-订单详情
export type rentOrderDetailType = InterFunction<
{
/**
* id
*/
id: number;
},
rentReqType
>;
// 租赁订单-发货
export type rentOrderSendType = InterFunction<
{
id: number;
/**
* 快递编码
*/
sendExpCode: string;
/**
* 快递编号
*/
sendExpNo: string;
/**
* 发货-收货详细地址
*/
takeAddress: string;
/**
* 取货人
*/
takeName: string;
/**
* 取货人号码
*/
takePhone: string;
/**
* 地区信息
*/
takeRegion: string;
/**
* 订单id
*/
uavOrderId: number;
},
any
>;
......@@ -38,6 +38,10 @@ import {
uavPoSendType,
uploadPOrderType,
walletAmountType,
rentOrderListType,
rentOrderDictType,
rentOrderSendType,
rentOrderDetailType,
} from '~/api/interface/orderManageType';
export class OrderManageAPI {
......@@ -158,4 +162,14 @@ export class OrderManageAPI {
axios.get('/oms/uav-po/userRemark', { params });
static setUavPoSellerRemark: uavPoSellerRemarkType = (params) =>
axios.get('/oms/uav-po/sellerRemark', { params });
// 租赁-订单列表
static getRentOrderList: rentOrderListType = (data) => axios.post('/oms/lease/order/list', data);
// 租赁-订单字典
static getRentOrderDict: rentOrderDictType = () => axios.get('/oms/lease/order/statusList');
// 租赁-订单发货
static rentOrderSend: rentOrderSendType = (data) => axios.post('/oms/lease/order/send', data);
// 租赁-订单详情
static getRentOrderDetail: rentOrderDetailType = (params) =>
axios.get('/oms/lease/order/detail', { params });
}
......@@ -98,7 +98,7 @@ $design_height:856;
}
}
.card-info{
margin-bottom: 26px;
margin-bottom: 10px;
display: flex;
padding: 0 40px 0 35px;
display: flex;
......
......@@ -93,6 +93,14 @@ const UserInfo = () => {
<div className='label'>订单发布</div>
<div className='value'>{releaseReportData?.orderReleaseCount}</div>
</div>
<div className='card-info'>
<div className='label'>新闻发布</div>
<div className='value'>{releaseReportData?.newsReleaseCount}</div>
</div>
<div className='card-info'>
<div className='label'>招投标发布</div>
<div className='value'>{releaseReportData?.tenderReleaseCount}</div>
</div>
</div>
</div>
);
......
import { Form, Input, Modal, ModalProps, Radio } from 'antd';
import { FC } from 'react';
import { InterDataType } from '~/api/interface';
import { rentOrderDetailType } from '~/api/interface/orderManageType';
// 租赁订单详情返回类型
type detailType = InterDataType<rentOrderDetailType>;
interface selfProps {
onOk: () => void;
onCancel: () => void;
currentOrderItem: detailType | undefined;
}
const ConfirmReturn: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => {
const [form] = Form.useForm<{ damage: number; reason: string }>();
const handleOk = () => {
onOk();
};
const handleCancel = () => {
onCancel();
};
return (
<Modal open={open} title='确认归还' onOk={handleOk} onCancel={handleCancel}>
<Form initialValues={{ damage: 0 }} form={form}>
<Form.Item label='判定' name='damage'>
<Radio.Group>
<Radio value={0}>未破损</Radio>
<Radio value={1}>破损</Radio>
</Radio.Group>
</Form.Item>
<Form.Item label='原因' name='reason'>
<Input.TextArea placeholder='请输入原因' maxLength={70} showCount rows={3} />
</Form.Item>
<Form.Item label='图片'>
<div className='image-file'>{}</div>
</Form.Item>
</Form>
</Modal>
);
};
export default ConfirmReturn;
import { InterListType, InterReqType } from '~/api/interface';
import { listPcWechatOrderType, sendOrderWareType } from '~/api/interface/orderManageType';
import React, { useEffect } from 'react';
import { Col, Form, Input, message, Modal, Radio, Row, Select } from 'antd';
import { Uploader } from '~/components/uploader';
import { PlusOutlined } from '@ant-design/icons';
import { OrderManageAPI } from '~/api';
// 表格数据类型
type TableType = InterListType<listPcWechatOrderType>;
// 请求数据的类型
type ReqType = InterReqType<sendOrderWareType>;
// 传参类型
interface propType {
title: string;
open: boolean;
closed: any;
data?: TableType[0];
}
const OrderDeliver: React.FC<propType> = (props) => {
OrderDeliver.defaultProps = {
data: undefined,
};
// 参数
const { title, open, closed, data } = props;
// 物流列表
const [expressList, setExpressList] = React.useState<{ label: string; value: string }[]>([]);
// 表单钩子
const [form] = Form.useForm<ReqType>();
// 关闭弹窗
const handleCancel = () => {
form.resetFields();
closed();
};
// 确认事件
const handleOk = () => {
form
.validateFields()
.then(async (values) => {
// console.log('确认事件 --->', values);
await handleSubmit(values);
})
.catch((err) => {
message
.warning({
content: err.errorFields[0].errors[0],
})
.then();
});
};
// 提交事件
const handleSubmit = async (values: ReqType) => {
const res = await OrderManageAPI.sendOrderWare({
...values,
orderInfoId: Number(data?.id),
});
if (res && res.code === '200') {
message.success('操作成功');
handleCancel();
}
};
// 获取物流信息
const getListExpressInfo = async () => {
const res = await OrderManageAPI.listExpressInfo({});
if (res && res.code === '200') {
setExpressList(res.result.map((item) => ({ label: item.exName, value: item.exCode })));
// console.log(res);
}
};
// componentDidMount
useEffect(() => {
if (!open) return;
if (!data) return;
getListExpressInfo().then();
// console.log('data --->', data);
}, [open]);
return (
<Modal
open={open}
title={title}
onCancel={handleCancel}
onOk={handleOk}
destroyOnClose
width={600}
>
<Form
name='addForm'
form={form}
labelAlign='right'
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
autoComplete='new-password'
>
<Form.Item label='收货地址' labelCol={{ span: 4 }}>
{data?.receipt?.takeName} {data?.receipt?.takePhone} {data?.receipt?.detailAddress}
</Form.Item>
<Form.Item label='发货方式' labelCol={{ span: 4 }}>
物流发货
</Form.Item>
<Row gutter={{ xs: 8, sm: 16, md: 24 }}>
<Col span={11}>
<Form.Item
label='物流单号'
name='sendExNo'
rules={[{ required: true, message: '请输入物流单号' }]}
>
<Input placeholder={'请输入物流单号'} maxLength={20} allowClear />
</Form.Item>
</Col>
<Col span={11}>
<Form.Item
label='物流公司'
name='sendExCode'
rules={[{ required: true, message: '请选择物流公司' }]}
>
<Select placeholder={'请选择物流公司'} options={expressList} allowClear />
</Form.Item>
</Col>
</Row>
<Row gutter={{ xs: 8, sm: 16, md: 24 }}>
<Col span={11}>
<Form.Item
label='归还联系人'
name='renName'
rules={[{ required: true, message: '请输入归还联系人' }]}
>
<Input placeholder={'请输入归还联系人'} maxLength={20} allowClear />
</Form.Item>
</Col>
<Col span={11}>
<Form.Item
label='归还电话'
name='renPhone'
rules={[
{ required: true, message: '请输入归还联系人电话' },
// 校验手机号
() => ({
validator(_, value) {
if (!value || /^1[3-9]\d{9}$/.test(value)) {
return Promise.resolve();
}
return Promise.reject('请输入正确的手机号');
},
}),
]}
>
<Input
placeholder={'请输入归还联系人电话'}
maxLength={20}
allowClear
type={'number'}
/>
</Form.Item>
</Col>
</Row>
<Row gutter={{ xs: 8, sm: 16, md: 24 }}>
<Col span={11}>
<Form.Item
label='归还地址'
name='renAddress'
rules={[{ required: true, message: '请输入归还地址' }]}
>
<Input placeholder={'请输入归还地址'} maxLength={20} allowClear />
</Form.Item>
</Col>
</Row>
<Row gutter={{ xs: 8, sm: 16, md: 24 }}>
<Col span={11}>
<Form.Item
label='质检照片'
name='imgs'
rules={[{ required: true, message: '请上传质检照片' }]}
>
<Uploader
listType={'picture-card'}
fileUpload
fileLength={3}
onChange={(e) => {
form.setFieldValue(
'imgs',
e.map((item) => item.url),
);
}}
>
<PlusOutlined />
</Uploader>
</Form.Item>
</Col>
<Col span={11}>
<Form.Item
label='质检视频'
name='videoUrl'
rules={[{ required: true, message: '请上传质检视频' }]}
>
<Uploader
listType={'picture-card'}
fileUpload
fileLength={1}
fileType={['video/mp4', 'video/avi', 'video/wmv', 'video/rmvb']}
fileSize={10}
onChange={(e) => {
form.setFieldValue('videoUrl', e[0].url);
}}
>
<PlusOutlined />
</Uploader>
</Form.Item>
</Col>
</Row>
<Row gutter={{ xs: 8, sm: 16, md: 24 }}>
<Col span={11}>
<Form.Item
label='设备状态'
name='vcuSatus'
rules={[{ required: true, message: '请选择设备状态' }]}
initialValue={0}
>
<Radio.Group
options={[
{ label: '正常', value: 0 },
{ label: '故障', value: 1 },
]}
onChange={(e) => {
form.setFieldValue('vcuSatus', e.target.value);
}}
/>
</Form.Item>
</Col>
<Col span={11}>
<Form.Item
label='操作密码'
name='authPwd'
rules={[{ required: true, message: '请输入操作密码' }]}
>
<Input.Password
placeholder={'请输入操作密码'}
maxLength={20}
allowClear
autoComplete='new-password'
/>
</Form.Item>
</Col>
</Row>
</Form>
</Modal>
);
};
export default OrderDeliver;
import { FC, useEffect, useState } from 'react';
import { Cascader, Form, Input, message, Modal, ModalProps, Select } from 'antd';
import { OrderManageAPI } from '~/api';
import { InterReqType } from '~/api/interface';
import { rentOrderSendType } from '~/api/interface/orderManageType';
import regionData from '~/assets/json/district.json';
// 发货请求类型
type sendMallType = Omit<Exclude<InterReqType<rentOrderSendType>, undefined>, 'takeRegion'> & {
takeRegion: string[];
};
interface selfProps {
currentOrderItem: any;
onCancel: () => void;
onOk: () => void;
}
const ShipmentsOrder: FC<ModalProps & selfProps> = ({ onOk, onCancel, open, currentOrderItem }) => {
const [form] = Form.useForm<sendMallType>();
const [listExpressInfo, setListExpressInfo] = useState<{ label: string; value: string }[]>([]);
//获取物流公司列表
const getExpressList = () => {
OrderManageAPI.listExpressInfo().then(({ result }) => {
setListExpressInfo(result?.map((v) => ({ label: v.exName, value: v.exCode })) || []);
});
};
const handleOk = () => {
form.validateFields().then((value) => {
OrderManageAPI.rentOrderSend({
...value,
uavOrderId: currentOrderItem?.id,
id: currentOrderItem?.uavOrderExpressDTO.id,
takeRegion: value?.takeRegion?.join('/'),
}).then(({ code }) => {
if (code === '200') {
message.success('发货成功');
form.resetFields();
onOk();
}
});
});
};
const handleCancel = () => {
form.resetFields();
onCancel();
};
useEffect(() => {
if (open) {
getExpressList();
}
}, [open]);
useEffect(() => {
if (currentOrderItem && open) {
form.setFieldsValue({
takeName: currentOrderItem.uavOrderExpressDTO.takeName,
takePhone: currentOrderItem.uavOrderExpressDTO.takePhone,
takeRegion: currentOrderItem.uavOrderExpressDTO.takeRegion.split('/'),
takeAddress: currentOrderItem.uavOrderExpressDTO.takeAddress,
});
}
}, [currentOrderItem]);
return (
<Modal open={open} title='发货' onOk={handleOk} onCancel={handleCancel}>
<Form
name='basic'
labelCol={{ span: 4 }}
wrapperCol={{ span: 16 }}
initialValues={{ remember: true }}
autoComplete='off'
form={form}
>
<Form.Item
label='物流公司'
name='sendExpCode'
rules={[
{
required: true,
message: '请选择物流公司',
},
]}
>
<Select placeholder='请选择物流公司' allowClear options={listExpressInfo}></Select>
</Form.Item>
<Form.Item
label='物流编号'
name='sendExpNo'
rules={[
{
required: true,
message: '请输入物流编号',
},
]}
>
<Input placeholder='请输入物流编号' allowClear maxLength={50} />
</Form.Item>
<Form.Item
label='用户姓名'
name='takeName'
rules={[
{
required: true,
message: '请输入用户姓名',
},
]}
>
<Input placeholder='请输入用户姓名' allowClear maxLength={30} />
</Form.Item>
<Form.Item
label='手机号'
name='takePhone'
rules={[
{
required: true,
message: '请输入手机号',
},
{
pattern: /^1[3-9]\d{9}$/,
message: '手机号格式不正确',
},
]}
>
<Input placeholder='请输入手机号' allowClear maxLength={30} />
</Form.Item>
<Form.Item
label='收货地址'
name='takeRegion'
rules={[
{
required: false,
message: '请选择收货地址',
},
]}
>
<Cascader
options={regionData}
placeholder='请选择收货地址'
allowClear
fieldNames={{
label: 'name',
value: 'name',
children: 'childInfo',
}}
/>
</Form.Item>
<Form.Item
label='详细地址'
name='takeAddress'
rules={[
{
required: false,
message: '请输入详细地址',
},
]}
>
<Input.TextArea maxLength={70} showCount placeholder='请输入详细地址' allowClear />
</Form.Item>
</Form>
</Modal>
);
};
export default ShipmentsOrder;
......@@ -7,20 +7,19 @@ import DetailPurchaser from '~/pages/orderManage/equipmentOrder/comp/detailPurch
import DetailInformation from '~/pages/orderManage/equipmentOrder/comp/detailInformation';
import { OrderManageAPI } from '~/api';
import { InterDataType } from '~/api/interface';
import { orderDetailType } from '~/api/interface/orderManageType';
import { rentOrderDetailType } from '~/api/interface/orderManageType';
import DetailTimeLine from '~/pages/orderManage/equipmentOrder/comp/detailTimeLine';
// import DetailMessageBox from '~/pages/orderManage/equipmentOrder/comp/detailMessageBox';
// 接口返回的类型
type DataType = InterDataType<orderDetailType>;
type DataType = InterDataType<rentOrderDetailType>;
function EquipmentOrderDetail() {
// 路由钩子
const navigate = useNavigate();
// 参数钩子
const [searchParams] = useSearchParams();
// 接收到的参数
const orderNo = searchParams.get('orderNo') as string;
// 订单id
const [orderId, setOrderId] = useState<number>(0);
// 返回上一页
const handleBack = () => {
navigate(-1);
......@@ -28,19 +27,20 @@ function EquipmentOrderDetail() {
// 订单详情
const [orderDetail, setOrderDetail] = useState<DataType>(null!);
// 获取订单详情
const getOrderDetail = async () => {
const res = await OrderManageAPI.orderDetail({
orderNo: orderNo,
const getOrderDetail = (id: number) => {
OrderManageAPI.getRentOrderDetail({
id,
}).then(({ result }) => {
if (result) {
setOrderDetail(result);
}
});
if (res && res.code === '200') {
setOrderDetail(res.result);
// console.log('获取订单详情 --->', res.result);
}
};
// componentDidMount
useEffect(() => {
getOrderDetail().then();
}, [orderNo]);
setOrderId(Number(searchParams.get('id') || 0));
getOrderDetail(Number(searchParams.get('id') || 0));
}, []);
return (
<div className={'order-detail'}>
<div className={'order-head'}>
......
.equipment-order{
.mall-sku-item{
display: flex;
align-items: center;
margin-bottom: 10px;
.sku-img{
width: 48px;
height: 48px;
}
.sku-info{
margin-left: 10px;
line-height: 16px;
text-align: left;
.info-name{
color:#1677ff
}
.info-spec{
margin-top: 10px;
span:not(:last-child){
&:after{
content: ';';
}
}
}
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论