提交 8da97540 作者: 龚洪江

功能:fdd实名认证

上级 c2e4da4b
...@@ -16,6 +16,7 @@ import { PilotTrainAPI } from './modules/pilotTrainAPI'; ...@@ -16,6 +16,7 @@ import { PilotTrainAPI } from './modules/pilotTrainAPI';
import { FlyerCenterAPI } from './modules/flyerCenterAPI'; import { FlyerCenterAPI } from './modules/flyerCenterAPI';
import { RentManageAPI } from './modules/rentManageAPI'; import { RentManageAPI } from './modules/rentManageAPI';
import { DepleteManageTypeAPI } from './modules/depleteManageTypeAPI'; import { DepleteManageTypeAPI } from './modules/depleteManageTypeAPI';
import { FddInterfaceAPI } from './modules/fddInterfaceAPI';
export { export {
CommonAPI, CommonAPI,
...@@ -36,4 +37,5 @@ export { ...@@ -36,4 +37,5 @@ export {
FlyerCenterAPI, FlyerCenterAPI,
RentManageAPI, RentManageAPI,
DepleteManageTypeAPI, 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 = { ...@@ -933,7 +933,7 @@ type mallOrderType = {
/** /**
* 订单编号 * 订单编号
*/ */
orderNo?: string; orderNo: string;
/** /**
* 订单实付总额 * 订单实付总额
*/ */
...@@ -1192,6 +1192,7 @@ export type mallOrderSendType = InterFunction< ...@@ -1192,6 +1192,7 @@ export type mallOrderSendType = InterFunction<
* 订单id * 订单id
*/ */
uavOrderId?: number; uavOrderId?: number;
id?: number;
}, },
any any
>; >;
...@@ -1209,3 +1210,25 @@ export type sellerRemarkType = InterFunction< ...@@ -1209,3 +1210,25 @@ export type sellerRemarkType = InterFunction<
}, },
any any
>; >;
// 商城订单-确认订单
export type confirmOrderType = InterFunction<
{
/**
* 订单交期
*/
deliveryTime: string;
/**
* 订单id
*/
id: number;
/**
* 订单实付总额
*/
orderTotalAmount: number;
/**
* 卖家备注
*/
sellerRemark?: string;
},
any
>;
...@@ -353,3 +353,8 @@ export type getUserAddressInfoType = InterFunction< ...@@ -353,3 +353,8 @@ export type getUserAddressInfoType = InterFunction<
id: number; 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 axios from '../request';
import { import {
confirmOrderType,
disputeType, disputeType,
flowDictionaryAndTimeType, flowDictionaryAndTimeType,
flowDictionaryType, flowDictionaryType,
...@@ -121,4 +122,6 @@ export class OrderManageAPI { ...@@ -121,4 +122,6 @@ export class OrderManageAPI {
// 商城订单-卖家备注 // 商城订单-卖家备注
static sellerRemark: sellerRemarkType = (params) => static sellerRemark: sellerRemarkType = (params) =>
axios.get('/oms/uav-order/sellerRemark', { params }); axios.get('/oms/uav-order/sellerRemark', { params });
// 商城订单-确认订单
static confirmOrder: confirmOrderType = (data) => axios.post('/oms/uav-order/confirmOrder', data);
} }
...@@ -2,6 +2,7 @@ import { ...@@ -2,6 +2,7 @@ import {
addressInsetType, addressInsetType,
addressListType, addressListType,
bindingCompanyMemberType, bindingCompanyMemberType,
companyVerifyUrlType,
deleteAddressType, deleteAddressType,
deleteRoleInfoType, deleteRoleInfoType,
editAddressType, editAddressType,
...@@ -26,6 +27,7 @@ import { ...@@ -26,6 +27,7 @@ import {
updatePasswordType, updatePasswordType,
updateRoleInfoType, updateRoleInfoType,
updateRoleMenuInfoType, updateRoleMenuInfoType,
userFddInfoType,
} from '../interface/systemManageType'; } from '../interface/systemManageType';
import axios from '../request'; import axios from '../request';
...@@ -123,4 +125,10 @@ export class SystemManageAPI { ...@@ -123,4 +125,10 @@ export class SystemManageAPI {
// 地址管理-根据地址id查找 // 地址管理-根据地址id查找
static getUserAddressInfo: getUserAddressInfoType = (params) => static getUserAddressInfo: getUserAddressInfoType = (params) =>
axios.get('/oms/user-address/getUserAddressInfo', { 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 { ...@@ -7,7 +7,7 @@ interface selfProps {
} }
const IframeModal: FC<ModalProps & selfProps> = ({ open, onCancel, title, url }) => { const IframeModal: FC<ModalProps & selfProps> = ({ open, onCancel, title, url }) => {
return ( 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' }} /> <iframe src={url} title={title} style={{ width: '100%', height: '1000px' }} />
</Modal> </Modal>
); );
......
...@@ -36,15 +36,17 @@ const ShipmentsOrder: FC<ModalProps & selfProps> = ({ onOk, onCancel, open, curr ...@@ -36,15 +36,17 @@ const ShipmentsOrder: FC<ModalProps & selfProps> = ({ onOk, onCancel, open, curr
const handleOk = () => { const handleOk = () => {
form.validateFields().then((value) => { form.validateFields().then((value) => {
OrderManageAPI.mallOrderSend({ ...value, uavOrderId: currentOrderItem?.id }).then( OrderManageAPI.mallOrderSend({
({ code }) => { ...value,
if (code === '200') { uavOrderId: currentOrderItem?.id,
message.success('发货成功'); id: currentOrderItem?.uavOrderExpressDTO.id,
form.resetFields(); }).then(({ code }) => {
onOk(); if (code === '200') {
} message.success('发货成功');
}, form.resetFields();
); onOk();
}
});
}); });
}; };
const handleCancel = () => { const handleCancel = () => {
......
...@@ -10,4 +10,29 @@ ...@@ -10,4 +10,29 @@
margin-top: 10px; 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 { FC, useEffect, useState } from 'react';
import { Button, Cascader, Col, Form, Input, Modal, ModalProps, Row, Table, Upload } from 'antd'; import {
Button,
Col,
DatePicker,
Form,
Image,
Input,
message,
Modal,
ModalProps,
Row,
Table,
} from 'antd';
import './index.scss'; import './index.scss';
import { ColumnsType } from 'antd/es/table/InternalTable'; import { ColumnsType } from 'antd/es/table/InternalTable';
import { UploadOutlined } from '@ant-design/icons'; 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 { interface selfProps {
onCancel: () => void; onCancel: () => void;
onOk: () => void; onOk: () => void;
mallOrderItem: mallOrderItemType | undefined;
} }
const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => { const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel, mallOrderItem }) => {
const tableColumns: ColumnsType<any> = [ const [orderInfoForm] = Form.useForm<{ orderTotalAmount: number; deliveryTime: string }>();
const [contractForm] = Form.useForm<{ contractUrl: string; contractTitle: string }>();
const tableColumns: ColumnsType<mallOrderItemType['skuDTOList'][0]> = [
{ {
title: '商品', title: '商品',
align: 'center', 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: '价格', title: '价格',
align: 'center', align: 'center',
dataIndex: 'unitPrice',
render: (text: number) => text.toFixed(2).toLocaleString(),
}, },
{ {
title: '数量', title: '数量',
align: 'center', 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 = () => { const handleOk = () => {
onOk(); 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 = () => { const handleCancel = () => {
orderInfoForm.resetFields();
contractForm.resetFields();
setContractFileList([]);
onCancel(); onCancel();
}; };
useEffect(() => {
if (mallOrderItem) {
orderInfoForm.setFieldValue('orderTotalAmount', mallOrderItem.orderTotalAmount);
}
}, [mallOrderItem]);
return ( return (
<Modal open={open} title='确认订单' onOk={handleOk} onCancel={handleCancel} width={800}> <Modal open={open} title='确认订单' onOk={handleOk} onCancel={handleCancel} width={800}>
<div className='sure-order'> <div className='sure-order'>
<div className='address-info'> {/*<div className='address-info'>*/}
<div className='address-info-title'>收货信息:</div> {/* <div className='address-info-title'>收货信息:</div>*/}
<div className='address-info-form'> {/* <div className='address-info-form'>*/}
<Form labelCol={{ span: 5 }} wrapperCol={{ span: 16 }}> {/* <Form labelCol={{ span: 5 }} wrapperCol={{ span: 16 }}>*/}
<Form.Item {/* <Form.Item*/}
label='收货人' {/* label='收货人'*/}
name='takeName' {/* name='takeName'*/}
// rules={[{ required: true, validator: validateUserName }]} {/* // rules={[{ required: true, validator: validateUserName }]}*/}
> {/* >*/}
<Input placeholder='请输入收货人' style={{ width: '300px' }} /> {/* <Input placeholder='请输入收货人' style={{ width: '300px' }} />*/}
</Form.Item> {/* </Form.Item>*/}
<Form.Item {/* <Form.Item*/}
label='联系方式' {/* label='联系方式'*/}
name='takePhone' {/* name='takePhone'*/}
// rules={[{ required: true, validator: validatePhone }]} {/* // rules={[{ required: true, validator: validatePhone }]}*/}
> {/* >*/}
<Input placeholder='请输入联系方式' style={{ width: '300px' }} /> {/* <Input placeholder='请输入联系方式' style={{ width: '300px' }} />*/}
</Form.Item> {/* </Form.Item>*/}
<Form.Item {/* <Form.Item*/}
label='所属地区' {/* label='所属地区'*/}
rules={[{ required: true, message: '请输入所属地区' }]} {/* rules={[{ required: true, message: '请输入所属地区' }]}*/}
name='takeRegion' {/* name='takeRegion'*/}
> {/* >*/}
<Cascader {/* <Cascader*/}
// options={location} {/* // options={location}*/}
style={{ width: '300px' }} {/* style={{ width: '300px' }}*/}
fieldNames={{ {/* fieldNames={{*/}
label: 'name', {/* label: 'name',*/}
value: 'name', {/* value: 'name',*/}
children: 'childInfo', {/* children: 'childInfo',*/}
}} {/* }}*/}
placeholder='请选择所属地区' {/* placeholder='请选择所属地区'*/}
/> {/* />*/}
</Form.Item> {/* </Form.Item>*/}
<Form.Item {/* <Form.Item*/}
label='详细地址' {/* label='详细地址'*/}
name='takeAddress' {/* name='takeAddress'*/}
rules={[{ required: true, message: '请输入详细地址' }]} {/* rules={[{ required: true, message: '请输入详细地址' }]}*/}
> {/* >*/}
<Input.TextArea {/* <Input.TextArea*/}
maxLength={250} {/* maxLength={250}*/}
placeholder='请输入详细地址' {/* placeholder='请输入详细地址'*/}
showCount {/* showCount*/}
rows={4} {/* rows={4}*/}
style={{ width: '300px' }} {/* style={{ width: '300px' }}*/}
/> {/* />*/}
</Form.Item> {/* </Form.Item>*/}
</Form> {/* </Form>*/}
</div> {/* </div>*/}
</div> {/*</div>*/}
<div className='order-info'> <div className='order-info'>
<div className='order-info-title'>订单信息:</div> <div className='order-info-title'>订单信息:</div>
<Row> <Row>
<Col span={3}></Col> <Col span={3}></Col>
<Col span={16}> <Col span={16}>
<div className='order-info-table'> <div className='order-info-table'>
<Table bordered columns={tableColumns} /> <Table
bordered
columns={tableColumns}
dataSource={mallOrderItem?.skuDTOList || []}
pagination={false}
rowKey='id'
/>
</div> </div>
<div className='order-info-form'> <div className='order-info-form'>
<Form wrapperCol={{ span: 10 }} labelCol={{ span: 3 }}> <Form wrapperCol={{ span: 10 }} labelCol={{ span: 3 }} form={orderInfoForm}>
<Form.Item label='订单交期'> <Form.Item
<Input placeholder='请输入订单交期' /> label='实付总额'
name='orderTotalAmount'
rules={[{ required: true, message: '请输入实付总额' }]}
>
<Input placeholder='请输入实付总额' suffix='元' maxLength={30} />
</Form.Item> </Form.Item>
<Form.Item label='付款期限'> <Form.Item
<Input placeholder='请输入付款期限' /> label='订单交期'
name='deliveryTime'
rules={[{ required: true, message: '请选择订单交期' }]}
>
<DatePicker />
</Form.Item> </Form.Item>
</Form> </Form>
</div> </div>
...@@ -108,16 +229,55 @@ const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => { ...@@ -108,16 +229,55 @@ const SureOrder: FC<ModalProps & selfProps> = ({ open, onOk, onCancel }) => {
<div className='contract-info'> <div className='contract-info'>
<div className='contract-info-title'>合同签署:</div> <div className='contract-info-title'>合同签署:</div>
<div className='contract-info-form'> <div className='contract-info-form'>
<Form labelCol={{ span: 4 }} wrapperCol={{ span: 16 }}> <Form labelCol={{ span: 5 }} wrapperCol={{ span: 7 }} form={contractForm}>
<Form.Item label='合同'> <Form.Item
<Upload> name='contractTitle'
<Button icon={<UploadOutlined />}>上传</Button> label='合同标题'
</Upload> 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> </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> </Form>
</div> </div>
</div> </div>
</div> </div>
<IframeModal
url={contractUrl}
title='合同签署'
open={iframeModalShow}
onCancel={iframeModalCancel}
/>
</Modal> </Modal>
); );
}; };
......
...@@ -33,20 +33,16 @@ function ProductOrderView() { ...@@ -33,20 +33,16 @@ function ProductOrderView() {
{ {
btnStr: '确认订单', btnStr: '确认订单',
status: 200, status: 200,
btnClick: (_record: TableType[0]) => { btnClick: (record: TableType[0]) => {
setCurrentOrderItem({ ...record });
setSureOrderShow(true); setSureOrderShow(true);
}, },
}, },
{ {
btnStr: '签署合同', btnStr: '凭证审批',
status: 300, status: 420,
btnClick: (_record: TableType[0]) => {}, btnClick: () => {},
}, },
// {
// btnStr: '凭证审批',
// status: 400,
// btnClick: () => {},
// },
{ {
btnStr: '发货', btnStr: '发货',
status: 500, status: 500,
...@@ -359,9 +355,19 @@ function ProductOrderView() { ...@@ -359,9 +355,19 @@ function ProductOrderView() {
{ {
title: '操作', title: '操作',
dataIndex: 'action', dataIndex: 'action',
align: 'center', // align: 'right',
fixed: 'right', fixed: 'right',
width: '10%', width: '10%',
onHeaderCell: () => ({
style: {
textAlign: 'center',
},
}),
onCell: () => ({
style: {
textAlign: 'right',
},
}),
render: (_text, record) => ( render: (_text, record) => (
<TableItem <TableItem
tr={ tr={
...@@ -440,7 +446,12 @@ function ProductOrderView() { ...@@ -440,7 +446,12 @@ function ProductOrderView() {
// rowSelection={{ selectedRowKeys, onChange: onSelectChange }} // rowSelection={{ selectedRowKeys, onChange: onSelectChange }}
/> />
{/*确认订单*/} {/*确认订单*/}
<SureOrder open={sureOrderShow} onCancel={sureOrderCancel} onOk={sureOrderOk} /> <SureOrder
open={sureOrderShow}
onCancel={sureOrderCancel}
onOk={sureOrderOk}
mallOrderItem={currentOrderItem}
/>
{/*凭证审批*/} {/*凭证审批*/}
<ApprovalOrder <ApprovalOrder
open={approvalOrderShow} 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'; ...@@ -168,6 +168,7 @@ import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
import CustomListDetail from '~/pages/customManage/customList/detail'; import CustomListDetail from '~/pages/customManage/customList/detail';
import ServiceCategoryDetail from '~/pages/categoryManage/serviceCategoryList/detail'; import ServiceCategoryDetail from '~/pages/categoryManage/serviceCategoryList/detail';
const AddressManageView = React.lazy(() => import('~/pages/systemManage/addressManage')); 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 IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryDetailView = React.lazy( // const IndustryDetailView = React.lazy(
...@@ -1288,6 +1289,17 @@ export const routerList: Array<RouteObjectType> = [ ...@@ -1288,6 +1289,17 @@ export const routerList: Array<RouteObjectType> = [
icon: <EnvironmentOutlined />, icon: <EnvironmentOutlined />,
}, },
}, },
{
path: '/systemManage/realNameAuth',
element: withLoadingComponent(<RealNameAuthView />),
errorElement: <ErrorPage />,
meta: {
id: 1460,
title: '实名认证',
icon: <VerifiedOutlined />,
develop: true,
},
},
], ],
}, },
]; ];
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论