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

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

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