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

fix:

parent ab92be49
......@@ -404,8 +404,8 @@ export const ORDER_TYPE = ['',
'积分兑换',
'渠道积分兑换',
'采购询价合同',
'采购招标合同',
'采购竞价合同',
'采购招标合同'
]
// 提货方式
......
......@@ -54,7 +54,7 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
// 会员列
const [memberColumn, setMemberColumn] = useState<any>(() => {
inviteMemberColumns[inviteMemberColumns.length - 2].render = (text, record) => <Switch checked={text} onChange={(v) => onChangeState(v, record)} />
inviteMemberColumns[inviteMemberColumns.length - 2].render = (text, record, index) => <Switch checked={text} onChange={(v) => onChangeState(v, record, index)} />
inviteMemberColumns[inviteMemberColumns.length - 1].render = (text, record) => <Button type="link" target="blank" href={`/shop?shopId=${btoa(JSON.stringify({ roleId: record.roleId, memberId: record.memberId }))}`}>进入店铺</Button>
return [...inviteMemberColumns]
})
......@@ -82,10 +82,10 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
const { materialAddButton, materialColumns, materialComponents, ...sectionProps } = useMaterialTable(addSchemaAction, goodRef, drawerSchemaAction)
const onChangeState = (v, r) => {
const onChangeState = (v, r, i) => {
let originData = addSchemaAction.getFieldValue('memberList')
addSchemaAction.setFieldValue('memberList', originData.map(item => {
if(item.id === r.id) {
addSchemaAction.setFieldValue('memberList', originData.map((item, indx) => {
if(indx === i) {
return {...item, isSend: v}
} else {
return item
......@@ -211,6 +211,10 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
ctx.setFieldValue('isOnlineEvaluation', true)
}
if(pageStatus === PageStatus.EDIT) {
ctx.setFieldState('*(memberName, inviteTenderInStatus, tenderOutStatus, createTime)', state => state.visible = true)
}
$('onFieldValueChange', 'inviteTenderType').subscribe(state => {
if(state.value === PUBLIC_BID) {
if(pageStatus === PageStatus.EDIT && !publicFlag.current) {
......@@ -227,11 +231,6 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
} else if(state.value === INVITE_BID) {
}
if(pageStatus === PageStatus.ADD) {
ctx.setFieldState('*(memberName, inviteTenderInStatus, tenderOutStatus, createTime)', state => state.props.visible = true)
}
})
$('onFieldValueChange', 'isQualificationCheck').subscribe(state => {
......
......@@ -19,7 +19,7 @@ import { buildColumns, expertColumns, initConditionData, selectExpertColumns, se
import { selectBidSchema } from './schema/modal'
import { formatTimeString } from '@/utils'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
import { BidOuterWorkState } from '@/constants'
import { BidInsideWorkState, BidOuterWorkState } from '@/constants'
export interface AddRemarkBidCommitteeProps {}
......@@ -95,17 +95,23 @@ const AddRemarkBidCommittee:React.FC<AddRemarkBidCommitteeProps> = (props) => {
dataIndex: 'ctl',
title: '操作',
align: 'center',
render: (r, t) => pageStatus !== PageStatus.PREVIEW && <>
render: (t, r) => pageStatus !== PageStatus.PREVIEW && <>
<Button type="link">
查看
</Button>
<Button type="link">
<Button type="link" onClick={() => removeExpert(r)}>
删除
</Button>
</>
}
])
const removeExpert = (record) => {
const hasExpertList = addSchemaAction.getFieldValue('expertExtractRecordList')
const temp = hasExpertList.filter(item => item.expert.id !== record.expert.id)
addSchemaAction.setFieldValue('expertExtractRecordList', [...temp])
}
const handleSubmit = async (value) => {
console.log(value)
setBtnLoading(true)
......@@ -162,7 +168,11 @@ const AddRemarkBidCommittee:React.FC<AddRemarkBidCommitteeProps> = (props) => {
const fetchData = (params: any) => {
return new Promise((resolve, reject) => {
PublicApi.postPurchaseInviteTenderGetInviteTenderList({ ...params, tenderOutStatusList: [BidOuterWorkState.Not_Selection_Tender] }, { ctlType: "none" }).then(res => {
PublicApi.postPurchaseInviteTenderGetInviteTenderList({
...params,
inviteTenderInStatusList: [BidInsideWorkState.Not_Selection_Tender],
tenderOutStatusList: [BidOuterWorkState.Not_Selection_Tender]
}, { ctlType: "none" }).then(res => {
resolve(res.data)
})
})
......@@ -170,7 +180,7 @@ const AddRemarkBidCommittee:React.FC<AddRemarkBidCommitteeProps> = (props) => {
const fetchExpertData = (params: any) => {
return new Promise((resolve, reject) => {
PublicApi.getPurchaseExpertGetExpertList({ ...params }, { ctlType: "none" }).then(res => {
PublicApi.getPurchaseExpertGetExpertList({ ...params, status: true }, { ctlType: "none" }).then(res => {
resolve(res.data)
})
})
......
......@@ -18,10 +18,15 @@ const CallForBidsSearchDetail: React.FC = () => {
{ title: '招标物料', id: 'bidMaterial', componentName: "BidMaterial" },
{ title: '招标要求', id: 'bidNeed', type: "bidNeed" },
{ title: '报名要求', id: 'registerNeed', type: "registerNeed" },
// // 多条 @需后台返回对应字段才可显示确实模块信息
// { title: '报名信息', id: 'registerInfo', type: "registerInfo" },
{ title: '资格预审要求', id: 'checkNeed', type: "checkNeed" },
// { title: '资格预审信息', id: 'registerInfo', type: "registerInfo" },
{ title: '评标要求', id: 'remarkNeed', type: "remarkNeed" },
{ title: '评标报告', id: 'remarkBidReport', componentName: "RemarkBidReport" },
{ title: '其他要求', id: 'otherNeed', type: "otherNeed" },
{ title: '招标方式', id: 'bidWay', componentName: "BidMethod" },
// { title: '招标结果', id: 'bidConfirm', componentName: "BidConfirm" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
......
......@@ -36,24 +36,38 @@ const ReadyAddBid:React.FC<ReadyAddBidProps> = (props) => {
const { loading: submitLoading, run: submitRun } = useHttpRequest(PublicApi.postPurchaseInviteTenderApplyCheckInviteTender)
const { columns, ref, rowSelection, rowSelectionCtl } = useSelfTable()
// 批量删除
const handleMenuClick = async (e) => {
switch(e.key) {
case '1': {
// 批量删除
const canDelete = !rowSelectionCtl.selectRow.some(v => v.inviteTenderInStatus !== BidInsideWorkState.Not_Submitted_Check_Invite_Tender)
if (canDelete) {
const { code } = await deleteRun({idList: rowSelectionCtl.selectedRowKeys})
if (code === 1000) {
ref.current.reload()
rowSelectionCtl.setSelectRow([])
rowSelectionCtl.setSelectedRowKeys([])
}
} else {
message.error('只能删除内部状态为待提交审核且从未提交过审核的招标')
}
break;
// // 批量删除
// const handleMenuClick = async (e) => {
// switch(e.key) {
// case '1': {
// // 批量删除
// const canDelete = !rowSelectionCtl.selectRow.some(v => v.inviteTenderInStatus !== BidInsideWorkState.Not_Submitted_Check_Invite_Tender)
// if (canDelete) {
// const { code } = await deleteRun({idList: rowSelectionCtl.selectedRowKeys})
// if (code === 1000) {
// ref.current.reload()
// rowSelectionCtl.setSelectRow([])
// rowSelectionCtl.setSelectedRowKeys([])
// }
// } else {
// message.error('只能删除内部状态为待提交审核且从未提交过审核的招标')
// }
// break;
// }
// }
// }
const handleBitchRemove = async () => {
if(!rowSelectionCtl.selectRow.length) return message.error('请选择招标')
const canDelete = !rowSelectionCtl.selectRow.some(v => v.inviteTenderInStatus !== BidInsideWorkState.Not_Submitted_Check_Invite_Tender)
if (canDelete) {
const { code } = await deleteRun({idList: rowSelectionCtl.selectedRowKeys})
if (code === 1000) {
ref.current.reload()
rowSelectionCtl.setSelectRow([])
rowSelectionCtl.setSelectedRowKeys([])
}
} else {
message.error('只能删除内部状态为待提交审核且从未提交过审核的招标')
}
}
// 批量审核
......@@ -114,13 +128,14 @@ const ReadyAddBid:React.FC<ReadyAddBidProps> = (props) => {
新建
</Button>
<Button onClick={handleBitchPush} loading={submitLoading}>批量提交审核</Button>
<DropDeleteDown>
<Button onClick={handleBitchRemove} loading={submitLoading}>批量删除</Button>
{/* <DropDeleteDown>
<Menu onClick={(e) => handleMenuClick(e)}>
<Menu.Item key="1" icon={<DeleteOutlined />}>
批量删除
</Menu.Item>
</Menu>
</DropDeleteDown>
</DropDeleteDown> */}
</Space>,
layouts: {
span: 8
......
......@@ -91,6 +91,8 @@ const ReadyQualifityCheckedDetail: React.FC = () => {
history.goBack()
}
setLoading(false)
}).catch(() => {
setLoading(false)
})
}
......
......@@ -35,7 +35,17 @@ const OnlineRemark: React.FC<RemarkBidReportProps> = ({cardTitle, addSchemaActio
const onBlurInput = (v, index) => {
const hasValues = addSchemaAction.getFieldValue('evaluationTenderList')
if(hasValues.length) {
addSchemaAction.setFieldValue('evaluationTenderList', hasValues.map(item => ({...item, isRecommend: true, reason: v.target.value})))
addSchemaAction.setFieldValue('evaluationTenderList', hasValues.map((item, _i) => {
if(index === _i) {
return {
...item,
isRecommend: true,
reason: v.target.value
}
} else {
return {...item}
}
}))
}
}
......
......@@ -234,7 +234,7 @@ export const noticeSchema: ISchema = {
children: "发送中标通知"
},
"x-component": "checkboxsingle",
default: false,
default: true,
},
winTenderNoticeContent: {
type: 'textarea',
......@@ -279,7 +279,7 @@ export const noticeSchema: ISchema = {
children: "发送感谢信"
},
"x-component": "checkboxsingle",
default: false,
default: true,
},
winTenderThanksContent: {
type: 'textarea',
......
......@@ -231,24 +231,26 @@ const ReadySendBidNoticeDetail: React.FC = () => {
beforeUpload
}}
effects={($, ctx) => {
const applyBuines = data.memberList.map(item => `${item.memberName}(中标总金额¥${item.amount})`)
const text = `${data.memberName}《${data.projectName}》评标工作已经结束,中标人已经确定。现将中标结果公布如下:
const applyBuines = data.memberList.map(item => `${item.memberName}(中标总金额¥${item.amount})`)
const text = `${data.memberName}《${data.projectName}》评标工作已经结束,中标人已经确定。现将中标结果公布如下:
中标供应商:${applyBuines.toString()}。
中标理由:${data.winTenderReason}。`
$('onFieldInit', 'winTenderAnnounceContent').subscribe(() => {
$('onFieldInit', 'winTenderAnnounceContent').subscribe(() => {
ctx.setFieldValue('winTenderAnnounceContent', text)
})
ctx.setFieldValue('winTenderAnnounceContent', text)
})
$('onFieldInit', 'winTenderNoticeContent').subscribe(() => {
$('onFieldInit', 'winTenderNoticeContent').subscribe(() => {
ctx.setFieldValue('winTenderNoticeContent', text)
})
ctx.setFieldValue('winTenderNoticeContent', text)
})
$('onFieldInit', 'winTenderThanksContent').subscribe(() => {
const thinkText = `贵公司参与了我公司《${data.projectName}》竞标。在我公司综合各投标单位的基本情况,并进行充分技术交流后,经评标委员会综合评定,贵公司未能中标。我公司对贵公司的积极参与和支持深表感谢!希望下次合作成功。`
$('onFieldInit', 'winTenderThanksContent').subscribe(() => {
ctx.setFieldValue('winTenderThanksContent', thinkText)
})
ctx.setFieldValue('winTenderThanksContent', thinkText)
})
}}
/>
</ReadySendBidNoticeContext.Provider>
......
import React, { useRef } from 'react'
import { Button } from 'antd'
import { history } from 'umi'
import { baseBidListColumns } from '@/pages/procurement/constants'
import EyePreview from '@/components/EyePreview'
import { CALLFORBID_TYPE, PURCHASE_TYPE } from '@/constants'
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'
// 待发送中标公示 招标
export const useSelfTable = () => {
......@@ -10,6 +15,50 @@ export const useSelfTable = () => {
const handleSubmit = async (record) => {
history.push(`/memberCenter/procurementAbility/callForBids/readySendBidNotice/detail?id=${record.id}`)
}
const baseBidListColumns: any[] = [
{
title: '招标编号/项目',
align: 'left',
dataIndex: 'code',
key: 'code',
render: (text, record) => <>
<EyePreview url={`${history.location.pathname}/detail?id=${record.id}`}>
{text}
</EyePreview>
<div>{record['projectName']}</div>
</>
},
{
title: '采购类型',
align: 'left',
dataIndex: 'purchaseType',
key: 'purchaseType',
render: (t) => PURCHASE_TYPE[t]
},
{
title: '招标方式',
align: 'left',
dataIndex: 'inviteTenderType',
key: 'inviteTenderType',
render: (t) => CALLFORBID_TYPE[t]
},
{
title: '外部状态',
align: 'left',
dataIndex: 'tenderOutStatus',
key: 'tenderOutStatus',
render: text => <CustomTag status={text} type='out' />
},
{
title: '内部状态',
align: 'left',
dataIndex: 'inviteTenderInStatus',
key: 'inviteTenderInStatus',
render: (text) => <CustomBadge status={text} type='inside' />
},
]
const secondColumns: any[] = baseBidListColumns.concat([
{
title: '操作',
......
......@@ -25,7 +25,7 @@ export const tableListSchema: ISchema = {
}
},
properties: {
inviteTenderProjectName: {
projectName: {
type: 'string',
'x-component-props': {
placeholder: '请输入招标项目',
......
......@@ -58,7 +58,7 @@ const TenderSearch: React.FC<{}> = () => {
useStateFilterSearchLinkageEffect(
$,
actions,
'code',
'inviteTenderCode',
FORM_FILTER_PATH,
);
},
......
......@@ -8,7 +8,7 @@ import { BidOutStateTexts } from '@/constants';
export const tableListSchema: ISchema = {
type: 'object',
properties: {
code: {
inviteTenderCode: {
type: 'string',
"x-component": 'SearchFilter',
'x-component-props': {
......
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Checkbox, Row, Col, InputNumber } from 'antd';
import style from '../../index.less'
import { ReadyConfirmBidContext } from '@/pages/procurement/_public/bid/context';
import checkmark from '@/assets/imgs/checkmark_circle.png'
/**
* 招标定标表格中 授标的每一项
* 招标定标表格中 授标的每一项 待审核专用
*/
export interface GivenBidItemProps {
/** 当前行数据 */
currentData: any;
/** 所有数据 */
datas: any;
/** 当前渲染的列索引等 */
currentColumn: any;
/** 所有的列索引 */
columns: any;
/** 当前列索引 */
currentIndex: any;
}
export const GivenBidItem:React.FC<GivenBidItemProps> = ({}) => {
export const GivenBidItem:React.FC<GivenBidItemProps> = ({
currentData,
datas,
currentColumn,
columns,
currentIndex
}) => {
const { submitData, submitCtl } = useContext(ReadyConfirmBidContext)
// const { paramsTableData: tableDataSource, simulateColumn: tableColumns } = submitData
const { setParamsTableData: setTableDataSource, setSimulateColumn: setTableColumns } = submitCtl
const onChangeInput = (v) => {
console.log(v, '改变')
setTableDataSource(() => {
const newData = [...datas]
const currentRow = newData[currentIndex]
currentRow[currentColumn.dataIndex]['awardRate'] = v
newData.splice(currentIndex, 1, currentRow)
return newData
})
}
console.log(currentData, 'current')
const chanegChecked = (e) => {
const ev: any = window.event || e;
const path = ev.path || (ev.composedPath && ev.composedPath());
setTableDataSource(() => {
const newData = [...datas]
const currentRow = newData[currentIndex]
currentRow[currentColumn.dataIndex]['isAwardTender'] = e.target.checked
// 默认100
currentRow[currentColumn.dataIndex]['awardRate'] = 100
newData.splice(currentIndex, 1, currentRow)
return newData
})
if(e.target.checked) {
path[6].style.border = '1px solid #00B37A'
path[6].nextSibling.style.display = 'inline-block'
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 {
path[6].style.border = '1px solid #F4F5F7'
path[6].nextSibling.style.display = 'none'
e.nativeEvent.target.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.style.border = 'none'
e.nativeEvent.target.parentElement.parentElement.nextSibling.style.display = 'none'
}
}
// 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 = '1px solid #F4F5F7'
// 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>
<Col><p>{currentData[currentColumn.dataIndex]['price']}</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>
<Col><p>{(currentData[currentColumn.dataIndex]['price'] * currentData['count']).toFixed(2)}</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>
<Col><p>{currentData[currentColumn.dataIndex]['isTax'] ? '是' : '否'}</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>
<Col><p>{currentData[currentColumn.dataIndex]['taxRate']}</p></Col>
</Row>
</div>
<div className={style['card-list']}>
......@@ -67,16 +95,24 @@ export const GivenBidItem:React.FC<GivenBidItemProps> = ({}) => {
<Col span={8}><p className={style['card-list_title']}>授标:</p></Col>
<Col>
<p>
<Checkbox defaultChecked={false} style={{marginRight: 16}} onChange={chanegChecked} />
{
currentData[currentColumn.dataIndex]['isAwardTender']
?
<span>{currentData[currentColumn.dataIndex]['awardRate']}%&nbsp;&nbsp;<img src={checkmark} alt="已授标" style={{width: 12, height: 12}} /></span>
:
<span></span>
}
{/* <Checkbox defaultChecked={currentData[currentColumn.dataIndex]['isAwardTender']} style={{marginRight: 16}} onChange={chanegChecked} />
<InputNumber
defaultValue={100}
defaultValue={currentData[currentColumn.dataIndex]['awardRate']}
min={0}
max={100}
formatter={value => `${value}%`}
parser={value => value.replace('%', '')}
onChange={onChangeInput}
style={{display: 'none'}}
/>
/> */}
</p>
</Col>
</Row>
......
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Divider, Row, Col } from 'antd';
import React from 'react'
import { Divider, Row, Col } from 'antd';
import style from '../../index.less'
/**
* 招标定标表格底部的 合计模块
* 招标定标表格底部的 合计模块 待审核专用
*/
export interface TotalAmountProps {
/** 所有需要的数据 */
datas: any;
columns: any;
}
export const TotalAmount:React.FC<TotalAmountProps> = ({}) => {
export const TotalAmount:React.FC<TotalAmountProps> = ({
datas,
columns,
}) => {
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>
{
columns.map((item, index) => index > 1 ? (<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价小计:</p></Col>
<Col>
<p>¥{ (datas.reduce((a, b) => a + b[item.dataIndex]['price'] * b.count, 0)).toFixed(2) }(含税)</p>
</Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>报价排名:</p></Col>
<Col><p>{index - 1}</p></Col>
</Row>
</div>
</Col>) : null)
}
</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>
{
columns.map((item, index) => index > 1 ? (<Col span={4}>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标数量:</p></Col>
<Col><p>{datas.reduce((a, b) => a + b[item.dataIndex]['isAwardTender'] ? 1 : 0, 0)}</p></Col>
</Row>
</div>
<div className={style['card-list']}>
<Row>
<Col span={8}><p className={style['card-list_title']}>授标总额:</p></Col>
<Col><p>¥{datas.reduce((a, b) => a + b[item.dataIndex]['isAwardTender'] ? (b[item.dataIndex]['price'] * b.count * b[item.dataIndex]['awardRate'] / 100).toFixed(2) : 0, 0)}(含税)</p></Col>
</Row>
</div>
</Col>) : null)
}
</Row>
</div>
}
......
......@@ -13,7 +13,7 @@ import {
} from 'bizcharts';
import Interval from 'bizcharts/lib/geometry/Interval'
import DataSet from "@antv/data-set";
import { BidInStateTexts, BidOutStateTexts, PURCHASE_TYPE } from '@/constants';
import { BidInStateTexts, BidOuterWorkState, BidOutStateTexts, PURCHASE_TYPE } from '@/constants';
import { PublicApi } from '@/services/api';
import moment from 'moment';
......@@ -39,12 +39,12 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
// 处理和投标有关的数据格式
const data = apiType === 'callForBid' ? _data : _data.inviteTender
console.log(data, _data)
const toogleMore = () => {
setShowMore(!showMore)
}
// 基本信息
// 基本信息——招标
const basicColumnList = [
{
span: 8,
......@@ -91,6 +91,60 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
]
}
]
// 基本信息——投标
const basicTenderColumnList = [
{
span: 8,
fieldList: [
{ title: '投标编号:', name: 'code', render: () => _data['code'] },
{ title: '外部状态:', name: 'tenderOutStatus', render: (text) => BidOutStateTexts[text]},
{ title: '内部状态:', name: 'inviteTenderInStatus', render: (text) => BidInStateTexts[text] },
{ title: '投标项目:', name: 'projectName' },
]
},
// {
// span: 8,
// fieldList: [
// { title: '投标摘要:', name: 'remark', render: () => _data['submitTender']['remark'] },
// {
// title: '投标文件:',
// name: 'inviteTenderFile',
// render: (t, r) => (<div>
// {
// _data['submitTender']['file'].map((_item, _i) => <p><a key={`submitTenderFile${_i}`} target="_blank" href={_item.url}><FileFilled /> {_item.name}</a></p>)
// }
// </div>)
// },
// ]
// },
{
span: 8,
fieldList: [
{ title: '招标编号:', name: 'code' },
{ title: '招标会员:', name: 'memberName' },
{
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 callForNeedList = [
......@@ -291,7 +345,7 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
/** 投标区块 **/
// @todo 中标结果 根据后端数据控制
const result = data.isWin
const result = _data.isWin
const bidResultList = [
{
span: 8,
......@@ -310,19 +364,19 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
</Col>
</Row>,
},
{ title: '中标理由:', name: 'createMemberName' },
{ title: '中标理由:', name: 'reason' },
]
},
{
span: 8,
fieldList: [
{ title: '中标公示:', name: 'createMemberName' },
{ title: '中标公示:', name: 'winTenderAnnounceContent' },
{
title: '中标公示附件:',
name: 'paymentInformationResponses',
name: 'winTenderAnnounceFile',
render: (t, r) => (<div>
{
data['paymentInformationResponses'].map((_item, _i) => <p><a key={`announce${_i}`} target="_blank" href={_item.url}><FileFilled /> {_item.payNode}</a></p>)
data['winTenderAnnounceFile'].map((_item, _i) => <p><a key={`announce${_i}`} target="_blank" href={_item.url}><FileFilled /> {_item.payNode}</a></p>)
}
</div>)
},
......@@ -331,13 +385,13 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
{
span: 8,
fieldList: [
{ title: '中标通知:', name: 'createMemberName' },
{ title: '中标通知:', name: 'winTenderNoticeContent' },
{
title: '中标通知附件:',
name: 'paymentInformationResponses',
name: 'winTenderNoticeFile',
render: (t, r) => (<div>
{
data['paymentInformationResponses'].map((_item, _i) => <p><a key={`notice${_i}`} target="_blank" href={_item.url}><FileFilled /> {_item.payNode}</a></p>)
data['winTenderNoticeFile'].map((_item, _i) => <p><a key={`notice${_i}`} target="_blank" href={_item.url}><FileFilled /> {_item.payNode}</a></p>)
}
</div>)
},
......@@ -385,7 +439,8 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
/** 类型数据映射 */
const Type_Data_Map = {
'basicInfo': basicColumnList,
// 当详情模式为投标详情并且投标外部状态投完标才有对应的投标基本信息显示
'basicInfo': apiType[apiType.length-1] === 'r' && _data['tenderOutStatus'] >= BidOuterWorkState.Not_Invite_Tender ? basicTenderColumnList : basicColumnList,
'bidNeed': callForNeedList,
'registerNeed': registerNeedList,
'checkNeed': checkNeedList,
......
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 12px; // 24
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;
......@@ -35,10 +61,10 @@
}
}
.remarkBidReportWrapper {
// 评标委员会
.remarkCommitteeContainer {
margin-bottom: 24px;
// .remarkBidReportWrapper {
// // 评标委员会
// .remarkCommitteeContainer {
// margin-bottom: 24px;
.committeeItem {
position: relative;
display: flex;
......@@ -77,13 +103,41 @@
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 {
......@@ -101,12 +155,12 @@
color: #909399;
}
}
}
// 评标附件
.remarkFileContainer {
margin-top: 20px;
.card-list {
border: none;
.remarkFile {
margin-top: 20px;
.card-list {
margin-top: 12px;
border: none;
}
}
}
}
// }
......@@ -21,9 +21,11 @@ const CallForBidsSearchDetailInTender: React.FC = () => {
{ title: '招标物料', id: 'bidMaterial', componentName: "BidMaterial" },
{ title: '招标要求', id: 'bidNeed', type: "bidNeed" },
{ title: '报名要求', id: 'registerNeed', type: "registerNeed" },
{ title: '报名信息', id: 'registerInfo', type: "registerInfo" },
{ title: '报名文件', id: 'registerFile', type: "registerFile" },
{ title: '资格预审要求', id: 'checkNeed', type: "checkNeed" },
{ title: '资格证明文件', id: 'checkQualifyFile', type: "checkQualifyFile" },
{ title: '其他要求', id: 'otherNeed', type: "otherNeed" },
// { title: '确认定标', id: 'bidConfirm', componentName: "BidConfirm" },
{ title: '流转记录', id: 'transferRecord', componentName: "BidTransformRecord" },
]
......
......@@ -30,19 +30,32 @@ export const useSelfTable = () => {
<div>{record['projectName']}</div>
</>
},
// {
// title: '采购类型',
// align: 'left',
// dataIndex: 'purchaseType',
// key: 'purchaseType',
// render: (t) => PURCHASE_TYPE[t]
// },
// {
// title: '招标方式',
// align: 'left',
// dataIndex: 'inviteTenderType',
// key: 'inviteTenderType',
// render: (t) => CALLFORBID_TYPE[t]
// },
{
title: '采购类型',
title: '招标会员',
align: 'left',
dataIndex: 'purchaseType',
key: 'purchaseType',
render: (t) => PURCHASE_TYPE[t]
dataIndex: 'memberName',
key: 'memberName',
},
{
title: '招标方式',
title: '开标时间',
align: 'left',
dataIndex: 'inviteTenderType',
key: 'inviteTenderType',
render: (t) => CALLFORBID_TYPE[t]
dataIndex: 'openTenderTime',
key: 'openTenderTime',
render: (text, record) => formatTimeString(record.createTime),
},
{
title: '发布时间',
......@@ -63,17 +76,17 @@ export const useSelfTable = () => {
</>,
width: 180
},
{
title: '资格预审开始/截止时间',
align: 'left',
dataIndex: 'checkStartTime',
key: 'checkStartTime',
render: (text, record) => <>
{record.preCheckStartTime ? <div><PlayCircleOutlined />&nbsp;{formatTimeString(record.preCheckStartTime)}</div> : null}
{record.preCheckEndTime ? <div><PoweroffOutlined />&nbsp;{formatTimeString(record.preCheckEndTime)}</div> : null}
</>,
width: 180
},
// {
// title: '资格预审开始/截止时间',
// align: 'left',
// dataIndex: 'checkStartTime',
// key: 'checkStartTime',
// render: (text, record) => <>
// {record.preCheckStartTime ? <div><PlayCircleOutlined />&nbsp;{formatTimeString(record.preCheckStartTime)}</div> : null}
// {record.preCheckEndTime ? <div><PoweroffOutlined />&nbsp;{formatTimeString(record.preCheckEndTime)}</div> : null}
// </>,
// width: 180
// },
{
title: '投标开始/截止时间',
align: 'left',
......
......@@ -25,18 +25,6 @@ export const useSelfTable = () => {
render: (text, record, index) => index + 1
},
{
title: '招标编号/项目',
align: 'left',
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (text, record) => <>
<EyePreview url={`/memberCenter/procurementAbility/tender/callForBidsSearch/detail?id=${record.inviteTender.id}`}>
{record.inviteTender.code}
</EyePreview>
<div>{record.inviteTender.projectName}</div>
</>
},
{
title: '投标编号/会员',
align: 'left',
dataIndex: 'code',
......@@ -49,6 +37,18 @@ export const useSelfTable = () => {
</>
},
{
title: '招标编号/项目',
align: 'left',
dataIndex: 'inviteTender',
key: 'inviteTender',
render: (text, record) => <>
<EyePreview url={`/memberCenter/procurementAbility/tender/callForBidsSearch/detail?id=${record.inviteTender.id}`}>
{record.inviteTender.code}
</EyePreview>
<div>{record.inviteTender.projectName}</div>
</>
},
{
title: '投标时间',
align: 'left',
dataIndex: 'memberId',
......
......@@ -135,7 +135,6 @@ export const MaterialTableCell:React.FC<MaterialTableCellProps> = ({
callback(err)
}
}
console.log(record, 'cell rrr')
let childNode = children;
if (editable) {
childNode =
......
......@@ -280,7 +280,7 @@ const PurchaseOrderDetail:React.FC<PurchaseOrderDetailProps> = (props) => {
v.channelProductId = v?.channelProductId || v?.commodityUnitPriceAndPicId
return v
}),
needTheInvoice: Number(value.needTheInvoice),
needTheInvoice: value.needTheInvoice ? 1 : 0,
// 冗余交付信息
deliveryAddresId: value.deliveryAddresId.id || value.deliveryAddresId,
...omit(value.deliveryAddresId, ['id']),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment