Commit 396b639d authored by 前端-黄佳鑫's avatar 前端-黄佳鑫

🐞fix: 修复多次报价的显示

parent bb2d4276
import React, { useContext, useEffect, useState } from 'react'; import React, { useContext, useEffect, useState, useRef } from 'react';
import { Space, Button, Tabs, Divider, Skeleton, Typography, message, Row, Col } from 'antd'; import { Space, Button, Tabs, Divider, Skeleton, Typography, message, Row, Col, Tooltip } from 'antd';
import { StandardTable } from 'god'; import { StandardTable } from 'god';
import { history } from 'umi'; import { history } from 'umi';
import moment from 'moment'; import moment from 'moment';
...@@ -10,9 +10,9 @@ import EyePreview from '@/components/EyePreview'; ...@@ -10,9 +10,9 @@ import EyePreview from '@/components/EyePreview';
import { PublicApi } from '@/services/api'; import { PublicApi } from '@/services/api';
import BidTable from '../bidTable'; import BidTable from '../bidTable';
import { Context, BidDetailContext } from '../context'; import { Context, BidDetailContext } from '../context';
import { useBidTable } from '../../../effects/useBidTable';
import { FilePdfOutlined } from '@ant-design/icons'; import { FilePdfOutlined } from '@ant-design/icons';
import ModalOperate from '../../../modalOperate'; import ModalOperate from '../../../modalOperate';
import { useBidTable } from '../../../effects/useBidTable';
export interface ContrastProps { export interface ContrastProps {
effect?: any, effect?: any,
...@@ -20,6 +20,18 @@ export interface ContrastProps { ...@@ -20,6 +20,18 @@ export interface ContrastProps {
preview?: boolean preview?: boolean
} }
const chNum: { [key: number]: string } = {
1: '一',
2: '二',
3: '三',
4: '四',
5: '五',
6: '六',
7: '七',
8: '八',
9: '九',
}
const ContrastLyout: React.FC<ContrastProps> = (props: any) => { const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
const { const {
effect: { effect: {
...@@ -35,11 +47,17 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -35,11 +47,17 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
ctl: { setDataSource } ctl: { setDataSource }
} }
} = useBidTable(); } = useBidTable();
const ref = useRef<any>({});
const context = useContext(Context); const context = useContext(Context);
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [disabled, setDisabled] = useState<boolean>(false); const [disabled, setDisabled] = useState<boolean>(false);
const [type, setType] = useState<string>(''); const [type, setType] = useState<string>('');
const [visible, setVisible] = useState<boolean>(false); const [visible, setVisible] = useState<boolean>(false);
const [iturn, setTurn] = useState<Array<number>>([]);
const [isDecrypt, setIsDecrypt] = useState<number>();
/** 当前的轮次 */
const [count, setCount] = useState<number>(turn);
const format = (text) => { const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</> return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</>
} }
...@@ -50,8 +68,8 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -50,8 +68,8 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
dataIndex: 'quotedPriceNo', dataIndex: 'quotedPriceNo',
render: (text: any, record: any) => ( render: (text: any, record: any) => (
<Space direction='vertical'> <Space direction='vertical'>
{ context.priceContrast === PRICECONTRAST_TYPE.UNENCRYPTED && <EyePreview url={`/memberCenter/procurementAbility/confirmOffer/quote/detail?id=${record.id}&number=${record.quotedPriceNo}`}>{text}</EyePreview> } { record.isDecrypt === PRICECONTRAST_TYPE.UNENCRYPTED && <EyePreview url={`/memberCenter/procurementAbility/confirmOffer/quote/detail?id=${record.id}&number=${record.quotedPriceNo}&turn=${record.turn}`}>{text}</EyePreview>}
{ context.priceContrast === PRICECONTRAST_TYPE.UNDECRYPTED && <Typography.Text type='success'>{text}</Typography.Text> } { record.isDecrypt === PRICECONTRAST_TYPE.UNDECRYPTED && <Tooltip placement="topLeft" title='当前报价为密封报价,请先解密报价单'><Typography.Text type='success'>{text}</Typography.Text></Tooltip>}
<Typography.Text>{record.details}</Typography.Text> <Typography.Text>{record.details}</Typography.Text>
</Space> </Space>
) )
...@@ -89,17 +107,29 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -89,17 +107,29 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
title: '解密状态', title: '解密状态',
key: 'isDecrypt', key: 'isDecrypt',
dataIndex: 'isDecrypt', dataIndex: 'isDecrypt',
render: (text: any, record: any) => ( render: (text: any) => (
<Typography.Text>{text === 1 ? '未加密' : '未解密'}</Typography.Text> <Typography.Text>{text === 1 ? '已解密' : '未解密'}</Typography.Text>
) )
}, },
] ]
/** 轮次 */
const handleTurn = (num: number) => {
let isTurn: Array<number> = [];
for (let i = 0; i < num; i += 1) {
isTurn.push(i + 1)
}
setTurn(isTurn.reverse());
}
const fetchTableData = (params: any) => { const fetchTableData = (params: any) => {
return new Promise(resolve => { return new Promise(resolve => {
PublicApi.getPurchaseConfirmQuotedPriceQuotedPriceInfo({ ...params, id, turn }).then(res => { PublicApi.getPurchaseConfirmQuotedPriceQuotedPriceInfo({ ...params, id, turn: count }).then(res => {
if (res.code === 1000) { if (res.code === 1000) {
resolve(res.data) resolve(res.data)
if (res.data.data.length > 0) {
setIsDecrypt(res.data.data[0].isDecrypt);
}
} }
}) })
}) })
...@@ -158,19 +188,20 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -158,19 +188,20 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
setDataSource(params); setDataSource(params);
if (preview) { if (preview) {
redux(params) redux(params)
console.log(params, data)
} }
} }
/** 立即比价 */ /** 立即比价 */
const atonceContrast = () => { const atonceContrast = async () => {
const PRICECONTRAST = context.priceContrast; const PRICECONTRAST = isDecrypt;
if (PRICECONTRAST === PRICECONTRAST_TYPE.UNENCRYPTED) { if (PRICECONTRAST === PRICECONTRAST_TYPE.UNENCRYPTED) {
setBoolean(true); setBoolean(true);
const params = { const params = {
id, id,
turn turn: count.toString()
} }
PublicApi.getPurchaseConfirmQuotedPriceRightOffContrastPrice({...params}, { ctrlType: 'none' }).then((res: any) => { await PublicApi.getPurchaseConfirmQuotedPriceRightOffContrastPrice({ ...params }, { ctrlType: 'none' }).then((res: any) => {
if (res.code === 1000) { if (res.code === 1000) {
const { data } = res; const { data } = res;
if (data.length > 0) { if (data.length > 0) {
...@@ -198,17 +229,23 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -198,17 +229,23 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
useEffect(() => { useEffect(() => {
if (preview && Object.keys(context).length > 0) { if (preview && Object.keys(context).length > 0) {
if (context.priceContrast === PRICECONTRAST_TYPE.UNENCRYPTED) { if (isDecrypt === PRICECONTRAST_TYPE.UNENCRYPTED) {
atonceContrast() atonceContrast()
} }
handleTurn(turn)
} }
}, [context]) }, [context, isDecrypt])
const handleSubmit = (type: string) => { const handleSubmit = (type: string) => {
setVisible(true) setVisible(true)
setType(type) setType(type)
} }
const handleOnChang = (e: any) => {
console.log(ref.current)
setCount(e)
}
return ( return (
<BidDetailContext.Provider value={dataSource}> <BidDetailContext.Provider value={dataSource}>
<Card <Card
...@@ -218,7 +255,7 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -218,7 +255,7 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
preview ? null : preview ? null :
<Space> <Space>
<Button onClick={() => handleSubmit('next')}>发起下轮报价</Button> <Button onClick={() => handleSubmit('next')}>发起下轮报价</Button>
{context.priceContrast === PRICECONTRAST_TYPE.UNDECRYPTED && {isDecrypt === PRICECONTRAST_TYPE.UNDECRYPTED &&
<Button onClick={() => handleSubmit('key')}> <Button onClick={() => handleSubmit('key')}>
解密报价单 解密报价单
</Button>} </Button>}
...@@ -232,16 +269,21 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -232,16 +269,21 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
</Space> </Space>
} }
> >
<Tabs> <Tabs onChange={handleOnChang}>
{iturn.map((item: any) => (
<Tabs.TabPane <Tabs.TabPane
key='1' key={item}
tab='第一轮' tab={`第${chNum[item]}轮`}
> >
<div className={style.divider}> <div className={style.divider}>
<Divider type='vertical' className={style.vertical} /> <Divider
type='vertical'
className={style.vertical}
/>
供应商信息 供应商信息
</div> </div>
<StandardTable <StandardTable
currentRef={ref}
columns={columns} columns={columns}
tableProps={{ rowKew: 'id' }} tableProps={{ rowKew: 'id' }}
fetchTableData={(params: any) => fetchTableData(params)} fetchTableData={(params: any) => fetchTableData(params)}
...@@ -261,8 +303,9 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => { ...@@ -261,8 +303,9 @@ const ContrastLyout: React.FC<ContrastProps> = (props: any) => {
</> </>
)} )}
</Tabs.TabPane> </Tabs.TabPane>
))}
</Tabs> </Tabs>
{ preview && {preview &&
<Row gutter={[0, 4]} style={{ marginTop: '1em' }}> <Row gutter={[0, 4]} style={{ marginTop: '1em' }}>
<Col span={24}> <Col span={24}>
<div className={style['card-list']}> <div className={style['card-list']}>
......
...@@ -25,7 +25,7 @@ const QuoteDetails = () => { ...@@ -25,7 +25,7 @@ const QuoteDetails = () => {
const format = (text) => { const format = (text) => {
return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</> return <>{moment(text).format("YYYY-MM-DD HH:mm:ss")}</>
} }
const { query: { id, number }, pathname } = history.location; const { query: { id, number, turn }, pathname } = history.location;
const [dataSource, setDataSource] = useState<any>({}); const [dataSource, setDataSource] = useState<any>({});
const [basicEffect, setBasicEffect] = useState<any>([]); const [basicEffect, setBasicEffect] = useState<any>([]);
const [otherEffect, setOtherEffect] = useState<any>([]); const [otherEffect, setOtherEffect] = useState<any>([]);
...@@ -107,7 +107,7 @@ const QuoteDetails = () => { ...@@ -107,7 +107,7 @@ const QuoteDetails = () => {
<BasicLayout effect={basicEffect} /> <BasicLayout effect={basicEffect} />
<BidInfoLayout <BidInfoLayout
fetch={PublicApi.getPurchaseConfirmQuotedPriceMaterielDetailed} fetch={PublicApi.getPurchaseConfirmQuotedPriceMaterielDetailed}
effect={{turn: dataSource.count, id }} effect={{turn, id }}
/> />
<OtherLayout effect={otherEffect} /> <OtherLayout effect={otherEffect} />
</Fragment> </Fragment>
......
...@@ -294,7 +294,7 @@ export const OFFTER_CONFIRMINTERIORSTATE_COLOR = { ...@@ -294,7 +294,7 @@ export const OFFTER_CONFIRMINTERIORSTATE_COLOR = {
export enum PRICECONTRAST_TYPE { export enum PRICECONTRAST_TYPE {
/** 未解密 */ /** 未解密 */
UNDECRYPTED = 1, UNDECRYPTED = 0,
/** 未加密 */ /** 已解密 */
UNENCRYPTED UNENCRYPTED
} }
...@@ -21,7 +21,7 @@ const AddForm = () => { ...@@ -21,7 +21,7 @@ const AddForm = () => {
/** 基本信息 */ /** 基本信息 */
const [basic, setbasic] = useState<any>({}); const [basic, setbasic] = useState<any>({});
/** 报价信息 */ /** 报价信息 */
const [offer, setoffer] = useState<any>([]); const [offer, setoffer] = useState<any>({});
/** 报价说明 */ /** 报价说明 */
const [explain, setexplain] = useState<any>({}); const [explain, setexplain] = useState<any>({});
/** 附件 */ /** 附件 */
...@@ -62,7 +62,8 @@ const AddForm = () => { ...@@ -62,7 +62,8 @@ const AddForm = () => {
basicInfo.createTime = params.createTime; basicInfo.createTime = params.createTime;
basicInfo.externalState = params.externalState; basicInfo.externalState = params.externalState;
basicInfo.interiorState = params.interiorState; basicInfo.interiorState = params.interiorState;
offerInfo.count = params.count || 1; offerInfo.count = params.count || 0;
offerInfo.id = params.id;
if (params.count) { if (params.count) {
offerInfo.materiels = params.quotedPriceProducts; offerInfo.materiels = params.quotedPriceProducts;
} else { } else {
......
...@@ -13,6 +13,7 @@ import { ...@@ -13,6 +13,7 @@ import {
import { CaretDownOutlined, CaretRightOutlined } from '@ant-design/icons'; import { CaretDownOutlined, CaretRightOutlined } from '@ant-design/icons';
import style from './index.less'; import style from './index.less';
import CrossSellProducts from '../modal/crossSellProducts'; import CrossSellProducts from '../modal/crossSellProducts';
import { PublicApi } from '@/services/api';
const { Text } = Typography; const { Text } = Typography;
const { Option } = Select; const { Option } = Select;
...@@ -34,23 +35,27 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -34,23 +35,27 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
const [visible, setVisible] = useState<boolean>(false); const [visible, setVisible] = useState<boolean>(false);
const [record, setRecord] = useState<any>({}); const [record, setRecord] = useState<any>({});
const [index, setIndex] = useState<number>(); const [index, setIndex] = useState<number>();
const [dataSource, setDataSource] = useState<any>(fetchdata.materiels) const [data, setData] = useState<any>({});
const [dataSource, setDataSource] = useState<any>([]);
const [idx, setIdx] = useState<number>(0);
/** 修改税率&单价 */ /** 修改税率&单价 */
const handleEdit = (e, name, idx) => { const handleEdit = (e, name, index) => {
const data = [...dataSource]; const params = { ...data }
const query = [...params[idx]];
switch (name) { switch (name) {
case 'isTax': case 'isTax':
data[idx].isTax = Number(e) query[index].isTax = Number(e)
break; break;
case 'taxProbability': case 'taxProbability':
data[idx].taxProbability = e.target.value; query[index].taxProbability = e.target.value;
break; break;
case 'taxUnitPrice': case 'taxUnitPrice':
data[idx].taxUnitPrice = e.target.value; query[index].taxUnitPrice = e.target.value;
break; break;
} }
setDataSource(data) params[idx] = [...query];
setData(params)
} }
/** 用于展示有第几轮的TABS */ /** 用于展示有第几轮的TABS */
const [count, setCount] = useState<number>() const [count, setCount] = useState<number>()
...@@ -108,7 +113,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -108,7 +113,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
<Select <Select
style={{ width: 100 }} style={{ width: 100 }}
onChange={(e) => handleEdit(e, 'isTax', index)} onChange={(e) => handleEdit(e, 'isTax', index)}
disabled={fetchdata && (fetchdata.count !== tabs[0])} disabled={fetchdata && (count !== tabs[0])}
> >
<Option value={1}></Option> <Option value={1}></Option>
<Option value={0}></Option> <Option value={0}></Option>
...@@ -129,7 +134,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -129,7 +134,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
> >
<Input <Input
onChange={(e) => handleEdit(e, 'taxProbability', index)} onChange={(e) => handleEdit(e, 'taxProbability', index)}
disabled={fetchdata && (fetchdata.count !== tabs[0])} disabled={fetchdata && (count !== tabs[0])}
addonAfter="%" addonAfter="%"
/> />
</Form.Item> </Form.Item>
...@@ -149,7 +154,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -149,7 +154,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
> >
<Input <Input
onChange={(e) => handleEdit(e, 'taxUnitPrice', index)} onChange={(e) => handleEdit(e, 'taxUnitPrice', index)}
disabled={fetchdata && (fetchdata.count !== tabs[0])} disabled={fetchdata && (count !== tabs[0])}
addonBefore="¥" addonBefore="¥"
/> />
</Form.Item> </Form.Item>
...@@ -182,29 +187,59 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -182,29 +187,59 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
/** 确定关联商品 */ /** 确定关联商品 */
const handleConfirm = (params: any) => { const handleConfirm = (params: any) => {
console.log(params, 10086)
const productAttributeJson = params.product.name.split('/').filter((_item, index) => index !== 0).join('/'); const productAttributeJson = params.product.name.split('/').filter((_item, index) => index !== 0).join('/');
const data = [...dataSource]; const param = { ...data };
data[index].productId = params.product.id; const query = [...param[idx]];
data[index].customerCategoryName = params.product.customerCategoryName; query[index].productId = params.product.id;
data[index].productName = params.product.name; query[index].customerCategoryName = params.product.customerCategoryName;
data[index].productBrand = params.product.brandName; query[index].productName = params.product.name;
data[index].productAttributeJson = productAttributeJson; query[index].productBrand = params.product.brandName;
data[index].enclosureUrls = params.files; query[index].productAttributeJson = productAttributeJson;
setDataSource(data) query[index].enclosureUrls = params.files;
param[idx] = [...query];
setData(param)
setVisible(false); setVisible(false);
} }
const fetchTableData = (turn: any, index: number) => {
const params = {
id: fetchdata.id,
turn,
current: '1',
pageSize: '100',
}
PublicApi.getPurchaseQuotedPriceMaterielDetailed({ ...params }).then((res: any) => {
if (res.code !== 1000) {
return
}
const param = { ...data };
param[index] = [...res.data.data];
console.log(param, 10086)
setData({ ...param });
setDataSource(res.data.data)
})
}
useEffect(() => { useEffect(() => {
if (fetchdata.materiels) { if (fetchdata.id) {
setDataSource(fetchdata.materiels) const isTurn = fetchdata.count ? fetchdata.count : 1;
fetchTableData(isTurn, 0)
}
console.log(fetchdata.count, 10086)
if (fetchdata.count || fetchdata.count === 0) {
let aCount = 0;
if (name === 'edit') {
aCount = fetchdata.count ? (fetchdata.count + 1) : 1;
} else if (name === 'quote') {
aCount = fetchdata.count ? (fetchdata.count + 1) : 1;
} }
if (fetchdata.count) {
form.setFieldsValue({ form.setFieldsValue({
count: fetchdata.count count: aCount
}) })
setCount(fetchdata.count)
handleTabs( fetchdata.count || 1) setCount(aCount);
handleTabs(aCount);
} }
}, [fetchdata]) }, [fetchdata])
...@@ -213,7 +248,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -213,7 +248,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
get: () => new Promise((resolve: any) => { get: () => new Promise((resolve: any) => {
form.validateFields().then(res => { form.validateFields().then(res => {
const detailss: any = []; const detailss: any = [];
dataSource.forEach(item => { data[0].forEach(item => {
console.log(item, 10086) console.log(item, 10086)
detailss.push({ detailss.push({
purchaseInquiryDetailsId: name === 'quote' ? item.id : item.purchaseInquiryDetailsId, purchaseInquiryDetailsId: name === 'quote' ? item.id : item.purchaseInquiryDetailsId,
...@@ -224,7 +259,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -224,7 +259,7 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
productId: item.productId, productId: item.productId,
goodsId: item.goodsId, goodsId: item.goodsId,
productBrand: item.productBrand, productBrand: item.productBrand,
productAttributeJson: '', productAttributeJson: item.productAttributeJson,
}) })
}) })
resolve({ resolve({
...@@ -239,7 +274,19 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -239,7 +274,19 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
}) })
}) })
} }
}, [dataSource]) }, [data])
const handleRadioGroup = (e) => {
const params = { ...data };
const { value } = e.target;
const index = e.target['data-index']
setCount(value);
setIdx(index);
if (!params[index]) {
const isTurn = value === 1 ? 1 : value - 1
fetchTableData(isTurn, index)
}
}
return ( return (
<Form <Form
...@@ -247,17 +294,17 @@ const OfferInfo: React.FC<IProps> = (props: any) => { ...@@ -247,17 +294,17 @@ const OfferInfo: React.FC<IProps> = (props: any) => {
className={style.offerStyle} className={style.offerStyle}
> >
<Form.Item name='count'> <Form.Item name='count'>
<Radio.Group> <Radio.Group onChange={handleRadioGroup}>
{tabs.length > 0 && tabs.map(item => { {tabs.length > 0 && tabs.map((item, index: any) => {
return ( return (
<Radio.Button key={item} value={item}>{item}</Radio.Button> <Radio.Button key={item} value={item} data-index={index}>{item}</Radio.Button>
) )
})} })}
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Table <Table
columns={columns} columns={columns}
dataSource={dataSource} dataSource={data[idx]}
rowClassName={style.editableRow} rowClassName={style.editableRow}
pagination={{ size: "small" }} pagination={{ size: "small" }}
rowKey='id' rowKey='id'
......
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