Commit f54f30b2 authored by 卢均锐's avatar 卢均锐

feat: 采购竞价&在线竞价 对接接口,修改字段 ,业务逻辑 ,增加组件

parent 010e89ab
......@@ -2,7 +2,11 @@ import React from 'react';
import { Typography } from 'antd';
import { LinkOutlined } from '@ant-design/icons';
const FilesItem = (props: any) => {
interface FilesItemProps {
files?: any
}
const FilesItem: React.FC<FilesItemProps> = (props: any) => {
const { files } = props;
if (files && files.length > 0) {
return (
......@@ -17,10 +21,10 @@ const FilesItem = (props: any) => {
)
})
)
}else{
} else {
return '-'
}
}
export default FilesItem
\ No newline at end of file
......@@ -2,6 +2,7 @@
background-color: #FAFBFC;
padding: 6px;
display: flex;
margin-bottom: 16px;
.box{
flex: 1;
display: flex;
......
......@@ -60,7 +60,7 @@ const BidCommonLayout: React.FC<BidCommonLayoutProps> = (props: any) => {
<div className={selfStyles.pieItem} key={key}>
<PieItem />
<div className={selfStyles.box}>
<div className={selfStyles.title}>中标金额(含税)</div>
<div className={selfStyles.title}>{child.label}</div>
<div className={selfStyles.price}>¥114,000.00</div>
</div>
</div>
......@@ -100,7 +100,7 @@ const BidCommonLayout: React.FC<BidCommonLayoutProps> = (props: any) => {
</div>
<div className={selfStyles.baseItem}>
<h5 className={selfStyles.label}>附件: </h5>
<h5 className={selfStyles.content}><FilesItem /></h5>
<h5 className={selfStyles.content}><FilesItem files={effect.returnUrls} /></h5>
</div>
</Col>
</Row>
......
......@@ -24,10 +24,12 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
const { awardProcess = [], materiels = [], isOpenPurchase, isOpenRanking } = detail;
const [showMore, setShowMore] = useState<boolean>(false);
const [activeItem, setActiveItem] = useState<any>(awardProcess?.[0] || { detailss: [] });
const [activeIndex, setActiveIndex] = useState<any>(awardProcess?.[0] || { detailss: [] });
const dataSource = showMore ? [...activeItem.detailss].splice(0, 4) : activeItem.detailss;
useEffect(() => {
awardProcess && setActiveItem(awardProcess?.[0] || { detailss: [] })
awardProcess && setActiveIndex(awardProcess?.[0] ? 0 : '')
}, [detail])
const columns: ColumnType<any>[] = [
......@@ -76,10 +78,11 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
},
]
const chooseItem = (item: any) => {
if (item.id !== activeItem.id) {
const chooseItem = (item: any, index: number) => {
if (index !== activeIndex) {
setShowMore(false);
setActiveItem(item);
setActiveIndex(index)
}
}
......@@ -93,8 +96,8 @@ const BidDetailLayout: React.FC<BidDetailLayoutProps> = (props: any) => {
<Row gutter={[8, 8]} style={{ marginBottom: '10px' }}>
{awardProcess?.map((item, index) => {
return (
<Col span={7} key={item.id} onClick={() => { chooseItem(item) }}>
<BtnItem btnType={btnType} detail={{ ...item, isOpenPurchase, isOpenRanking }} active={item.id === activeItem.id} />
<Col span={7} key={item.id} onClick={() => { chooseItem(item, index) }}>
<BtnItem btnType={btnType} detail={{ ...item, isOpenPurchase, isOpenRanking }} active={index === activeIndex} />
</Col>
)
})}
......
......@@ -20,11 +20,12 @@ export interface TableCommonLayoutProps {
id?: number,
number?: number,
fetch?: () => Promise<unknown>,
extra?: React.ReactNode
extra?: React.ReactNode,
effect?: any
}
const LowestQuotationRecord: React.FC<TableCommonLayoutProps> = (props: any) => {
const { layoutId, layoutTitle, id, number, fetch, extra } = props;
const { layoutId, layoutTitle, id, number, fetch, extra, effect } = props;
const currentRef = useRef({});
const columns = [
......@@ -53,7 +54,7 @@ const LowestQuotationRecord: React.FC<TableCommonLayoutProps> = (props: any) =>
},
{
title: '含税/税率',
dataIndex: 'purchaseCount',
dataIndex: 'isTax',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary'>{transforType[text]}</Text>
......@@ -63,12 +64,12 @@ const LowestQuotationRecord: React.FC<TableCommonLayoutProps> = (props: any) =>
},
{
title: '单价(含税)',
dataIndex: 'purchaseCount',
dataIndex: 'unitPrice',
render: (text: any, record: any) => <Text type='secondary'>¥{text}</Text>
},
{
title: '金额(含税)',
dataIndex: 'purchaseCount',
dataIndex: 'price',
render: (text: any, record: any) => <Text type='secondary'>¥{text}</Text>
},
];
......@@ -93,7 +94,7 @@ const LowestQuotationRecord: React.FC<TableCommonLayoutProps> = (props: any) =>
</div>
<div className={selfStyles.baseItem}>
<h5 className={selfStyles.label}>报价总额(含税): </h5>
<h5 className={selfStyles.content}></h5>
<h5 className={selfStyles.content}>{effect.sumAwardPrice}</h5>
</div>
<StandardTable
currentRef={currentRef}
......
......@@ -44,7 +44,7 @@ const RecordLayout: React.FC<ProgressProps> = (props: any) => {
title: '状态',
key: 'state',
dataIndex: 'state',
render: (_text: any, _record: any) => <Tag color={externalColors[_text]}>{_record.stateName}</Tag>
render: (_text: any, _record: any) => <Tag color={externalColors(_text)}>{_record.stateName}</Tag>
},
{
title: '操作',
......@@ -93,7 +93,7 @@ const RecordLayout: React.FC<ProgressProps> = (props: any) => {
title: '状态',
key: 'state',
dataIndex: 'state',
render: (_text: any, _record: any) => <Tag color={internalColors[_text]}>{_record.stateName}</Tag>
render: (_text: any, _record: any) => <Tag color={internalColors(_text)}>{_record.stateName}</Tag>
},
{
title: '操作',
......
......@@ -2,6 +2,8 @@ import React, { useRef, useState } from 'react';
import { StandardTable } from 'god';
import Card from '../../../card';
import EyePreview from '@/components/EyePreview';
import { Row, Col, Space, Button, Typography, Badge, Tag } from 'antd';
const { Text } = Typography;
export interface TableCommonLayoutProps {
layoutId?: string,
......@@ -11,6 +13,11 @@ export interface TableCommonLayoutProps {
fetch?: () => Promise<unknown>,
}
const transforType = {
1: '是',
0: '否'
}
const TableCommonLayout: React.FC<TableCommonLayoutProps> = (props: any) => {
const { layoutId, layoutTitle, id, number, fetch } = props;
const currentRef = useRef({});
......@@ -20,6 +27,12 @@ const TableCommonLayout: React.FC<TableCommonLayoutProps> = (props: any) => {
title: '物料编号/名称',
key: 'number',
dataIndex: 'number',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary'>{text}</Text>
<Text type='secondary'>{record.name}</Text>
</Space>
)
},
{
title: '规格型号',
......@@ -40,21 +53,35 @@ const TableCommonLayout: React.FC<TableCommonLayoutProps> = (props: any) => {
title: '采购数量/单位',
key: 'unit',
dataIndex: 'unit',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary'>{record.purchaseCount}</Text>
<Text type='secondary'>{text}</Text>
</Space>
)
},
{
title: '含税/税率',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
key: 'isTax',
dataIndex: 'isTax',
render: (text: any, record: any) => (
<Space direction='vertical'>
<Text type='secondary'>{transforType[text]}</Text>
<Text type='secondary'>{`${record.taxRate ? `${record.taxRate}%` : ''}`}</Text>
</Space>
)
},
{
title: '单价(含税)',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
key: 'unitPrice',
dataIndex: 'unitPrice',
render: (text: any, record: any) => <Text type='secondary'>¥{text}</Text>
},
{
title: '金额(含税)',
key: 'purchaseCount',
dataIndex: 'purchaseCount',
key: 'price',
dataIndex: 'price',
render: (text: any, record: any) => <Text type='secondary'>¥{text}</Text>
},
];
......
/** 价单外部状态颜色 */
export const BID_EXTERNALSTATE_COLOR = {
'-1': 'error',
99: 'success',
1: 'default',
2: 'warning',
3: 'warning',
4: 'warning',
5: 'default',
6: 'processing',
7: 'error',
8: 'error',
export const BID_EXTERNALSTATE_COLOR = (text) => {
switch (Number(text)) {
case -1:
case 7:
case 8:
return 'error';
case 2:
case 3:
case 4:
return 'warning';
case 6:
return 'processing';
case 99:
return 'success';
default:
return 'default'
}
}
// export const BID_EXTERNALSTATE_COLOR = {
// '-1': 'error',
// 99: 'success',
// 1: 'default',
// 2: 'warning',
// 3: 'warning',
// 4: 'warning',
// 5: 'default',
// 6: 'processing',
// 7: 'error',
// 8: 'error',
// }
/** 报价内部状态颜色 */
export const BID_INTERNALSTATE_COLOR = {
'-1': 'error',
99: 'success',
1: 'default',
2: 'warning',
3: 'warning',
4: 'processing',
8: 'error',
9: 'error',
10: 'default',
11: 'error',
12: 'processing',
13: 'warning',
14: 'warning',
15: 'warning',
}
\ No newline at end of file
export const BID_INTERNALSTATE_COLOR = (text) => {
switch (Number(text)) {
case -1:
case 8:
case 9:
case 11:
return 'error';
case 2:
case 3:
case 13:
case 14:
case 15:
return 'warning';
case 4:
case 12:
return 'processing';
case 99:
return 'success';
default:
return 'default';
}
}
// export const BID_INTERNALSTATE_COLOR = {
// '-1': 'error',
// 99: 'success',
// 1: 'default',
// 2: 'warning',
// 3: 'warning',
// 4: 'processing',
// 8: 'error',
// 9: 'error',
// 10: 'default',
// 11: 'error',
// 12: 'processing',
// 13: 'warning',
// 14: 'warning',
// 15: 'warning',
// }
\ No newline at end of file
.thankModal {
:global {
.ant-modal-header {
display: none;
}
.ant-modal-content {
height: 440px;
background: url("../../../../../../../assets/imgs/thankLetterBg.png") center center no-repeat;
// background: url('../../../../assets/imgs/thankLetterBg.png') center center no-repeat;
}
.ant-modal-footer {
display: none;
}
}
.thankLetter {
// width: 660px;
// height: 440px;
h2 {
text-align: center;
font-size: 24px;
font-weight: 500;
color: #303133;
// height: 36px;
// line-height: 36px;
padding-top: 20px;
}
h4 {
text-align: center;
font-size: 16px;
font-weight: 500;
color: #C0C4CC;
line-height: 16px;
padding: 0 24px;
}
p {
font-size: 14px;
font-weight: 400;
color: #303133;
line-height: 24px;
padding: 0 24px;
}
.name {
font-weight: 500;
text-align: left;
padding: 0 24px;
}
.company {
text-align: right;
padding: 0 24px;
margin-top: 100px;
}
.time {
text-align: right;
padding: 0 24px;
}
}
}
import React, { useMemo } from 'react'
import { Row, Col, Tag, Modal } from 'antd'
import moment from 'moment';
import { getAuth } from '@/utils/auth';
import style from './index.less'
interface ThankItemProps {
visible: boolean,
detail?: any,
onOk?: Function
}
const ThankItem: React.FC<ThankItemProps> = (props: any) => {
const { visible, detail, onOk } = props;
const userInfo = useMemo(() => getAuth(), [detail]);
return (
<Modal
title="感谢函"
visible={visible}
onOk={onOk}
onCancel={onOk}
width={660}
className={style.thankModal}
>
<div className={style.thankLetter}>
<h2>感谢函</h2>
<h4>THANKS LETTER</h4>
<p className={style.name}>尊敬的{userInfo.name}</p>
<p>{detail.content}</p>
<p className={style.company}>{detail.createMemberName}</p>
<p className={style.time}>{moment().format('YYYY-MM-DD')}</p>
</div>
</Modal>
)
}
export default ThankItem;
\ No newline at end of file
......@@ -18,6 +18,8 @@ import LowestQuotationRecordLayout from '../../components/detail/components/lowe
import BidProgressDrawer from '../../components/detail/components/bidProgressDrawer';
import QuotationDetailsDrawer from '../../components/detail/components/quotationDetailsDrawer';
import ThankModal from './components/thank';
import {
BID_EXTERNALSTATE_COLOR,
......@@ -31,8 +33,8 @@ const transforType = {
const TABLINK = [
{ id: 'progressLayout', title: '流转进度' },
// { id: 'winBidMsgLayout', title: '中标通知' },
// { id: 'winBidResultLayout', title: '中标结果' },
{ id: 'winBidMsgLayout', title: '中标通知' },
{ id: 'winBidResultLayout', title: '中标结果' },
{ id: 'basicLayout', title: '基本信息' },
{ id: 'materialLayout', title: '采购物料' },
{ id: 'bidRulesLayout', title: '竞价规则' },
......@@ -40,7 +42,6 @@ const TABLINK = [
{ id: 'conditionLayout', title: '交易条件' },
{ id: 'fileLayout', title: '附件' },
{ id: 'quotationRecordLayout', title: '最低报价记录' },
{ id: 'resultLayout', title: '授标结果' },
{ id: 'recordLayout', title: '流转记录' },
]
......@@ -48,7 +49,8 @@ const SearchDetail = () => {
const {
query: {
id,
number
number,
isPrize
},
pathname,
} = history.location;
......@@ -75,6 +77,8 @@ const SearchDetail = () => {
const [conditionEffect, setConditionEffect] = useState<any>([]);
// 授标结果
const [awardResult, setAwardResult] = useState<any>({});
const [thankVisAble, seTthankVisAble] = useState<boolean>(false);
const handleProgressEffect = (data: any) => {
let _list = [
......@@ -90,8 +94,8 @@ const SearchDetail = () => {
col: [
{ label: '竞价编号', extra: data.biddingNo, type: 'text' },
{ label: '竞价摘要', extra: data.details, type: 'text' },
{ label: '外部状态', extra: <Tag color={BID_EXTERNALSTATE_COLOR[data.externalState]}>{data.externalStateName}</Tag>, type: 'text' },
{ label: '内部状态', extra: <Badge status={BID_INTERNALSTATE_COLOR[data.interiorState]} text={data.interiorStateName} />, type: 'text' },
{ label: '外部状态', extra: <Tag color={BID_EXTERNALSTATE_COLOR(data.externalState)}>{data.externalStateName}</Tag>, type: 'text' },
{ label: '内部状态', extra: <Badge status={BID_INTERNALSTATE_COLOR(data.interiorState)} text={data.interiorStateName} />, type: 'text' },
]
},
{
......@@ -114,12 +118,13 @@ const SearchDetail = () => {
setResultEffect([
{
col: [
{ label: '中标公示', extra: '', type: 'text' }
{ label: '中标金额(含税)', extra: data.sumAwardPrice, type: 'text' },
{ label: '中标理由', extra: '价格最低', type: 'text' },
]
},
{
col: [
{ label: '中标通知', extra: '', type: 'text' }
{ label: '中标公示', extra: data.awardResults, type: 'text' },
]
}
])
......@@ -218,7 +223,11 @@ const SearchDetail = () => {
handleRulesEffect(data);
handleSignUpEffect(data);
handleConditionEffect(data);
handleAwardResult(data)
// handleAwardResult(data)
handleResultEffect(data);
if (data.externalState === 999 && isPrize !== 0 && isPrize) {
seTthankVisAble(true)
}
})
PublicApi.getPurchaseOnlineBiddingProcess({ ...params }).then(res => {
if (res.code !== 1000) {
......@@ -235,20 +244,7 @@ const SearchDetail = () => {
const _returnWinBidMsgLayout = () => {
return (
<BidCommonLayout layoutId="winBidMsgLayout" title="中标通知" effect={
[
{
col: [
{ label: '中标公示', extra: '温州龙昌手袋有限公司《进口头层黄牛皮荔枝纹采购》评标工作已经结束,中标人已经确定。现将中标结果公布如下:中标供应商:广州万富皮具有限中心(中标含税总金额¥114000.00),江门华飞皮具有限公司(中标含税总金额:¥38000.00)。中标理由:综合评分。', type: 'text' },
]
},
{
col: [
{ label: '中标公示', extra: '温州龙昌手袋有限公司《进口头层黄牛皮荔枝纹采购》评标工作已经结束,中标人已经确定。现将中标结果公布如下:中标供应商:广州万富皮具有限中心(中标含税总金额¥114000.00),江门华飞皮具有限公司(中标含税总金额:¥38000.00)。中标理由:综合评分。', type: 'text' },
]
}
]
} />
<BidCommonLayout layoutId="winBidMsgLayout" title="中标通知" effect={resultEffect} />
)
}
......@@ -257,6 +253,9 @@ const SearchDetail = () => {
<TableCommonLayout
layoutId='winBidResultLayout'
layoutTitle='中标结果'
id={id}
number={number}
fetch={PublicApi.getPurchaseOnlineBiddingAwardResultsBidding}
/>
)
}
......@@ -306,6 +305,7 @@ const SearchDetail = () => {
layoutId='quotationRecordLayout'
layoutTitle='最低报价记录'
fetch={PublicApi.getPurchaseOnlineBiddingMinimumBidding}
effect={dataSource}
extra={<Button type='link' onClick={() => { setProgressVisible(true) }}>查看竞价过程</Button>}
/>
)
......@@ -316,17 +316,6 @@ const SearchDetail = () => {
setQuotationDetailsVisible(true);
}
const _returnResultLayout = () => {
return (
<BidCommonLayout
layoutId="resultLayout"
title="授标结果"
layoutType='result'
checkDetailFunc={_openQuotationDetailsDrawer}
effect={awardResult} />
)
}
return (
......@@ -337,8 +326,8 @@ const SearchDetail = () => {
components={
<Fragment>
<ProgressLayout effect={progressEffect} />
{/* {_returnWinBidMsgLayout()} */}
{/* {_returnWinBidResultLayout()} */}
{_returnWinBidMsgLayout()}
{_returnWinBidResultLayout()}
<BidCommonLayout layoutId="basicLayout" title="基本信息" effect={basicEffect} />
{_returnMaterialLayout()}
{_returnBidRulesLayout()}
......@@ -346,7 +335,6 @@ const SearchDetail = () => {
{_returnConditionLayout()}
{_returnFileLayout()}
{_returnLowestQuotationRecordLayout()}
{_returnResultLayout()}
<RecordComontLayout externalColors={BID_EXTERNALSTATE_COLOR} internalColors={BID_INTERNALSTATE_COLOR} />
</Fragment>
}
......@@ -365,6 +353,11 @@ const SearchDetail = () => {
visible={quotationDetailsVisible}
onClose={() => setQuotationDetailsVisible(false)}
/>
<ThankModal
visible={thankVisAble}
detail={dataSource}
onOk={() => { seTthankVisAble(false) }}
/>
</Context.Provider>
)
}
......
.history {
border-radius: 8px;
overflow: hidden;
.historyHeader {
height: 209px;
background: -webkit-linear-gradient(top, rgba(91, 143, 249, 1), #FFFFFF);
padding: 16px;
h5 {
font-size: 14px;
color: #FFFFFF;
margin-bottom: 24px;
}
}
.box {
color: #909399;
font-size: 12px;
text-align: center;
position: relative;
background-color: #fff;
border-radius: 8px;
overflow: hidden;
.historyHeader {
height: 209px;
background: -webkit-linear-gradient(top, rgba(91,143,249, 1), #FFFFFF);
padding: 16px;
padding: 16px 0;
h5 {
font-size: 14px;
color: #FFFFFF;
margin-bottom: 24px;
}
.icon {
width: 24px;
position: absolute;
left: 16px;
top: 16px;
}
.badge {
width: 16px;
height: 16px;
background: #EBECF0;
border-radius: 12px;
text-align: center;
line-height: 16px;
color: #909399;
font-size: 12px;
display: inline-block;
position: absolute;
left: 16px;
top: 16px;
}
.box{
color: #909399;
.rightPosition {
position: absolute;
right: 16px;
top: 20px;
}
p {
margin: 0;
}
.currentPrice {
color: #303133;
font-size: 24px;
margin: 6px 0 12px 0;
span {
font-size: 12px;
text-align: center;
position: relative;
background-color: #fff;
border-radius: 8px;
padding: 16px 0;
.icon{
width: 24px;
position: absolute;
left: 16px;
top: 16px;
}
.rightPosition{
position: absolute;
right: 16px;
top: 20px;
}
p{
margin: 0;
}
.currentPrice{
color: #303133;
font-size: 24px;
margin: 6px 0 12px 0;
span{
font-size: 12px;
margin-right: 8px;
}
}
.row{
display: flex;
flex-direction: row;
justify-content: center;
.col{
flex: 1;
span{
color: #303133;
}
}
}
margin-right: 8px;
}
}
.historyFootter{
background-color: #FFFFFF;
padding: 16px;
h5{
font-size: 14px;
color: #303133;
margin-bottom: 16px;
.row {
display: flex;
flex-direction: row;
justify-content: center;
.col {
flex: 1;
span {
color: #303133;
}
}
}
}
.historyFootter {
background-color: #FFFFFF;
padding: 16px;
h5 {
font-size: 14px;
color: #303133;
margin-bottom: 16px;
}
}
\ No newline at end of file
}
}
......@@ -2,6 +2,8 @@ import React, { useMemo, useState } from 'react';
import { Row, Col, Tabs, Button } from 'antd';
import level1 from '@/assets/icons/the_first.png';
import level2 from '@/assets/icons/the_second.png';
import level3 from '@/assets/icons/the_third.png';
import TrendTag from '../../../../components/detail/components/trendTag';
......@@ -15,27 +17,37 @@ interface HistoryItemProps {
const HistoryItem: React.FC<HistoryItemProps> = (props: any) => {
const { detail } = props;
const mapData = detail.offerLogs ? [...detail.offerLogs].splice(0, 3) : [];
const currentMinPrice = useMemo(() => {
if (!detail.isOpenPurchase) {
return '不公开'
const _returnBadge = () => {
if (detail.isOpenRanking) {
return null;
} else {
return detail?.offerLogs != null ? (detail?.offerLogs[0]?.minPrice ? `${detail?.offerLogs[0]?.minPrice}` : '-') : '-'
const _number = Number(detail?.ranking);
switch (_number) {
case 1:
return <img src={level1} alt="第一名" className={styles.icon} />;
case 2:
return <img src={level1} alt="第二名" className={styles.icon} />;
case 3:
return <img src={level1} alt="第三名" className={styles.icon} />;
default:
return <div className={styles.badge}>{_number}</div>
}
}
}, [detail])
}
return (
<div className={styles.history}>
<div className={styles.historyHeader}>
<h5>报价历史</h5>
<div className={styles.box}>
<img src={level1} alt="第一名" className={styles.icon} />
{_returnBadge()}
<div className={styles.rightPosition}>
{detail?.offerRatio ? <TrendTag ratio={detail?.offerRatio} /> : ''}
</div>
<p>本次报价金额</p>
<p className={styles.currentPrice}><span>¥</span>{detail?.offerPrice || '-'}</p>
<div className={styles.row}>
<div className={styles.col} style={{ borderRight: '1px solid #EBECF0' }}>当前最低价:<span>{currentMinPrice}</span></div>
<div className={styles.col} style={{ borderRight: '1px solid #EBECF0' }}>当前最低价:<span>{detail?.minLowPrice ?? '-'}</span></div>
<div className={styles.col}>报价次数:<span>{detail?.offerCount ? detail?.offerCount : '-'}</span></div>
</div>
</div>
......
......@@ -68,12 +68,12 @@ const ReadyBid = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -67,12 +67,12 @@ const ReadySignUp = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......@@ -82,7 +82,7 @@ const ReadySignUp = () => {
onClick={() => {history.push(`/memberCenter/procurementAbility/onlineBid/readySignUp/signUp?id=${record.id}&number=${record.biddingNo}`)}}
type='link'
>
报名
{record.button === 3 ? '报名' : '重新报名'}
</Button>
}];
......
......@@ -32,7 +32,7 @@ const Search = () => {
render: (text: any, record: any) => (
<Space direction='vertical'>
<EyePreview
url={`/memberCenter/procurementAbility/onlineBid/search/detail?id=${record.id}&number=${record.biddingNo}`}>{text}</EyePreview>
url={`/memberCenter/procurementAbility/onlineBid/search/detail?id=${record.id}&number=${record.biddingNo}&isPrize=${record.isPrize}`}>{text}</EyePreview>
<Text type="secondary">{record.details}</Text>
</Space>
)
......@@ -71,12 +71,12 @@ const Search = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}];
return (
......
......@@ -54,8 +54,8 @@ const ConfirmBidResultModal: React.FC<ConfirmBidResultModalProps> = (props: any)
}
const _returnDefaultAwardResults = useMemo(() => {
return record ? `${record.MemberName}${record.details}》竞价工作已经结束,中标人已经确定。现将中标结果公布如下:
中标供应商:${record.MemberName}(中标总金额(含税):${record.sumAwardPrice})。
return record ? `${record?.purchaseMemberName ?? record?.createMemberName}${record.details}》竞价工作已经结束,中标人已经确定。现将中标结果公布如下:
中标供应商:${record.memberName}(中标总金额(含税):${record.sumAwardPrice})。
中标理由:价格最低` : '';
}, [record])
......
import React, { useState, useRef, useEffect } from 'react';
import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { SaveOutlined } from '@ant-design/icons';
import { Tabs, Card, Button, Badge } from 'antd';
import ReutrnEle from '@/components/ReturnEle';
import { PublicApi } from '@/services/api';
import Material from '../../purchaseInquiry/addInquiry/components/material';
import Demand from '../../purchaseInquiry/addInquiry/components/demand';
......@@ -14,7 +16,6 @@ import BidRequirement from './components/bidRequirement';
import Condition from './components/condition';
import File from './components/file';
import { PublicApi } from '@/services/api';
const { TabPane } = Tabs;
......@@ -198,7 +199,7 @@ const AddForm = () => {
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回" />}
extra={
<Button loading={loading} type="primary" onClick={handleSubmit}> 保存</Button>
<Button loading={loading} type="primary" onClick={handleSubmit}><SaveOutlined /> 保存</Button>
}
>
<Card>
......
......@@ -51,34 +51,30 @@ const ReadyAdd = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
dataIndex: 'operate',
render: (text: any, record: any) => <>
{
<>
<Popconfirm title="确定要提交审核吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button type='link'>
提交
</Button>
</Popconfirm>
<Dropdown overlay={() => (
<Menu onClick={(e) => handleMenuClick(e, record)}>
<Menu.Item key="1">编辑</Menu.Item>
<Menu.Item key="2">删除</Menu.Item>
</Menu>
)}>
<Button type='link'>更多<CaretDownOutlined /></Button>
</Dropdown>
</>
}
{record.button === 1 && <Popconfirm title="确定要提交审核吗?" okText="是" cancelText="否" onConfirm={() => fetchSubmitBatch(record.id)}>
<Button type='link'>
提交
</Button>
</Popconfirm>}
<Dropdown overlay={() => (
<Menu onClick={(e) => handleMenuClick(e, record)}>
<Menu.Item key="1">编辑</Menu.Item>
<Menu.Item key="2" disabled={!(record.button === 1)}>删除</Menu.Item>
</Menu>
)}>
<Button type='link'>更多<CaretDownOutlined /></Button>
</Dropdown>
</>
}];
......
......@@ -55,12 +55,12 @@ const ReadyBid = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -20,6 +20,7 @@ const DetailBottomDrawer: React.FC<DetailBottomDrawerProps> = (props: any) => {
const { visible, onClose, detail } = props;
const { awardProcess = [], materiels = [], offerCount, isOpenPurchase, isOpenRanking } = detail;
const [activeItem, setActiveItem] = useState<any>('');
const [activeIndex, setActiveIndex] = useState<any>('');
const [dataSource, setDataSource] = useState<any>(materiels);
const [dataSource2, setDataSource2] = useState<any>(materiels);
useEffect(() => {
......@@ -54,7 +55,7 @@ const DetailBottomDrawer: React.FC<DetailBottomDrawerProps> = (props: any) => {
},
{
title: '含税/税率',
dataIndex: 'isHasTaxName',
dataIndex: 'isTax',
render: (text: any, record: any) => <Input value={record.taxRate} onChange={(e) => { _changeTax(record, e.target.value) }} addonAfter="%" />
},
{
......@@ -74,6 +75,7 @@ const DetailBottomDrawer: React.FC<DetailBottomDrawerProps> = (props: any) => {
const _i = _dataSource.findIndex((item) => item.id === record.id);
let _item = { ..._dataSource[_i] };
_item.taxRate = value;
_item.isTax = value != 0 ? 1 : 0;
_dataSource[_i] = _item;
setDataSource(_dataSource);
setDataSource2(_dataSource)
......@@ -98,12 +100,14 @@ const DetailBottomDrawer: React.FC<DetailBottomDrawerProps> = (props: any) => {
return dataSource2?.reduce((total, cur) => total + (cur.price || 0), 0) || 0;
}, [dataSource2])
const chooseItem = (item?: any) => {
const chooseItem = (item?: any, index?: number) => {
if (item) {
setActiveItem(item);
setActiveIndex(index);
setDataSource(item.detailss);
} else {
setActiveItem('');
setActiveIndex('')
setDataSource(dataSource2);
}
}
......@@ -141,8 +145,8 @@ const DetailBottomDrawer: React.FC<DetailBottomDrawerProps> = (props: any) => {
</Col>
{awardProcess?.map((item, index) => {
return (
<Col span={7} key={`BtnItem_${item.id}`} onClick={() => { chooseItem(item) }}>
<BtnItem btnType={2} detail={{ ...item, isOpenPurchase, isOpenRanking }} active={item.id === activeItem.id} />
<Col span={7} key={`BtnItem_${item.id}`} onClick={() => { chooseItem(item, index) }}>
<BtnItem btnType={2} detail={{ ...item, isOpenPurchase, isOpenRanking }} active={index === activeIndex} />
</Col>
)
})}
......
......@@ -36,7 +36,7 @@ const ReadyConfirm = () => {
dataIndex: 'biddingNo',
render: (text: any, record: any) => (
<Space direction='vertical'>
<EyePreview url={`/memberCenter/procurementAbility/purchaseBid/readyConfirm/detail?id=${record.id}&number=${text}`}>{text}</EyePreview>
<EyePreview url={`/memberCenter/procurementAbility/purchaseBid/readyConfirm/detail?id=${record.id}&number=${text}&memberName=${record.memberName}`}>{text}</EyePreview>
<Text type='secondary'>{record.details}</Text>
</Space>
)
......@@ -66,12 +66,12 @@ const ReadyConfirm = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -55,12 +55,12 @@ const ReadyExamineOne = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -60,12 +60,12 @@ const ReadyExamineResultOne = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -61,12 +61,12 @@ const ReadyExamineResultTwo = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -68,12 +68,12 @@ const ReadyExamineSignUp = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -54,12 +54,12 @@ const ReadyExamineTwo = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -54,12 +54,12 @@ const ReadySubmit = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
......@@ -24,6 +24,7 @@ const ReadySubmitExamineResult = () => {
const ref = useRef<any>({});
const [rowkeys, setRowKeys] = useState<Array<number>>([]);
const [id, setId] = useState<number>();
const [buttonType, setButtonType] = useState<number>();
const [visible, setVisible] = useState<boolean>(false);
const columns: ColumnType<any>[] = [{
title: '竞价单号/摘要',
......@@ -31,7 +32,7 @@ const ReadySubmitExamineResult = () => {
dataIndex: 'biddingNo',
render: (text: any, record: any) => (
<Space direction='vertical'>
<EyePreview url={`/memberCenter/procurementAbility/purchaseBid/readySubmitExamineResult/detail?id=${record.id}&number=${text}`}>{text}</EyePreview>
<EyePreview url={`/memberCenter/procurementAbility/purchaseBid/readySubmitExamineResult/detail?id=${record.id}&number=${text}&button=${record.button}`}>{text}</EyePreview>
<Text type='secondary'>{record.details}</Text>
</Space>
)
......@@ -61,22 +62,23 @@ const ReadySubmitExamineResult = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
dataIndex: 'operate',
align: 'center',
render: (text: any, record: any) => <Button onClick={() => handleSubmit(record.id)} type='link'>提交审核</Button>
render: (text: any, record: any) => <Button disabled={!(record.button === 1 || record.button === 2)} onClick={() => handleSubmit(record.id, record.button)} type='link'>{record.button === 1 ? '修改' : '提交审核'}</Button>
}];
const handleSubmit = (id: number) => {
const handleSubmit = (id: number, type: number) => {
setId(id);
setButtonType(type);
setVisible(true);
}
......@@ -86,7 +88,8 @@ const ReadySubmitExamineResult = () => {
signUpIdea,
urls
}
PublicApi.postPurchaseBiddingSubmitExamineBiddingReturn(_params).then(res => {
const _fetch = buttonType === 1 ? PublicApi.postPurchaseBiddingUpdateBiddingReturn : PublicApi.postPurchaseBiddingSubmitExamineBiddingReturn;
_fetch(_params).then(res => {
if (res.code === 1000) {
setVisible(false);
ref.current.reload();
......
......@@ -53,7 +53,9 @@ const SearchDetail = () => {
query: {
id,
number,
signUpId //报名ID
signUpId, //报名ID
button, //按钮类型
memberName //中标供应商
},
pathname,
} = history.location;
......@@ -116,8 +118,8 @@ const SearchDetail = () => {
col: [
{ label: '竞价编号', extra: data.biddingNo, type: 'text' },
{ label: '竞价摘要', extra: data.details, type: 'text' },
{ label: '外部状态', extra: <Tag color={BID_EXTERNALSTATE_COLOR[data.externalState]}>{data.externalStateName}</Tag>, type: 'text' },
{ label: '内部状态', extra: <Badge status={BID_INTERNALSTATE_COLOR[data.interiorState]} text={data.interiorStateName} />, type: 'text' },
{ label: '外部状态', extra: <Tag color={BID_EXTERNALSTATE_COLOR(data.externalState)}>{data.externalStateName}</Tag>, type: 'text' },
{ label: '内部状态', extra: <Badge status={BID_INTERNALSTATE_COLOR(data.interiorState)} text={data.interiorStateName} />, type: 'text' },
]
},
{
......@@ -220,7 +222,8 @@ const SearchDetail = () => {
setAwardResult(
{
list: data.awardsFruits || [],
signUpIdea: data.signUpIdea
signUpIdea: data.signUpIdea,
returnUrls: data.returnUrls
}
)
}
......@@ -297,7 +300,7 @@ const SearchDetail = () => {
case 'readySubmitExamineResult':
return (
<Button onClick={() => setUploadBidResultVisible(true)} type='primary'>
<CheckCircleOutlined /> 提交竞价结果
<CheckCircleOutlined /> {button === 1 ? '修改' : '提交'}竞价结果
</Button>
)
case 'readyConfirm':
......@@ -561,8 +564,8 @@ const SearchDetail = () => {
signUpIdea,
urls
}
console.log(_params)
PublicApi.postPurchaseBiddingSubmitExamineBiddingReturn(_params).then(res => {
const _fetch = button === 1 ? PublicApi.postPurchaseBiddingUpdateBiddingReturn : PublicApi.postPurchaseBiddingSubmitExamineBiddingReturn;
_fetch(_params).then(res => {
if (res.code === 1000) {
history.goBack()
}
......@@ -603,7 +606,7 @@ const SearchDetail = () => {
/>
<ConfirmBidResultModal
title="确认竞价结果"
record={dataSource}
record={{ ...dataSource, memberName: memberName }}
visible={confirmBidResultVisible}
onCancel={() => setConfirmBidResultVisible(false)}
fetch={PublicApi.postPurchaseBiddingStayConfirmBidding}
......
......@@ -58,12 +58,12 @@ const Search = () => {
title: '外部状态',
key: 'externalState',
dataIndex: 'externalState',
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR[text]}>{record.externalStateName}</Tag>
render: (text: any, record: any) => <Tag color={BID_EXTERNALSTATE_COLOR(text)}>{record.externalStateName}</Tag>
}, {
title: '内部状态',
key: 'interiorState',
dataIndex: 'interiorState',
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR[text]} text={record.interiorStateName} />
render: (text: any, record: any) => <Badge status={BID_INTERNALSTATE_COLOR(text)} text={record.interiorStateName} />
}, {
title: '操作',
key: 'operate',
......
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