Commit 981ec204 authored by 涂伟's avatar 涂伟

fix: '维保方案配置日周期新增执行时间选择'

parent cd608464
...@@ -511,6 +511,56 @@ const AddModal = props => { ...@@ -511,6 +511,56 @@ const AddModal = props => {
}); });
}; };
function hasOverlappingIntervals(intervals) {
if (intervals.length < 2) {
return false; // 少于两个时间段,不可能有交集
}
// 辅助函数,将时间字符串转换为分钟数
function timeToMinutes(timeStr) {
const [hours, minutes] = timeStr.split(':').map(Number);
return hours * 60 + minutes;
}
// 按照开始时间排序,这里使用转换后的分钟数进行比较
intervals.sort((a, b) => {
const startA = timeToMinutes(a.beginTime);
const startB = timeToMinutes(b.beginTime);
if (startA === startB) {
// 如果开始时间相同,则按照结束时间排序(也转换为分钟数比较)
return timeToMinutes(a.endTime) - timeToMinutes(b.endTime);
}
return startA - startB;
});
// 遍历排序后的数组,检查是否有时间交集
for (let i = 1; i < intervals.length; i++) {
const current = intervals[i];
const prev = intervals[i - 1];
// 转换当前和前一个时间段的开始和结束时间为分钟数(但这里其实只需比较开始时间)
// 因为排序已经确保了开始时间的顺序
const currentStart = timeToMinutes(current.beginTime);
const prevEnd = timeToMinutes(prev.endTime);
// 如果当前时间段的开始时间小于等于前一个时间段的结束时间,则存在交集
if (currentStart < prevEnd) {
return true;
}
}
// 没有交集
return false;
}
const checkMustData = (arr) => {
// 使用 some 方法来检查数组中是否有任何项不满足条件
return arr.some(item => {
// 检查每个项是否缺少必要的属性
return !item.name || !item.beginTime || !item.endTime;
});
}
const onSubmit = () => { const onSubmit = () => {
formAdd.validateFields().then(validate1 => { formAdd.validateFields().then(validate1 => {
if (validate1) { if (validate1) {
...@@ -564,7 +614,17 @@ const AddModal = props => { ...@@ -564,7 +614,17 @@ const AddModal = props => {
StartLen: Number(startLen), StartLen: Number(startLen),
StartExecLen: StartExecLen, StartExecLen: StartExecLen,
EndExecLen: EndExecLen, EndExecLen: EndExecLen,
PlanDetails: data.PlanDetails
}; };
if (checkMustData(data.PlanDetails)) {
message.warning('请检查巡检名称和时间是否填写完整!');
return
}
if (hasOverlappingIntervals(data.PlanDetails)) {
message.warning('时间区间不可重合!');
return
}
console.log(data, hasOverlappingIntervals(data.PlanDetails), '时间校验');
obj.inOrder = obj.inOrder ? 1 : 0; obj.inOrder = obj.inOrder ? 1 : 0;
obj.isDynamicCycle = obj.isDynamicCycle ? 1 : 0; obj.isDynamicCycle = obj.isDynamicCycle ? 1 : 0;
if (!obj.time) { if (!obj.time) {
...@@ -583,7 +643,7 @@ const AddModal = props => { ...@@ -583,7 +643,7 @@ const AddModal = props => {
lastData.time = true; lastData.time = true;
} }
obj.docycle = JSON.stringify(lastData); obj.docycle = JSON.stringify(lastData);
console.log(obj.docycle,'ssssssssssss'); console.log(obj.docycle, 'ssssssssssss');
let arr = []; let arr = [];
dataSource.forEach(i => { dataSource.forEach(i => {
arr.push(i.name); arr.push(i.name);
......
...@@ -2,9 +2,10 @@ ...@@ -2,9 +2,10 @@
/* eslint-disable prefer-destructuring */ /* eslint-disable prefer-destructuring */
/* eslint-disable no-else-return */ /* eslint-disable no-else-return */
// 基础信息配置 // 基础信息配置
import { Form, Radio, Select, Row, Col, Switch, Tooltip, InputNumber } from 'antd'; import { Form, Radio, Select, Row, Col, Switch, Tooltip, InputNumber, Input, DatePicker, Button } from 'antd';
import { EditOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { EditOutlined, InfoCircleOutlined, CloseCircleOutlined, PlusCircleOutlined } from '@ant-design/icons';
import React, { useEffect, useRef, useState } from 'react'; import React, { useEffect, useRef, useState } from 'react';
import moment from 'moment';
import styles from './BaseTimeConfig.less'; import styles from './BaseTimeConfig.less';
const provinceData = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; const provinceData = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
...@@ -17,6 +18,9 @@ const cityData = { ...@@ -17,6 +18,9 @@ const cityData = {
周六: ['周六', '周日', '下周一', '下周二', '下周三', '下周四', '下周五'], 周六: ['周六', '周日', '下周一', '下周二', '下周三', '下周四', '下周五'],
周日: ['周日', '下周一', '下周二', '下周三', '下周四', '下周五', '下周六'], 周日: ['周日', '下周一', '下周二', '下周三', '下周四', '下周五', '下周六'],
}; };
const { RangePicker } = DatePicker;
// const [formAdd] = Form.useForm();
// const { Item } = Form;
const BaseConfig = (props, ref) => { const BaseConfig = (props, ref) => {
const Mobj = { const Mobj = {
1: 1, 1: 1,
...@@ -40,14 +44,37 @@ const BaseConfig = (props, ref) => { ...@@ -40,14 +44,37 @@ const BaseConfig = (props, ref) => {
const [HourType, setHourType] = useState('今'); const [HourType, setHourType] = useState('今');
const [HourDayType1, setHourDayType1] = useState('0'); // 时选择-日期 const [HourDayType1, setHourDayType1] = useState('0'); // 时选择-日期
const [HourDayType2, setHourDayType2] = useState('1'); // 时选择-日期 const [HourDayType2, setHourDayType2] = useState('1'); // 时选择-日期
const [planDetails, setPlanDetails] = useState([]); // 日选择-巡检时间段
const [show, setShow] = useState(true); // 日选择-巡检时间段
const handleInputChange = (value) => { const handleInputChange = (value) => {
setOnlineTasks(value); setOnlineTasks(value);
} }
// 生成随机ID
function generateRandomId() {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let randomId = '';
for (let i = 0; i < 8; i++) {
randomId += chars.charAt(Math.floor(Math.random() * chars.length));
}
return randomId;
}
useEffect(() => { useEffect(() => {
if (props.keepTimeData) { if (props.keepTimeData) {
console.log(props.keepTimeData, 'props.keepTimeDataprops.keepTimeData');
if (props.keepTimeData.PlanDetails?.length) {
setPlanDetails(props.keepTimeData.PlanDetails.map((item, index) => {
return {
...item,
id: generateRandomId()
}
}))
} else {
setPlanDetails([])
}
if (props.keepTimeData?.time) { if (props.keepTimeData?.time) {
setVisibleChecked(true); setVisibleChecked(true);
} }
...@@ -99,12 +126,12 @@ const BaseConfig = (props, ref) => { ...@@ -99,12 +126,12 @@ const BaseConfig = (props, ref) => {
setValue('day'); setValue('day');
setCycleLen(props.keepTimeData.CycleLen); setCycleLen(props.keepTimeData.CycleLen);
} else if (props.keepTimeData?.Unit === '小时') { } else if (props.keepTimeData?.Unit === '小时') {
console.log(props.keepTimeData,'props.keepTimeDataprops.keepTimeDataprops.keepTimeData'); console.log(props.keepTimeData, 'props.keepTimeDataprops.keepTimeDataprops.keepTimeData');
setValue('hour'); setValue('hour');
setCycleLen(props.keepTimeData.CycleLen); setCycleLen(props.keepTimeData.CycleLen);
setHourDayType1(props.keepTimeData.StartExecLen) setHourDayType1(props.keepTimeData.StartExecLen)
setstartLen(props.keepTimeData.StartLen) setstartLen(props.keepTimeData.StartLen)
if(props.keepTimeData.EndExecLen > 23) { if (props.keepTimeData.EndExecLen > 23) {
setHourType('明') setHourType('明')
setHourDayType2(props.keepTimeData.EndExecLen - 24) setHourDayType2(props.keepTimeData.EndExecLen - 24)
} else { } else {
...@@ -197,6 +224,7 @@ const BaseConfig = (props, ref) => { ...@@ -197,6 +224,7 @@ const BaseConfig = (props, ref) => {
HourDayType1, HourDayType1,
HourDayType2, HourDayType2,
HourType, HourType,
PlanDetails: Unit === 'day'?planDetails:[]
}, },
})); }));
const randerZqsz = value => { const randerZqsz = value => {
...@@ -983,6 +1011,41 @@ const BaseConfig = (props, ref) => { ...@@ -983,6 +1011,41 @@ const BaseConfig = (props, ref) => {
setVisibleChecked(e); setVisibleChecked(e);
}; };
const changeName = (e, item) => {
console.log(e.target.value, item, '改变咯');
const updatedPlanDetails = planDetails.map((items) => {
if (items.id === item.id) {
return { ...items, name: e.target.value };
}
return items;
});
setPlanDetails(updatedPlanDetails);
}
const changeTime = (value, item) => {
console.log(value, item,value?value[0].format('HH:mm'):'', '改变咯');
const updatedPlanDetails = planDetails.map((items) => {
if (items.id === item.id) {
return { ...items, beginTime: value?value[0].format('HH:mm'):'', endTime: value?value[1].format('HH:mm'):'' };
}
return items;
});
setPlanDetails(updatedPlanDetails);
}
const handleAdd = () => {
console.log('添加咯');
setPlanDetails([...planDetails, { name: ``, beginTime: '', endTime: '', id: generateRandomId() }])
}
const handleReduce = (id) => {
console.log(id, 'ididididid');
const newData = planDetails.filter(item => item.id !== id)
setPlanDetails(newData)
console.log('减少咯', newData);
}
useEffect(() => {
console.log(planDetails, '改变咯');
}, [planDetails])
return ( return (
<div className={styles.baseForm}> <div className={styles.baseForm}>
{Unit && ( {Unit && (
...@@ -1042,6 +1105,51 @@ const BaseConfig = (props, ref) => { ...@@ -1042,6 +1105,51 @@ const BaseConfig = (props, ref) => {
</Col> </Col>
)} )}
{Unit === 'day' && (
<Col span={24}>
<Form.Item labelCol={{ span: 5 }} name="" label="执行时间">
{
<div className={styles.dayTime}>
{planDetails.map((item, index) => (
<div key={item.id}>
<div className={styles.name}>
<Input placeholder="请输入巡检名称" allowClear defaultValue={item.name} onChange={(e) => { changeName(e, item) }} />
</div>
<div className={styles.time}>
<RangePicker
picker="time"
format="HH:mm"
onChange={(value) => { changeTime(value, item) }}
showTime={{
hideDisabledOptions: true,
defaultValue: [item.beginTime ? moment(item.beginTime, 'HH:mm') : '', item.endTime ? moment(item.endTime, 'HH:mm') : ''],
}}
/>
</div>
<div className={styles.close}>
<CloseCircleOutlined onClick={() => { handleReduce(item.id) }} />
</div>
</div>
))}
<Button
onClick={handleAdd}
icon={<PlusCircleOutlined />}
style={{
marginTop: 10,
// marginLeft: 114,
borderRadius: '5px',
left: '100%',
transform: 'translateX(-100%)',
}}
>
添加巡检时间
</Button>
</div>
}
</Form.Item>
</Col>
)}
{visibleChecked && Unit !== 'day' && ( {visibleChecked && Unit !== 'day' && (
<Col span={24}> <Col span={24}>
<Form.Item labelCol={{ span: 5 }} name="zxsj" label="执行时间"> <Form.Item labelCol={{ span: 5 }} name="zxsj" label="执行时间">
......
...@@ -5,7 +5,31 @@ ...@@ -5,7 +5,31 @@
width: 100%; width: 100%;
justify-content: space-between; justify-content: space-between;
margin-top: 15px; margin-top: 15px;
.dayTime {
position: relative;
>div {
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
margin-bottom: 5px;
.name {
flex: 1;
}
.time {
flex: 2;
}
.close:hover {
cursor: pointer;
}
}
}
} }
.FormLast { .FormLast {
color: red; color: red;
} }
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