Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jinfa-platform
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈智峰
jinfa-platform
Commits
d7dfd91e
Commit
d7dfd91e
authored
Apr 27, 2021
by
前端-钟卫鹏
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: 订单支付方式新增账期月结确认,招标专家抽取通知管理
parent
b3ab0260
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
1000 additions
and
246 deletions
+1000
-246
context.ts
src/pages/procurement/_public/bid/context.ts
+3
-0
useBidDetail.tsx
src/pages/procurement/_public/bid/effects/useBidDetail.tsx
+16
-5
index.tsx
src/pages/procurement/callForBids/addNewBid/index.tsx
+11
-0
index.ts
src/pages/procurement/callForBids/addNewBid/schema/index.ts
+1
-6
index.tsx
...s/procurement/callForBids/addRemarkBidCommittee/index.tsx
+8
-2
index.tsx
...curement/callForBids/extractNoticeManage/detail/index.tsx
+2
-2
index.tsx
.../procurement/callForBids/readyConfirmBid/detail/index.tsx
+2
-14
index.less
...Bids/readyExpertRemark/components/onlineRemark/index.less
+105
-0
index.tsx
...rBids/readyExpertRemark/components/onlineRemark/index.tsx
+127
-0
index.tsx
...ds/readyExpertRemark/components/remarkTableCell/index.tsx
+104
-0
index.tsx
...ds/readyExpertRemark/components/transferProcess/index.tsx
+0
-0
index.tsx
...curement/callForBids/readyExpertRemark/constant/index.tsx
+209
-0
index.less
...ocurement/callForBids/readyExpertRemark/detail/index.less
+9
-0
index.tsx
...rocurement/callForBids/readyExpertRemark/detail/index.tsx
+117
-35
index.tsx
...pages/procurement/callForBids/readyExpertRemark/index.tsx
+1
-2
useRemarkDetail.ts
...nt/callForBids/readyExpertRemark/model/useRemarkDetail.ts
+81
-0
useRemarkTable.tsx
...nt/callForBids/readyExpertRemark/model/useRemarkTable.tsx
+95
-0
useSelfTable.tsx
...ment/callForBids/readyExpertRemark/model/useSelfTable.tsx
+14
-27
index.ts
...procurement/callForBids/readyExpertRemark/schema/index.ts
+3
-4
index.tsx
src/pages/procurement/components/bidDetailHeader/index.tsx
+0
-22
index.tsx
src/pages/procurement/components/bidDetailSection/index.tsx
+1
-1
index.tsx
src/pages/procurement/components/descriptionsInfo/index.tsx
+5
-4
index.tsx
src/pages/procurement/components/remarkBidReport/index.tsx
+1
-115
index.tsx
src/pages/transaction/components/orderPayModal/index.tsx
+85
-7
No files found.
src/pages/procurement/_public/bid/context.ts
View file @
d7dfd91e
...
...
@@ -5,3 +5,6 @@ export const BidDetailContext = createContext<any>({})
// 待新增招标 详情
export
const
ReadyAddBidDetailContext
=
createContext
<
any
>
({})
// 专家评标详情
export
const
RemarkDetailContext
=
createContext
<
any
>
({})
src/pages/procurement/_public/bid/effects/useBidDetail.tsx
View file @
d7dfd91e
...
...
@@ -5,8 +5,14 @@ import { PublicApi } from '@/services/api'
import
{
message
}
from
'antd'
interface
OrderDetailHookProps
{
/** 招标-招标详情,投标-投标详情,招标-投标详情,投标-招标详情 */
type
:
'callForBid'
|
'tender'
|
'callForBidInTender'
|
'tenderInCallForBid'
/** 招标-招标详情,投标-投标详情,招标-投标详情,投标-招标详情,custom自定义 配合requestApi字段 */
type
:
'callForBid'
|
'tender'
|
'callForBidInTender'
|
'tenderInCallForBid'
|
'custom'
,
/** custom模式下 传入获取详情的api */
requestApi
?:
any
,
/** custom模式下 传入获取调用requestApi的params字段 */
customDetailField
?:
string
,
// /** custom模式下 传入获取调用获取流程流转记录接口的params字段 */
// customSearchRecordField?: string,
}
// 招标详情, 支持(招标-招标、投标-投标、招标-投标、投标-招标)两种模式
...
...
@@ -27,7 +33,12 @@ export const useBidDetail = (options: OrderDetailHookProps) => {
const
[
offsetTopList
,
setOffsetTopList
]
=
useState
<
number
[]
>
([])
const
{
id
}
=
usePageStatus
()
const
{
type
}
=
options
const
{
type
,
requestApi
=
null
,
customDetailField
=
null
,
// customSearchRecordField = null
}
=
options
useEffect
(()
=>
{
reloadFormData
()
...
...
@@ -49,7 +60,7 @@ export const useBidDetail = (options: OrderDetailHookProps) => {
_api
=
PublicApi
.
getPurchaseSubmitTenderGetInviteTender
;
break
;
default
:
_api
=
null
;
_api
=
requestApi
;
}
return
_api
}
...
...
@@ -70,7 +81,7 @@ export const useBidDetail = (options: OrderDetailHookProps) => {
field
=
'inviteTenderId'
break
;
default
:
field
=
null
;
field
=
customDetailField
;
}
return
field
}
...
...
src/pages/procurement/callForBids/addNewBid/index.tsx
View file @
d7dfd91e
...
...
@@ -17,6 +17,7 @@ import RelevanceGoodDrawer from './components/relevanceGoodDrawer'
import
{
INVITE_BID
,
PUBLIC_BID
,
SYSTEM_BID
}
from
'@/constants'
import
MemberModal
from
'./components/memberModal'
import
{
useAttachmentChangeForEdit
}
from
'./effects'
import
{
useAsyncSelect
}
from
'@/formSchema/effects/useAsyncSelect'
export
interface
AddNewBidProps
{}
...
...
@@ -170,6 +171,11 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
}
}
const
fetchTemplateSelectOptions
=
async
()
=>
{
const
{
data
}
=
await
PublicApi
.
getPurchaseTemplateGetTemplateList
({
current
:
'1'
,
pageSize
:
'999'
,
status
:
'true'
});
return
data
.
data
.
map
(
v
=>
({
label
:
v
.
name
,
value
:
v
.
id
}))
}
return
(
<
PageHeaderWrapper
style=
{
{
margin
:
0
}
}
...
...
@@ -236,6 +242,11 @@ const AddNewBid:React.FC<AddNewBidProps> = (props) => {
// 监听附件列表字段变动 处理编辑情况下的id问题
useAttachmentChangeForEdit
(
ctx
,
)
useAsyncSelect
(
'templateId'
,
fetchTemplateSelectOptions
,
)
}
}
expressionScope=
{
{
materialAddButton
,
...
...
src/pages/procurement/callForBids/addNewBid/schema/index.ts
View file @
d7dfd91e
...
...
@@ -612,12 +612,7 @@ const evaluationNeedInfo: ISchema = {
type
:
'number'
,
title
:
'评标项模板'
,
required
:
true
,
enum
:
[
{
label
:
'One'
,
value
:
'1'
},
{
label
:
'Two'
,
value
:
'2'
},
{
label
:
'Three'
,
value
:
'3'
},
{
label
:
'Four'
,
value
:
'4'
}
],
enum
:
[],
"x-component-props"
:
{
placeholder
:
"请选择评标项模板"
},
...
...
src/pages/procurement/callForBids/addRemarkBidCommittee/index.tsx
View file @
d7dfd91e
...
...
@@ -18,6 +18,8 @@ import { PublicApi } from '@/services/api'
import
{
buildColumns
,
expertColumns
,
initConditionData
,
selectExpertColumns
,
selectItemColumns
,
transformAreaField
,
transformSelectExpertField
}
from
'./constant'
import
{
selectBidSchema
}
from
'./schema/modal'
import
{
formatTimeString
}
from
'@/utils'
import
DateRangePickerUnix
from
'@/components/NiceForm/components/DateRangePickerUnix'
import
{
BidOuterWorkState
}
from
'@/constants'
export
interface
AddRemarkBidCommitteeProps
{}
...
...
@@ -160,7 +162,7 @@ const AddRemarkBidCommittee:React.FC<AddRemarkBidCommitteeProps> = (props) => {
const
fetchData
=
(
params
:
any
)
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
PublicApi
.
postPurchaseInviteTenderGetInviteTenderList
({
...
params
},
{
ctlType
:
"none"
}).
then
(
res
=>
{
PublicApi
.
postPurchaseInviteTenderGetInviteTenderList
({
...
params
,
tenderOutStatusList
:
[
BidOuterWorkState
.
Not_Selection_Tender
]
},
{
ctlType
:
"none"
}).
then
(
res
=>
{
resolve
(
res
.
data
)
})
})
...
...
@@ -293,7 +295,11 @@ const AddRemarkBidCommittee:React.FC<AddRemarkBidCommitteeProps> = (props) => {
{
ctx
:
{
schema
:
selectBidSchema
,
components
:
{
ModalSearch
:
Search
,
Submit
}
,
components
:
{
DateRangePickerUnix
,
ModalSearch
:
Search
,
Submit
}
,
effects
:
(
$
,
actions
)
=>
{
actions
.
reset
()
useStateFilterSearchLinkageEffect
(
...
...
src/pages/procurement/callForBids/extractNoticeManage/detail/index.tsx
View file @
d7dfd91e
import
React
,
{
useState
,
useEffect
,
useRef
}
from
'react'
;
import
{
PageHeaderWrapper
}
from
'@ant-design/pro-layout'
;
import
{
history
}
from
'umi'
import
{
Button
,
Row
,
Col
,
Card
}
from
'antd'
import
{
Button
,
Row
,
Col
}
from
'antd'
import
ReutrnEle
from
'@/components/ReturnEle'
;
import
{
SaveOutlined
}
from
'@ant-design/icons'
;
import
{
usePageStatus
,
PageStatus
}
from
'@/hooks/usePageStatus'
import
MellowCard
from
'@/components/MellowCard'
;
import
ModalForm
from
'@/components/ModalForm'
;
import
{
create
AsyncFormActions
,
create
FormActions
}
from
'@formily/antd'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
formatTimeString
}
from
'@/utils'
;
import
styles
from
'./index.less'
...
...
src/pages/procurement/callForBids/readyConfirmBid/detail/index.tsx
View file @
d7dfd91e
...
...
@@ -11,27 +11,16 @@ import BidDetailHeader from '@/pages/procurement/components/bidDetailHeader';
import
BidDetailSection
from
'@/pages/procurement/components/bidDetailSection'
;
const
ReadyQualifityCheckedDetail
:
React
.
FC
=
()
=>
{
const
{
formContext
,
id
,
detailList
}
=
useBidDetail
({
type
:
'purchaseOrder
'
})
const
{
data
,
currentPayInfoId
}
=
formContext
const
{
formContext
,
id
}
=
useBidDetail
({
type
:
'callForBid
'
})
const
{
data
}
=
formContext
const
payRef
=
useRef
<
any
>
({})
/** 约定好 对应的锚点title和元素id映射 */
// type? 用于区分DescriptionsInfo组件的内容
// componentName? 用于区分不同组件的渲染
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: 'bidMaterial', componentName: "BidMaterial" },
// { title: '招标要求', id: 'bidNeed', type: "bidNeed" },
// { title: '报名要求', id: 'registerNeed', type: "registerNeed" },
// { title: '资格预审要求', id: 'checkNeed', type: "checkNeed" },
// { title: '评标要求', id: 'remarkNeed', type: "remarkNeed" },
// { title: '其他要求', id: 'otherNeed', type: "otherNeed" },
// { title: '招标方式', id: 'bidWay', componentName: "BidMethod" },
{
title
:
'流转记录'
,
id
:
'transferRecord'
,
componentName
:
"BidTransformRecord"
},
]
...
...
@@ -39,7 +28,6 @@ const ReadyQualifityCheckedDetail: React.FC = () => {
<
div
>
<
BidDetailContext
.
Provider
value=
{
formContext
}
>
<
BidDetailHeader
detailList=
{
detailList
}
formContext=
{
formContext
}
anchorList=
{
anchorTitleList
}
backLink=
"/memberCenter/procurementAbility/callForBids/callForBidsSearch"
...
...
src/pages/procurement/callForBids/readyExpertRemark/components/onlineRemark/index.less
0 → 100644
View file @
d7dfd91e
.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;
}
.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;
}
}
}
// 评标记录
.remarkRecordContainer {
.remarkRecordHead {
display: flex;
justify-content: space-between;
}
: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;
}
}
}
}
src/pages/procurement/callForBids/readyExpertRemark/components/onlineRemark/index.tsx
0 → 100644
View file @
d7dfd91e
import
React
,
{
useContext
,
useState
,
useEffect
}
from
'react'
import
{
Table
,
Button
,
Radio
,
Tooltip
,
Row
,
Col
}
from
'antd'
import
MellowCard
from
'@/components/MellowCard'
import
{
UserOutlined
}
from
'@ant-design/icons'
;
import
style
from
'./index.less'
import
{
useRemarkTable
}
from
'../../model/useRemarkTable'
;
import
NiceForm
from
'@/components/NiceForm'
;
import
{
createFormActions
}
from
'@formily/antd'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
useRemarkDetail
}
from
'../../model/useRemarkDetail'
;
import
{
generateRemarkTable
}
from
'../../constant'
;
/**
* 评标报告
*/
export
interface
RemarkBidReportProps
{
cardTitle
?:
string
;
}
const
addSchemaAction
=
createFormActions
()
const
OnlineRemark
:
React
.
FC
<
RemarkBidReportProps
>
=
({
cardTitle
})
=>
{
const
{
formContext
,
id
}
=
useRemarkDetail
({
type
:
'callForBid'
})
const
{
data
}
=
formContext
const
{
remarkColumns
,
remarkComponents
}
=
useRemarkTable
(
addSchemaAction
,
data
)
const
[
initFormValue
,
setInitFormValue
]
=
useState
<
any
>
({})
const
handleSubmit
=
async
(
value
)
=>
{
}
return
(
<
MellowCard
title=
{
cardTitle
}
style=
{
{
marginTop
:
24
}
}
bordered=
{
false
}
fullHeight
>
<
div
className=
{
style
.
remarkBidReportWrapper
}
>
<
div
className=
{
style
.
remarkRecordContainer
}
>
<
div
className=
{
style
.
remarkRecordHead
}
>
<
h3
className=
"commonPanelTitle"
>
评标记录
</
h3
>
</
div
>
{
/* <Table dataSource={dataSource} columns={columns} pagination={{size: "small"}} /> */
}
<
NiceForm
// loading={formLoading}
previewPlaceholder=
' '
value=
{
initFormValue
}
actions=
{
addSchemaAction
}
schema=
{
{
type
:
'object'
,
properties
:
{
evaluationTenderList
:
{
type
:
'array'
,
"x-component"
:
'MultTable'
,
"x-component-props"
:
{
rowKey
:
'id'
,
columns
:
"{{remarkColumns}}"
,
components
:
"{{remarkComponents}}"
,
pagination
:
{
size
:
'small'
}
},
},
}
}
}
onSubmit=
{
handleSubmit
}
// effects={($, ctx) => {
// $('onFormMount').subscribe(async () => {
// $('onFieldValueChange', 'deliverAddress').subscribe(async state => {
// })
// })
// }}
expressionScope=
{
{
remarkColumns
,
remarkComponents
,
}
}
/>
</
div
>
<
div
className=
{
style
.
bidMemberContainer
}
>
<
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>广州室间隔度过后工地</p></Col>
</Row>
<Row>
<Col span={8}><p className={style['card-list_title']}>推荐人:</p></Col>
<Col><p>佳士得拍卖行</p></Col>
</Row>
<Row>
<Col span={8}><p className={style['card-list_title']}>理由:</p></Col>
<Col><p>无条件中标</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>广州室间隔度过后工地</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>广州室间隔度过后工地</p></Col>
</Row>
</div>
</Col>
</Row> */
}
</
div
>
</
div
>
</
MellowCard
>)
}
OnlineRemark
.
defaultProps
=
{}
export
default
OnlineRemark
src/pages/procurement/callForBids/readyExpertRemark/components/remarkTableCell/index.tsx
0 → 100644
View file @
d7dfd91e
import
React
,
{
useRef
,
useContext
}
from
'react'
import
{
Form
,
Input
}
from
'antd'
;
export
interface
TableCellProps
{
title
:
React
.
ReactNode
;
editable
:
boolean
;
children
:
React
.
ReactNode
;
dataIndex
:
string
;
record
:
any
;
handleSave
:
(
record
:
any
)
=>
Promise
<
any
>
;
forceEdit
:
boolean
,
formItem
:
string
,
formItemProps
:
any
,
}
const
EditableContext
=
React
.
createContext
<
any
>
({});
export
const
RemarkEditableRow
:
React
.
FC
<
any
>
=
({...
props
})
=>
{
const
[
form
]
=
Form
.
useForm
();
const
ctx
=
{
form
}
return
(
<
Form
form=
{
form
}
component=
{
false
}
>
<
EditableContext
.
Provider
value=
{
ctx
}
>
<
tr
{
...
props
}
/>
</
EditableContext
.
Provider
>
</
Form
>
);
};
export
const
RemarkTableCell
:
React
.
FC
<
TableCellProps
>
=
({
title
,
editable
,
children
,
dataIndex
,
record
,
handleSave
,
forceEdit
,
formItem
,
formItemProps
=
{},
...
restProps
})
=>
{
const
formItemRef
=
useRef
<
any
>
();
const
{
form
}
=
useContext
(
EditableContext
);
const
save
=
async
e
=>
{
try
{
const
values
=
await
form
.
validateFields
();
values
.
taxRate
=
Number
(
values
.
taxRate
)
||
0
values
.
price
=
Number
(
values
.
price
)
||
0
handleSave
({
...
record
,
...
values
});
}
catch
(
errInfo
)
{
console
.
log
(
'Save failed:'
,
errInfo
);
}
};
const
chooseFormItem
=
(
type
)
=>
{
switch
(
type
)
{
case
'input'
:
{
return
<
Input
style=
{
{
width
:
140
}
}
type=
'number'
ref=
{
formItemRef
}
onChange=
{
save
}
{
...
formItemProps
}
id=
{
dataIndex
+
record
.
id
}
className=
"purchase_amount_input"
/>
}
}
}
let
childNode
=
children
;
if
(
editable
)
{
childNode
=
<
Form
.
Item
style=
{
{
margin
:
0
}
}
name=
{
dataIndex
}
initialValue=
{
record
[
dataIndex
]
||
''
}
rules=
{
[
{
required
:
true
,
message
:
`${title}必须填写`
,
},
{
pattern
:
/^
\d
+
(\.\d
{1,2}
)?
$/
,
message
:
'采购数量仅限两位小数'
,
},
]
}
>
{
chooseFormItem
(
formItem
)
}
</
Form
.
Item
>
}
return
<
td
{
...
restProps
}
>
{
childNode
}
</
td
>;
}
RemarkTableCell
.
defaultProps
=
{}
export
default
RemarkTableCell
src/pages/procurement/callForBids/readyExpertRemark/components/transferProcess/index.tsx
0 → 100644
View file @
d7dfd91e
src/pages/procurement/callForBids/readyExpertRemark/constant/index.tsx
0 → 100644
View file @
d7dfd91e
import
{
BidInOpeartTexts
,
BidInStateTexts
,
BidOutOpeartTexts
,
BidOutStateTexts
}
from
'@/constants'
import
CustomTag
from
'@/pages/procurement/components/CustomTag'
import
{
formatTimeString
}
from
'@/utils'
import
{
FileFilled
}
from
'@ant-design/icons'
import
React
,
{
useEffect
}
from
'react'
export
const
anchorTitleList
=
[
{
title
:
'流转进度'
,
id
:
'transferProcess'
,
componentName
:
"TransferProcess"
},
{
title
:
'基本信息'
,
id
:
'baseicInfo'
,
type
:
"basicInfo"
},
{
title
:
'评标要求'
,
id
:
'remarkNeed'
,
type
:
"remarkNeed"
},
{
title
:
'评标报告'
,
id
:
'remarkBidReport'
,
componentName
:
"RemarkBidReport"
},
{
title
:
'流转记录'
,
id
:
'transferRecord'
,
componentName
:
"BidTransformRecord"
},
]
// 基本信息
export
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
:
'memberName'
},
{
title
:
'招标摘要:'
,
name
:
'remark'
},
]
},
]
// 评标要去
export
const
evaluationColumnList
=
[
{
span
:
8
,
fieldList
:
[
{
title
:
'评标要求时间:'
,
name
:
'createTime'
,
render
:
(
t
,
r
)
=>
formatTimeString
(
r
[
'evaluationStartTime'
])
+
'至'
+
formatTimeString
(
r
[
'evaluationEndTime'
])},
{
title
:
'评标要求:'
,
name
:
'evaluationRequirement'
},
]
},
{
span
:
8
,
fieldList
:
[
{
title
:
'评标要求附件:'
,
name
:
'evaluationFile'
,
render
:
(
t
,
r
)
=>
(<
div
>
{
t
.
map
((
_item
,
_i
)
=>
<
p
><
a
key=
{
`evaluationFile${_i}`
}
target=
"_blank"
href=
{
_item
.
url
}
><
FileFilled
/>
{
_item
.
name
}
</
a
></
p
>)
}
</
div
>)
},
]
},
{
span
:
8
,
fieldList
:
[
{
title
:
'是否在线评标:'
,
name
:
'isOnlineEvaluation'
,
render
:
(
text
)
=>
text
?
'是'
:
'否'
},
{
title
:
'评标项模板:'
,
name
:
'templateName'
},
]
},
]
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'
,
},
]
/** 生成在线评标表格
* memeberList: 投标会员列表
* contentList: 评标细则内容列表
*/
export
const
generateRemarkTable
=
(
memeberList
,
contentList
)
=>
{
// 初始列
const
columns
:
any
[]
=
[
{
title
:
'会员ID'
,
dataIndex
:
'memberId'
,
key
:
'memberId'
,
className
:
'commonHide'
},
{
title
:
'评标会员'
,
dataIndex
:
'memberName'
,
key
:
'memberName'
},
{
title
:
'总计得分'
,
dataIndex
:
'score'
,
key
:
'score'
},
{
title
:
'评标分类'
,
dataIndex
:
'sort'
,
key
:
'sort'
},
]
// 新增字段以 字符term+细则id组合而成
contentList
.
map
(
item
=>
{
columns
.
push
({
title
:
item
.
term
,
dataIndex
:
`term_
${
item
.
id
}
`
,
key
:
`term_
${
item
.
id
}
`
,
align
:
'center'
,
formItem
:
'input'
,
editable
:
true
,
width
:
140
,
})
})
const
dataSource
:
any
[]
=
[]
memeberList
.
map
(
item
=>
{
let
dataItem
=
{
memberId
:
item
.
memberId
,
memberName
:
item
.
memberName
}
contentList
.
map
(
_
=>
`term_
${
_
.
id
}
`
).
map
(
_
=>
{
dataItem
[
_
]
=
null
return
dataItem
})
dataSource
.
push
(
dataItem
)
})
return
{
columns
,
dataSource
,
}
}
src/pages/procurement/callForBids/readyExpertRemark/detail/index.less
View file @
d7dfd91e
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 24px;
}
.card-list_title {
font-size: 12px;
color: #909399;
}
src/pages/procurement/callForBids/readyExpertRemark/detail/index.tsx
View file @
d7dfd91e
import
React
,
{
useState
,
use
Callback
,
useRef
,
useContext
,
useEffect
,
creat
eRef
}
from
'react'
;
import
React
,
{
useState
,
use
Effect
,
us
eRef
}
from
'react'
;
import
{
history
}
from
'umi'
import
{
Button
}
from
'antd'
;
import
style
from
'./index.less'
import
{
Button
,
Row
,
Col
,
Radio
,
Table
}
from
'antd'
;
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
{
RemarkDetailContext
}
from
'@/pages/procurement/_public/bid/context'
;
import
BidDetailHeader
from
'@/pages/procurement/components/bidDetailHeader'
;
import
BidDetailSection
from
'@/pages/procurement/components/bidDetailSection'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
usePageStatus
}
from
'@/hooks/usePageStatus'
import
TransferProcess
,
{
TransferEnum
}
from
'@/pages/procurement/components/transferProcess'
;
import
{
findLastIndexFlowState
}
from
'@/utils'
;
import
{
useRemarkDetail
}
from
'../model/useRemarkDetail'
;
import
style
from
'./index.less'
import
MellowCard
from
'@/components/MellowCard'
;
import
{
anchorTitleList
,
basicColumnList
,
evaluationColumnList
,
insideRecordCols
,
outReocrdCols
}
from
'../constant'
;
import
OnlineRemark
from
'../components/onlineRemark'
;
const
ReadyExpertRemarkDetail
:
React
.
FC
=
()
=>
{
const
{
formContext
,
id
,
detailList
}
=
useBidDetail
({
type
:
'purchaseOrder'
})
const
{
data
,
currentPayInfoId
}
=
formContext
const
payRef
=
useRef
<
any
>
({})
const
{
formContext
,
id
}
=
useRemarkDetail
({
type
:
'callForBid'
})
const
{
data
,
externalProcurementOrderLogResponses
,
interiorProcurementOrderLogResponses
}
=
formContext
const
[
transferRadio
,
setTransferRadio
]
=
useState
<
TransferEnum
>
(
TransferEnum
.
Outer
)
/** 约定好 对应的锚点title和元素id映射 */
// type? 用于区分DescriptionsInfo组件的内容
// componentName? 用于区分不同组件的渲染
const
anchorTitleList
=
[
{
title
:
'流转进度'
,
id
:
'transferProcess'
,
componentName
:
"TransferProcess"
},
{
title
:
'基本信息'
,
id
:
'baseicInfo'
,
type
:
"basicInfo"
},
// { title: '招标物料', id: 'bidMaterial', componentName: "BidMaterial" },
// { title: '招标要求', id: 'bidNeed', type: "bidNeed" },
// { title: '报名要求', id: 'registerNeed', type: "registerNeed" },
// { title: '资格预审要求', id: 'checkNeed', type: "checkNeed" },
{
title
:
'评标要求'
,
id
:
'remarkNeed'
,
type
:
"remarkNeed"
},
// { title: '其他要求', id: 'otherNeed', type: "otherNeed" },
// { title: '招标方式', id: 'bidWay', componentName: "BidMethod" },
{
title
:
'评标报告'
,
id
:
'remarkBidReport'
,
componentName
:
"RemarkBidReport"
},
{
title
:
'流转记录'
,
id
:
'transferRecord'
,
componentName
:
"BidTransformRecord"
},
]
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
)
}
return
(
<
div
>
<
Bid
DetailContext
.
Provider
value=
{
formContext
}
>
<
Remark
DetailContext
.
Provider
value=
{
formContext
}
>
<
BidDetailHeader
detailList=
{
detailList
}
formContext=
{
formContext
}
anchorList=
{
anchorTitleList
}
backLink=
"/memberCenter/procurementAbility/callForBids/callForBidsSearch"
extraRight=
{
<
Button
type=
'primary'
>
单据审核
...
...
@@ -49,16 +52,95 @@ const ReadyExpertRemarkDetail: React.FC = () => {
/>
<
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"
>
<
MellowCard
title=
'基本信息'
style=
{
{
marginTop
:
24
}
}
bordered=
{
false
}
fullHeight
>
{
data
?.
inviteTender
&&
<
RenderBasicInfoColumns
infoList=
{
basicColumnList
}
dataSource=
{
data
.
inviteTender
}
/>
}
</
MellowCard
>
</
div
>
<
div
id=
"remarkNeed"
>
<
MellowCard
title=
'评标要求'
style=
{
{
marginTop
:
24
}
}
bordered=
{
false
}
fullHeight
>
{
data
?.
inviteTender
&&
<
RenderBasicInfoColumns
infoList=
{
evaluationColumnList
}
dataSource=
{
data
.
inviteTender
}
/>
}
</
MellowCard
>
</
div
>
{
/* 在线评标 */
}
<
div
id=
"remarkBidReport"
>
<
OnlineRemark
cardTitle=
"在线评标"
/>
</
div
>
{
/* 在线评标 */
}
<
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
>
</
RemarkDetailContext
.
Provider
>
</
div
>
);
}
;
}
export
default
ReadyExpertRemarkDetail
;
src/pages/procurement/callForBids/readyExpertRemark/index.tsx
View file @
d7dfd91e
...
...
@@ -17,9 +17,8 @@ import '../../constants/index.less'
export
interface
ReadyExpertRemarkProps
{}
const
fetchTableData
=
async
(
params
)
=>
{
const
{
data
}
=
await
PublicApi
.
postPurchaseInviteTenderGetInvite
TenderList
({
const
{
data
}
=
await
PublicApi
.
getPurchaseExpertExtractRecordGetEvaluation
TenderList
({
...
params
,
tenderOutStatusList
:
[
BidOuterWorkState
.
Not_Selection_Tender
],
},
{
ctlType
:
"none"
})
return
data
}
...
...
src/pages/procurement/callForBids/readyExpertRemark/model/useRemarkDetail.ts
0 → 100644
View file @
d7dfd91e
import
React
from
'react'
import
{
useCallback
,
useState
,
useEffect
}
from
'react'
import
{
usePageStatus
}
from
'@/hooks/usePageStatus'
import
{
PublicApi
}
from
'@/services/api'
import
{
message
}
from
'antd'
interface
DetailHookProps
{
}
export
const
useRemarkDetail
=
(
options
:
DetailHookProps
)
=>
{
// 详情数据
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
{
id
}
=
usePageStatus
()
useEffect
(()
=>
{
reloadFormData
()
},
[])
const
reloadFormData
=
useCallback
(
async
()
=>
{
if
(
id
)
{
const
{
code
,
data
,
message
:
msg
}
=
await
PublicApi
.
getPurchaseExpertExtractRecordGetEvaluationTender
({
id
},
{
ctlType
:
"none"
})
if
(
code
===
1000
)
{
setFormData
(
data
)
}
else
{
message
.
error
(
msg
)
}
const
searchId
=
data
.
inviteTender
.
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
,
}
return
{
formContext
,
id
,
}
}
src/pages/procurement/callForBids/readyExpertRemark/model/useRemarkTable.tsx
0 → 100644
View file @
d7dfd91e
import
React
,
{
useState
,
useEffect
}
from
'react'
import
{
ISchemaFormActions
,
ISchemaFormAsyncActions
}
from
'@formily/antd'
;
import
{
Button
,
message
}
from
'antd'
;
import
{
CaretDownOutlined
,
CaretRightOutlined
}
from
'@ant-design/icons'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
{
Row
,
Col
}
from
'antd'
import
style
from
'../index.less'
import
{
generateRemarkTable
}
from
'../constant'
;
import
RemarkTableCell
,
{
RemarkEditableRow
}
from
'../components/remarkTableCell'
;
/**
* @param ctx schemaAction
* data: 详情数据
*/
export
const
useRemarkTable
=
(
ctx
:
ISchemaFormActions
|
ISchemaFormAsyncActions
,
data
:
any
)
=>
{
const
[
remarkColumns
,
setRemarkColumns
]
=
useState
<
any
>
([])
// 获取投标会员和模板整合成评标 table
useEffect
(()
=>
{
if
(
data
?.
inviteTender
?.
id
)
{
const
getMemberFn
=
PublicApi
.
getPurchaseExpertExtractRecordGetSubmitTenderMemberList
({
inviteTenderId
:
data
.
inviteTender
.
id
})
const
getTemplateFn
=
PublicApi
.
getPurchaseTemplateGetTemplate
({
id
:
data
.
inviteTender
.
templateId
})
Promise
.
all
([
getMemberFn
,
getTemplateFn
]).
then
(
values
=>
{
console
.
log
(
values
,
'all'
)
const
{
code
:
memberCode
,
data
:
memberData
}
=
values
[
0
]
const
{
code
:
contentCode
,
data
:
contentData
}
=
values
[
1
]
if
(
memberCode
===
1000
&&
contentCode
===
1000
&&
memberData
?.
length
&&
contentData
.
templateContentList
?.
length
)
{
const
{
templateContentList
}
=
contentData
// 生成在线评标表格
const
{
columns
,
dataSource
}
=
generateRemarkTable
(
memberData
,
templateContentList
)
console
.
log
(
columns
,
dataSource
,
11
)
setRemarkColumns
(
columns
)
ctx
.
setFieldValue
(
'evaluationTenderList'
,
dataSource
)
}
})
}
},
[
data
])
const
remarkComponents
=
{
body
:
{
row
:
RemarkEditableRow
,
cell
:
RemarkTableCell
}
}
const
handleSave
=
row
=>
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
newData
=
[...
ctx
.
getFieldValue
(
'submitTenderMateriel'
)];
const
index
=
newData
.
findIndex
(
item
=>
row
.
id
===
item
.
id
);
const
item
=
newData
[
index
];
newData
.
splice
(
index
,
1
,
{
...
item
,
...
row
,
});
ctx
.
setFieldValue
(
'submitTenderMateriel'
,
newData
)
// // thead总计变动
// let _ = [...onlineInfoColumns]
// _[_.length - 2]['title'] = <>
// <div>金额(含税)</div>
// <div>总计:¥<span style={{fontWeight: 'bolder'}}>{newData.reduce((prev, next) => (prev*100 + (next.money || 0)*100)/100, 0)}</span></div>
// </>
// setRemarkColumns(_)
resolve
({
item
,
newData
})
})
};
const
remarkMergeColumns
=
remarkColumns
.
map
(
col
=>
{
if
(
!
col
.
editable
)
{
return
col
;
}
return
{
...
col
,
onCell
:
record
=>
({
record
,
editable
:
ctx
.
getFormState
().
editable
===
false
?
false
:
col
.
editable
,
dataIndex
:
col
.
dataIndex
,
title
:
col
.
title
,
formItem
:
col
.
formItem
,
formItemProps
:
col
.
formItemProps
,
handleSave
}),
};
})
return
{
remarkColumns
:
remarkMergeColumns
,
remarkComponents
,
}
}
src/pages/procurement/callForBids/readyExpertRemark/model/useSelfTable.tsx
View file @
d7dfd91e
...
...
@@ -20,43 +20,37 @@ const baseBidListColumns: any[] = [
{
title
:
'招标编号/项目'
,
align
:
'left'
,
dataIndex
:
'code'
,
key
:
'code'
,
dataIndex
:
[
'inviteTender'
,
'code'
]
,
key
:
[
'inviteTender'
,
'code'
]
,
render
:
(
text
,
record
)
=>
<>
<
EyePreview
url=
{
`${history.location.pathname}/detail?id=${record.id}`
}
>
{
text
}
</
EyePreview
>
<
div
>
{
record
.
projectName
}
</
div
>
<
div
>
{
record
.
inviteTender
.
projectName
}
</
div
>
</>
},
{
title
:
'专家号码'
,
align
:
'left'
,
dataIndex
:
'
type
'
,
key
:
'
type
'
,
dataIndex
:
'
userId
'
,
key
:
'
userId
'
,
},
// {
// title: '评标人',
// align: 'left',
// dataIndex: 'supplyMembersName',
// key: 'supplyMembersName',
// },
{
title
:
'评标开始/
评标
时间'
,
title
:
'评标开始/
结束
时间'
,
align
:
'left'
,
dataIndex
:
'createTime'
,
key
:
'createTime'
,
dataIndex
:
[
'inviteTender'
,
'evaluationStartTime'
]
,
key
:
[
'inviteTender'
,
'evaluationEndTime'
]
,
render
:
(
text
,
record
)
=>
<>
<
div
><
PlayCircleOutlined
/>
{
formatTimeString
(
record
.
create
Time
)
}
</
div
>
<
div
><
PoweroffOutlined
/>
{
formatTimeString
(
record
.
create
Time
)
}
</
div
>
<
div
><
PlayCircleOutlined
/>
{
formatTimeString
(
record
.
inviteTender
.
evaluationStart
Time
)
}
</
div
>
<
div
><
PoweroffOutlined
/>
{
formatTimeString
(
record
.
inviteTender
.
evaluationEnd
Time
)
}
</
div
>
</>,
width
:
200
},
{
title
:
'外部状态'
,
align
:
'left'
,
dataIndex
:
'tenderOutStatus'
,
key
:
'tenderOutStatus'
,
dataIndex
:
[
'inviteTender'
,
'tenderOutStatus'
]
,
key
:
[
'inviteTender'
,
'tenderOutStatus'
]
,
render
:
text
=>
<
CustomTag
status=
{
text
}
type=
'out'
/>
},
{
...
...
@@ -80,11 +74,7 @@ export const useSelfTable = () => {
}})
const
handleSubmit
=
async
(
record
)
=>
{
if
(
record
.
interiorState
===
PurchaseOrderInsideWorkState
.
ONE_LEVEL_AUDIT_ORDER
)
{
history
.
push
(
`/memberCenter/tranactionAbility/purchaseOrder/firstApprovedOrder/detail?id=
${
record
.
id
}
`
)
}
// await PublicApi.postOrderQuotationBeReviewed({id})
// ref.current.reload()
history
.
push
(
`/memberCenter/procurementAbility/callForBids/readyExpertRemark/detail?id=
${
record
.
id
}
`
)
}
const
secondColumns
:
any
[]
=
baseBidListColumns
.
concat
([
{
...
...
@@ -92,10 +82,7 @@ export const useSelfTable = () => {
align
:
'left'
,
dataIndex
:
'ctl'
,
key
:
'ctl'
,
render
:
(
text
,
record
)
=>
<>
<
Button
type=
'link'
onClick=
{
()
=>
handleSubmit
(
record
)
}
>
评标
</
Button
>
<
Button
type=
'link'
onClick=
{
()
=>
handleSubmit
(
record
)
}
>
拒绝
</
Button
>
</>
render
:
(
text
,
record
)
=>
new
Date
().
getTime
()
<
record
.
inviteTender
.
evaluationEndTime
&&
<
Button
type=
'link'
onClick=
{
()
=>
handleSubmit
(
record
)
}
>
评标
</
Button
>
}
])
...
...
src/pages/procurement/callForBids/readyExpertRemark/schema/index.ts
View file @
d7dfd91e
import
{
ISchema
}
from
'@formily/antd'
;
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
;
import
{
OrderTypeMap
,
PurchaseOrderInsideWorkStateTexts
,
PurchaseOrderOutWorkStateTexts
}
from
'@/constants'
;
/**
* 除了订单必填字段, 默认
...
...
@@ -29,17 +28,17 @@ export const tableListSchema: ISchema = {
}
},
properties
:
{
p
rojectName
:
{
inviteTenderP
rojectName
:
{
type
:
'string'
,
'x-component-props'
:
{
placeholder
:
'请输入招标项目'
,
}
},
"[
startTime,e
ndTime]"
:
{
"[
evaluationStartTime,evaluationE
ndTime]"
:
{
type
:
'array'
,
"x-component"
:
'DateRangePickerUnix'
,
'x-component-props'
:
{
placeholder
:
[
'
发布开始时间'
,
'发布
结束时间'
],
placeholder
:
[
'
评标开始时间'
,
'评标
结束时间'
],
},
},
submit
:
{
...
...
src/pages/procurement/components/bidDetailHeader/index.tsx
View file @
d7dfd91e
...
...
@@ -68,18 +68,6 @@ const BidDetailHeader: React.FC<BidDetailHeaderProps> = ({
}
}
const
clickItem
=
(
index
:
any
)
=>
{
let
distance
=
formContext
.
offsetTopList
[
index
]
-
140
window
.
scrollTo
({
top
:
distance
<
0
?
0
:
distance
,
behavior
:
"smooth"
})
let
dom
=
document
.
documentElement
||
document
.
body
if
(
formContext
.
offsetTopList
[
index
]
-
189
+
dom
.
clientHeight
>=
dom
.
scrollHeight
)
{
setCurrent
(
index
)
}
}
return
(
<
div
className=
{
isFixed
?
[
style
.
detailHeader
,
style
.
anchorTitleFixed
].
join
(
' '
)
:
style
.
detailHeader
}
id=
"detailHeader"
>
{
...
...
@@ -99,16 +87,6 @@ const BidDetailHeader: React.FC<BidDetailHeaderProps> = ({
<
Row
>
<
Col
>
<
div
className=
{
style
.
anchorTitle
}
id=
"anchorTitle"
>
{
/* <ul className={style.anchorUl}>
{
anchorList.map((item, index) => (
<li key={index} onClick={()=>clickItem(index)}>
<a className={current === index ? style.current : null}>{item}</a>
</li>
))
}
</ul> */
}
<
Anchor
onClick=
{
(
e
)
=>
e
.
preventDefault
()
}
showInkInFixed=
{
false
}
targetOffset=
{
200
}
>
{
anchorList
.
map
((
item
,
index
)
=>
(
...
...
src/pages/procurement/components/bidDetailSection/index.tsx
View file @
d7dfd91e
...
...
@@ -14,7 +14,7 @@ import MemberWinInfo from '../memberWinInfo'
export
interface
BidDetailSectionProps
{
formContext
:
any
,
/** 招标-招标详情,投标-投标详情,招标-投标详情,投标-招标详情
*/
/** 招标-招标详情,投标-投标详情,招标-投标详情,投标-招标详情*/
type
:
'callForBid'
|
'tender'
|
'callForBidInTender'
|
'tenderInCallForBid'
anchorList
?:
any
,
}
...
...
src/pages/procurement/components/descriptionsInfo/index.tsx
View file @
d7dfd91e
...
...
@@ -15,6 +15,7 @@ import Interval from 'bizcharts/lib/geometry/Interval'
import
DataSet
from
"@antv/data-set"
;
import
{
BidInStateTexts
,
BidOutStateTexts
,
PURCHASE_TYPE
}
from
'@/constants'
;
import
{
PublicApi
}
from
'@/services/api'
;
import
moment
from
'moment'
;
/**
* 描述信息列表
...
...
@@ -494,10 +495,10 @@ const DescriptionsInfo: React.FC<BasicInfoProps> = ({cardTitle, type}) => {
<
div
className=
{
style
.
thankLetter
}
>
<
h2
>
感谢函
</
h2
>
<
h4
>
THANKS LETTER
</
h4
>
<
p
className=
{
style
.
name
}
>
尊敬的
广州白马皮具交易中心
</
p
>
<
p
>
贵公司参与了我公司《
进口头层黄牛皮荔枝纹采购
》竞标。在我公司综合各投标单位的基本情况,并进行充分技术交流后,经评标委员会综合评定,贵公司未能中标。我公司对贵公司的积极参与和支持深表感谢!希望下次合作成功。
</
p
>
<
p
className=
{
style
.
company
}
>
温州龙昌手袋有限公司
</
p
>
<
p
className=
{
style
.
time
}
>
2020-08-25
</
p
>
<
p
className=
{
style
.
name
}
>
尊敬的
{
_data
.
memberName
}
</
p
>
<
p
>
贵公司参与了我公司《
{
data
.
projectName
}
》竞标。在我公司综合各投标单位的基本情况,并进行充分技术交流后,经评标委员会综合评定,贵公司未能中标。我公司对贵公司的积极参与和支持深表感谢!希望下次合作成功。
</
p
>
<
p
className=
{
style
.
company
}
>
{
data
.
memberName
}
</
p
>
<
p
className=
{
style
.
time
}
>
{
moment
().
format
(
'YYYY-MM-DD'
)
}
</
p
>
</
div
>
</
Modal
>
</
MellowCard
>)
...
...
src/pages/procurement/components/remarkBidReport/index.tsx
View file @
d7dfd91e
...
...
@@ -21,7 +21,6 @@ const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
const
bidDetailContext
=
useContext
(
BidDetailContext
)
const
{
data
,
ctl
}
=
bidDetailContext
const
[
transferRadio
,
setTransferRadio
]
=
useState
<
number
>
(
5
)
const
dataSource
=
[
{
...
...
@@ -132,16 +131,6 @@ const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
}
}
const
onChange
=
(
record
)
=>
{
console
.
log
(
record
)
}
const
callForWay
=
1
// 招标方式
const
handleChangeType
=
(
e
)
=>
{
setTransferRadio
(
e
.
target
.
value
)
}
return
(
<
MellowCard
title=
{
cardTitle
}
...
...
@@ -150,89 +139,11 @@ 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
>
<
Radio
.
Group
value=
{
transferRadio
}
buttonStyle=
"solid"
size=
"small"
onChange=
{
handleChangeType
}
>
<
Radio
.
Button
value=
{
5
}
>
技术部分(50%)
</
Radio
.
Button
>
<
Radio
.
Button
value=
{
3
}
>
商务部分(30%)
</
Radio
.
Button
>
<
Radio
.
Button
value=
{
2
}
>
综合部分(20%)
</
Radio
.
Button
>
</
Radio
.
Group
>
</
div
>
{
transferRadio
===
5
?
<
Table
dataSource=
{
dataSource
}
columns=
{
columns
}
pagination=
{
{
size
:
"small"
}
}
/>
:
null
}
{
transferRadio
===
3
?
<
Table
dataSource=
{
dataSource
}
columns=
{
columns
}
pagination=
{
{
size
:
"small"
}
}
/>
:
null
}
{
transferRadio
===
2
?
<
Table
dataSource=
{
dataSource
}
columns=
{
columns
}
pagination=
{
{
size
:
"small"
}
}
/>
:
null
}
<
Table
dataSource=
{
dataSource
}
columns=
{
columns
}
pagination=
{
{
size
:
"small"
}
}
/>
</
div
>
<
div
className=
{
style
.
bidMemberContainer
}
>
<
h3
className=
"commonPanelTitle"
>
推荐中标会员
</
h3
>
...
...
@@ -272,31 +183,6 @@ const RemarkBidReport: React.FC<RemarkBidReportProps> = ({cardTitle}) => {
</
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>
</Row>
</div>
} */
}
</
MellowCard
>)
}
...
...
src/pages/transaction/components/orderPayModal/index.tsx
View file @
d7dfd91e
...
...
@@ -87,7 +87,7 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
console
.
log
(
transformPayList
,
'trans'
)
const
[
visible
,
setVisible
]
=
useState
(
false
)
const
[
checked
,
setChecked
]
=
useState
<
any
>
({})
const
[
current
,
setCurrent
]
=
useState
(
0
)
// 0选择方式 1线下支付方式 2授信支付 3余额支付 4微信支付 5货到付款 6支付宝 1000清除
const
[
current
,
setCurrent
]
=
useState
(
0
)
// 0选择方式 1线下支付方式 2授信支付 3余额支付 4微信支付 5货到付款 6支付宝 100
账期 101月结 100
0清除
const
[
payStep
,
setPayStep
]
=
useState
(
0
)
// 支付模态框的步骤 0选方式 1下一步的具体操作 2输入支付密码
const
mobilePayFlag
=
useRef
(
0
)
// 用于判断移动支付类型 4微信6支付宝
const
[
qrLoading
,
setQrLoading
]
=
useState
(
false
)
...
...
@@ -246,6 +246,15 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
// setQrLoading(true)
// handleSubmitPay()
// }
else
if
(
checked
.
id
===
100
)
{
console
.
log
(
'选择了账期结算模式'
)
setCurrent
(
100
)
setPayStep
(
1
)
}
else
if
(
checked
.
id
===
101
)
{
console
.
log
(
'选择了月结结算模式'
)
setCurrent
(
101
)
setPayStep
(
1
)
}
else
{
message
.
error
(
'暂只支持线下支付、授信额度支付、余额支付、货到付款、微信支付方式'
)
}
...
...
@@ -287,6 +296,14 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
}
else
if
(
current
===
5
)
{
// 开始提交货到付款数据
handleSubmitPay
()
}
else
if
(
current
===
100
)
{
// 开始提交账期结算数据
// @todo 与后端联调传参
handleSubmitPay
()
}
else
if
(
current
===
101
)
{
// 开始提交月结结算数据
// @todo 与后端联调传参
handleSubmitPay
()
}
confirm
&&
confirm
()
...
...
@@ -422,18 +439,18 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
?
payTextList
[
key
]
:
(
value
[
0
][
'value'
]
===
1
?
'账期'
:
'月结'
)
(
value
[
0
][
'value'
]
===
1
00
?
'账期'
:
'月结'
)
}
</
Col
>
<
Col
style=
{
{
flex
:
1
}
}
>
<
div
className=
{
style
.
radioBox
}
>
{
(
value
as
any
[]).
map
(
v
=>
{
if
(
payOnReceived
&&
v
.
value
===
7
)
{
// 过滤到付
return
null
}
else
{
//
if(payOnReceived && v.value === 7)
{
// 过滤到付
//
return null
//
}
else
{
return
<
div
key=
{
v
.
value
}
className=
{
cx
(
style
.
payRadio
,
(
checked
&&
v
.
value
===
checked
.
id
)
?
style
.
active
:
''
)
}
onClick=
{
()
=>
setChecked
({
id
:
v
.
value
,
channel
:
v
.
channel
})
}
>
{
v
.
label
}
</
div
>
}
//
}
})
}
</
div
>
...
...
@@ -596,7 +613,68 @@ const OrderPayModal: React.FC<OrderPayModalProps> = (props) => {
</
div
>
</
div
>
}
{
/* 账期结算 */
}
{
current
===
100
&&
<
div
>
<
p
style=
{
{
fontWeight
:
"bold"
}
}
>
账期支付确认
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付方式:
</
span
>
<
span
className=
{
style
.
amount
}
>
账期
</
span
>
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付渠道:
</
span
>
<
span
className=
{
style
.
amount
}
>
{
transformPayList
[
'-1'
][
0
][
'label'
]
}
</
span
>
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付金额(元):
</
span
>
<
span
className=
{
cx
(
style
.
amount
,
style
.
amount2
)
}
>
{
data
?.
paymentInformationResponses
?.
filter
(
item
=>
item
.
id
===
Number
(
currentPayInfoId
))[
0
]?.
payPrice
?.
toFixed
(
2
)
}
</
span
>
</
p
>
</
div
>
}
{
/* 月结结算 */
}
{
current
===
101
&&
<
div
>
<
p
style=
{
{
fontWeight
:
"bold"
}
}
>
月结支付确认
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付方式:
</
span
>
<
span
className=
{
style
.
amount
}
>
月结
</
span
>
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付渠道:
</
span
>
<
span
className=
{
style
.
amount
}
>
{
transformPayList
[
'-1'
][
0
][
'label'
]
}
</
span
>
</
p
>
<
p
>
<
span
className=
{
style
.
title
}
>
支付金额(元):
</
span
>
<
span
className=
{
cx
(
style
.
amount
,
style
.
amount2
)
}
>
{
data
?.
paymentInformationResponses
?.
filter
(
item
=>
item
.
id
===
Number
(
currentPayInfoId
))[
0
]?.
payPrice
?.
toFixed
(
2
)
}
</
span
>
</
p
>
</
div
>
}
</
Modal
>
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment