This commit is contained in:
jl-zhoujl2
2022-08-26 15:48:47 +08:00
parent 7d3372342a
commit 29e85ec345
5 changed files with 392 additions and 32 deletions

View File

@ -2,10 +2,12 @@
.common {
padding: 0px 24px;
}
//操作栏颜色
.operation {
// margin-right: 8px;
}
// .card-title-button .ant-card-head-title {
// padding: 10px 0px;
// }
@ -17,15 +19,18 @@
color: #b30000;
// margin-right: 8px;
}
.revenue .ant-tabs-content-holder {
margin-top: 0px;
}
.revenue .ant-tabs-top > .ant-tabs-nav,
.ant-tabs-bottom > .ant-tabs-nav,
.ant-tabs-top > div > .ant-tabs-nav,
.ant-tabs-bottom > div > .ant-tabs-nav {
.revenue .ant-tabs-top>.ant-tabs-nav,
.ant-tabs-bottom>.ant-tabs-nav,
.ant-tabs-top>div>.ant-tabs-nav,
.ant-tabs-bottom>div>.ant-tabs-nav {
margin: 0;
}
// .ant-pro-card-body {
// padding: 0;
// }
@ -33,17 +38,21 @@
.confirm .ant-pro-table .ant-pro-table-search {
padding: 16px 0px 0px 0px;
}
.notice .ant-pro-table-list-toolbar-container {
padding: 0px 0px 16px;
}
.erf-title-flex {
display: flex;
justify-content: space-between;
}
.erf-title-left {
height: 32px;
line-height: 32px;
}
.erf-delete {
color: #1890ff !important;
background: rgba(0, 0, 0, 0) !important;
@ -55,6 +64,7 @@
font-weight: 600;
line-height: 56px;
}
.CM_span {
text-indent: 2em;
// line-height: 24px;
@ -79,10 +89,12 @@
float: left;
line-height: 44px;
}
//日历组件专用样式
.calendar-dashboard .ant-picker-calendar .ant-picker-panel .ant-picker-body {
padding: 0px;
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date {
margin: 0 0 1px 1px;
padding: 0px 8px 0px;
@ -93,6 +105,7 @@
border-right: 1px solid #f0f0f0;
border-radius: 0px
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-content {
position: static;
width: auto;
@ -102,34 +115,42 @@
color: rgba(0, 0, 0, 0.85);
line-height: 1.5715;
text-align: center;
}
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date,
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date,
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected .ant-picker-calendar-date-today,
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-cell-selected:hover .ant-picker-calendar-date-today {
background: #fff1f0;
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {
border-color: #b30000;
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-body th {
padding: 0 0px 5px 0;
text-align: center;
}
.calendar-dashboard .ant-picker-calendar-full .ant-picker-panel .ant-picker-body td {
text-align: center;
}
.calendar-dashboard .ant-tag {
margin-right: 0px;
line-height: 19px;
}
.calendar-dashboard .ant-picker-cell {
cursor: default;
}
.notice-detail-html p {
margin: 0;
padding: 0;
}
.notice-detail-file {
font-size: 17px;
color: #7c7c7c;
@ -138,26 +159,38 @@
top: 5px;
vertical-align: top;
}
.notice-detail-noticefile {
margin-top: 20px;
.ant-spin-nested-loading {
display: inline-block;
}
}
.baseinf-top {
background-color: #ffffff;
padding: 20px;
overflow: auto;
}
.baseinf-bottom-btn {
margin-top: 40px;
text-align: center;
}
.calibration-panel {
.ant-collapse-content-box {
padding: 0px 16px;
}
}
.question-form .ant-space {
min-width: 50%;
}
.table-no-alert {
.ant-pro-table-alert {
display: none;
}
}

View File

@ -0,0 +1,249 @@
import React, { useEffect, useRef, useState } from 'react';
import { Col, DatePicker, Form, Input, message, Modal, Row } from 'antd';
import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table';
import { getBidEvalRoom } from './service';
import { dateFormat, disabledDate, disabledDateTime, validateMessages } from './MeetingReservation';
import moment from 'moment';
import { dateTimeFormatter } from '@/utils/DateUtils';
interface BidEvalAppointmentProps {
modalVisible: boolean;
onCancel: () => void;
onSubmit: (value: any) => void;
values: any;
}
export const proviceEnum = {
"0011": "北京",
"0012": "天津",
"0013": "河北",
"0014": "山西",
"0015": "内蒙古",
"0021": "辽宁",
"0022": "吉林",
"0023": "黑龙江",
"0031": "上海",
"0032": "江苏",
"0033": "浙江",
"0034": "安徽",
"0035": "福建",
"0036": "江西",
"0037": "山东",
"0041": "河南",
"0042": "湖北",
"0043": "湖南",
"0044": "广东",
"0045": "广西",
"0046": "海南",
"0050": "重庆",
"0051": "四川",
"0052": "贵州",
"0053": "云南",
"0054": "西藏",
"0061": "陕西",
"0062": "甘肃",
"0063": "青海",
"0064": "宁夏",
"0065": "新疆",
"001000": "集团"
}
const modalHeight = window.innerHeight * 96 / 100;
const BidEvalAppointment: React.FC<BidEvalAppointmentProps> = (props) => {
const { modalVisible, onCancel, onSubmit, values } = props;
const actionRef = useRef<ActionType>();
const [form] = Form.useForm();
//当前选择行areaId
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
//当前选择行数据
const [selectedRecord, setSelectedRecord] = useState<any>();
const columns: ProColumns<any>[] = [
{
valueType: 'index',
width: 48,
},
{
title: '评标室名称',
dataIndex: 'areaName',
ellipsis: true,
},
{
title: '服务省分',
dataIndex: 'provinceDictId',
ellipsis: true,
valueEnum: proviceEnum,
hideInSearch: true,
},
{
title: '详细地址',
dataIndex: 'areaAddress',
ellipsis: true,
hideInSearch: true,
},
{
title: '可容纳人数',
dataIndex: 'areaNumber',
ellipsis: true,
hideInSearch: true,
},
{
title: '联系人',
dataIndex: 'contactName',
ellipsis: true,
hideInSearch: true,
}, {
title: '联系电话',
dataIndex: 'contactTel',
ellipsis: true,
hideInSearch: true,
},
];
const onOk = () => {
if (selectedRowKeys.length == 0) {
message.info("请选择评标室");
return;
}
form.validateFields().then(value => {
if (value.reserveStartDate < moment().format(dateTimeFormatter)) {
message.info("开始时间不可早于当前时间");
return;
}
value["areaId"] = selectedRecord.id;
value["placeId"] = selectedRecord.placeId;
value["evalLocation"] = selectedRecord.areaName;
onSubmit(value);
})
}
useEffect(() => {
if (values) {
if (values?.areaId) {
setSelectedRowKeys([values.areaId])
setSelectedRecord({
...values,
id: values.areaId,
})
}
form.setFieldsValue({
...values,
})
}
return () => {
setSelectedRowKeys([]);
setSelectedRecord(void 0);
}
}, [values])
return (
<Modal
destroyOnClose
title="选择评标室"
visible={modalVisible}
maskClosable={false}
onCancel={() => onCancel()}
onOk={() => onOk()}
okText="确认"
width={"70%"}
style={{ maxHeight: modalHeight }}
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', }}
className="confirm table-no-alert"
centered
>
<ProTable<any>
columns={columns}
actionRef={actionRef}
bordered={false}
request={async (params: any) => {
return await getBidEvalRoom(params).then(res => {
if (res?.code == 200) {
return {
data: res?.data.records,
success: res?.success,
total: res?.data.total,
}
} else {
return {
data: [],
success: false,
total: 0,
}
}
})
}}
rowKey="id"
search={{
labelWidth: 'auto',
}}
options={false}
pagination={{
size: "small",
defaultPageSize: 10,
showSizeChanger: true,
}}
rowSelection={{
type: "radio",
selectedRowKeys,
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRowKeys(selectedRowKeys);
setSelectedRecord(selectedRows[0]);
},
}}
dateFormatter="string"
toolBarRender={false}
/>
<Form
name="basic"
form={form}
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
preserve={false}
validateMessages={validateMessages}
>
{selectedRowKeys.length > 0 && (
<Row>
<Col span={12}>
<Form.Item
label="预计评标开始时间"
name="reserveStartDate"
rules={[{ required: true, message: '请选择' }]}
>
<DatePicker showTime={{ defaultValue: moment().hour(7) }} showNow={false} disabledDate={disabledDate} disabledTime={disabledDateTime} showMinute={false} showSecond={false} format={dateFormat} style={{ width: '100%' }} />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="预计评标结束时间"
name="reserveEndDate"
rules={[{ required: true, message: '请选择' }]}
>
<DatePicker showTime={{ defaultValue: moment().hour(7) }} showNow={false} disabledDate={disabledDate} disabledTime={disabledDateTime} showMinute={false} showSecond={false} format={dateFormat} style={{ width: '100%' }} />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="预约人"
name="reserveBy"
rules={[{ required: true }]}
>
<Input maxLength={20} placeholder="预约人姓名" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="预约人联系方式"
name="reserveContactNumber"
rules={[{ required: true }]}
>
<Input type="number" maxLength={20} placeholder="预约人手机号" />
</Form.Item>
</Col>
</Row>
)}
</Form>
</Modal>
);
};
export default BidEvalAppointment;

View File

@ -18,16 +18,26 @@ const layout = {
labelCol: { span: 7 },
wrapperCol: { span: 14 },
};
const validateMessages = {
export const validateMessages = {
required: '请填写此项',
};
const range = (start: number, end: number) => {
export const range = (start: number, end: number) => {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
};
//不可选天
export function disabledDate(current: any) {
return current && current < moment().startOf('day');
}
//不可选小时
export const disabledDateTime = () => ({
disabledHours: () => [...range(0, 7), ...range(19, 24)],
});
//时间选择框日期格式化
export const dateFormat: DatePickerProps['format'] = value => value?.startOf('hour').format('YYYY-MM-DD HH:mm:ss');
/**
* 评标室预约管理-会议室预约弹窗
* @param props
@ -67,16 +77,7 @@ const MeetingReservation: React.FC<MeetingReservationProps> = (props) => {
setLoading(false);
})
};
//不可选天
function disabledDate(current: any) {
return current && current < moment().startOf('day');
}
//不可选小时
const disabledDateTime = () => ({
disabledHours: () => [...range(0, 7), ...range(19, 24)],
});
//时间选择框日期格式化
const dateFormat: DatePickerProps['format'] = value => value?.startOf('hour').format('YYYY-MM-DD HH:mm:ss');
//获取预约信息
const getMeetData = () => {
setSkeleing(true);

View File

@ -26,4 +26,18 @@ export async function cancelMeeting(id: any) {
return request('/api/biz-service-ebtp-evaluation/v1/eval/room/reserve/cancel/' + id, {
method: 'GET',
});
}
/**
* 评标室预约-查询评标室
* @params data
*/
export async function getBidEvalRoom(data: any) {
return request('/api/biz-service-ebtp-evaluation/v1/elec/eval/area/page/list', {
method: 'POST',
data: {
...data,
pageNo: data.current,
},
});
}

View File

@ -11,6 +11,7 @@ import FileDown from '@/utils/Download';
import { UploadOutlined } from '@ant-design/icons';
import { btnAuthority } from '@/utils/authority';
import RiskPrevention from '@/utils/RiskPrevention';
import BidEvalAppointment from '@/components/ElecBidEvaluation/BidEvalAppointment';
const JudgingPanel: React.FC<{}> = () => {
const modalHeight = window.innerHeight * 96 / 100;
@ -43,6 +44,9 @@ const JudgingPanel: React.FC<{}> = () => {
const [manNum, manNumSet] = useState<number>(5);//人数
const [riskVisible, setRiskVisible] = useState<boolean>(false);//风控弹窗 2021.9.7 zhoujianlong
const [riskData, setRiskData] = useState<any[]>([]);//风控数据 2021.9.7 zhoujianlong
const [selectEvalVisible, setSelectEvalVisible] = useState<boolean>(false);//电子评标室-评标室预约选择 2022.8.26 zhoujianlong
const [selectEvalDisabled, setSelectEvalDisabled] = useState<boolean>(true);//电子评标室-评标室预约选择不可选状态控制 true-不可填写 false-可填写 2022.8.26 zhoujianlong
const [selectEvalData, setSelectEvalData] = useState<any>();//电子评标室-评标室预约选择-数据 2022.8.26 zhoujianlong
function getShouName() {
const method = getProMethod();
let showNameT: any = { zbr: '', bb: '', pb: '', }//相关标段 标书费 保证金 服务费
@ -72,7 +76,7 @@ const JudgingPanel: React.FC<{}> = () => {
const hide = message.loading('正在配置');
try {
const success = await saveGroup({ ...fields }).then((res) => {
if(res?.code == 4004 && res?.success == false) { //2021.9.7 zhoujianlong 新增评委会保存增加风控
if (res?.code == 4004 && res?.success == false) { //2021.9.7 zhoujianlong 新增评委会保存增加风控
const data = res?.data?.result == undefined ? [] : res?.data?.result
setRiskData(data)
setRiskVisible(true)
@ -673,6 +677,20 @@ const JudgingPanel: React.FC<{}> = () => {
}}>{display ? '自行输入' : '选择分类'}</Button>
</Row>
} */}
<FormItem
name="placeId"
label="场所id"
hidden
>
<Input />
</FormItem>
<FormItem
name="areaId"
label="区域Id"
hidden
>
<Input />
</FormItem>
<Row>
<Col span={12}><FormItem
name="representativeNumber"
@ -688,8 +706,29 @@ const JudgingPanel: React.FC<{}> = () => {
>
<Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col>
</Row>
<Row>
<Col span={12}>
<Form.Item label={`${showName.pb}地点`} style={{ marginBottom: 0 }} required>
<FormItem
name="evalLocation"
rules={[...rule(`${showName.pb}地点`), { type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
style={{ display: 'inline-block', width: 'calc(60% - 8px)' }}
>
<Input style={{ width: "100%" }} disabled={disabled || !selectEvalDisabled} />
</FormItem>
<Form.Item
style={{ display: 'inline-block', width: 'calc(40% - 8px)', margin: '0 8px' }}
>
<Button type='primary' onClick={() => selectEvalClick()} disabled={disabled}></Button>
</Form.Item>
</Form.Item>
</Col>
<Col span={12}><FormItem
name="description"
label="申请要求"
rules={[{ type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col>
<Col span={12}><FormItem
name="startTime"
label={`预计${showName.pb}开始时间`}
@ -701,6 +740,7 @@ const JudgingPanel: React.FC<{}> = () => {
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled}
showNow={false}
style={{ width: "90%" }}
/>
</FormItem></Col>
<Col span={12}><FormItem
@ -714,23 +754,22 @@ const JudgingPanel: React.FC<{}> = () => {
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled}
showNow={false}
style={{ width: "90%" }}
/>
</FormItem></Col>
</Row>
<Row>
<Col span={12}><FormItem
name="evalLocation"
label={`${showName.pb}地点`}
rules={[...rule(`${showName.pb}地点`), { type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
name="reserveBy"
label="预约人"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人` }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
<Input style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
</FormItem></Col>
<Col span={12}><FormItem
name="description"
label="申请要求"
rules={[{ type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
name="reserveContactNumber"
label="预约人联系方式"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人联系方式` }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
<Input type="number" style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
</FormItem></Col>
</Row>
<h3 className="first-title">{showName.bb}</h3>
@ -1657,7 +1696,29 @@ const JudgingPanel: React.FC<{}> = () => {
dataSet(dataTem, type);
memberCountSet(memberCount + 1);
}
//评标室预约回调
const returnEvalData = (value: any) => {
setSelectEvalVisible(false);
setSelectEvalDisabled(false);
form.setFieldsValue({
startTime: value.reserveStartDate,
endTime: value.reserveEndDate,
evalLocation: value.evalLocation,
reserveBy: value.reserveBy,
reserveContactNumber: value.reserveContactNumber,
areaId: value.areaId,
placeId: value.placeId,
})
}
//评标室预约-选择评标室
const selectEvalClick = () => {
const data = form.getFieldsValue();
data["reserveStartDate"] = data.startTime;
data["reserveEndDate"] = data.endTime;
console.log("data", data)
setSelectEvalData(data);
setSelectEvalVisible(true);
}
return (
<div className='bgCWhite' style={{ padding: '0px 24px 24px' }}>
<Spin spinning={spin}>
@ -1715,7 +1776,7 @@ const JudgingPanel: React.FC<{}> = () => {
{group()}
{member()}
{/**风控组件 */}
{riskVisible && <RiskPrevention
{riskVisible && <RiskPrevention
modalVisible={riskVisible}
onCancel={() => {
setRiskVisible(false)
@ -1723,6 +1784,8 @@ const JudgingPanel: React.FC<{}> = () => {
}}
data={riskData}
/>}
{/**电子评标室-评标室预约选择 */}
<BidEvalAppointment modalVisible={selectEvalVisible} onCancel={() => setSelectEvalVisible(false)} onSubmit={(value: any) => returnEvalData(value)} values={selectEvalData} />
</div>
)
}