Commit ae76195d authored by 前端-钟卫鹏's avatar 前端-钟卫鹏

fix: 商品添加是否税率功能

parent c246086e
......@@ -53,6 +53,7 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
const [isBatchSetting, setIsBatchSetting] = useState<boolean>(false) //是否点击批量设置
const flagRef = useRef<boolean>(false)
const [isChangePriceType, setIsChangePriceType] = useState<boolean>(false) // 价格类型是否有变动
const [isTax, setIsTax] = useState<boolean>(true) // 是否含税
const [combineAttributeChangeFatories, setCombineAttributeChangeFatories] = useState<number>(0)
......@@ -660,6 +661,10 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
}, {})
}
const onChangeTax = (e) => {
setIsTax(e.target.checked)
}
return (<>
<Form
{...layout}
......@@ -773,9 +778,38 @@ const PriceAttributeForm: React.FC<Iprops> = (props) => {
</span>
}
valuePropName="checked"
initialValue={true}
>
<Checkbox disabled={planPrice !== 1}>允许使用会员折扣价购买</Checkbox>
</Form.Item>
<Form.Item
name="isTax"
label="是否含税"
valuePropName="checked"
initialValue={true}
>
<Checkbox onChange={onChangeTax}></Checkbox>
</Form.Item>
{
isTax ?
<Form.Item
name="tax"
label="税率"
rules={[
{
required: true,
message: '税率必须填写',
},
{
pattern: /^\d+(\.\d{1,2})?$/,
message: '税率仅限两位小数',
},
]}
>
<Input suffix="%" />
</Form.Item>
: null
}
</Form>
{/* 批量设置按钮 */}
{
......
......@@ -12,3 +12,5 @@ export const RemarkDetailContext = createContext<any>({})
// 待提交评标报告详情
export const ReportDetailContext = createContext<any>({})
// 待定标详情
export const ReadyConfirmBidContext = createContext<any>({})
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
}
.card-list_title {
font-size: 12px;
color: #909399;
}
import React, { useContext, useState } from 'react'
import { Row, Col } from 'antd'
import MellowCard from '@/components/MellowCard'
import { ReadyConfirmBidContext } from '@/pages/procurement/_public/bid/context';
import { formatTimeString } from '@/utils'
import style from './index.less'
import { CaretDownOutlined, CaretUpOutlined } from '@ant-design/icons';
import { BidInStateTexts, BidOutStateTexts, PURCHASE_TYPE } from '@/constants';
/**
* 基本信息
*/
interface IBasicInfo {
title?: string;
}
const BasicInfo: React.FC<IBasicInfo> = ({ title }) => {
const bidDetailContext = useContext(ReadyConfirmBidContext)
const { data, ctl } = bidDetailContext
const [showMore, setShowMore] = useState<boolean>(false)
const toogleMore = () => {
setShowMore(!showMore)
}
// 基本信息
const basicColumnList = [
{
span: 8,
fieldList: [
{ title: '招标编号:', name: 'code' },
{ title: '外部状态:', name: 'tenderOutStatus', render: (text) => BidOutStateTexts[text]},
{ title: '内部状态:', name: 'inviteTenderInStatus', render: (text) => BidInStateTexts[text] },
{ title: '发布时间:', name: 'createTime', render: (text) => formatTimeString(text) },
]
},
{
span: 8,
fieldList: [
{ title: '招标项目:', name: 'projectName' },
{ title: '项目预算:', name: 'budget' },
{ title: '采购类型:', name: 'purchaseType', render: (text) => PURCHASE_TYPE[text] },
{ title: '招标会员:', name: 'memberName' },
]
},
{
span: 8,
fieldList: [
{ title: '招标摘要:', name: 'remark' },
{
title: '适用地址:',
name: 'inviteTenderAreaList',
render: (t, r) => {
const showDataSource = showMore ? data['inviteTenderAreaList'] : [...data['inviteTenderAreaList']].splice(0, 3)
return <>
<p>
{
showDataSource.map((_item, _i) => <p key={`address${_i}`}>{_item.provinceName+'/'+(_item.cityName||'')}</p>)
}
</p>
{
data.length > 3 &&
<p onClick={toogleMore} style={{ cursor: 'pointer' }} className="commonPickColor">
展开{showMore ? <CaretDownOutlined /> : <CaretUpOutlined />}
</p>
}
</>
}
},
]
}
]
const RenderBasicInfoColumns = ({ infoList = [], dataSource }) => <Row>
{
infoList.map(({span, fieldList = []}, index) => (<Col key={index} span={span}>
{
fieldList.length ? fieldList.map((_v, _i) => <Row key={_v.name} className={style['card-list']} style={_v.rowStyle}>
{_v?.noTitle ? null : <Col span={6} className={style['card-list_title']}>{_v.title}</Col>}
<Col>{_v.render ? _v.render(dataSource[_v.name], dataSource) : dataSource[_v.name]}</Col>
</Row>) : null
}
</Col>))
}
</Row>
return (
<MellowCard
title={title}
style={{marginTop: 24}}
bordered={false}
fullHeight
>
<RenderBasicInfoColumns infoList={basicColumnList} dataSource={data} />
</MellowCard>)
}
BasicInfo.defaultProps = {}
export default BasicInfo
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Checkbox, Row, Col, InputNumber } from 'antd';
import style from '../../index.less'
/**
* 招标定标表格中 授标的每一项 待定标专用
*/
export interface GivenBidItemProps {
}
export const GivenBidItem:React.FC<GivenBidItemProps> = ({}) => {
const onChangeInput = (v) => {
console.log(v, '改变')
}
const chanegChecked = (e) => {
if(e.target.checked) {
e.nativeEvent.target.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.style.border = '1px solid #00B37A'
e.nativeEvent.target.parentElement.parentElement.nextSibling.style.display = 'inline-block'
} else {
e.nativeEvent.target.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.style.border = 'none'
e.nativeEvent.target.parentElement.parentElement.nextSibling.style.display = 'none'
}
}
return <div className={style.throwBidInfo}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>含税单价:</p></Col>
<Col><p>¥19.00</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>含税金额:</p></Col>
<Col><p>¥30000</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>是否含税:</p></Col>
<Col><p></p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>税率:</p></Col>
<Col><p>7%</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标:</p></Col>
<Col>
<p>
<Checkbox defaultChecked={false} style={{marginRight: 16}} onChange={chanegChecked} />
<InputNumber
defaultValue={100}
min={0}
max={100}
formatter={value => `${value}%`}
parser={value => value.replace('%', '')}
onChange={onChangeInput}
style={{display: 'none'}}
/>
</p>
</Col>
</Row>
</div>
</div>
}
GivenBidItem.defaultProps = {}
export default GivenBidItem
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Divider, Row, Col } from 'antd';
import style from '../../index.less'
/**
* 招标定标表格底部的 合计模块 待定标专用
*/
export interface TotalAmountProps {
}
export const TotalAmount:React.FC<TotalAmountProps> = ({}) => {
return <div className={style.totalWrapper}>
<Row>
<Col span={4}></Col>
<Col span={4}></Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价小计:</p></Col>
<Col><p>¥156,000.00(含税)</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价排名:</p></Col>
<Col><p>1</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>最低标价:</p></Col>
<Col><p>3</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价小计:</p></Col>
<Col><p>¥158,000.00(含税)</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价排名:</p></Col>
<Col><p>2</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>最低标价:</p></Col>
<Col><p>2</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价小计:</p></Col>
<Col><p>¥168,000.00(含税)</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价排名:</p></Col>
<Col><p>3</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>最低标价:</p></Col>
<Col><p>0</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价小计:</p></Col>
<Col><p>¥176,000.00(含税)</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价排名:</p></Col>
<Col><p>4</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>最低标价:</p></Col>
<Col><p>3</p></Col>
</Row>
</div>
</Col>
</Row>
<Divider dashed={true} style={{margin: 0, marginBottom: 8}} />
<Row>
<Col span={4}></Col>
<Col span={4}></Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标数量:</p></Col>
<Col><p>3</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标总额:</p></Col>
<Col><p>¥100,000.00(含税)</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标数量:</p></Col>
<Col><p>1</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标总额:</p></Col>
<Col><p>¥54,000.00(含税)</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标数量:</p></Col>
<Col><p>0</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标总额:</p></Col>
<Col><p>0</p></Col>
</Row>
</div>
</Col>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标数量:</p></Col>
<Col><p>3</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标总额:</p></Col>
<Col><p>0</p></Col>
</Row>
</div>
</Col>
</Row>
</div>
}
TotalAmount.defaultProps = {}
export default TotalAmount
.card-list {
font-size: 12px;
// line-height: 20px;
// margin-top: 24px;
// border: 1px solid #F4F5F7;
// padding: 12px;
p {
margin-bottom: 8px;
}
}
.card-list_title {
font-size: 12px;
color: #909399;
}
.bidConfirmWrapper {
:global {
.ant-row {
.ant-col {
.ant-row {
.ant-col-4 {
padding-top: 0;
padding-bottom: 0;
margin-bottom: 2px;
margin-top: 2px;
}
}
}
}
}
background: #F4F5F7;
.bidTableHead {
height: 32px;
line-height: 32px;
background: #F4F5F7;
border: 4px solid #F4F5F7;
color: #303133;
padding-left: 16px;
img {
width: 24px;
height: 24px;
}
.levelCircle {
display: inline-block;
width: 20px;
height: 20px;
line-height: 20px;
background: #EBECF0;
border-radius: 50%;
color: #909399;
margin-right: 8px;
text-align: center;
}
}
.materialInfo, .amountInfo, .throwBidInfo, .totalWrapper {
height: 162px;
background-color: #fff;
padding: 16px;
position: relative;
overflow: hidden;
}
.rankNumber {
width: 32px;
height: 32px;
font-size: 12px;
font-weight: 500;
color: #606266;
line-height: 44px;
border-radius: 50%;
background-color: #F4F5F7;
position: absolute;
top: -16px;
left: -16px;
text-align: right;
padding-right: 6px;
}
}
import React, { useContext, useState } from 'react'
import { Row, Col } from 'antd'
import MellowCard from '@/components/MellowCard'
import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import style from './index.less'
import level1 from '@/assets/imgs/rank1.png'
import level2 from '@/assets/imgs/rank2.png'
import level3 from '@/assets/imgs/rank3.png'
import TotalAmount from './components/totalAmount';
import GivenBidItem from './components/givenBidItem';
/**
* 招标定标 待定标专用
*/
export interface BidConfirmProps {
cardTitle?: string;
}
const BidConfirm: React.FC<BidConfirmProps> = ({cardTitle}) => {
const bidDetailContext = useContext(BidDetailContext)
const { data, ctl } = bidDetailContext
return (
<div id="bidConfirm">
<MellowCard
title={cardTitle}
style={{marginTop: 24}}
bordered={false}
fullHeight
>
<div className={style.bidConfirmWrapper}>
<Row gutter={[0, 4]}>
<Col span={24}>
<Row>
<Col span={4}><p className={style.bidTableHead}>采购物料</p></Col>
<Col span={4}><p className={style.bidTableHead}>采购数量</p></Col>
<Col span={4}><p className={style.bidTableHead}><img src={level1} alt="排名一"/>广州白马皮具交易中心</p></Col>
<Col span={4}><p className={style.bidTableHead}><img src={level2} alt="排名二"/>东莞绿洲皮具有限公司</p></Col>
<Col span={4}><p className={style.bidTableHead}><img src={level3} alt="排名三"/>江门华飞皮具有限公司</p></Col>
<Col span={4}><p className={style.bidTableHead}><span className={style.levelCircle}>4</span>广州万福皮具有限公司</p></Col>
</Row>
<Row gutter={[0, 4]} style={{margin: '0 4px'}}>
<Col span={4}>
<div className={style.materialInfo}>
<span className={style.rankNumber}>1</span>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>物料编号:</p></Col>
<Col><p>Q89YTE1</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>物料名称:</p></Col>
<Col><p>进口头层牛皮荔枝纹</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>规格型号:</p></Col>
<Col><p>红色/XL/厚1.5mm</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>品类:</p></Col>
<Col><p>牛皮</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>品牌:</p></Col>
<Col><p>PELLE</p></Col>
</Row>
</div>
</div>
</Col>
<Col span={4}>
<div className={style.amountInfo}>
<span>3000</span>
<br />
<span style={{color: "#909399"}}>(次)</span>
</div>
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
</Row>
<Row gutter={[0, 4]} style={{margin: '0 4px'}}>
<Col span={4}>
<div className={style.materialInfo}>
<span className={style.rankNumber}>2</span>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>物料编号:</p></Col>
<Col><p>Q89YTE1</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>物料名称:</p></Col>
<Col><p>进口头层牛皮荔枝纹</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>规格型号:</p></Col>
<Col><p>红色/XL/厚1.5mm</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>品类:</p></Col>
<Col><p>牛皮</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>品牌:</p></Col>
<Col><p>PELLE</p></Col>
</Row>
</div>
</div>
</Col>
<Col span={4}>
<div className={style.amountInfo}>
<span>3000</span>
<br />
<span style={{color: "#909399"}}>(次)</span>
</div>
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
<Col span={4}>
<GivenBidItem />
</Col>
</Row>
<Row gutter={[0, 4]} style={{margin: '0 4px'}}>
<Col span={24}>
<TotalAmount />
</Col>
</Row>
</Col>
</Row>
</div>
</MellowCard>
</div>)
}
BidConfirm.defaultProps = {}
export default BidConfirm
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
// border: 1px solid #F4F5F7;
// padding: 12px;
}
.card-list_title {
font-size: 12px;
color: #909399;
}
.participateContent {
border: 1px solid #F4F5F7;
padding: 12px;
margin-bottom: 16px;
border-top: 1px solid #00B37A;
}
.amount {
font-weight: bold;
border-bottom: 1px dashed #EBECF0;
margin-bottom: 0;
padding-bottom: 12px;
span {
color: #909399
}
}
import React, { useContext, useState } from 'react'
import { Table, Button, Radio, Tooltip, Row, Col } from 'antd'
import MellowCard from '@/components/MellowCard'
import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import { QuestionCircleOutlined, UserOutlined } from '@ant-design/icons';
import style from './index.less'
import CustomTag from '@/pages/procurement/components/CustomTag';
/**
* 会员参标信息 待定标专用
*/
export interface ParticipateInfoProps {
cardTitle?: string;
}
const ParticipateInfo: React.FC<ParticipateInfoProps> = ({cardTitle}) => {
const bidDetailContext = useContext(BidDetailContext)
const { data, ctl } = bidDetailContext
const mockData = [
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: true,
status: 1,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: false,
status: 1,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: false,
status: 2,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: true,
status: 1,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: true,
status: 0,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: true,
status: 1,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
{
company: '广州第三个官方工地公司',
amount: 13516,
isTax: true,
status: 2,
createTime: '2012-12-14 23:35:43',
no: 'HEGF05495',
},
]
return (
<div id="participateInfo">
<MellowCard
title={cardTitle}
style={{marginTop: 24}}
bordered={false}
fullHeight
>
<div className={style.participateWrapper}>
<Row gutter={[16, 0]}>
{
mockData.map((item, index) => (<Col span={4} key={index}>
<div className={style.participateContent}>
<div className={style.topWrapper}>
<h3>{item.company}</h3>
<p className={style.amount}>{item.amount}<span>{item.isTax ? ' (含税)' : ' (不含税)'}</span></p>
</div>
<div className={style.contentWrapper}>
<Row className={style['card-list']}>
<Col span={8} className={style['card-list_title']}>环节状态:</Col>
<Col>
<CustomTag type="out" status={item.status} />
</Col>
</Row>
<Row className={style['card-list']}>
<Col span={8} className={style['card-list_title']}>投标时间:</Col>
<Col>{item.createTime}</Col>
</Row>
<Row className={style['card-list']}>
<Col span={8} className={style['card-list_title']}>投标单号:</Col>
<Col>{item.no}</Col>
</Row>
</div>
</div>
</Col>
))
}
</Row>
</div>
</MellowCard>
</div>)
}
ParticipateInfo.defaultProps = {}
export default ParticipateInfo
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
border: 1px solid #F4F5F7;
padding: 12px;
&:hover {
.deleteMember {
display: block;
}
}
}
.card-list-dash {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
border: 1px dashed #D8DDE6;
padding: 12px;
cursor: pointer;
position: relative;
}
.deleteMember {
display: none;
width: 24px;
height: 24px;
text-align: center;
position: absolute;
right: 12px;
top: 24px;
border: none;
color: #fff;
background-color: rgba(0,0,0,0.4);
}
.card-list_title {
font-size: 12px;
color: #909399;
}
.headColor {
font-weight: 500;
color: #909399;
}
.rankContainer {
.levelCircle {
display: inline-block;
width: 20px;
height: 20px;
background: #EBECF0;
border-radius: 50%;
color: #909399;
margin-right: 8px;
text-align: center;
}
p {
display: flex;
justify-content: space-between;
margin-left: 8px;
}
h5 {
margin-left: 8px;
}
}
// .remarkBidReportWrapper {
// // 评标委员会
// .remarkCommitteeContainer {
// margin-bottom: 24px;
.committeeItem {
position: relative;
display: flex;
background-color: #FAFBFC;
text-align: center;
padding-top: 12px;
padding-left: 12px;
p {
align-items: center;
height: 56px;
line-height: 56px;
}
.avater {
width: 72px;
img {
width: 32px;
height: 32px;
}
p {
height: 12px;
font-size: 12px;
font-weight: 400;
color: #909399;
line-height: 12px;
}
}
.status {
position: absolute;
right: 0;
top: 0;
height: 12px;
font-size: 12px;
font-weight: 400;
color: #00B37A;
line-height: 12px;
padding: 2px 4px;
background-color: #E4F7EF;
}
.statusInfo {
color: #5243AA;
background-color: #6554C0;
}
.statusReceive {
color: #2266EE;
background-color: #F0F7FF;
}
.statusReject {
color: #D32F2F;
background-color: #FFF2F0;
}
}
// }
// 评标记录
.remarkRecordContainer {
.rankContent {
display: flex;
p {
img {
display: inline-block;
width: 24px;
height: 24px;
}
span {
&:first-child {
margin-right: 14px;
}
}
}
}
.remarkRecordHead {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
:global {
.ant-radio-button-wrapper:hover {
color: #606266;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
color: #fff;
background: #6B778C;
border-color: #6B778C;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)::before {
background-color: #6B778C;
}
.ant-table-thead > tr > th {
color: #909399;
}
}
.remarkFile {
.card-list {
margin-top: 12px;
border: none;
}
}
}
// }
import React, { useContext, useEffect, useRef, useState } from 'react'
import { Table, Button, Radio, Row, Col, message } from 'antd'
import MellowCard from '@/components/MellowCard'
import { UserOutlined, DeleteOutlined } from '@ant-design/icons';
import style from './index.less'
import imgLink from '@/assets/imgs/default_avatar.png'
import level1 from '@/assets/imgs/rank1.png'
import level2 from '@/assets/imgs/rank2.png'
import level3 from '@/assets/imgs/rank3.png'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd';
import { ExpertRectractStatus } from '@/constants';
import cx from 'classnames'
import { groupBy } from '../../../readySubmitReport/constant';
import { EditableCell, EditableRow } from '../../../readySubmitReport/components/remarkTableCell';
import { ReadyConfirmBidContext } from '@/pages/procurement/_public/bid/context';
/**
* 评标报告 待定标专用
*/
export interface RemarkBidReportProps {
cardTitle?: string;
addSchemaAction?: ISchemaFormActions | ISchemaFormAsyncActions;
}
const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
const { data, submitData, submitCtl } = useContext(ReadyConfirmBidContext)
const [transferRadio, setTransferRadio] = useState<number>(0)
const { fileList, recommandList, childTableData } = submitData
const { setFileList, setRecommandList, setChildrenTableData } = submitCtl
const [evaluationRecord, setEvaluationRecord] = useState<any>([])
const [childTableColumns, setChildrenTableColumns] = useState<any>([])
useEffect(() => {
// if(data?.evaluationTenderRecommendList.length) {
// setRecommandList(data.evaluationTenderRecommendList)
// }
if(data?.memberList.length) {
// 转换数据 生成评分项radio和所有分块表格
let dataSource: any = [], tempObject: any = {}
const { memberList } = data
for(let i = 0; i < memberList.length; i++) {
let item = memberList[i]
tempObject.id = item.id
tempObject.memberId = item.memberId
tempObject.memberName = item.memberName
// for(let j = 0; j < item.evaluationTenderList.length; j++) {
// let _item = item['evaluationTenderList'][j]
// tempObject.expertExtractRecordId = _item['expertExtractRecord']['id']
// tempObject.score = _item['score']
// tempObject.sort = _item['sort']
// tempObject.standard = _item['standard']
// tempObject.standardScore = _item['standardScore']
// tempObject.term = _item['term']
// dataSource.push({...tempObject})
// }
}
// 计算总分 计算平均分
const computedData = groupBy(dataSource, 'memberName')
const computedScore = Object.keys(computedData).map((item, index) => {
let expertNumber = Object.keys(groupBy(computedData[item], 'expertExtractRecordId')).length
let total = computedData[item].reduce((a, b) => a + b.score, 0)
return {
memberName: item,
total,
average: total/expertNumber,
expertNumber,
}
})
const dataBySort = groupBy(dataSource, 'sort')
setEvaluationRecord(dataBySort)
// 根据评标sort分类后的数据 遍历 分子表格
let childrenTableDataSource = [] // table data
let childTableDataColumns = [] // table columns
Object.keys(dataBySort).forEach((item, index) => {
let childTableData = []
let childTableColumns = [{
title: '会员', dataIndex: 'memberName', key: 'memberName',
render: (t, r, i) => renderRanking(t, r, ++i)
},
{
title: '修正总分', dataIndex: 'total', key: 'total', editable: true,
},
{
title: '平均分', dataIndex: 'average', key: 'average', className: 'commonHide'
}]
let childTableColumnResult = []
const childDataSource = groupBy(dataBySort[item], 'memberName')
Object.keys(childDataSource).forEach((_item, _index) => {
// 动态子表格列 // 合并同会员下的专家评标
// 相同同会员名下的分数数据 只需要取一个
const computedMemberScoreItem = computedScore.filter(_v => _v.memberName === _item)[0]
let objectItem: any = {
memberId: childDataSource[_item][0]['memberId'],
memberName: _item,
total: computedMemberScoreItem['total'],
average: computedMemberScoreItem['average'],
expertNumber: computedMemberScoreItem['expertNumber'],
}
let columns: any = []
childDataSource[_item].forEach((__item, __index) => {
columns.push({
title: <><UserOutlined />{__item['expertExtractRecordId']}</>,
dataIndex: __item['expertExtractRecordId'],
key: __item['expertExtractRecordId'],
})
objectItem[__item['expertExtractRecordId']] = __item['score']
})
childTableData.push(objectItem)
childTableColumnResult = childTableColumns.concat(columns)
})
childrenTableDataSource.push(childTableData.sort((a, b) => b.total - a.total))
childTableDataColumns.push(childTableColumnResult)
})
setChildrenTableData(childrenTableDataSource)
setChildrenTableColumns(childTableDataColumns)
}
}, [data])
const renderRanking = (t, r, i) => {
if(i === 1) {
return (<div className={style.rankContainer}>
<div className={style.rankContent}>
<p>
<img src={level1} alt="排名一"/>
</p>
<div>
<h5>{t}</h5>
<p><span>总分:{r.total}</span><span>平均分:{r.average}</span></p>
</div>
</div>
</div>)
} else if(i === 2){
return (<div className={style.rankContainer}>
<div className={style.rankContent}>
<p>
<img src={level2} alt="排名二"/>
</p>
<div>
<h5>{t}</h5>
<p><span>总分:{r.total}</span><span>平均分:{r.average}</span></p>
</div>
</div>
</div>)
} else if(i === 3) {
return (<div className={style.rankContainer}>
<div className={style.rankContent}>
<p>
<img src={level3} alt="排名三"/>
</p>
<div>
<h5>{t}</h5>
<p><span>总分:{r.total}</span><span>平均分:{r.average}</span></p>
</div>
</div>
</div>)
} else {
return (<div className={style.rankContainer}>
<div className={style.rankContent}>
<p>
<span className={style.levelCircle}>{i}</span>
</p>
<div>
<h5>{t}</h5>
<p><span>总分:{r.total}</span><span>平均分:{r.average}</span></p>
</div>
</div>
</div>)
}
}
const handleChangeType = (e) => {
setTransferRadio(e.target.value)
}
const deleteMemeber = (mid, index) => {
setRecommandList(() => {
return mid ? recommandList.filter(item => item.id !== mid) : recommandList.filter((item, _i) => _i !== index)
})
}
const components = {
body: {
row: EditableRow,
cell: EditableCell,
},
}
const handleSave = (row, index) => {
// 双重遍历childTableData数据 改变total和average
setChildrenTableData(() => {
return childTableData.map(element => {
return element.map(_e => {
if(_e.memberName === row.memberName) {
return {
..._e,
total: Number(row.total),
average: Number(row.total) / row.expertNumber
}
} else {
return _e
}
})
})
})
}
return (<>
<div id="remarkBidReport" className={style.remarkRecordContainer}>
<MellowCard
title={cardTitle}
style={{marginTop: 24}}
bordered={false}
fullHeight
>
<div className={style.remarkRecordHead}>
<h3 className="commonPanelTitle">评标记录</h3>
<Radio.Group value={transferRadio} buttonStyle="solid" size="small" onChange={handleChangeType}>
{
Object.keys(evaluationRecord).map((item, index) => (<Radio.Button key={index} value={index}>{item}</Radio.Button>))
}
</Radio.Group>
</div>
{
Object.keys(evaluationRecord).map((item, index) => {
// 处理列
const columns = childTableColumns[index].map(col => {
if (!col.editable) {
return col;
}
return {
...col,
onCell: (record: any) => ({
record,
editable: col.editable,
dataIndex: col.dataIndex,
title: col.title,
handleSave: (row) => handleSave(row, index),
}),
};
});
if(transferRadio === index) {
return <Table
key={index}
components={components}
dataSource={childTableData[index]}
columns={columns}
pagination={{size: "small"}}
/>
}
})
}
<div className={style.remarkBidMember}>
<h3 className="commonPanelTitle">推荐中标会员</h3>
<Row gutter={[16, 0]}>
{
recommandList?.length ? recommandList.map((item, index) => (<Col key={item.id} span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>会员:</p></Col>
<Col><p>{item.memberName}</p></Col>
</Row>
<Row>
<Col span={8}><p className={style['card-list_title']}>推荐人:</p></Col>
<Col><p>{item.userName}</p></Col>
</Row>
<Row>
<Col span={8}><p className={style['card-list_title']}>理由:</p></Col>
<Col><p>{item.reason}</p></Col>
</Row>
{
item?.id ? null : <span className={style.deleteMember} onClick={() => deleteMemeber(item.id, index)}><DeleteOutlined /></span>
}
</div>
</Col>
)) : null
}
</Row>
</div>
<div className={style.remarkFile}>
<h3 className="commonPanelTitle">评标附件</h3>
<div className={style['card-list']}>
<Row>
<Col span={4}><p className={style['card-list_title']}>附件:</p></Col>
<Col><p>2513561516</p></Col>
</Row>
</div>
</div>
</MellowCard>
</div>
</>)
}
RemarkBidReport.defaultProps = {}
export default RemarkBidReport
import React, { useEffect } from 'react'
import CustomTag from '@/pages/procurement/components/CustomTag'
import { BidInOpeartTexts, BidOutOpeartTexts } from "@/constants"
import { formatTimeString } from "@/utils"
export const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: 'TransferProcess' },
{ title: '基本信息', id: 'baseicInfo', type: 'basicInfo' },
{ title: '评标报告', id: 'remarkBidReport', componentName: 'RemarkBidReport' },
{ title: '会员参标信息', id: 'participateInfo', componentName: 'ParticipateInfo' },
{ title: '招标定标', id: 'bidConfirm', componentName: 'BidConfirm' },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
export const outReocrdCols: any[] = [
{
title: '流转顺序号',
dataIndex: 'no',
align: 'center',
key: 'no',
render: (_, __, index: number) => index + 1
},
{
title: '操作角色',
dataIndex: 'memberRoleName',
align: 'center',
key: 'memberRoleName',
},
{
title: '状态',
dataIndex: 'status',
align: 'center',
key: 'status',
render: text => <CustomTag status={text} type='out'/>
},
{
title: '操作',
dataIndex: 'operation',
align: 'center',
key: 'operation',
render: text => BidOutOpeartTexts[text]
},
{
title: '操作时间',
dataIndex: 'createTime',
align: 'center',
key: 'createTime',
render: time => formatTimeString(time)
},
{
title: '审核意见',
dataIndex: 'checkRemark',
align: 'center',
key: 'checkRemark',
},
]
export const insideRecordCols: any[] = [
{
title: '流转记录',
dataIndex: 'no',
align: 'center',
key: 'no',
render: (_, __, index: number) => index + 1
},
{
title: '操作人',
dataIndex: 'memberRoleName',
align: 'center',
key: 'memberRoleName',
},
{
title: '部门',
dataIndex: 'department',
align: 'center',
key: 'department',
},
{
title: '职位',
dataIndex: 'position',
align: 'center',
key: 'position',
},
{
title: '状态',
dataIndex: 'status',
align: 'center',
key: 'status',
render: text => <CustomTag status={text} type='inside' />
},
{
title: '操作',
dataIndex: 'operation',
align: 'center',
key: 'operation',
render: text => BidInOpeartTexts[text]
},
{
title: '操作时间',
dataIndex: 'createTime',
align: 'center',
key: 'createTime',
render: text => formatTimeString(text)
},
{
title: '审核意见',
dataIndex: 'checkRemark',
align: 'center',
key: 'checkRemark',
},
]
import React, { useState, useCallback, useRef, useContext, useEffect, createRef } from 'react';
import { history } from 'umi'
import { Button } from 'antd';
import { Button, Col, Row, Radio, Table } from 'antd';
import style from './index.less'
import OrderDetailWrapper from '@/pages/transaction/components/OrderDetailWrapper';
import PreLoading from '@/components/PreLoading';
import OrderPayModal from '@/pages/transaction/components/orderPayModal';
import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import { useBidDetail } from '@/pages/procurement/_public/bid/effects/useBidDetail';
import { ReadyConfirmBidContext } from '@/pages/procurement/_public/bid/context';
import BidDetailHeader from '@/pages/procurement/components/bidDetailHeader';
import BidDetailSection from '@/pages/procurement/components/bidDetailSection';
import { SendOutlined } from '@ant-design/icons';
import { anchorTitleList, insideRecordCols, outReocrdCols } from '../constant';
import { useConfirmDetail } from '../effects/useConfirmDetail';
import TransferProcess, { TransferEnum } from '@/pages/procurement/components/transferProcess';
import { findLastIndexFlowState } from '@/utils';
import MellowCard from '@/components/MellowCard';
import { PublicApi } from '@/services/api';
import BasicInfo from '../components/basicInfo';
import RemarkBidReport from '../components/remarkBidReport';
import ParticipateInfo from '../components/participateInfo';
import BidConfirm from '../components/bidConfirm';
const ReadyQualifityCheckedDetail: React.FC = () => {
const { formContext, id } = useBidDetail({type: 'callForBid'})
const {data} = formContext
const { formContext, id } = useConfirmDetail({type: 'callForBid'})
const { data, externalProcurementOrderLogResponses, interiorProcurementOrderLogResponses, submitData } = formContext
const payRef = useRef<any>({})
const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: 'TransferProcess' },
{ title: '基本信息', id: 'baseicInfo', type: 'basicInfo' },
{ title: '评标报告', id: 'remarkBidReport', componentName: 'RemarkBidReport' },
{ title: '会员参标信息', id: 'participateInfo', componentName: 'ParticipateInfo' },
{ title: '招标定标', id: 'bidConfirm', componentName: 'BidConfirm' },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
const [transferRadio, setTransferRadio] = useState<TransferEnum>(TransferEnum.Outer)
const [loading, setLoading] = useState<boolean>(false)
const RenderBasicInfoColumns = ({ infoList = [], dataSource }) => <Row>
{
infoList.map(({span, fieldList = []}, index) => (<Col key={index} span={span}>
{
fieldList.length ? fieldList.map((_v, _i) => <Row key={_v.name} className={style['card-list']} style={_v.rowStyle}>
{_v?.noTitle ? null : <Col span={6} className={style['card-list_title']}>{_v.title}</Col>}
<Col>{_v.render ? _v.render(dataSource[_v.name], dataSource) : dataSource[_v.name]}</Col>
</Row>) : null
}
</Col>))
}
</Row>
const handleChangeType = (e) => {
setTransferRadio(e.target.value)
}
const handleSubmit = () => {
setLoading(true)
console.log(submitData)
const {fileList, recommandList, childTableData} = submitData
let params: any = { id }
params.evaluationTenderRecommendList = recommandList.filter(item => !item?.id)
params.evaluationTenderFile = fileList
params.evaluationTenderReportMemberList = childTableData[0].map(item => ({ memberId: item.memberId, correctScore: item.total }))
PublicApi.postPurchaseExpertExtractReportSubmitEvaluationTenderReport(params).then(res => {
setLoading(true)
if(res.code === 1000) {
history.goBack()
} else {
setLoading(false)
}
})
}
return (
<div>
<BidDetailContext.Provider value={formContext}>
<ReadyConfirmBidContext.Provider value={formContext}>
<BidDetailHeader
formContext={formContext}
anchorList={anchorTitleList}
extraRight={
<Button type='primary'>
单据审核
<Button type='primary' icon={<SendOutlined />}>
提交定标
</Button>
}
/>
<OrderDetailWrapper>
<PreLoading loading={!formContext.data} active paragraph={{rows: 6}}>
<BidDetailSection formContext={formContext} anchorList={anchorTitleList} type="callForBid" />
<div id="transferProcess">
<TransferProcess
cardTitle='流转进度'
customTitleKey='name'
customKey='id'
outerVerifyCurrent={findLastIndexFlowState(formContext.externalWorkflowFlowRecordLogResponses)}
innerVerifyCurrent={findLastIndexFlowState(formContext.interiorWorkflowFlowRecordLogResponses)}
outerVerifySteps={
formContext.externalWorkflowFlowRecordLogResponses ?
formContext.externalWorkflowFlowRecordLogResponses.map(item => ({
...item,
status: item.isActive ? 'finish' : 'wait',
})) :
[]
}
innerVerifySteps={
formContext.interiorWorkflowFlowRecordLogResponses ?
formContext.interiorWorkflowFlowRecordLogResponses.map(item => ({
...item,
status: item.isActive ? 'finish' : 'wait',
})) :
[]
}
></TransferProcess>
</div>
<div id="baseicInfo">
<BasicInfo title="基本信息" />
</div>
{/* 评标报告 */}
<RemarkBidReport cardTitle="评标报告" />
{/* 会员参标信息 */}
<ParticipateInfo cardTitle="会员参标信息" />
{/* 招标定标 */}
<BidConfirm cardTitle="招标定标" />
<div id="transferRecord">
<MellowCard
title='流转记录'
style={{marginTop: 24}}
bordered={false}
extra={
<Radio.Group value={transferRadio} buttonStyle="solid" size="small" onChange={handleChangeType}>
{externalProcurementOrderLogResponses?.length ? <Radio.Button value={TransferEnum.Outer}>外部流转</Radio.Button> : null}
{interiorProcurementOrderLogResponses?.length ? <Radio.Button value={TransferEnum.Interior}>内部流转</Radio.Button> : null}
</Radio.Group>
}
className={style.cardWrap}
>
{
(externalProcurementOrderLogResponses?.length && transferRadio === TransferEnum.Outer) ?
<Table
columns={outReocrdCols}
dataSource={externalProcurementOrderLogResponses}
pagination={{ size: "small" }}
rowKey="id"
/> : null
}
{
(interiorProcurementOrderLogResponses?.length && transferRadio === TransferEnum.Interior) ?
<Table
columns={insideRecordCols}
dataSource={interiorProcurementOrderLogResponses}
pagination={{ size: "small" }}
rowKey="id"
/> : null
}
</MellowCard>
</div>
</PreLoading>
</OrderDetailWrapper>
<OrderPayModal
currentRef={payRef}
/>
</BidDetailContext.Provider>
</ReadyConfirmBidContext.Provider>
</div>
);
};
......
import React from 'react'
import { useCallback, useState, useEffect } from 'react'
import { usePageStatus } from '@/hooks/usePageStatus'
import { PublicApi } from '@/services/api'
import { message } from 'antd'
export const useConfirmDetail = (options: {}) => {
// 详情数据
const [formData, setFormData] = useState<any>(null)
// 流转记录数据(内/外)
const [interiorProcurementOrderLogResponses, setInteriorProcurementOrderLogResponses] = useState<any>(null)
const [externalProcurementOrderLogResponses, setExternalProcurementOrderLogResponses] = useState<any>(null)
// 流程状态数据(内/外)
const [interiorWorkflowFlowRecordLogResponses, setInteriorWorkflowFlowRecordLogResponses] = useState<any>(null)
const [externalWorkflowFlowRecordLogResponses, setExternalWorkflowFlowRecordLogResponses] = useState<any>(null)
// 提交报告的表单数据
const [fileList, setFileList] = useState<any>([])
const [recommandList, setRecommandList] = useState<any>()
const [childTableData, setChildrenTableData] = useState<any>([])
const { id } = usePageStatus()
useEffect(() => {
reloadFormData()
}, [])
const reloadFormData = useCallback(async () => {
if (id) {
const { code, data, message: msg } = await PublicApi.getPurchaseInviteTenderGetCheckFinishTender({inviteTenderId: id}, { ctlType: "none" })
if (code === 1000) {
setFormData(data)
} else {
message.error(msg)
}
const searchId = data.id
// 流转记录(内/外)
// 招投标
const inCheckRecordFn = PublicApi.getPurchaseInviteTenderInCheckRecordGetInviteTenderInCheckRecord
const inReocrdRes = await inCheckRecordFn({ inviteTenderId: searchId })
if (inReocrdRes.code === 1000) {
setInteriorProcurementOrderLogResponses(inReocrdRes.data)
}
const outCheckRecordFn = PublicApi.getPurchaseTenderOutCheckRecordGetTenderOutCheckRecord
const outRecordRes = await outCheckRecordFn({ inviteTenderId: searchId })
if (outRecordRes.code === 1000) {
setExternalProcurementOrderLogResponses(outRecordRes.data)
}
// 流程状态(内/外)
// 招投标
const processRes = await PublicApi.getPurchaseInviteTenderGetInviteTenderProcess({ inviteTenderId: searchId })
if(processRes.code === 1000 && processRes.data) {
setInteriorWorkflowFlowRecordLogResponses(processRes.data.subProcess.userTaskList)
setExternalWorkflowFlowRecordLogResponses(processRes.data.userTaskList)
}
}
}, [id])
// 需共享的状态
const formContext = {
data: formData,
interiorProcurementOrderLogResponses,
externalProcurementOrderLogResponses,
interiorWorkflowFlowRecordLogResponses,
externalWorkflowFlowRecordLogResponses,
ctl: {
setData: setFormData,
},
reloadFormData,
// 提交报告的表单数据
submitData: {
fileList,
recommandList,
childTableData
},
submitCtl: {
setFileList,
setRecommandList,
setChildrenTableData
}
}
return {
formContext,
id,
}
}
......@@ -14,6 +14,7 @@ import MellowCard from '@/components/MellowCard';
import { anchorTitleList, basicColumnList, evaluationColumnList, insideRecordCols, outReocrdCols } from '../constant';
import OnlineRemark from '../components/onlineRemark';
import { createFormActions } from '@formily/antd';
import { SendOutlined } from '@ant-design/icons';
const addSchemaAction = createFormActions()
......@@ -89,8 +90,8 @@ const ReadyExpertRemarkDetail: React.FC = () => {
formContext={formContext}
anchorList={anchorTitleList}
extraRight={
<Button type='primary' onClick={()=>addSchemaAction.submit()}>
单据审核
<Button type='primary' onClick={()=>addSchemaAction.submit()} icon={<SendOutlined />}>
提交报告
</Button>
}
/>
......
......@@ -11,6 +11,7 @@ import ApprovedModal from '@/pages/procurement/components/approvedModal';
import { usePageStatus } from '@/hooks/usePageStatus';
import { useHttpRequest } from '@/hooks/useHttpRequest';
import { PublicApi } from '@/services/api';
import { SendOutlined } from '@ant-design/icons';
const ReadySubmitBidDetail: React.FC = () => {
const { formContext, id } = useBidDetail({type: 'callForBid'})
......@@ -69,8 +70,8 @@ const ReadySubmitBidDetail: React.FC = () => {
formContext={formContext}
anchorList={anchorTitleList}
extraRight={
action ? <Button type='primary' onClick={handleClick}>
单据审核
action ? <Button type='primary' onClick={handleClick} icon={<SendOutlined />}>
提交招标
</Button> : null
}
/>
......
......@@ -14,6 +14,7 @@ import { findLastIndexFlowState } from '@/utils';
import RemarkBidReport from '../components/remarkBidReport';
import { createFormActions } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { SendOutlined } from '@ant-design/icons';
const addSchemaAction = createFormActions()
......@@ -66,8 +67,8 @@ const readySubmitReportDetail: React.FC = () => {
formContext={formContext}
anchorList={anchorTitleList}
extraRight={
<Button type='primary' onClick={handleSubmit} loading={loading}>
单据审核
<Button type='primary' onClick={handleSubmit} loading={loading} icon={<SendOutlined />}>
提交报告
</Button>
}
/>
......
import React, { useState, useCallback, useRef } from 'react';
import { Button } from 'antd';
import OrderDetailWrapper from '@/pages/transaction/components/OrderDetailWrapper';
import PreLoading from '@/components/PreLoading';
import OrderPayModal from '@/pages/transaction/components/orderPayModal';
......@@ -7,24 +6,30 @@ import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import { useBidDetail } from '@/pages/procurement/_public/bid/effects/useBidDetail';
import BidDetailHeader from '@/pages/procurement/components/bidDetailHeader';
import BidDetailSection from '@/pages/procurement/components/bidDetailSection';
import { BidOuterWorkState } from '@/constants';
const TenderSearchDetail: React.FC = () => {
const { formContext, id } = useBidDetail({type: 'callForBidInTender'})
const {data} = formContext
const { data } = formContext
const payRef = useRef<any>({})
const contentRef = useRef<any>({})
const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: "TransferProcess" },
{ title: '中标结果', id: 'bidResult', type: "bidResult" },
{ title: '中标明细', id: 'bidParticulars', componentName: "BidParticulars" },
{ title: '基本信息', id: 'baseicInfo', type: "basicInfo" },
{ title: '投标要求', id: 'tenderNeed', type: "bidNeed" },
{ title: '投标其他要求', id: 'tenderOtherNeed', type: "bidNeed" },
{ title: '投标商品', id: 'tenderParticulars', componentName: "BidParticulars" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: "TransferProcess" },
{ title: '中标结果', id: 'bidResult', type: "bidResult" },
{ title: '中标明细', id: 'bidParticulars', componentName: "BidParticulars" },
{ title: '基本信息', id: 'baseicInfo', type: "basicInfo" },
{ title: '投标要求', id: 'tenderNeed', type: "bidNeed" },
{ title: '投标其他要求', id: 'tenderOtherNeed', type: "bidNeed" },
{ title: '投标商品', id: 'tenderParticulars', componentName: "BidParticulars" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
// 没有完成的标 隐藏中标结果、中标明细
if(data?.inviteTender?.tenderOutStatus !== BidOuterWorkState.Finish_Invite_Tender) {
anchorTitleList.splice(1, 2)
}
return (
<div>
......
......@@ -5,6 +5,7 @@ import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import style from './index.less'
import { CaretDownOutlined, CaretRightOutlined } from '@ant-design/icons';
import { columns } from './constant';
import { PublicApi } from '@/services/api';
/**
* 中标明细和投标物料嵌套表格
......@@ -53,17 +54,10 @@ const BidParticulars: React.FC<BidParticularsProps> = ({cardTitle}) => {
return tempCol
})
const dataSource = [
{
key: 1,
name: <span>Q89YTE1<br />进口头层牛皮荔枝纹</span>,
age: '红色/XL/厚1.5mm',
address: '牛皮',
brand: 'PELLE',
number: <span>2000<br /></span>,
tax: <span><br />6%</span>,
price: "¥18.00",
amount: "¥38,000.00",
const onExpandRender = async (e, r) => {
setTableData(() => [...tableData].map(item => ({
...item,
description: <div className={style.childrenWrap}>
<Row>
<Col span={3}>
......@@ -74,42 +68,29 @@ const BidParticulars: React.FC<BidParticularsProps> = ({cardTitle}) => {
</Col>
<Col span={6}>
<div className={style.childrenContent}>
<p><span>商品编号:</span>Q89YTE1</p>
<p><span>商品名称:</span>进口头层黄牛皮荔枝纹</p>
<p><span>商品编号:</span>{r.code}</p>
<p><span>商品名称:</span>{r.name}</p>
</div>
</Col>
<Col span={6}>
<div className={style.childrenContent}>
<p><span>规格型号:</span>Q89YTE1</p>
<p><span>品类:</span>进口头层黄牛皮荔枝纹</p>
<p><span>规格型号:</span>{r.type}</p>
<p><span>品类:</span>{r.categoryName}</p>
</div>
</Col>
<Col span={6}>
<div className={style.childrenContent}>
<p><span>品牌:</span>Q89YTE1</p>
<p><span>品牌:</span>{r.brandName}</p>
</div>
</Col>
<Col span={3}>
{/* <Col span={3}>
<div className={style.childrenContent}>
<p><a>查看</a></p>
</div>
</Col>
</Col> */}
</Row>
</div>,
},
{
key: 2,
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
description: 'My name is Jim Green, I am 42 years old, living in London No. 1 Lake Park.',
},
];
// @todo 根据后端返回的commodityId查询商品信息渲染表格嵌套信息
const onExpandRender = (e, r) => {
console.log(e, r)
</div>
})))
}
return (<>
......
......@@ -455,33 +455,17 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
<RenderBasicInfoColumns infoList={Type_Data_Map[type]} dataSource={data} />
{
type === 'remarkNeed' ?
<div className={style['card-list']}>
<p className={style['card-list_title']}>评标专家列表:</p>
_data?.expertExtractList?.expertExtractList[0]?.expertExtractRecordList[0]?.expert.map((item, index) => (<div key={item.id} className={style['card-list']}>
<p className={style['card-list_title']}>评标专家列表:</p>
<p style={{backgroundColor: '#fafbfc'}}>
<Row>
<Col span={1}>1</Col>
<Col span={2}>大佬</Col>
<Col span={4}>kuaimeizheng@qq.com</Col>
<Col span={4}>全球总监</Col>
<Col span={1}>{++index}</Col>
<Col span={2}>{item.name}</Col>
<Col span={4}>{item.phone}</Col>
<Col span={4}>{item.userJobTitle}</Col>
</Row>
</p>
<p style={{backgroundColor: '#fafbfc'}}>
<Row>
<Col span={1}>1</Col>
<Col span={2}>大佬</Col>
<Col span={4}>kuaimeizheng@qq.com</Col>
<Col span={4}>宇宙总监</Col>
</Row>
</p>
<p style={{backgroundColor: '#fafbfc'}}>
<Row>
<Col span={1}>1</Col>
<Col span={2}>大佬</Col>
<Col span={4}>kuaimeizheng@qq.com</Col>
<Col span={4}>宇宙总监</Col>
</Row>
</p>
</div>
</div>))
: null
}
<Modal
......
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
margin-top: 12px; // 24
border: 1px solid #F4F5F7;
padding: 12px;
}
......@@ -102,4 +102,11 @@
}
}
}
// 评标附件
.remarkFileContainer {
margin-top: 20px;
.card-list {
border: none;
}
}
}
......@@ -10,7 +10,7 @@ import level2 from '@/assets/imgs/rank2.png'
import level3 from '@/assets/imgs/rank3.png'
/**
* 评标报告
* 评标报告 仅待定标后续使用
*/
export interface RemarkBidReportProps {
......@@ -150,71 +150,6 @@ const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
fullHeight
>
<div className={style.remarkBidReportWrapper}>
<div className={style.remarkCommitteeContainer}>
<h3 className="commonPanelTitle">评标委员会</h3>
<Row gutter={[16, 0]}>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
<Col span={4}>
<div className={style.committeeItem}>
<div className={style.avater}>
<img src={imgLink} alt="专家头像"/>
<p>系统抽取</p>
</div>
<p><span className={style['card-list_title']}>评委专家编号:</span>135</p>
<span className={style.status}>已评标</span>
</div>
</Col>
</Row>
</div>
<div className={style.remarkRecordContainer}>
<div className={style.remarkRecordHead}>
<h3 className="commonPanelTitle">评标记录</h3>
......@@ -271,32 +206,20 @@ const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
</Col>
</Row>
</div>
</div>
{/* <div className={style['card-list']}>
<Row>
<Col span={2}><p className={style['card-list_title']}>招标方式</p></Col>
<Col><p>{callForWay === 1 ? '系统匹配' : '公开招标'}</p></Col>
</Row>
</div>
{
callForWay === 1 ?
<Table dataSource={dataSource} columns={columns} pagination={{size: "small"}} />
:
<div className={style['card-list']}>
<Row>
<Col span={6}><p className={style['card-list_title']}>招标方式</p></Col>
<Col><p>{callForWay === 1 ? '系统匹配' : '公开招标'}</p></Col>
</Row>
<Row>
<Col span={6}><p className={style['card-list_title']}>招标方式</p></Col>
<Col><p>{callForWay === 1 ? '系统匹配' : '公开招标'}</p></Col>
</Row>
<Row>
<Col span={6}><p className={style['card-list_title']}>招标方式</p></Col>
<Col><p>{callForWay === 1 ? '系统匹配' : '公开招标'}</p></Col>
<div className={style.remarkFileContainer}>
<h3 className="commonPanelTitle">评标附件</h3>
<Row gutter={[16, 0]}>
<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>附件:</p></Col>
<Col><p>1234564566</p></Col>
</Row>
</div>
</Col>
</Row>
</div>
} */}
</div>
</MellowCard>)
}
......
......@@ -47,14 +47,25 @@ export const useSelfTable = () => {
render: (text, record) => formatTimeString(record.inviteTender.createTime),
width: 180
},
// {
// title: '报名开始/截止时间',
// align: 'left',
// dataIndex: 'memberRoleId',
// key: 'memberRoleId',
// render: (text, record) => <>
// <div><PlayCircleOutlined />&nbsp;{formatTimeString(record.inviteTender.registerStartTime)}</div>
// <div><PoweroffOutlined />&nbsp;{formatTimeString(record.inviteTender.registerEndTime)}</div>
// </>,
// width: 180
// },
{
title: '报名开始/截止时间',
title: '资格预审开始/截止时间',
align: 'left',
dataIndex: 'memberRoleId',
key: 'memberRoleId',
dataIndex: 'createTime',
key: 'createTime',
render: (text, record) => <>
<div><PlayCircleOutlined />&nbsp;{formatTimeString(record.inviteTender.registerStartTime)}</div>
<div><PoweroffOutlined />&nbsp;{formatTimeString(record.inviteTender.registerEndTime)}</div>
<div><PlayCircleOutlined />&nbsp;{formatTimeString(record.inviteTender.preCheckStartTime)}</div>
<div><PoweroffOutlined />&nbsp;{formatTimeString(record.inviteTender.preCheckEndTime)}</div>
</>,
width: 180
},
......
......@@ -6,23 +6,29 @@ import { BidDetailContext } from '@/pages/procurement/_public/bid/context';
import { useBidDetail } from '@/pages/procurement/_public/bid/effects/useBidDetail';
import BidDetailHeader from '@/pages/procurement/components/bidDetailHeader';
import BidDetailSection from '@/pages/procurement/components/bidDetailSection';
import { BidOuterWorkState } from '@/constants';
const TenderSearchDetail: React.FC = () => {
const { formContext, id } = useBidDetail({type: 'tender'})
const {data} = formContext
const { data } = formContext
const payRef = useRef<any>({})
const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: "TransferProcess" },
{ title: '中标结果', id: 'bidResult', type: "bidResult" },
{ title: '中标明细', id: 'bidParticulars', componentName: "BidParticulars" },
{ title: '基本信息', id: 'baseicInfo', type: "basicInfo" },
{ title: '投标要求', id: 'tenderNeed', type: "bidNeed" },
{ title: '投标其他要求', id: 'tenderOtherNeed', type: "bidNeed" },
{ title: '投标商品', id: 'tenderParticulars', componentName: "BidParticulars" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
const anchorTitleList = [
{ title: '流转进度', id: 'transferProcess', componentName: "TransferProcess" },
{ title: '中标结果', id: 'bidResult', type: "bidResult" },
{ title: '中标明细', id: 'bidParticulars', componentName: "BidParticulars" },
{ title: '基本信息', id: 'baseicInfo', type: "basicInfo" },
{ title: '投标要求', id: 'tenderNeed', type: "bidNeed" },
{ title: '投标其他要求', id: 'tenderOtherNeed', type: "bidNeed" },
{ title: '投标商品', id: 'tenderParticulars', componentName: "BidParticulars" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
// 没有完成的标 隐藏中标结果、中标明细
if(data?.inviteTender?.tenderOutStatus !== BidOuterWorkState.Finish_Invite_Tender) {
anchorTitleList.splice(1, 2)
}
return (
<div>
......
......@@ -6,13 +6,14 @@ import { formatTimeString } from '@/utils'
import { PlayCircleOutlined, PoweroffOutlined } from '@ant-design/icons'
import CustomTag from '@/pages/procurement/components/CustomTag'
import CustomBadge from '@/pages/procurement/components/customBadge'
import { BidOuterWorkState, TenderInsideWorkState } from '@/constants'
// 投标查询
export const useSelfTable = () => {
const ref = useRef<any>({})
const handlePreview = (param) => {
history.push(`/memberCenter/procurementAbility/tender/tenderSearch/detail?id=${param.inviteTender.id}`)
const handleEdit = (param) => {
history.push(`/memberCenter/procurementAbility/tender/readyAddTender/edit?id=${param.id}`)
}
const callForBidColumns: any[] = [
......@@ -87,15 +88,15 @@ export const useSelfTable = () => {
key: 'isSubMember',
render: (t, r) => <CustomBadge status={r.submitTenderInStatus} type='tenderInside' />
},
// {
// title: '操作',
// align: 'left',
// dataIndex: 'ctl',
// key: 'ctl',
// render: (text, record) => <>
// <Button type='link' onClick={() => handlePreview(record)}>查看</Button>
// </>
// }
{
title: '操作',
align: 'left',
dataIndex: 'ctl',
key: 'ctl',
render: (text, record) => record.submitTenderInStatus === TenderInsideWorkState.Submitted_Submit_Tender &&
record.tenderOutStatus === BidOuterWorkState.Not_Open_Tender &&
<Button type='link' onClick={() => handleEdit(record)}>修改</Button>
}
]
return {
......
......@@ -127,6 +127,9 @@ const ContractModalTable:React.FC<ContractModalTableProps> = (props) => {
tableProps={{
rowKey: 'id'
}}
resetModal={{
destroyOnClose: true,
}}
{...restProps}
/>
)
......
......@@ -105,6 +105,9 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
if(isNaN(_value) || _value < Number(record["minOrder"])) {
throw new Error(`数量不小于最小起订数${record["minOrder"]}`)
}
if(_value > Number.MAX_SAFE_INTEGER) {
throw new Error('数值溢出')
}
callback()
} catch (err) {
callback(err)
......
......@@ -132,8 +132,8 @@ export const orderTypeLabelMap = {
// "24": "积分兑换",
// "25": "渠道积分兑换",
"32": "采购询价合同",
"33": "采购竞价合同",
"34": "采购招标合同",
"33": "采购招标合同",
"34": "采购竞价合同",
}
// 支付方式
......
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