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

feat: 添加评标委员会相关页面

parent 30639885
......@@ -234,6 +234,20 @@ export const callForBidsRoute = [
hideInMenu: true,
noMargin: true,
},
// 评标委员会
{
path: '/memberCenter/procurementAbility/callForBids/remarkBidCommittee',
name: '评标委员会',
component: '@/pages/procurement/callForBids/remarkBidCommittee',
},
// 评标委员会-新建
{
path: '/memberCenter/procurementAbility/callForBids/remarkBidCommittee/add',
name: '新建评标委员会',
component: '@/pages/procurement/callForBids/addRemarkBidCommittee',
hideInMenu: true,
noMargin: true,
},
]
},
]
import React, { useState, useRef, useContext, useEffect } from 'react'
import { Form, Input, Select } from 'antd';
import { has } from 'lodash';
export interface ProductTableCellProps {
title: React.ReactNode;
......@@ -29,7 +28,7 @@ export const ProductEditableRow: React.FC<any> = ({...props }) => {
</EditableContext.Provider>
</Form>
);
};
}
......
import React, {useEffect} from 'react'
import { ISchemaFormActions, ISchemaFormAsyncActions } from '@formily/antd'
import { useModalTable } from '../../model/useModalTable'
import ModalTable from '@/components/ModalTable'
import { columnsSetMember } from '../../constant'
import { PublicApi } from '@/services/api'
import {formSearch } from '../../schema/modal'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import ModalSearch from '@/components/NiceForm/components/Search'
import Submit from '@/components/NiceForm/components/Submit'
import { PageStatus, usePageStatus } from '@/hooks/usePageStatus'
import { clearModalParams } from '@/utils'
import DrawerTable from '@/components/DrawerTable'
export interface MemberModalProps {
type?: 'radio' | 'checkbox',
schemaAction: ISchemaFormActions | ISchemaFormAsyncActions,
currentRef?: any,
}
const ProjectModal:React.FC<MemberModalProps> = (props) => {
const { type = "checkbox", schemaAction, currentRef, ...restProps } = props
const {
visible,
setVisible,
rowSelection,
rowSelectionCtl,
} = useModalTable({type, customKey: "memberId"})
const {
id,
preview,
pageStatus
} = usePageStatus()
useEffect(() => {
if (currentRef) {
currentRef.current = {
setVisible,
visible,
rowSelectionCtl
}
}
}, [])
// 添加会员
const handleOkAddMember = () => {
setVisible(false)
if(pageStatus === PageStatus.EDIT) {
schemaAction.setFieldState('commodityMemberList', state => {
state.isDelete = true
})
let hasMember: any = schemaAction.getFieldValue('commodityMemberList') || []
schemaAction.setFieldValue('commodityMemberList', hasMember.concat(rowSelectionCtl.selectRow))
rowSelectionCtl.setSelectedRowKeys([])
rowSelectionCtl.setSelectRow([])
} else {
schemaAction.setFieldValue('commodityMemberList', rowSelectionCtl.selectRow)
schemaAction.setFieldState('commodityMemberList', state => {
state.dataSource = rowSelectionCtl.selectRow
})
}
clearModalParams()
}
const handleCancelAddMember = () => {
setVisible(false)
clearModalParams()
}
const fetchMemberList = async (params) => {
const excludeIds = await PublicApi.getProductCommodityGetStrategyMemberByCommodityId({commodityId: schemaAction.getFieldValue("productId")}, {ctlType: 'none'})
let checkedMember = schemaAction.getFieldValue('commodityMemberList')
if(schemaAction.getFieldState('commodityMemberList').isDelete) {
params.excludeList = checkedMember.map(item => ({
memberId: item.memberId,
roleId: item.roleId,
}))
} else {
params.excludeList = excludeIds.data.map(item => ({
memberId: item.memberId,
roleId: item.memberRoleId,
}))
}
const res = await PublicApi.postMemberManageLowerConsumerPage(params, {ctlType: 'none'});
return res.data
}
return (
<ModalTable
modalTitle='选择项目'
confirm={handleOkAddMember}
cancel={handleCancelAddMember}
visible={visible}
columns={columnsSetMember}
rowSelection={rowSelection}
fetchTableData={params => fetchMemberList(params)}
formilyProps={
{
ctx: {
schema: formSearch,
components: {
ModalSearch,
Submit,
},
effects: ($, actions) => {
actions.reset()
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
},
}
}
}
resetModal={{
destroyOnClose: true
}}
tableProps={{
rowKey: 'memberId'
}}
/>
)
}
ProjectModal.defaultProps = {}
export default ProjectModal
// 选择商品和会员弹框的列
export const columnsSetMember: any[] = [
{
title: 'ID',
dataIndex: 'memberId',
align: 'center',
key: 'memberId',
},
{
title: '会员名称',
dataIndex: 'name',
align: 'center',
key: 'name',
},
{
title: '会员类型',
dataIndex: 'memberTypeName',
align: 'center',
key: 'memberTypeName',
},
{
title: '会员角色',
dataIndex: 'roleName',
align: 'center',
key: 'roleName',
},
{
title: '会员等级',
dataIndex: 'levelTag',
align: 'center',
key: 'levelTag',
}
]
.ant-input-group-addon {
padding: 0;
border: none;
}
.connectBtn {
width: 80px;
height: 32px;
line-height: 32px;
background: #909399;
color: #fff;
text-align: center;
cursor: pointer;
}
.footer {
position: absolute;
right: 0;
bottom: 0;
padding: 12px 16px 12px 0;
width: 100%;
text-align: right;
border-top: 1px solid #eee;
background-color: #fff;
}
.card-list {
font-size: 12px;
line-height: 20px;
margin-top: 12px;
}
.card-list_title {
font-size: 12px;
color: #909399;
}
import { useState, useEffect } from 'react'
import { useRowSelectionTable } from '@/hooks/useRowSelectionTable'
export const useModalTable = (options?) => {
const [visible, setVisible] = useState(false)
const [rowSelection, rowSelectionCtl] = useRowSelectionTable(options)
return {
visible,
setVisible,
rowSelection,
rowSelectionCtl
}
}
import React from 'react'
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
export const formSchema: ISchema = {
type: 'object',
properties: {
STRATEGY_TABS: {
type: 'object',
"x-component": "tab",
"x-component-props": {
type: 'card',
},
properties: {
"tab-1": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
"tab": "基本信息",
},
"properties": {
MEGA_LAYOUT1: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
wrapperCol: 8,
labelAlign: 'left'
},
properties: {
name: {
type: 'string',
title: '评标委员会名称',
"x-component-props": {
placeholder: '最长50个字符,25字汉字'
},
"x-rules": [
{
required: true,
message: '请填写评标委员会名称'
},
{
limitByte: true,
maxByte: 60
},
]
},
projectName: {
type: 'string',
title: '招标项目',
"x-mega-props": {
full: true
},
"x-component-props": {
disabled: true,
addonAfter: "{{selectButton}}"
},
required: true
},
remarkNo: {
type: 'string',
title: '评标招标编号',
readOnly: true,
},
startTime: {
type: 'string',
title: '开标时间',
readOnly: true,
},
remarkTime: {
type: 'string',
title: '评标时间',
readOnly: true,
},
createTime: {
type: 'string',
title: '创建时间',
readOnly: true,
},
}
}
}
},
"tab-2": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
"tab": "组件条件"
},
"properties": {
MEGA_LAYOUT2: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
conditionLists: {
type: 'array:number',
"x-component": 'MultTable',
"x-component-props": {
rowKey: 'id',
columns: "{{conditionColumns}}",
}
}
}
}
}
},
"tab-3": {
"type": "object",
"x-component": "tabpane",
"x-component-props": {
"tab": "委员会成员"
},
"properties": {
MEGA_LAYOUT3: {
type: 'object',
"x-component": 'mega-layout',
"x-component-props": {
labelCol: 4,
labelAlign: 'left'
},
properties: {
conditionLists: {
type: 'array:number',
"x-component": 'MultTable',
"x-component-props": {
rowKey: 'id',
columns: "{{memeberColumns}}",
prefix: "{{selectExpertButton}}",
}
}
}
}
}
},
}
}
}
}
import { FORM_FILTER_PATH } from "@/formSchema/const";
import { ISchema } from "@formily/antd";
// 选择商品和会员高级筛选
export const formSearch: ISchema = {
type: 'object',
properties: {
name: {
type: 'string',
'x-component': 'ModalSearch',
'x-component-props': {
placeholder: '请输入会员名字',
align: 'flex-left',
advanced: false,
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
rowStyle: {
flexWrap: 'nowrap',
style: {
marginRight: 0
}
},
colStyle: {
marginTop: 20,
},
},
properties: {
submit: {
"x-component": 'Submit',
"x-mega-props": {
span: 1
},
"x-component-props": {
children: '查询',
}
}
}
}
}
}
......@@ -31,7 +31,6 @@ const AddRemarkBidExpert:React.FC<AddRemarkBidExpertProps> = (props) => {
const [visible, setVisible] = useState(false)
const [selectRow, setSelectRow] = useState<any[]>([]) // 抽屉选择的行数据
const [selectedRowKeys, setSelectedRowKeys] = useState<Array<string>>([])
const [totalNumber, setTotalNumber] = useState<number>(0)
const {
id,
......@@ -55,8 +54,6 @@ const AddRemarkBidExpert:React.FC<AddRemarkBidExpertProps> = (props) => {
return new Promise((resolve, reject) => {
//@ts-ignore
PublicApi.getProductPlatformGetAttributeList({ ...params, name: params.name || '', groupName: params.groupName || '', isEnable: true }).then(res => {
console.log(res)
setTotalNumber(res.data.totalCount)
resolve(res.data)
})
})
......@@ -114,7 +111,7 @@ const AddRemarkBidExpert:React.FC<AddRemarkBidExpertProps> = (props) => {
style={{margin: 0}}
onBack={() => history.goBack()}
backIcon={<ReutrnEle description="返回"/>}
title="新建评标模板"
title="新建评标专家"
// extra={[
// <Button key="1" onClick={() => addSchemaAction.submit()} loading={btnLoading} type="primary" icon={<SaveOutlined />}>
// 保存
......
......@@ -16,7 +16,7 @@ export interface AddRemarkBidTemplateProps {}
const addSchemaAction = createFormActions()
// 新增评标模板. 包含新增和编辑
const AddNewBid:React.FC<AddRemarkBidTemplateProps> = (props) => {
const AddRemarkBidTemplate:React.FC<AddRemarkBidTemplateProps> = (props) => {
const [formLoading, setFormLoading] = useState(false)
const [btnLoading, setBtnLoading] = useState(false)
......@@ -69,6 +69,6 @@ const AddNewBid:React.FC<AddRemarkBidTemplateProps> = (props) => {
)
}
AddNewBid.defaultProps = {}
AddRemarkBidTemplate.defaultProps = {}
export default AddNewBid
export default AddRemarkBidTemplate
import React, { useRef } from 'react'
import { history } from 'umi'
import { Card, Button, Space } from 'antd'
import { StandardTable } from 'god'
import { PageHeaderWrapper } from '@ant-design/pro-layout'
import { PublicApi } from '@/services/api'
import { useSelfTable } from './model/useSelfTable'
import { PlusCircleOutlined } from '@ant-design/icons'
import { tableListSchema } from './schema'
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch'
import { FORM_FILTER_PATH } from '@/formSchema/const'
import Submit from '@/components/NiceForm/components/Submit'
import DateRangePickerUnix from '@/components/NiceForm/components/DateRangePickerUnix'
// 评标委员会 招标
export interface RemarkBidCommitteeProps {}
const fetchTableData = async (params) => {
const { data } = await PublicApi.getOrderProcurementReviewedListOne(params)
return data
}
const RemarkBidCommittee:React.FC<RemarkBidCommitteeProps> = (props) => {
const {
columns,
ref,
} = useSelfTable()
return <PageHeaderWrapper>
<Card>
<StandardTable
fetchTableData={params => fetchTableData(params)}
columns={columns}
currentRef={ref}
rowKey={'id'}
formilyLayouts={{
justify: 'space-between'
}}
formilyProps={{
ctx: {
inline: false,
schema: tableListSchema,
effects: ($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'orderNo',
FORM_FILTER_PATH,
);
},
components: {
DateRangePickerUnix,
Submit
}
},
layouts: {
order: 2,
span: 24
}
}}
formilyChilds={{
children: <Space>
<Button
icon={<PlusCircleOutlined/>}
type='primary'
onClick={() => history.push('/memberCenter/procurementAbility/callForBids/remarkBidCommittee/add')}
>
新建
</Button>
</Space>,
layouts: {
span: 8
}
}}
/>
</Card>
</PageHeaderWrapper>
}
RemarkBidCommittee.defaultProps = {}
export default RemarkBidCommittee
import React, { useRef } from 'react'
import { Button } from 'antd'
import { history } from 'umi'
import StatusSwitch from '@/components/StatusSwitch'
import EyePreview from '@/components/EyePreview'
import { formatTimeString } from '@/utils'
import { PlayCircleOutlined, PoweroffOutlined } from '@ant-design/icons'
// 评标委员会 招标
export const useSelfTable = () => {
const ref = useRef<any>({})
const baseBidListColumns: any[] = [
{
title: '序号',
align: 'center',
dataIndex: 'id',
key: 'id',
render: (t, r, i) => ++i
},
{
title: '评标委员会名称',
align: 'center',
dataIndex: 'receiverName',
key: 'receiverName',
render: (text, record) => <>
<EyePreview url={`${history.location.pathname}/detail?id=${record.id}`}>
{text}
</EyePreview>
</>
},
{
title: '评标招标编号',
align: 'center',
dataIndex: 'orderNo',
key: 'orderNo',
},
{
title: '开标时间',
align: 'center',
dataIndex: 'createTime',
key: 'createTime',
render: (text, record) => formatTimeString(record.createTime),
width: 200
},
{
title: '评标开始/截止时间',
align: 'center',
dataIndex: 'createTime',
key: 'createTime',
render: (text, record) => <>
<div><PlayCircleOutlined />{formatTimeString(record.createTime)}</div>
<div><PoweroffOutlined />{formatTimeString(record.createTime)}</div>
</>,
width: 200
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createTime',
key: 'createTime',
render: (text, record) => formatTimeString(record.createTime),
width: 200
},
{
title: '参与评标人数',
align: 'center',
dataIndex: 'sum',
key: 'sum',
},
// {
// title: '状态',
// align: 'center',
// dataIndex: 'externalState',
// key: 'externalState',
// render: (text: any, record: any) => (
// <StatusSwitch
// handleConfirm={() => handleUpdateState(record)}
// record={record}
// fieldNames="isEnable"
// expectTrueValue={true}
// />
// ),
// },
]
// const handleUpdateState = (record) => {
// console.log(record, 'update')
// }
const secondColumns: any[] = baseBidListColumns.concat([
{
title: '操作',
align: 'center',
dataIndex: 'ctl',
key: 'ctl',
render: (text, record) => <>
<Button type='link'>编辑</Button>
<Button type='link'>发送通知</Button>
<Button type='link'>删除</Button>
</>
}
])
return {
columns: secondColumns,
ref,
}
}
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { OrderTypeMap, PurchaseOrderInsideWorkStateTexts, PurchaseOrderOutWorkStateTexts } from '@/constants';
/**
* 除了订单必填字段, 默认
*/
export const tableListSchema: ISchema = {
type: 'object',
properties: {
orderNo: {
type: 'string',
"x-component": 'SearchFilter',
'x-component-props': {
placeholder: '请输入订单编号',
align: 'flex-end',
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'flex-layout',
'x-component-props': {
inline: true,
colStyle: {
marginLeft: 20
}
},
properties: {
orderThe: {
type: 'string',
'x-component-props': {
placeholder: '请输入订单摘要',
}
},
"supplyMembersName": {
type: 'string',
"x-component-props": {
placeholder: '请输入供应会员名称'
}
},
"type": {
type: 'string',
"x-component-props": {
placeholder: '请选择订单类型'
},
enum: Object.keys(OrderTypeMap).map(item => ({
label: OrderTypeMap[item],
value: item,
}))
},
"[startCreateTime,endCreateTime]": {
type: 'array',
"x-component": 'DateRangePickerUnix',
'x-component-props': {
placeholder: ['开始时间','结束时间'],
},
},
submit: {
'x-component': 'Submit',
'x-component-props': {
children: '查询',
},
},
},
},
}
}
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