提交 8da97540 作者: 龚洪江

功能:fdd实名认证

上级 c2e4da4b
......@@ -16,6 +16,7 @@ import { PilotTrainAPI } from './modules/pilotTrainAPI';
import { FlyerCenterAPI } from './modules/flyerCenterAPI';
import { RentManageAPI } from './modules/rentManageAPI';
import { DepleteManageTypeAPI } from './modules/depleteManageTypeAPI';
import { FddInterfaceAPI } from './modules/fddInterfaceAPI';
export {
CommonAPI,
......@@ -36,4 +37,5 @@ export {
FlyerCenterAPI,
RentManageAPI,
DepleteManageTypeAPI,
FddInterfaceAPI,
};
import { InterFunction } from '~/api/interface';
// fdd-上传合同
export type uploadContractType = InterFunction<
{
/**
* 合同地址
*/
docUrl: string;
/**
* 订单编号
*/
orderNo: string;
/**
* 端口:0小程序 1后台
*/
port: number;
/**
* 合同标题
*/
title: string;
},
{
id: number;
unionId: string;
orderNo: string;
contractNo: string;
contractTitle: string;
signStatus: number;
singerTime: string;
createTime: string;
updateTime: string;
archiveDate: string;
aremark: string;
bremark: string;
atransactionId: number;
btransactionId: number;
}
>;
// fdd-签署合同
export type signContractType = InterFunction<
{
/**
* 合同编号
*/
contractId: string;
/**
* 小程序页面跳转地址
*/
pages?: string;
/**
* 端口:0小程序 1后台
*/
port: number;
},
string
>;
......@@ -933,7 +933,7 @@ type mallOrderType = {
/**
* 订单编号
*/
orderNo?: string;
orderNo: string;
/**
* 订单实付总额
*/
......@@ -1192,6 +1192,7 @@ export type mallOrderSendType = InterFunction<
* 订单id
*/
uavOrderId?: number;
id?: number;
},
any
>;
......@@ -1209,3 +1210,25 @@ export type sellerRemarkType = InterFunction<
},
any
>;
// 商城订单-确认订单
export type confirmOrderType = InterFunction<
{
/**
* 订单交期
*/
deliveryTime: string;
/**
* 订单id
*/
id: number;
/**
* 订单实付总额
*/
orderTotalAmount: number;
/**
* 卖家备注
*/
sellerRemark?: string;
},
any
>;
......@@ -353,3 +353,8 @@ export type getUserAddressInfoType = InterFunction<
id: number;
}
>;
//fdd-企业实名认证
export type companyVerifyUrlType = InterFunction<{ port: number }, string>;
// fdd-企业实名认证信息
export type userFddInfoType = InterFunction<{ port: number }, any>;
import { signContractType, uploadContractType } from '~/api/interface/fddInterfaceType';
import axios from '../request';
export class FddInterfaceAPI {
// fdd-上传合同
static uploadContract: uploadContractType = (data) =>
axios.post('/userapp/fdd/contract/uploadContract', data);
// fdd-签署合同
static signContract: signContractType = (params) =>
axios.get('/userapp/fdd/contract/stamp', { params });
}
import axios from '../request';
import {
confirmOrderType,
disputeType,
flowDictionaryAndTimeType,
flowDictionaryType,
......@@ -121,4 +122,6 @@ export class OrderManageAPI {
// 商城订单-卖家备注
static sellerRemark: sellerRemarkType = (params) =>
axios.get('/oms/uav-order/sellerRemark', { params });
// 商城订单-确认订单
static confirmOrder: confirmOrderType = (data) => axios.post('/oms/uav-order/confirmOrder', data);
}
......@@ -2,6 +2,7 @@ import {
addressInsetType,
addressListType,
bindingCompanyMemberType,
companyVerifyUrlType,
deleteAddressType,
deleteRoleInfoType,
editAddressType,
......@@ -26,6 +27,7 @@ import {
updatePasswordType,
updateRoleInfoType,
updateRoleMenuInfoType,
userFddInfoType,
} from '../interface/systemManageType';
import axios from '../request';
......@@ -123,4 +125,10 @@ export class SystemManageAPI {
// 地址管理-根据地址id查找
static getUserAddressInfo: getUserAddressInfoType = (params) =>
axios.get('/oms/user-address/getUserAddressInfo', { params });
// fdd-企业实名认证
static getCompanyVerifyUrl: companyVerifyUrlType = (params) =>
axios.get('/userapp/fdd/auth/getCompanyVerifyUrl', { params });
// fdd-获取企业实名认证信息
static getAppUserFddInfo: userFddInfoType = (params) =>
axios.get('/userapp/fdd/auth/getAppUserFddInfo', { params });
}
......@@ -7,7 +7,7 @@ interface selfProps {
}
const IframeModal: FC<ModalProps & selfProps> = ({ open, onCancel, title, url }) => {
return (
<Modal open={open} onCancel={onCancel} title={title}>
<Modal open={open} onCancel={onCancel} title={title} width={1000} footer={null}>
<iframe src={url} title={title} style={{ width: '100%', height: '1000px' }} />
</Modal>
);
......
......@@ -36,15 +36,17 @@ const ShipmentsOrder: FC<ModalProps & selfProps> = ({ onOk, onCancel, open, curr
const handleOk = () => {
form.validateFields().then((value) => {
OrderManageAPI.mallOrderSend({ ...value, uavOrderId: currentOrderItem?.id }).then(
({ code }) => {
OrderManageAPI.mallOrderSend({
...value,
uavOrderId: currentOrderItem?.id,
id: currentOrderItem?.uavOrderExpressDTO.id,
}).then(({ code }) => {
if (code === '200') {
message.success('发货成功');
form.resetFields();
onOk();
}
},
);
});
});
};
const handleCancel = () => {
......
......@@ -10,4 +10,29 @@
margin-top: 10px;
}
}
.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: ';';
}
}
}
}
}
}
import { FC } from 'react';
import { Button, Cascader, Col, Form, Input, Modal, ModalProps, Row, Table, Upload } from 'antd';
import { FC, useEffect, useState } from 'react';
import {
Button,
Col,
DatePicker,
Form,
Image,
Input,
message,
Modal,
ModalProps,
Row,
Table,
} from 'antd';
import './index.scss';
import { ColumnsType } from 'antd/es/table/InternalTable';
import { UploadOutlined } from '@ant-design/icons';
import { Uploader } from '~/components/uploader';
import { InterListType } from '~/api/interface';
import { mallOrderListType } from '~/api/interface/orderManageType';
import { FddInterfaceAPI, OrderManageAPI } from '~/api';
import IframeModal from '~/components/modal/iframeModal';
import { decode } from 'js-base64';
import { UploadFile } from 'antd/es/upload/interface';
// 订单对象类型
type mallOrderItemType = InterListType<mallOrderListType>[0];
interface selfProps {
onCancel: () => void;
onOk: () => void;
mallOrderItem: mallOrderItemType | undefined;
}
const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => {
const tableColumns: ColumnsType<any> = [
const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel, mallOrderItem }) => {
const [orderInfoForm] = Form.useForm<{ orderTotalAmount: number; deliveryTime: string }>();
const [contractForm] = Form.useForm<{ contractUrl: string; contractTitle: string }>();
const tableColumns: ColumnsType<mallOrderItemType['skuDTOList'][0]> = [
{
title: '商品',
align: 'center',
render: (_text: any, record) => (
<div className='mall-sku-item'>
<Image src={record.skuImage} className='sku-img' />
<div className='sku-info'>
<div className='info-name'>{record.tradeName}</div>
<div className='info-spec'>
{Object.entries(JSON.parse(record.productSpec)).map((v, index) => (
<span key={index}>{v.join(':')}</span>
))}
</div>
</div>
</div>
),
},
{
title: '价格',
align: 'center',
dataIndex: 'unitPrice',
render: (text: number) => text.toFixed(2).toLocaleString(),
},
{
title: '数量',
align: 'center',
dataIndex: 'orderNum',
},
];
// 签署合同地址
const [contractFileList, setContractFileList] = useState<UploadFile[]>([]);
const [contractUrl, setContractUrl] = useState<string>('');
const [iframeModalShow, setIframeModalShow] = useState<boolean>(false);
// 合同文件上传成功回调
const uploadSuccess = (value: any) => {
setContractFileList(value);
contractForm.setFieldValue('contractUrl', value[0].url);
};
// 合同上传fdd
const uploadContract = () => {
if (mallOrderItem) {
contractForm
.validateFields()
.then((values) => {
FddInterfaceAPI.uploadContract({
docUrl: values.contractUrl,
orderNo: mallOrderItem.orderNo,
port: 1,
title: values.contractTitle,
}).then(({ result }) => {
signContract(result.contractNo);
});
})
.catch((error: any) => {
message.warning(error?.errorFields[0]?.errors[0]);
});
}
};
// 签署合同
const signContract = (contractId: string) => {
FddInterfaceAPI.signContract({ contractId, port: 1 }).then(({ result }) => {
if (result) {
setContractUrl(decode(result));
setIframeModalShow(true);
}
});
};
const iframeModalCancel = () => {
setIframeModalShow(false);
};
const handleOk = () => {
if (mallOrderItem) {
Promise.all([orderInfoForm.validateFields(), contractForm.validateFields()])
.then((values) => {
OrderManageAPI.confirmOrder({ ...values[0], id: mallOrderItem.id }).then(
({ code, message: msg }) => {
if (code === '200') {
onOk();
} else {
message.error(msg);
}
},
);
})
.catch((error: any) => {
message.warning(error?.errorFields[0]?.errors[0]);
});
}
};
const handleCancel = () => {
orderInfoForm.resetFields();
contractForm.resetFields();
setContractFileList([]);
onCancel();
};
useEffect(() => {
if (mallOrderItem) {
orderInfoForm.setFieldValue('orderTotalAmount', mallOrderItem.orderTotalAmount);
}
}, [mallOrderItem]);
return (
<Modal open={open} title='确认订单' onOk={handleOk} onCancel={handleCancel} width={800}>
<div className='sure-order'>
<div className='address-info'>
<div className='address-info-title'>收货信息:</div>
<div className='address-info-form'>
<Form labelCol={{ span: 5 }} wrapperCol={{ span: 16 }}>
<Form.Item
label='收货人'
name='takeName'
// rules={[{ required: true, validator: validateUserName }]}
>
<Input placeholder='请输入收货人' style={{ width: '300px' }} />
</Form.Item>
<Form.Item
label='联系方式'
name='takePhone'
// rules={[{ required: true, validator: validatePhone }]}
>
<Input placeholder='请输入联系方式' style={{ width: '300px' }} />
</Form.Item>
<Form.Item
label='所属地区'
rules={[{ required: true, message: '请输入所属地区' }]}
name='takeRegion'
>
<Cascader
// options={location}
style={{ width: '300px' }}
fieldNames={{
label: 'name',
value: 'name',
children: 'childInfo',
}}
placeholder='请选择所属地区'
/>
</Form.Item>
<Form.Item
label='详细地址'
name='takeAddress'
rules={[{ required: true, message: '请输入详细地址' }]}
>
<Input.TextArea
maxLength={250}
placeholder='请输入详细地址'
showCount
rows={4}
style={{ width: '300px' }}
/>
</Form.Item>
</Form>
</div>
</div>
{/*<div className='address-info'>*/}
{/* <div className='address-info-title'>收货信息:</div>*/}
{/* <div className='address-info-form'>*/}
{/* <Form labelCol={{ span: 5 }} wrapperCol={{ span: 16 }}>*/}
{/* <Form.Item*/}
{/* label='收货人'*/}
{/* name='takeName'*/}
{/* // rules={[{ required: true, validator: validateUserName }]}*/}
{/* >*/}
{/* <Input placeholder='请输入收货人' style={{ width: '300px' }} />*/}
{/* </Form.Item>*/}
{/* <Form.Item*/}
{/* label='联系方式'*/}
{/* name='takePhone'*/}
{/* // rules={[{ required: true, validator: validatePhone }]}*/}
{/* >*/}
{/* <Input placeholder='请输入联系方式' style={{ width: '300px' }} />*/}
{/* </Form.Item>*/}
{/* <Form.Item*/}
{/* label='所属地区'*/}
{/* rules={[{ required: true, message: '请输入所属地区' }]}*/}
{/* name='takeRegion'*/}
{/* >*/}
{/* <Cascader*/}
{/* // options={location}*/}
{/* style={{ width: '300px' }}*/}
{/* fieldNames={{*/}
{/* label: 'name',*/}
{/* value: 'name',*/}
{/* children: 'childInfo',*/}
{/* }}*/}
{/* placeholder='请选择所属地区'*/}
{/* />*/}
{/* </Form.Item>*/}
{/* <Form.Item*/}
{/* label='详细地址'*/}
{/* name='takeAddress'*/}
{/* rules={[{ required: true, message: '请输入详细地址' }]}*/}
{/* >*/}
{/* <Input.TextArea*/}
{/* maxLength={250}*/}
{/* placeholder='请输入详细地址'*/}
{/* showCount*/}
{/* rows={4}*/}
{/* style={{ width: '300px' }}*/}
{/* />*/}
{/* </Form.Item>*/}
{/* </Form>*/}
{/* </div>*/}
{/*</div>*/}
<div className='order-info'>
<div className='order-info-title'>订单信息:</div>
<Row>
<Col span={3}></Col>
<Col span={16}>
<div className='order-info-table'>
<Table bordered columns={tableColumns} />
<Table
bordered
columns={tableColumns}
dataSource={mallOrderItem?.skuDTOList || []}
pagination={false}
rowKey='id'
/>
</div>
<div className='order-info-form'>
<Form wrapperCol={{ span: 10 }} labelCol={{ span: 3 }}>
<Form.Item label='订单交期'>
<Input placeholder='请输入订单交期' />
<Form wrapperCol={{ span: 10 }} labelCol={{ span: 3 }} form={orderInfoForm}>
<Form.Item
label='实付总额'
name='orderTotalAmount'
rules={[{ required: true, message: '请输入实付总额' }]}
>
<Input placeholder='请输入实付总额' suffix='元' maxLength={30} />
</Form.Item>
<Form.Item label='付款期限'>
<Input placeholder='请输入付款期限' />
<Form.Item
label='订单交期'
name='deliveryTime'
rules={[{ required: true, message: '请选择订单交期' }]}
>
<DatePicker />
</Form.Item>
</Form>
</div>
......@@ -108,16 +229,55 @@ const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => {
<div className='contract-info'>
<div className='contract-info-title'>合同签署:</div>
<div className='contract-info-form'>
<Form labelCol={{ span: 4 }} wrapperCol={{ span: 16 }}>
<Form.Item label='合同'>
<Upload>
<Button icon={<UploadOutlined />}>上传</Button>
</Upload>
<Form labelCol={{ span: 5 }} wrapperCol={{ span: 7 }} form={contractForm}>
<Form.Item
name='contractTitle'
label='合同标题'
rules={[{ required: true, message: '请输入合同标题' }]}
>
<Input placeholder='请输入合同标题' maxLength={30} />
</Form.Item>
<Form.Item
label='上传合同'
name='contractUrl'
rules={[{ required: true, message: '请上传合同' }]}
>
<Uploader
fileUpload
listType='text'
fileLength={1}
onChange={uploadSuccess}
fileType={[
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
]}
defaultFileList={contractFileList}
>
<Button icon={<UploadOutlined />} />
</Uploader>
</Form.Item>
<Row>
<Col span={5}></Col>
<Col>
<div>
<Button type='primary' size='small' onClick={uploadContract}>
签署合同
</Button>
<span style={{ color: 'red' }}>(上传合同后需完成签署!)</span>
</div>
</Col>
</Row>
</Form>
</div>
</div>
</div>
<IframeModal
url={contractUrl}
title='合同签署'
open={iframeModalShow}
onCancel={iframeModalCancel}
/>
</Modal>
);
};
......
......@@ -33,20 +33,16 @@ function ProductOrderView() {
{
btnStr: '确认订单',
status: 200,
btnClick: (_record: TableType[0]) => {
btnClick: (record: TableType[0]) => {
setCurrentOrderItem({ ...record });
setSureOrderShow(true);
},
},
{
btnStr: '签署合同',
status: 300,
btnClick: (_record: TableType[0]) => {},
btnStr: '凭证审批',
status: 420,
btnClick: () => {},
},
// {
// btnStr: '凭证审批',
// status: 400,
// btnClick: () => {},
// },
{
btnStr: '发货',
status: 500,
......@@ -359,9 +355,19 @@ function ProductOrderView() {
{
title: '操作',
dataIndex: 'action',
align: 'center',
// align: 'right',
fixed: 'right',
width: '10%',
onHeaderCell: () => ({
style: {
textAlign: 'center',
},
}),
onCell: () => ({
style: {
textAlign: 'right',
},
}),
render: (_text, record) => (
<TableItem
tr={
......@@ -440,7 +446,12 @@ function ProductOrderView() {
// rowSelection={{ selectedRowKeys, onChange: onSelectChange }}
/>
{/*确认订单*/}
<SureOrder open={sureOrderShow} onCancel={sureOrderCancel} onOk={sureOrderOk} />
<SureOrder
open={sureOrderShow}
onCancel={sureOrderCancel}
onOk={sureOrderOk}
mallOrderItem={currentOrderItem}
/>
{/*凭证审批*/}
<ApprovalOrder
open={approvalOrderShow}
......
import { useEffect, useState } from 'react';
import { SystemManageAPI } from '~/api';
import { decode } from 'js-base64';
const RealNameAuth = () => {
const [authUrl, setAuthUrl] = useState<string>('');
// 获取第三方认证连接
const getCompanyVerifyUrl = () => {
SystemManageAPI.getCompanyVerifyUrl({ port: 1 }).then(({ result }) => {
if (result) {
setAuthUrl(decode(result));
}
});
};
useEffect(() => {
getCompanyVerifyUrl();
}, []);
return (
<div className='real-name-auth'>
<iframe src={authUrl} title='实名认证' style={{ width: '100%', height: '1000px' }} />
</div>
);
};
export default RealNameAuth;
......@@ -168,6 +168,7 @@ import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
import CustomListDetail from '~/pages/customManage/customList/detail';
import ServiceCategoryDetail from '~/pages/categoryManage/serviceCategoryList/detail';
const AddressManageView = React.lazy(() => import('~/pages/systemManage/addressManage'));
const RealNameAuthView = React.lazy(() => import('~/pages/systemManage/realNameAuth'));
// const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryDetailView = React.lazy(
......@@ -1288,6 +1289,17 @@ export const routerList: Array<RouteObjectType> = [
icon: <EnvironmentOutlined />,
},
},
{
path: '/systemManage/realNameAuth',
element: withLoadingComponent(<RealNameAuthView />),
errorElement: <ErrorPage />,
meta: {
id: 1460,
title: '实名认证',
icon: <VerifiedOutlined />,
develop: true,
},
},
],
},
];
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论