Commit 3dd79f80 authored by 前端-黄佳鑫's avatar 前端-黄佳鑫

🦄 refactor: 询价报价,确认报价重构

parent 15393f6a
......@@ -17,29 +17,141 @@ export default [
component: '@/pages/transaction/dealAbility/confirmOffer/offerSearch',
},
{
/** 报价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/offerSearch/offer/preview',
name: '报价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/offerSearch/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交审核报价单 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer',
name: '待提交审核报价单',
component: '@/pages/transaction/dealAbility/confirmOffer/waitSubmitAuditOffer',
},
{
/** 待提交审核报价单 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/offer/preview',
name: '待提交审核报价单详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交审核报价单 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/offer/detail',
name: '待提交审核报价单详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(一级) */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne',
name: '待审核询价单(一级)',
component: '@/pages/transaction/dealAbility/confirmOffer/waitAuditInquiryOne',
},
{
/** 待审核询价单(一级) 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/offer/preview',
name: '待审核询价单(一级)详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(一级) 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/offer/detail',
name: '待审核询价单(一级)详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(二级) */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo',
name: '待审核询价单(二级)',
component: '@/pages/transaction/dealAbility/confirmOffer/waitAuditInquiryTwo',
},
{
/** 待审核询价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/offer/preview',
name: '待审核询价单(二级)详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核询价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/offer/detail',
name: '待审核询价单(二级)详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交报价单 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer',
name: '待提交报价单',
component: '@/pages/transaction/dealAbility/confirmOffer/waitSubmitOffer',
},
{
/** 待提交报价单 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/offer/preview',
name: '待提交报价单详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交报价单 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/offer/detail',
name: '待提交报价单详情',
component: '@/pages/transaction/dealAbility/confirmOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/confirmOffer/preview',
hideInMenu: true,
noMargin: true,
},
]
}
]
......@@ -16,35 +16,167 @@ export default [
component: '@/pages/transaction/dealAbility/inquiryOffer/inquirySearch',
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/inquirySearch/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 报价单查询 */
path: '/memberCenter/tranactionAbility/inquiryOffer/offerSearch',
name: '报价单查询',
component: '@/pages/transaction/dealAbility/inquiryOffer/offerSearch',
},
{
/** 报价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/offerSearch/offer/preview',
name: '报价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 报价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/offerSearch/offer/detail',
name: '报价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/offerSearch/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待新增报价单 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer',
name: '待新增报价单',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAddOffer',
},
{
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/offer',
name: 'quote',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAddOffer/quote'
},
// 新建报价单
{
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/add',
name: 'add',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAddOffer/add'
},
// 新建报价单编辑
{
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/edit',
name: 'edit',
hideInMenu: true,
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAddOffer/edit'
},
{
/** 待新增报价单 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/offer/preview',
name: '待新增报价单详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核报价单(一级) */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne',
name: '待审核报价单(一级)',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAuditOfferOne',
},
{
/** 待新增报价单 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/offer/preview',
name: '审核报价单(一级)详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待新增报价单 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/offer/detail',
name: '审核报价单(一级)详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核报价单(二级) */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo',
name: '待审核报价单(二级)',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitAuditOfferTwo',
},
{
/** 待审核报价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/offer/preview',
name: '待审核报价单(二级)详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 待审核报价单(二级) 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/offer/detail',
name: '待审核报价单(二级)详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
{
/** 待提交报价单 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer',
name: '待提交报价单',
component: '@/pages/transaction/dealAbility/inquiryOffer/waitSubmitOffer',
},
{
/** 待提交报价单 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer/offer/preview',
name: '待提交报价单详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/detail',
hideInMenu: true,
noMargin: true,
},
{
/** 询价单查询 查看详情 */
path: '/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer/inquiry/preview',
name: '询价单查询详情',
component: '@/pages/transaction/dealAbility/inquiryOffer/preview',
hideInMenu: true,
noMargin: true,
},
]
}
]
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography, Space } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import PeripheralLayout from '@/pages/transaction/components/detailLayout';
import { Context } from '@/pages/transaction/components/detailLayout/components/context';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { CheckCircleOutlined, LinkOutlined } from '@ant-design/icons';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import ProgressLayout from '@/pages/transaction/components/detailLayout/components/progressLayout';
import BasicLayout from '@/pages/transaction/components/detailLayout/components/basicLayout';
import ListLayout from '@/pages/transaction/components/detailLayout/components/listLayout';
import GeneralLayout from '@/pages/transaction/components/detailLayout/components/GeneralLayout';
import RecordLyout from '@/pages/transaction/components/detailLayout/components/RecordLyout';
import ModalOperate from '@/pages/transaction/components/modalOperate';
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'inquiryProductLayout', title: '商品询价' },
{ id: 'otherLayout', title: '其他说明' },
{ id: 'fileLayout', title: '附件' },
{ id: 'recordLyout', title: '流转记录' },
]
const ConfirmOfferDetail = () => {
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const {
query: {
id,
},
pathname,
} = history.location;
const [path] = useState(pathname.split('/')[pathname.split('/').length - 1]);
const [pathPci] = useState(pathname.split('/')[pathname.split('/').length - 3]);
const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]);
const [otherEffect, setOtherEffect] = useState<any>([]);
const [fileEffect, setFileEffect] = useState<any>([]);
const [visible, setVisible] = useState<boolean>(false);
const handleBasicEffect = (data: any) => {
setBasicEffect([
{
col: [
{ label: '报价单号', extra: data.quotationNo },
{ label: '报价摘要', extra: data.details },
{ label: '外部状态', extra: <Tag color={EXTERNALSTATE_COLOR[data.externalState] || 'default'}>{data.externalStateName}</Tag> },
{ label: '内部状态', extra: <Badge status={INTERNALSTATE_COLOR[data.interiorState] || 'default'} text={data.interiorStateName} /> },
]
},
{
col: [
{ label: '对应询价单号', extra: data.inquiryListNo },
{ label: '询价会员', extra: data.memberName },
{ label: '报价截止时间', extra: format(data.quotationAsTime) },
]
},
{
col: [
{ label: '单据时间', extra: format(data.voucherTime) },
]
},
])
}
const handleOtherEffect = (data: any) => {
setOtherEffect([
{
col: [
{ label: '最小起订', extra: data.minimumOrder },
{ label: '交付说明', extra: data.deliveryInstructions },
{ label: '付款说明', extra: data.paymentType },
]
},
{
col: [
{ label: '税费说明', extra: data.taxes },
{ label: '物流说明', extra: data.logistics },
{ label: '包装说明', extra: data.packRequire },
]
},
{
col: [
{ label: '其他说明', extra: data.otherRequire },
]
},
])
}
const handleFileEffect = (data: any) => {
setFileEffect([
{
col: [
{
label: '附件',
extra: <>
{data.enclosureUrls.map((item: any, index: number) => (
<Typography.Link
style={{ display: 'block', paddingBottom: '8px' }}
key={`link_${index + 1}`}
href={`/api/contract/contractTemplate/downloadContract?contractName=${item.name}&contractUrl=${item.url}`}
target="_blank"
>
<LinkOutlined />
{item.name}
</Typography.Link>
))}
</>
},
]
}
])
}
const fetchDataSource = async () => {
await PublicApi.getTransactionNotarizeEnquiryProductQuotationDetails({ id }).then(res => {
if (res.code !== 1000) {
history.goBack();
return;
}
const { data } = res;
data.externalLogStates = data.externalQuotationStateResponses ? [...data.externalQuotationStateResponses] : null;
data.interiorLogStates = data.interiorQuotationStateResponses ? [...data.interiorQuotationStateResponses] : null;
data.externalLogs = data.externalRequisitionFormResponses ? [...data.externalRequisitionFormResponses] : null;
data.interiorLogs = data.interiorQuotationLogResponses ? [...data.interiorQuotationLogResponses] : null;
setDataSource(data);
handleBasicEffect(data);
handleOtherEffect(data);
handleFileEffect(data);
})
}
useEffect(() => {
fetchDataSource();
}, [])
const columns: ColumnType<any>[] = [
{
title: '商品ID/名称',
key: 'productId',
dataIndex: 'productId',
render: (productId, data) => (
<Space direction='vertical'>
<Typography.Link target="_blank" href={`/shop/commodity/detail?id=${productId}&type=2&shopId=${btoa(JSON.stringify({ roleId: data.memberRoleId, memberId: data.memberId }))}`}>{productId}</Typography.Link>
<Typography.Text>{data.productName}</Typography.Text>
</Space>
)
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '采购数量/单位',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
render: (purchaseCount, data) => (
<Space direction='vertical'>
<Typography.Text>{purchaseCount}</Typography.Text>
<Typography.Text>{data.unit}</Typography.Text>
</Space>
)
},
{
title: '含税/税率',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
{
title: '报价单价',
key: 'price',
dataIndex: 'price',
render: price => <>{price ? `¥${price.toFixed(2)}` : '¥0.00'}</>
},
{
title: '金额',
key: 'money',
dataIndex: 'money',
render: money => <>{money ? `¥${money.toFixed(2)}` : '¥0.00'}</>
},
]
const fetchLink = () => {
let fetchSoure: any = null;
switch (pathPci) {
case 'waitSubmitAuditOffer':
fetchSoure = PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmit
break;
case 'waitAuditInquiryOne':
fetchSoure = PublicApi.postTransactionNotarizeEnquiryQuotedPriceAudit
break;
case 'waitAuditInquiryTwo':
fetchSoure = PublicApi.postTransactionNotarizeEnquiryQuotedPriceAuditTwo
break;
case 'waitSubmitOffer':
fetchSoure = PublicApi.postTransactionNotarizeEnquiryQuotedPriceAffirm
break;
}
return fetchSoure
}
return (
<Context.Provider value={dataSource}>
<PeripheralLayout
no={dataSource.quotationNo}
detail={dataSource.details}
tabLink={TABLINK}
effect={
<>
{path === 'detail'
&& (
<Button
onClick={() => setVisible(true)}
type='primary'
>
<CheckCircleOutlined />
单据审核
</Button>
)}
</>
}
components={
<Fragment>
<ProgressLayout />
<BasicLayout effect={basicEffect} />
<ListLayout
id={id}
anchor="inquiryProductLayout"
title="询价商品"
columns={columns}
fetch={PublicApi.getTransactionInquiryDetails}
/>
<GeneralLayout
anchor="otherLayout"
title="其他说明"
effect={otherEffect}
/>
<GeneralLayout
anchor="fileLayout"
title="附件"
effect={fileEffect}
/>
<RecordLyout />
</Fragment>
}
/>
<ModalOperate
id={id}
title="单据审核"
modalType="audit"
visible={visible}
fetch={fetchLink()}
onCancel={() => setVisible(false)}
onOk={() => history.goBack()}
/>
</Context.Provider>
)
}
export default ConfirmOfferDetail;
......@@ -23,14 +23,14 @@ const OfferSearch = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/quoteOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/offerSearch/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/quoteOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/offerSearch/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import PeripheralLayout from '@/pages/transaction/components/detailLayout';
import { Context } from '@/pages/transaction/components/detailLayout/components/context';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { CheckCircleOutlined, LinkOutlined } from '@ant-design/icons';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import ProgressLayout from '@/pages/transaction/components/detailLayout/components/progressLayout';
import BasicLayout from '@/pages/transaction/components/detailLayout/components/basicLayout';
import ListLayout from '@/pages/transaction/components/detailLayout/components/listLayout';
import GeneralLayout from '@/pages/transaction/components/detailLayout/components/GeneralLayout';
import RecordLyout from '@/pages/transaction/components/detailLayout/components/RecordLyout';
import EyePreview from '@/components/EyePreview';
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'inquiryProductLayout', title: '询价商品' },
{ id: 'conditionLayout', title: '交易条件' },
{ id: 'fileLayout', title: '附件' },
{ id: 'recordLyout', title: '流转记录' },
]
const ConfirmOfferPreview = () => {
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const {
query: {
id,
},
pathname,
} = history.location;
const [path] = useState(pathname.split('/')[pathname.split('/').length - 1]);
const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]);
const [conditionEffect, setConditionEffect] = useState<any>([]);
const [fileEffect, setFileEffect] = useState<any>([]);
const handleBasicEffect = (data: any) => {
setBasicEffect([
{
col: [
{ label: '询价单号', extra: data.inquiryListNo },
{ label: '询价摘要', extra: data.details },
]
},
{
col: [
{ label: '外部状态', extra: <Tag color={EXTERNALSTATE_COLOR[data.externalState] || 'default'}>{data.externalStateName}</Tag> },
{ label: '内部状态', extra: <Badge status={INTERNALSTATE_COLOR[data.interiorState] || 'default'} text={data.interiorStateName} /> },
]
},
{
col: [
{ label: '询价会员', extra: data.inquiryListMemberName },
{ label: '单据时间', extra: format(data.voucherTime) },
]
},
])
}
const handleConditionEffect = (data: any) => {
setConditionEffect([
{
col: [
{ label: '交付日期', extra: format(data.deliveryTime) },
{ label: '交付地址', extra: data.fullAddress },
{ label: '报价截止时间', extra: format(data.quotationAsTime) },
]
},
{
col: [
{ label: '报价要求', extra: data.offer },
{ label: '付款方式', extra: data.paymentType },
{ label: '税费要求', extra: data.taxes },
]
},
{
col: [
{ label: '物流要求', extra: data.logistics },
{ label: '包装要求', extra: data.packRequire },
{ label: '其他要求', extra: data.otherRequire },
]
},
])
}
const handleFileEffect = (data: any) => {
setFileEffect([
{
col: [
{
label: '附件',
extra: <>
{data.enclosureUrls.map((item: any, index: number) => (
<Typography.Link
style={{ display: 'block', paddingBottom: '8px' }}
key={`link_${index + 1}`}
href={`/api/contract/contractTemplate/downloadContract?contractName=${item.name}&contractUrl=${item.url}`}
target="_blank"
>
<LinkOutlined />
{item.name}
</Typography.Link>
))}
</>
},
]
}
])
}
const fetchDataSource = async () => {
await PublicApi.getTransactionNotarizeEnquiryQuotedPriceDetails({ id }).then(res => {
if (res.code !== 1000) {
history.goBack();
return;
}
const { data } = res;
data.externalLogStates = [...data.externalInquiryListStateResponses];
data.interiorLogStates = [...data.interiorRequisitionFormStateResponses];
data.externalLogs = [...data.externalInquiryListLogResponses];
data.interiorLogs = [...data.interiorInquiryListLogResponses];
setDataSource(data);
handleBasicEffect(data);
handleConditionEffect(data);
handleFileEffect(data);
})
}
useEffect(() => {
fetchDataSource();
}, [])
const handleJump = (data:any) => {
window.open(`/shop/commodity/detail?id=${data.productId}&type=2&shopId=${btoa(JSON.stringify({ roleId: data.memberRoleId, memberId: data.memberId }))}`)
}
const columns: ColumnType<any>[] = [
{
title: 'ID',
key: 'id',
dataIndex: 'id',
},
{
title: '商品名称',
key: 'productName',
dataIndex: 'productName',
render: (text: any, record: any) => <EyePreview type='button' handleClick={() => handleJump(record)}>{text}</EyePreview>
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '单位',
key: 'unit',
dataIndex: 'unit',
},
{
title: '采购数量',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
]
return (
<Context.Provider value={dataSource}>
<PeripheralLayout
no={dataSource.inquiryListNo}
detail={dataSource.details}
tabLink={TABLINK}
components={
<Fragment>
<ProgressLayout />
<BasicLayout effect={basicEffect} />
<ListLayout
id={id}
anchor="inquiryProductLayout"
title="询价商品"
columns={columns}
fetch={PublicApi.getTransactionEnquiryProductList}
/>
<GeneralLayout
anchor="conditionLayout"
title="交易条件"
effect={conditionEffect}
/>
<GeneralLayout
anchor="fileLayout"
title="附件"
effect={fileEffect}
/>
<RecordLyout />
</Fragment>
}
/>
</Context.Provider>
)
}
export default ConfirmOfferPreview;
......@@ -30,14 +30,14 @@ const WaitAuditInquiryOne = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingReviewOne/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingReviewOne/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -78,7 +78,7 @@ const WaitAuditInquiryOne = () => {
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) =>
<Button type='link'>审核</Button>
<Button type='link' onClick={() => history.push(`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryOne/offer/detail?id=${record.id}`)}>审核</Button>
}
]
......
......@@ -30,13 +30,13 @@ const WaitAuditInquiryOne = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/offer/preview?id=${record.id}`}>{text}</EyePreview>
}, {
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -77,7 +77,7 @@ const WaitAuditInquiryOne = () => {
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) =>
<Button type='link'>审核</Button>
<Button type='link' onClick={() => history.push(`/memberCenter/tranactionAbility/confirmOffer/waitAuditInquiryTwo/offer/detail?id=${record.id}`)}>审核</Button>
}
]
......
import React, { useRef, useState } from 'react';
import Table from '@/pages/transaction/components/TableLayout';
import { history } from 'umi';
import { Tag, Badge, Button, Row, Col } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import EyePreview from '@/components/EyePreview';
......@@ -18,13 +19,9 @@ const WaitSubmitAuditOffer = () => {
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmitAll({ ids: rowkeys });
}
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmitAll({ ids: rowkeys });
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
......@@ -37,14 +34,14 @@ const WaitSubmitAuditOffer = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmitReview/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmitReview/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -84,7 +81,7 @@ const WaitSubmitAuditOffer = () => {
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交审核</Button>
render: (text: any, record: any) => <Button type='link' onClick={() => history.push(`/memberCenter/tranactionAbility/confirmOffer/waitSubmitAuditOffer/offer/detail?id=${record.id}`)}>提交审核</Button>
}
];
......@@ -105,7 +102,7 @@ const WaitSubmitAuditOffer = () => {
<Col span={6}>
<Button
disabled={rowkeys.length === 0}
onClick={() => fetchSubmitBatch()}
onClick={fetchSubmitBatch}
>
批量提交审核
</Button>
......
import React, { useRef, useState } from 'react';
import { history } from 'umi';
import Table from '@/pages/transaction/components/TableLayout';
import { Tag, Badge, Button, Row, Col } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
......@@ -18,13 +19,8 @@ const WaitSubmitOffer = () => {
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
/** 批量审核 */
const fetchSubmitBatch = async (id?: number) => {
let res = null;
if (id) {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmit({ id: Number(id) })
} else {
res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceSubmitAll({ ids: rowkeys });
}
const fetchSubmitBatch = async () => {
const res = await PublicApi.postTransactionNotarizeEnquiryQuotedPriceAffirmAll({ ids: rowkeys });
if (res.code === 1000) {
reload.current.reload();
setRowKeys([])
......@@ -37,14 +33,14 @@ const WaitSubmitOffer = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/confirmInquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -84,7 +80,7 @@ const WaitSubmitOffer = () => {
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交报价单</Button>
render: (text: any, record: any) => <Button type='link' onClick={() => history.push(`/memberCenter/tranactionAbility/confirmOffer/waitSubmitOffer/offer/detail?id=${record.id}`)}>提交报价单</Button>
}
]
......@@ -93,7 +89,7 @@ const WaitSubmitOffer = () => {
schema={WAITSUBMITOFFERSCHEMA}
columns={columns}
effects="quotationNo"
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceList}
fetch={PublicApi.getTransactionNotarizeEnquiryQuotedPriceAffirmList}
reload={reload}
selectedRow
fetchRowkeys={(e) => setRowKeys(e)}
......
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography, Space } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import PeripheralLayout from '@/pages/transaction/components/detailLayout';
import { Context } from '@/pages/transaction/components/detailLayout/components/context';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { CheckCircleOutlined, LinkOutlined } from '@ant-design/icons';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import ProgressLayout from '@/pages/transaction/components/detailLayout/components/progressLayout';
import BasicLayout from '@/pages/transaction/components/detailLayout/components/basicLayout';
import ListLayout from '@/pages/transaction/components/detailLayout/components/listLayout';
import GeneralLayout from '@/pages/transaction/components/detailLayout/components/GeneralLayout';
import RecordLyout from '@/pages/transaction/components/detailLayout/components/RecordLyout';
import ModalOperate from '@/pages/transaction/components/modalOperate';
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'inquiryProductLayout', title: '商品询价' },
{ id: 'otherLayout', title: '其他说明' },
{ id: 'fileLayout', title: '附件' },
{ id: 'recordLyout', title: '流转记录' },
]
const InquiryOfferDetail = () => {
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const {
query: {
id,
},
pathname,
} = history.location;
const [path] = useState(pathname.split('/')[pathname.split('/').length - 1]);
const [pathPci] = useState(pathname.split('/')[pathname.split('/').length - 3]);
const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]);
const [otherEffect, setOtherEffect] = useState<any>([]);
const [fileEffect, setFileEffect] = useState<any>([]);
const [visible, setVisible] = useState<boolean>(false);
const handleBasicEffect = (data: any) => {
setBasicEffect([
{
col: [
{ label: '报价单号', extra: data.quotationNo },
{ label: '报价摘要', extra: data.details },
{ label: '外部状态', extra: <Tag color={EXTERNALSTATE_COLOR[data.externalState] || 'default'}>{data.externalStateName}</Tag> },
{ label: '内部状态', extra: <Badge status={INTERNALSTATE_COLOR[data.interiorState] || 'default'} text={data.interiorStateName} /> },
]
},
{
col: [
{ label: '对应询价单号', extra: data.inquiryListNo },
{ label: '询价会员', extra: data.memberName },
{ label: '报价截止时间', extra: format(data.quotationAsTime) },
]
},
{
col: [
{ label: '单据时间', extra: format(data.voucherTime) },
]
},
])
}
const handleOtherEffect = (data: any) => {
setOtherEffect([
{
col: [
{ label: '最小起订', extra: data.minimumOrder },
{ label: '交付说明', extra: data.deliveryInstructions },
{ label: '付款说明', extra: data.paymentType },
]
},
{
col: [
{ label: '税费说明', extra: data.taxes },
{ label: '物流说明', extra: data.logistics },
{ label: '包装说明', extra: data.packRequire },
]
},
{
col: [
{ label: '其他说明', extra: data.otherRequire },
]
},
])
}
const handleFileEffect = (data: any) => {
setFileEffect([
{
col: [
{
label: '附件',
extra: <>
{data.enclosureUrls.map((item: any, index: number) => (
<Typography.Link
style={{ display: 'block', paddingBottom: '8px' }}
key={`link_${index + 1}`}
href={`/api/contract/contractTemplate/downloadContract?contractName=${item.name}&contractUrl=${item.url}`}
target="_blank"
>
<LinkOutlined />
{item.name}
</Typography.Link>
))}
</>
},
]
}
])
}
const fetchDataSource = async () => {
await PublicApi.getTransactionProductQuotationDetails({ id }).then(res => {
if (res.code !== 1000) {
history.goBack();
return;
}
const { data } = res;
data.externalLogStates = data.externalQuotationStateResponses ? [...data.externalQuotationStateResponses] : null;
data.interiorLogStates = data.interiorQuotationStateResponses ? [...data.interiorQuotationStateResponses] : null;
data.externalLogs = data.externalRequisitionFormResponses ? [...data.externalRequisitionFormResponses] : null;
data.interiorLogs = data.interiorQuotationLogResponses ? [...data.interiorQuotationLogResponses] : null;
setDataSource(data);
handleBasicEffect(data);
handleOtherEffect(data);
handleFileEffect(data);
})
}
useEffect(() => {
fetchDataSource();
}, [])
const columns: ColumnType<any>[] = [
{
title: '商品ID/名称',
key: 'productId',
dataIndex: 'productId',
render: (productId, data) => (
<Space direction='vertical'>
<Typography.Link target="_blank" href={`/shop/commodity/detail?id=${productId}&type=2&shopId=${btoa(JSON.stringify({ roleId: data.memberRoleId, memberId: data.memberId }))}`}>{productId}</Typography.Link>
<Typography.Text>{data.productName}</Typography.Text>
</Space>
)
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '采购数量/单位',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
render: (purchaseCount, data) => (
<Space direction='vertical'>
<Typography.Text>{purchaseCount}</Typography.Text>
<Typography.Text>{data.unit}</Typography.Text>
</Space>
)
},
{
title: '含税/税率',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
{
title: '报价单价',
key: 'price',
dataIndex: 'price',
render: price => <>{price ? `¥${price.toFixed(2)}` : '¥0.00'}</>
},
{
title: '金额',
key: 'money',
dataIndex: 'money',
render: money => <>{money ? `¥${money.toFixed(2)}` : '¥0.00'}</>
},
]
const fetchLink = () => {
let fetchSoure: any = null;
switch (pathPci) {
case 'waitAuditOfferOne':
fetchSoure = PublicApi.postTransactionProductQuotationtAuditSubmit
break;
case 'waitAuditOfferTwo':
fetchSoure = PublicApi.postTransactionProductQuotationtAuditSubmitTwo
break;
}
return fetchSoure
}
return (
<Context.Provider value={dataSource}>
<PeripheralLayout
no={dataSource.quotationNo}
detail={dataSource.details}
tabLink={TABLINK}
effect={
<>
{path === 'detail'
&& (
<Button
onClick={() => setVisible(true)}
type='primary'
>
<CheckCircleOutlined />
单据审核
</Button>
)}
</>
}
components={
<Fragment>
<ProgressLayout />
<BasicLayout effect={basicEffect} />
<ListLayout
id={id}
anchor="inquiryProductLayout"
title="询价商品"
columns={columns}
fetch={PublicApi.getTransactionInquiryDetails}
/>
<GeneralLayout
anchor="otherLayout"
title="其他说明"
effect={otherEffect}
/>
<GeneralLayout
anchor="fileLayout"
title="附件"
effect={fileEffect}
/>
<RecordLyout />
</Fragment>
}
/>
<ModalOperate
id={id}
title="单据审核"
modalType="audit"
visible={visible}
fetch={fetchLink()}
onCancel={() => setVisible(false)}
onOk={() => history.goBack()}
/>
</Context.Provider>
)
}
export default InquiryOfferDetail;
......@@ -23,7 +23,7 @@ const InquirySearch = () => {
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/enquiryOrder/rfq/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/inquirySearch/inquiry/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单摘要',
......@@ -31,9 +31,9 @@ const InquirySearch = () => {
dataIndex: 'details',
},
{
title: '询价会员',
key: 'memberName',
dataIndex: 'memberName',
title: '询价会员',
key: 'inquiryListMemberName',
dataIndex: 'inquiryListMemberName',
},
{
title: '交付日期',
......
......@@ -23,14 +23,14 @@ const OfferSearch = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/quoteOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/offerSearch/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/quoteOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/offerSearch/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......
import React, { Fragment, useEffect, useState } from 'react';
import { Button, Tag, Badge, Typography } from 'antd';
import { history } from 'umi';
import { ColumnType } from 'antd/lib/table/interface';
import PeripheralLayout from '@/pages/transaction/components/detailLayout';
import { Context } from '@/pages/transaction/components/detailLayout/components/context';
import moment from 'moment';
import { PublicApi } from '@/services/api';
import { CheckCircleOutlined, LinkOutlined } from '@ant-design/icons';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
import ProgressLayout from '@/pages/transaction/components/detailLayout/components/progressLayout';
import BasicLayout from '@/pages/transaction/components/detailLayout/components/basicLayout';
import ListLayout from '@/pages/transaction/components/detailLayout/components/listLayout';
import GeneralLayout from '@/pages/transaction/components/detailLayout/components/GeneralLayout';
import RecordLyout from '@/pages/transaction/components/detailLayout/components/RecordLyout';
import EyePreview from '@/components/EyePreview';
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'inquiryProductLayout', title: '询价商品' },
{ id: 'conditionLayout', title: '交易条件' },
{ id: 'fileLayout', title: '附件' },
{ id: 'recordLyout', title: '流转记录' },
]
const InquiryOfferPreview = () => {
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const {
query: {
id,
},
pathname,
} = history.location;
const [path] = useState(pathname.split('/')[pathname.split('/').length - 1]);
const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]);
const [conditionEffect, setConditionEffect] = useState<any>([]);
const [fileEffect, setFileEffect] = useState<any>([]);
const handleBasicEffect = (data: any) => {
setBasicEffect([
{
col: [
{ label: '询价单号', extra: data.inquiryListNo },
{ label: '询价摘要', extra: data.details },
]
},
{
col: [
{ label: '外部状态', extra: <Tag color={EXTERNALSTATE_COLOR[data.externalState] || 'default'}>{data.externalStateName}</Tag> },
{ label: '内部状态', extra: <Badge status={INTERNALSTATE_COLOR[data.interiorState] || 'default'} text={data.interiorStateName} /> },
]
},
{
col: [
{ label: '询价会员', extra: data.inquiryListMemberName },
{ label: '单据时间', extra: format(data.voucherTime) },
]
},
])
}
const handleConditionEffect = (data: any) => {
setConditionEffect([
{
col: [
{ label: '交付日期', extra: format(data.deliveryTime) },
{ label: '交付地址', extra: data.fullAddress },
{ label: '报价截止时间', extra: format(data.quotationAsTime) },
]
},
{
col: [
{ label: '报价要求', extra: data.offer },
{ label: '付款方式', extra: data.paymentType },
{ label: '税费要求', extra: data.taxes },
]
},
{
col: [
{ label: '物流要求', extra: data.logistics },
{ label: '包装要求', extra: data.packRequire },
{ label: '其他要求', extra: data.otherRequire },
]
},
])
}
const handleFileEffect = (data: any) => {
setFileEffect([
{
col: [
{
label: '附件',
extra: <>
{data.enclosureUrls.map((item: any, index: number) => (
<Typography.Link
style={{ display: 'block', paddingBottom: '8px' }}
key={`link_${index + 1}`}
href={`/api/contract/contractTemplate/downloadContract?contractName=${item.name}&contractUrl=${item.url}`}
target="_blank"
>
<LinkOutlined />
{item.name}
</Typography.Link>
))}
</>
},
]
}
])
}
const fetchDataSource = async () => {
await PublicApi.getTransactionProductInquiryDetails({ id }).then(res => {
if (res.code !== 1000) {
history.goBack();
return;
}
const { data } = res;
data.externalLogStates = [...data.externalInquiryListStateResponses];
data.interiorLogStates = [...data.interiorRequisitionFormStateResponses];
data.externalLogs = [...data.externalInquiryListLogResponses];
data.interiorLogs = [...data.interiorInquiryListLogResponses];
setDataSource(data);
handleBasicEffect(data);
handleConditionEffect(data);
handleFileEffect(data);
})
}
useEffect(() => {
fetchDataSource();
}, [])
const handleJump = (data:any) => {
window.open(`/shop/commodity/detail?id=${data.productId}&type=2&shopId=${btoa(JSON.stringify({ roleId: data.memberRoleId, memberId: data.memberId }))}`)
}
const columns: ColumnType<any>[] = [
{
title: 'ID',
key: 'id',
dataIndex: 'id',
},
{
title: '商品名称',
key: 'productName',
dataIndex: 'productName',
render: (text: any, record: any) => <EyePreview type='button' handleClick={() => handleJump(record)}>{text}</EyePreview>
},
{
title: '品类',
key: 'category',
dataIndex: 'category',
},
{
title: '品牌',
key: 'brand',
dataIndex: 'brand',
},
{
title: '单位',
key: 'unit',
dataIndex: 'unit',
},
{
title: '采购数量',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
},
]
return (
<Context.Provider value={dataSource}>
<PeripheralLayout
no={dataSource.inquiryListNo}
detail={dataSource.details}
tabLink={TABLINK}
components={
<Fragment>
<ProgressLayout />
<BasicLayout effect={basicEffect} />
<ListLayout
id={id}
anchor="inquiryProductLayout"
title="询价商品"
columns={columns}
fetch={PublicApi.getTransactionEnquiryProductList}
/>
<GeneralLayout
anchor="conditionLayout"
title="交易条件"
effect={conditionEffect}
/>
<GeneralLayout
anchor="fileLayout"
title="附件"
effect={fileEffect}
/>
<RecordLyout />
</Fragment>
}
/>
</Context.Provider>
)
}
export default InquiryOfferPreview;
import React from 'react';
import AddQuoteForm from './addForm';
import {history} from 'umi';
const AddQuote: React.FC<{}> = () => {
const { id } = history.location.query;
return(
<AddQuoteForm
type={1}
/>
)
}
export default AddQuote;
\ No newline at end of file
import React, { useState, useRef, useEffect } from 'react';
import { history } from 'umi';
import { Button, Card, Tabs, message } from 'antd';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import ReutrnEle from '@/components/ReturnEle';
import BasicInfo from './components/basicInfo'; // 基本信息
import EnquiryGoods from './components/enquiryGoods'; // 询价商品
import TradingConditions from './components/tradingConditions'; // 交易条件
import Attached from './components/attached'; // 附件
import FlowRecord from './components/flowRecord'; // 流转记录
import { PublicApi } from '@/services/api'
const { TabPane } = Tabs;
export interface parmas {
id?: any,
type?: any
}
const AddQuotes: React.FC<parmas> = (props) => {
const { id, type } = props;
const [count, setCount] = useState<string>('1')
const [inquiryNo, setInquiryLNo] = useState<any>({}); //存放用户信息
const [goodsList, setgoodsList] = useState([]); //存放商品
const [enclosureUrls, setenclosureUrls] = useState<any>([]);
const basicInfoRef = useRef<any>({});
const tradingConditionsRef = useRef<any>({});
const [editData, setEditData] = useState<any>({});
const [loading, setloading] = useState<boolean>(false);
const { pathname } = history.location;
const pathType = pathname.split('/')[pathname.split('/').length - 1];
useEffect(() => {
if (id && type === 2) {
PublicApi.getTransactionProductQuotationDetails({ id }).then(res => {
if (res.code === 1000) {
setEditData(res.data);
setInquiryLNo({
orderNo: res.data.inquiryListNo,
orderId: res.data.inquiryListId
})
setenclosureUrls(res.data.enclosureUrls)
}
})
} else if (id && type === 3) {
// 报价
PublicApi.getTransactionProductInquiryDetails({ id }).then(res => {
if (res.code === 1000) {
setEditData(res.data);
setInquiryLNo({
orderNo: res.data.inquiryListNo,
orderId: res.data.id
})
setenclosureUrls(res.data.enclosureUrls)
}
})
}
}, [])
/************* 页面的一些操作start *************/
const onSumbit = async (params: any) => {
setloading(true);
const basicInfo = await basicInfoRef.current.validateFields();
const tradingConditions = await tradingConditionsRef.current.validateFields();
const basicInfoData = basicInfo.data;
const tradingConditionsData = tradingConditions.data;
if (basicInfo.state && tradingConditions.state) {
const parmas = {
inquiryListProductRequests: goodsList, // 商品列表 ,InquiryListProductRequest
...basicInfoData,
...tradingConditionsData,
enclosureUrls,
inquiryListNo: inquiryNo.orderNo,
inquiryListId: inquiryNo.orderId
}
if (id && type === 2) {
parmas.id = editData.id;
await PublicApi.postTransactionProductQuotationUpdate(parmas).then(res => {
if (res.code === 1000) {
history.goBack();
} else { setloading(false); }
})
} else {
await PublicApi.postTransactionProductQuotationAdd(parmas).then(res => {
if (res.code === 1000) {
history.goBack();
} else { setloading(false); }
})
}
} else {
message.error('有必填字段没选择,请检查!');
setloading(false);
}
}
// 获取到会员信息
const getMemberList = (list: any) => {
PublicApi.getTransactionProductInquiryDetails({ id: list.orderId }).then(res => {
if (res.code === 1000) {
res.data.inquiryListProductRequests.forEach((item: any) => {
item.money = item.purchaseCount * item.price
})
setEditData(res.data)
setenclosureUrls(res.data.enclosureUrls)
}
})
setInquiryLNo(list);
}
// 获取添加的商品列表
const getGoodsList = (list: any) => {
setgoodsList(list)
}
/************* 页面的一些操作end *************/
const handleClick = (key: string) => {
if (key === '3') {
setCount(key)
}
}
// 附件回调
const handleGetEnclosureUrls = (data: any) => {
setenclosureUrls(data)
}
return (
<PageHeaderWrapper
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
extra={
<Button type="primary" onClick={onSumbit} loading={loading}> 保存</Button>
}
>
<Card>
<Tabs onTabClick={handleClick} type="card">
<TabPane tab="基本信息" key="1" forceRender>
<BasicInfo
currentRef={basicInfoRef}
getMemberList={getMemberList}
editData={editData}
type={type}
/>
</TabPane>
<TabPane tab="商品报价" key="2" forceRender>
<EnquiryGoods
inquiryNo={inquiryNo}
getGoodsList={getGoodsList}
editData={editData}
type={type}
/>
</TabPane>
<TabPane tab="其他说明" key="3" forceRender>
<TradingConditions
currentRef={tradingConditionsRef}
editData={pathType !== 'quote' ? editData : {}}
/>
</TabPane>
<TabPane tab="附件" key="4" forceRender>
<Attached
editData={pathType !== 'quote' ? editData : {}}
handleGetEnclosureUrls={handleGetEnclosureUrls}
/>
</TabPane>
<TabPane tab="流转记录" key="5" forceRender>
<FlowRecord
editData={editData}
/>
</TabPane>
</Tabs>
</Card>
</PageHeaderWrapper>
)
}
export default AddQuotes
import React, { useState, useEffect } from 'react';
import { Form, Button, Upload, message } from 'antd';
import { UPLOAD_TYPE } from '@/constants'
import { UploadFile, UploadChangeParam } from 'antd/lib/upload/interface';
import styles from './index.less';
import { UploadOutlined, DeleteOutlined, LinkOutlined } from '@ant-design/icons';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
export interface parmas {
handleGetEnclosureUrls?: Function,
editData?: any
}
const Attached: React.FC<parmas> = (props) => {
const { handleGetEnclosureUrls, editData } = props;
const [files, setFiles] = useState<Array<any>>([]);
const [loading, setloading] = useState(false);
/**判断文件类型和大小 */
const beforeDocUpload = (file: UploadFile) => {
const isLt20M = file.size / 1024 / 1024 < 20;
if (!isLt20M) {
message.error('上传文件大小不超过 20M!');
}
return isLt20M;
}
// 上传回调
const handleChange = ({ file }) => {
const arr: any = files;
setloading(true);
if (file.response) {
if (file.response.code === 1000) {
arr.push({
name: file.name,
url: file.response.data
})
setloading(false);
}
}
setFiles([...arr])
handleGetEnclosureUrls(arr);
}
// 删除附件
const removeFiles = (index: any) => {
const arr = [...files];
arr.splice(index, 1);
setFiles(arr);
handleGetEnclosureUrls(arr);
}
useEffect(() => {
if (Object.keys(editData).length > 0) {
setFiles(editData.enclosureUrls)
}
}, [editData])
return (
<Form
{...layout}
className={styles.revise_style}
>
<Form.Item label='附件' name='upload'>
<div className={styles.upload_data}>
{(files && files.length > 0) && files.map((v, index) => (
<div key={index} className={styles.upload_item}>
<div className={styles.upload_left}>
<LinkOutlined />
<span>{v.name}</span>
</div>
<div className={styles.upload_right} onClick={() => removeFiles(index)}>
<DeleteOutlined />
</div>
</div>
))}
</div>
<Upload
action="/api/file/file/upload"
data={{ fileType: UPLOAD_TYPE }}
showUploadList={false}
accept='.doc,.docx,.pdf,.ppt,.pptx,.xls,.xlsx'
beforeUpload={beforeDocUpload}
onChange={handleChange}
>
<Button loading={loading} icon={<UploadOutlined />}>上传文件</Button>
<div style={{ marginTop: '8px' }}>一次上传一个文件,每个附件大小不能超过 20M</div>
</Upload>
</Form.Item>
</Form>
)
}
export default Attached;
import React, { useState, useEffect } from 'react';
import { Form, Input, Button, Tag, Badge } from 'antd';
import styles from './index.less';
import { LinkOutlined } from '@ant-design/icons';
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable';
import ModalTable from '@/components/ModalTable'
import { PublicApi } from '@/services/api'
import moment from 'moment';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 9 },
labelAlign: "left"
};
const { Search } = Input;
interface queryProps {
currentRef?: any,
getMemberList?: Function,
editData: any,
type: number,
}
const BasicInfo: React.FC<queryProps> = (props) => {
const [basicform] = Form.useForm();
const { getMemberList, currentRef, editData, type } = props;
// 会员添加弹窗控制
const [visibleChannelMember, setVisibleChannelMember] = useState(false);
const [inquiryNo, setinquiryNo] = useState<any>({});
const [inquiryRowSelection, inquiryRowCtl] = useRowSelectionTable({ customKey: 'orderId', type: 'radio' });
const handleOkAddMember = () => {
if (inquiryRowCtl.selectRow.length > 0) {
setVisibleChannelMember(false)
setinquiryNo(inquiryRowCtl.selectRow[0]);
getMemberList(inquiryRowCtl.selectRow[0]); // 回传给父级
}
}
const handleCancelAddMember = () => {
setVisibleChannelMember(false)
}
const columnsSetMember: any[] = [
{
title: '询价单号',
dataIndex: 'orderNo',
key: 'orderNo',
},
{
title: '询价单摘要',
dataIndex: 'details',
key: 'details',
},
{
title: '询价会员',
dataIndex: 'memberName',
key: 'memberName',
},
{
title: '单据时间',
dataIndex: 'documentTime',
key: 'documentTime',
render: (text: any, record: any) => format(text)
}
]
// 模拟数据
const fetchMemberList = async (params) => {
return new Promise((resolve, reject) => {
PublicApi.getTransactionCorrespondingInquiryNumber({ ...params }).then(res => {
resolve(res.data)
})
});
}
// 选择会员弹框结束
useEffect(() => {
if (Object.keys(inquiryNo).length > 0) {
basicform.setFieldsValue({ 'inquiryListNo': inquiryNo.orderNo })
}
}, [inquiryNo])
/************* 页面的一些操作start *************/
// 拿到表单数据
const hadnleValidateFields = () => {
return new Promise((resolve) => {
basicform.validateFields().then(values => {
resolve({
state: true,
data: {
details: values.details,
inquiryListNo: values.inquiryListNo,
}
})
}).catch(errorInfo => {
console.log(errorInfo)
})
})
}
useEffect(() => {
if (currentRef) {
const userAction = {
validateFields: () => hadnleValidateFields()
}
if (currentRef && typeof currentRef === 'function') {
currentRef(userAction);
}
if (currentRef && typeof currentRef !== 'function') {
currentRef.current = userAction;
}
}
}, [])
useEffect(() => {
if (Object.keys(editData).length > 0) {
basicform.setFieldsValue({
details: editData.details
})
setinquiryNo({
orderId: editData.id,
orderNo: editData.inquiryListNo
});
}
}, [editData])
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
/************* 页面的一些操作end *************/
return (
<>
<Form
{...layout}
form={basicform}
className={styles.revise_style}
>
<Form.Item label='报价单摘要' name='details' rules={[{ required: true, message: '请输入询价单摘要' }]}>
<Input />
</Form.Item>
<Form.Item label='对应询价单号' name='inquiryListNo' rules={[{ required: true, message: '请选择被询价会员' }]}>
<Search disabled={type === 3} value={Object.keys(inquiryNo).length > 0 ? inquiryNo.orderNo : undefined} readOnly enterButton={<><LinkOutlined /> 选择</>} onSearch={() => setVisibleChannelMember(true)} />
{Object.keys(inquiryNo).length > 0 && <Button type='link' onClick={() => window.open(`/memberCenter/tranactionAbility/inquiryQuote/enquiryOrder/rfq/preview?id=${inquiryNo.orderId}`)}>查看询价单详情</Button>}
</Form.Item>
<Form.Item label='报价单号' name='quotationNo'>
<span>{Object.keys(editData).length > 0 ? editData.quotationNo : '-'}</span>
</Form.Item>
<Form.Item label='询价会员' name='inquiryListMemberName'>
<span>{Object.keys(editData).length > 0 ? (editData.inquiryListMemberName || editData.memberName ) : '-'}</span>
</Form.Item>
<Form.Item label='报价截止时间' name='quotationAsTime'>
<span>{Object.keys(editData).length > 0 ? format(editData.quotationAsTime) : '-'}</span>
</Form.Item>
<Form.Item label='单据时间' name='voucherTime'>
<span>{Object.keys(editData).length > 0 ? format(editData.deliveryTime) : '-'}</span>
</Form.Item>
<Form.Item label='外部状态' name='external'>
<span>{(Object.keys(editData).length > 0 && editData.externalState) ? <Tag color={EXTERNALSTATE_COLOR[editData.externalState]}>{editData.externalStateName}</Tag> : '-'}</span>
</Form.Item>
<Form.Item label='内部状态' name='internal'>
<span>{(Object.keys(editData).length > 0 && editData.interiorState) ? <Badge status={INTERNALSTATE_COLOR[editData.interiorState]} text={editData.interiorStateName} /> : '-'}</span>
</Form.Item>
</Form>
{/* 选择会员弹框 */}
<ModalTable
modalTitle='选择询价单'
confirm={handleOkAddMember}
cancel={handleCancelAddMember}
visible={visibleChannelMember}
resetModal={{ destroyOnClose: true, forceRender: true }}
columns={columnsSetMember}
rowSelection={inquiryRowSelection}
fetchTableData={params => fetchMemberList(params)}
modalType='selectRfqOrder'
searchName='orderNo'
forceRender={true}
tableProps={{
rowKey: 'orderId',
}}
/>
</>
)
}
export default BasicInfo
import React, { useState, useEffect, ReactNode } from 'react';
import styles from './index.less';
import { Input, Table, Form } from 'antd';
import { ColumnType } from 'antd/lib/table/interface';
import { PublicApi } from '@/services/api';
interface queryProps {
inquiryNo?: any,
getGoodsList: Function,
editData: any,
type?: any
}
const EnquiryGoods: React.FC<queryProps> = (props) => {
const { inquiryNo, getGoodsList, editData, type } = props
// 会员添加弹窗控制
const [goodsList, setgoodsList] = useState([]);
// 计算金额
const countMoney = (num: any, money: any) => {
let price: ReactNode = null;
price = (Number(money) * 1) / Number(num);
return Number(price).toFixed(2);
}
/**输入框输入 */
const inputOnchange = (id, e) => {
const { value } = e.target
goodsList.forEach(v => {
if (v.productId === id) {
v.money = value
v.price = countMoney(v.purchaseCount, value);
}
})
getGoodsList([...goodsList]) // 返回给父级
setgoodsList([...goodsList])
}
const columns: ColumnType<any>[] = [{
title: '商品ID',
dataIndex: 'productId',
}, {
title: '商品名称',
dataIndex: 'productName',
}, {
title: '品类',
dataIndex: 'category',
}, {
title: '品牌',
dataIndex: 'brand',
}, {
title: '单位',
dataIndex: 'unit',
}, {
title: '采购数量',
dataIndex: 'purchaseCount',
}, {
title: '报价单价',
dataIndex: 'price',
}, {
title: '金额',
dataIndex: 'money',
render: (text: any, record: any) => (
<Form.Item name={record.productId} noStyle initialValue={record.money}>
<Input
addonBefore="¥"
onBlur={(e) => inputOnchange(record.productId, e)}
type='number'
maxLength={25}
/>
</Form.Item>
)
}]
useEffect(() => {
if (Object.keys(inquiryNo).length > 0 && inquiryNo.orderId) {
console.log(inquiryNo)
PublicApi.getTransactionProductInquiryDetails({ id: inquiryNo.orderId }).then(res => {
if (res.code === 1000) {
const data = res.data.inquiryListProductRequests;
data.forEach((item: any) => {
item.money = item.purchaseCount * item.price
})
getGoodsList(data)
setgoodsList(data)
}
})
}
}, [inquiryNo])
// 编辑时回显的数据
useEffect(() => {
if (Object.keys(editData).length > 0) {
setgoodsList(editData.inquiryListProductRequests);
}
}, [])
return (
<div className={styles.revise_style}>
<Form>
<Table rowKey={'productId'} style={{ marginTop: '16px' }} columns={columns} dataSource={goodsList} pagination={false} />
</Form>
</div>
)
}
export default EnquiryGoods
import React, { useState } from 'react';
import styles from './index.less';
import { Radio, Tag } from 'antd';
import PolymericTable from '@/components/PolymericTable';
import { EditableColumns } from '@/components/PolymericTable/interface';
import moment from 'moment';
import { EXTERNALSTATE_COLOR, INTERNALSTATE_COLOR } from '@/pages/transaction/components/stateColor';
export interface parmas {
editData?: any
}
const FlowRecord: React.FC<parmas> = (props) => {
const { editData } = props;
const [radio, setRadio] = useState<string>('outer'); //切换单据
const format = (text, fmt?: string) => {
return <>{moment(text).format(fmt || "YYYY-MM-DD HH:mm:ss")}</>
}
const outerColumns: EditableColumns[] = [{
title: '序号',
dataIndex: 'id',
}, {
title: '操作角色',
dataIndex: 'roleName',
}, {
title: '状态',
dataIndex: 'state',
render: (text: any, record: any) => <Tag color={EXTERNALSTATE_COLOR[text]}>{record.stateName}</Tag>
}, {
title: '操作',
dataIndex: 'operation',
}, {
title: '操作时间',
dataIndex: 'operationTime',
render: (text: any, record: any) => format(text)
}, {
title: '审核意见',
dataIndex: 'auditOpinion',
}]
const insideColumns: EditableColumns[] = [{
title: '序号',
dataIndex: 'id',
}, {
title: '操作人',
dataIndex: 'roleName',
}, {
title: '部门',
dataIndex: 'department',
}, {
title: '职位',
dataIndex: 'position',
}, {
title: '状态',
dataIndex: 'state',
render: (text: any, record: any) => <Tag color={INTERNALSTATE_COLOR[text]}>{record.stateName}</Tag>
}, {
title: '操作',
dataIndex: 'operation',
}, {
title: '操作时间',
dataIndex: 'operationTime',
render: (text: any, record: any) => format(text)
}, {
title: '审核意见',
dataIndex: 'auditOpinion',
}]
const onChange = (e: any) => {
setRadio(e.target.value)
}
return (
<div className={styles.revise_style}>
<Radio.Group defaultValue="outer" buttonStyle="solid" onChange={onChange}>
<Radio.Button value="outer">外部单据</Radio.Button>
<Radio.Button value="inside">内部单据</Radio.Button>
</Radio.Group>
{radio === 'outer' ?
<PolymericTable
dataSource={editData.externalRequisitionFormResponses}
columns={outerColumns}
loading={false}
pagination={null}
/>
:
<PolymericTable
dataSource={editData.interiorQuotationLogResponses}
columns={insideColumns}
loading={false}
pagination={null}
/>
}
</div>
)
}
export default FlowRecord
.revise_style {
:global {
.ant-form-item-label {
width: 174px;
label {
color:#6B778C
}
}
.ant-form-item-control {
width: 500px;
.ant-form-item-control-input-content {
position: relative;
.ant-btn-link {
position: absolute;
right: -120px;
}
.ant-picker {
width: 100%;
}
}
.ant-input-group-addon {
.ant-input-search-button {
background-color: #6B778C;
border-color: #6B778C;
}
}
}
.ant-radio-group-solid {
.ant-radio-button-wrapper-checked {
background: #6B778C;
border-color: #6B778C;
&:hover {
background: #6B778C;
border-color: #6B778C;
}
}
}
}
.upload_item {
padding: 5px 8px;
margin-bottom: 16px;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #FAFBFC;
.upload_left {
display: flex;
align-items: center;
color: #303133;
:global {
.anticon-file-word {
color: #4279df;
font-size: 20px;
margin-right: 8px;
}
}
}
.upload_right {
color: #00B37A;
cursor: pointer;
:global {
.anticon-delete {
margin-left: 19px;
color: #C0C4CC;
}
}
}
}
}
\ No newline at end of file
import React, { useEffect } from 'react';
import styles from './index.less';
import { Form, Input, Row, Col, InputNumber } from 'antd';
interface queryProps {
currentRef?: any,
editData: any
}
const layout: any = {
colon: false,
labelCol: { style: { width: '174px' } },
wrapperCol: { span: 24 },
labelAlign: "left"
};
const TradingConditions: React.FC<queryProps> = (props) => {
const { currentRef, editData } = props;
const [TradingConditionsForm] = Form.useForm();
const hadnleValidateFields = () => {
return new Promise((resolve) => {
TradingConditionsForm.validateFields().then(values => {
resolve({
state: true,
data: {
minimumOrder: values.minimumOrder,
deliveryInstructions: values.deliveryInstructions,
paymentType: values.paymentType,
taxes: values.taxes,
logistics: values.logistics,
packRequire: values.logistics,
otherRequire: values.logistics,
}
})
}).catch(errorInfo => {
console.log(errorInfo)
})
})
}
useEffect(() => {
if (currentRef) {
const userAction = {
validateFields: () => hadnleValidateFields()
}
if (currentRef && typeof currentRef === 'function') {
currentRef(userAction);
}
if (currentRef && typeof currentRef !== 'function') {
currentRef.current = userAction;
}
}
}, [])
useEffect(() => {
// 编辑时回显的数据
if(Object.keys(editData).length > 0) {
console.log(editData, 10086)
TradingConditionsForm.setFieldsValue({
paymentType: editData.paymentType,
taxes: editData.taxes,
logistics: editData.logistics,
packRequire: editData.packRequire,
otherRequire: editData.otherRequire,
deliveryInstructions: editData.deliveryInstructions,
minimumOrder: editData.minimumOrder
})
}
}, [editData])
return (
<Form
{...layout}
form={TradingConditionsForm}
className={styles.revise_style}
>
<Row gutter={70}>
<Col span={12}>
<Form.Item label='最小起订' name='minimumOrder' rules={[{ required: true, message: '请输入最小起订' }]}>
<InputNumber min={1} placeholder='请输入数量' />
</Form.Item>
<Form.Item label='交付说明' name='deliveryInstructions'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
<Form.Item label='付款说明' name='paymentType'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
<Form.Item label='税费说明' name='taxes'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
<Form.Item label='物流说明' name='logistics'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
<Form.Item label='包装说明' name='packRequire'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label='其他说明' name='otherRequire'>
<Input.TextArea placeholder='最长100个字符,50个汉字' />
</Form.Item>
</Col>
</Row>
</Form>
)
}
export default TradingConditions
import React from 'react';
import AddQuoteForm from './addForm';
import {history} from 'umi';
const EditQuote: React.FC<{}> = () => {
const { id } = history.location.query;
return(
<AddQuoteForm
id={id}
type={2}
/>
)
}
export default EditQuote;
\ No newline at end of file
......@@ -55,14 +55,14 @@ const WaitAddOffer = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -109,7 +109,7 @@ const WaitAddOffer = () => {
return (
<>
{(record.interiorState !== 5 && record.interiorState !== 6) && <Button type='link' onClick={() => fetchSubmitBatch(record.id)}>提交审核</Button>}
<Button type="link" onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/edit?id=${record.id}`)}>修改</Button>
<Button type="link" onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/edit?id=${record.id}`)}>修改</Button>
{(record.interiorState !== 5 && record.interiorState !== 6) &&
<Popconfirm
destroyTooltipOnHide
......@@ -146,7 +146,7 @@ const WaitAddOffer = () => {
<Button
type="primary"
icon={<PlusOutlined />}
onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/addInquiryOrder/add`)}
onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryOffer/waitAddOffer/add`)}
>
新建
</Button>
......
import React from 'react';
import AddQuoteForm from './addForm';
import {history} from 'umi';
const Quote: React.FC<{}> = () => {
const { id } = history.location.query;
return(
<AddQuoteForm
id={id}
type={3}
/>
)
}
export default Quote;
\ No newline at end of file
......@@ -29,14 +29,14 @@ const WaitAuditOfferOne = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewOne/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewOne/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -76,7 +76,7 @@ const WaitAuditOfferOne = () => {
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/detail?id=${record.id}&page_type=2`)}>审核</Button>
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferOne/offer/detail?id=${record.id}`)}>审核</Button>
},
]
return (
......
......@@ -29,14 +29,14 @@ const WaitAuditOfferTwo = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......@@ -76,7 +76,7 @@ const WaitAuditOfferTwo = () => {
title: '操作',
key: 'options',
dataIndex: 'options',
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryQuote/pendingReviewTwo/quote/detail?id=${record.id}&page_type=3`)}>审核</Button>
render: (text: any, record: any) => <Button type='link' disabled={record.interiorState === 1} onClick={() => history.push(`/memberCenter/tranactionAbility/inquiryOffer/waitAuditOfferTwo/offer/detail?id=${record.id}`)}>审核</Button>
},
]
return (
......
......@@ -33,14 +33,14 @@ const WaitSubmitOffer = () => {
key: 'quotationNo',
dataIndex: 'quotationNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingSubmit/quote/preview?id=${record.id}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer/offer/preview?id=${record.id}`}>{text}</EyePreview>
},
{
title: '询价单号',
key: 'inquiryListNo',
dataIndex: 'inquiryListNo',
render: (text: any, record: any) => <EyePreview
url={`/memberCenter/tranactionAbility/inquiryQuote/pendingSubmit/rfq/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
url={`/memberCenter/tranactionAbility/inquiryOffer/waitSubmitOffer/inquiry/preview?id=${record.inquiryListId}`}>{text}</EyePreview>
},
{
title: '报价单摘要',
......
......@@ -123,10 +123,10 @@ const ProductInquiryDetail = () => {
return;
}
const { data } = res;
data.externalLogStates = [...data.externalInquiryListStateResponses];
data.interiorLogStates = [...data.interiorRequisitionFormStateResponses];
data.externalLogs = [...data.externalInquiryListLogResponses];
data.interiorLogs = [...data.interiorInquiryListLogResponses];
data.externalLogStates = data.externalInquiryListStateResponses ? [...data.externalInquiryListStateResponses] : null;
data.interiorLogStates = data.interiorRequisitionFormStateResponses ? [...data.interiorRequisitionFormStateResponses] : null;
data.externalLogs = data.externalInquiryListLogResponses ? [...data.externalInquiryListLogResponses] : null;
data.interiorLogs = data.interiorInquiryListLogResponses ? [...data.interiorInquiryListLogResponses] : null;
setDataSource(data);
handleBasicEffect(data);
handleConditionEffect(data);
......
......@@ -130,7 +130,7 @@ const AddQuotes: React.FC<parmas> = (props) => {
} else {
await PublicApi.postTransactionInquiryListAdd(parmas).then(res => {
if (res.code === 1000) {
history.push('/memberCenter/tranactionAbility/goodsOffer/addEnquiryOrder');
history.push('/memberCenter/tranactionAbility/productInquiry/waitAddInquiry');
} else { setloading(false); }
})
}
......@@ -173,7 +173,7 @@ const AddQuotes: React.FC<parmas> = (props) => {
}
>
<Card>
<Tabs onTabClick={handleClick}>
<Tabs onTabClick={handleClick} type="card">
<TabPane tab="基本信息" key="1" forceRender>
<BasicInfo
currentRef={basicInfoRef}
......
......@@ -109,13 +109,13 @@ const WaitAddInquiry = () => {
render: (text: any, record: any) => {
return (
<>
<Button
type='link'
disabled={record.interiorState !== 1}
onClick={() => fetchSubmitBatch(record.id)}
>
提交审核
</Button>
<Popconfirm title="确定要提交吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button
type='link'
>
提交审核
</Button>
</Popconfirm>
<Button
type="link"
disabled={record.interiorState !== 1 && record.interiorState !== 6}
......
......@@ -101,6 +101,8 @@ const PurchasInfo: React.FC<PurchasInfoPropsType> = (props) => {
const data: any = res.data
if (res.code === 1000) {
if (data) {
console.log(res.data)
setShopInfo(res.data)
setSelectCityData(initMemberShopArea(data.areaBOList))
setLogo(data.logo)
setCompanyPics(data.companyPics || [])
......@@ -321,11 +323,13 @@ const PurchasInfo: React.FC<PurchasInfoPropsType> = (props) => {
const handleMallSelectChange = (mallId: number) => {
setShopId(mallId)
console.log(mallId, shopInfo)
if (!shopInfo) {
return null
}
if (shopInfo.shopId && shopInfo.memberId) {
const resUrl = getMallItemAndSetUrl(mallId)
getMallItemAndSetUrl(mallId)
}
}
......
......@@ -143,7 +143,7 @@ const PurchasePlanDetailed = () => {
position: '',
purchaseInquiryId: null,
roleName: item.operator,
state: item.step + 1,
state: item.status,
step: item.step,
})
})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment