feat:报错提示返回异常,cron设置
This commit is contained in:
parent
ccea84285c
commit
698ef16905
|
@ -1,4 +1,4 @@
|
||||||
import {Button, Form} from "antd";
|
import {Button, Form, message, Popconfirm} from "antd";
|
||||||
import React, {useEffect, useState} from "react";
|
import React, {useEffect, useState} from "react";
|
||||||
import {
|
import {
|
||||||
ModalForm,
|
ModalForm,
|
||||||
|
@ -16,6 +16,8 @@ import {
|
||||||
import dayjs, {UnitTypeShort} from "dayjs";
|
import dayjs, {UnitTypeShort} from "dayjs";
|
||||||
import {onceConsumerRead} from "@/utils/codeToReadName";
|
import {onceConsumerRead} from "@/utils/codeToReadName";
|
||||||
import {betweenTime} from "@/utils/timeFormatUtil";
|
import {betweenTime} from "@/utils/timeFormatUtil";
|
||||||
|
import {QuestionCircleOutlined} from "@ant-design/icons";
|
||||||
|
import {deleteTask} from "@/lib/task/project/data";
|
||||||
|
|
||||||
interface ClickRecordProps {
|
interface ClickRecordProps {
|
||||||
openClickRecord?: boolean;
|
openClickRecord?: boolean;
|
||||||
|
@ -49,6 +51,12 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
||||||
recordTimeRange: [res.data.data.startDate ? dayjs(res.data.data.startDate) : undefined,
|
recordTimeRange: [res.data.data.startDate ? dayjs(res.data.data.startDate) : undefined,
|
||||||
res.data.data.startDate ? dayjs(res.data.data.recordDate) : undefined]
|
res.data.data.startDate ? dayjs(res.data.data.recordDate) : undefined]
|
||||||
})
|
})
|
||||||
|
if (res.data.data.startDate&&res.data.data.recordDate){
|
||||||
|
let timeDif = betweenTime(dayjs(res.data.data.recordDate), dayjs(res.data.data.startDate));
|
||||||
|
if (res.data.data.timeDifference!=timeDif){
|
||||||
|
form.setFieldValue("timeDifference",timeDif)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
@ -79,22 +87,31 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
||||||
render: (prop, defaultDoms) => {
|
render: (prop, defaultDoms) => {
|
||||||
const result = [];
|
const result = [];
|
||||||
if (recordId && !editAble) {
|
if (recordId && !editAble) {
|
||||||
result.push(<Button color="danger" key="edit"
|
result.push(<Button danger key="edit" type="primary"
|
||||||
onClick={() => setEditAble(true)}>编辑
|
onClick={() => setEditAble(true)}>编辑
|
||||||
</Button>)
|
</Button>)
|
||||||
result.push(<Button type="primary" key="close"
|
result.push(<Button type="primary" key="close"
|
||||||
onClick={() => setOpenClickRecord?.(false)}>关闭
|
onClick={() => setOpenClickRecord?.(false)}>关闭
|
||||||
</Button>)
|
</Button>)
|
||||||
result.push(<Button color="danger" key="delete"
|
result.push(
|
||||||
onClick={() => {
|
<Popconfirm
|
||||||
|
key='delete'
|
||||||
|
title="删除记录"
|
||||||
|
description="确认要删除记录?"
|
||||||
|
icon={<QuestionCircleOutlined style={{color: 'red'}}/>}
|
||||||
|
okText="确认"
|
||||||
|
cancelText="取消"
|
||||||
|
onConfirm={() => {
|
||||||
deleteClickRecordAPI(recordId).then(res => {
|
deleteClickRecordAPI(recordId).then(res => {
|
||||||
if (res.data.status.success) {
|
if (res.data.status.success) {
|
||||||
setOpenClickRecord?.(false)
|
setOpenClickRecord?.(false)
|
||||||
reloadData?.()
|
reloadData?.()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}}>删除
|
}}
|
||||||
</Button>)
|
>
|
||||||
|
<Button danger type="primary" key="delete">删除
|
||||||
|
</Button></Popconfirm>)
|
||||||
} else {
|
} else {
|
||||||
result.push(defaultDoms)
|
result.push(defaultDoms)
|
||||||
}
|
}
|
||||||
|
@ -116,6 +133,7 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
||||||
if (values.recordTimeRange[1]) {
|
if (values.recordTimeRange[1]) {
|
||||||
values.recordDate = new Date(values.recordTimeRange[1])
|
values.recordDate = new Date(values.recordTimeRange[1])
|
||||||
}
|
}
|
||||||
|
try{
|
||||||
if (values.id) {
|
if (values.id) {
|
||||||
await editClickRecordAPI(values);
|
await editClickRecordAPI(values);
|
||||||
} else {
|
} else {
|
||||||
|
@ -124,6 +142,10 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
||||||
setOpenClickRecord?.(false)
|
setOpenClickRecord?.(false)
|
||||||
reloadData?.()
|
reloadData?.()
|
||||||
return true
|
return true
|
||||||
|
}catch (e){
|
||||||
|
console.error(e)
|
||||||
|
return false
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ProFormDateTimeRangePicker name="recordTimeRange" label="记录时间"
|
<ProFormDateTimeRangePicker name="recordTimeRange" label="记录时间"
|
||||||
|
|
|
@ -17,7 +17,7 @@ interface CronGeneratorProps {
|
||||||
function cronToChinese(cronExpression: string) {
|
function cronToChinese(cronExpression: string) {
|
||||||
// 解析Cron表达式各部分
|
// 解析Cron表达式各部分
|
||||||
const parts = cronExpression.split(' ');
|
const parts = cronExpression.split(' ');
|
||||||
if (parts.length < 5) {
|
if (parts.length != 5) {
|
||||||
return '非法的Cron表达式';
|
return '非法的Cron表达式';
|
||||||
}
|
}
|
||||||
const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;
|
const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;
|
||||||
|
@ -155,7 +155,7 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
||||||
cron,canSetting}) => {
|
cron,canSetting}) => {
|
||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
const [current, setCurrent] = useState<number>(0);
|
const [current, setCurrent] = useState<number>(0);
|
||||||
const [cronSeconds, setCronSeconds] = useState<string>(cron ? cron.split(' ')[0] : '*');
|
const [cronSeconds, setCronSeconds] = useState<string>(cron ? cron.split(' ')[0] : '0');
|
||||||
const [cronMinutes, setCronMinutes] = useState<string>(cron ? cron.split(' ')[1] : '0');
|
const [cronMinutes, setCronMinutes] = useState<string>(cron ? cron.split(' ')[1] : '0');
|
||||||
const [cronHours, setCronHours] = useState<string>(cron ? cron.split(' ')[2] : '*');
|
const [cronHours, setCronHours] = useState<string>(cron ? cron.split(' ')[2] : '*');
|
||||||
const [cronDayOfMonth, setCronDayOfMonth] = useState<string>(cron ? cron.split(' ')[3] : '*');
|
const [cronDayOfMonth, setCronDayOfMonth] = useState<string>(cron ? cron.split(' ')[3] : '*');
|
||||||
|
@ -179,7 +179,10 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
||||||
setCurrent(index);
|
setCurrent(index);
|
||||||
};
|
};
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (cron){
|
||||||
|
console.log({fullCronExpression})
|
||||||
setCanReadCron(cronToChinese(fullCronExpression))
|
setCanReadCron(cronToChinese(fullCronExpression))
|
||||||
|
}
|
||||||
}, [fullCronExpression]);
|
}, [fullCronExpression]);
|
||||||
|
|
||||||
const onClickConfirmCron = () => {
|
const onClickConfirmCron = () => {
|
||||||
|
@ -189,7 +192,7 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
||||||
setNextOccurrences(res.data.data.map((next: string) => dayjs(next)));
|
setNextOccurrences(res.data.data.map((next: string) => dayjs(next)));
|
||||||
setExpectedTimeRange([dayjs(res.data.data[0]),
|
setExpectedTimeRange([dayjs(res.data.data[0]),
|
||||||
onceConsumer&&onceConsumer.length==2 ? dayjs(res.data.data[0]).add(Number(onceConsumer[0]), onceConsumer[1] as UnitTypeShort):undefined])
|
onceConsumer&&onceConsumer.length==2 ? dayjs(res.data.data[0]).add(Number(onceConsumer[0]), onceConsumer[1] as UnitTypeShort):undefined])
|
||||||
setCronFunction(fullCronExpression);
|
setCronFunction("0 "+fullCronExpression);
|
||||||
});
|
});
|
||||||
setShowModal(false)
|
setShowModal(false)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
@ -3,7 +3,7 @@ import {Dayjs} from "dayjs";
|
||||||
export type TaskWebSelectVO ={
|
export type TaskWebSelectVO ={
|
||||||
name?:string,
|
name?:string,
|
||||||
description?:string,
|
description?:string,
|
||||||
treeList:boolean,
|
treeList?:boolean,
|
||||||
treeFilter?:boolean,
|
treeFilter?:boolean,
|
||||||
treeOrList?:boolean,
|
treeOrList?:boolean,
|
||||||
pid?:string,
|
pid?:string,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
'use client'
|
'use client'
|
||||||
import React, {Fragment, useCallback, useContext, useEffect, useMemo, useRef, useState} from "react";
|
import React, {Fragment, useCallback, useContext, useEffect, useMemo, useRef, useState} from "react";
|
||||||
import {Calendar, dayjsLocalizer, Event, SlotInfo, View} from 'react-big-calendar'
|
import {Calendar, dateFnsLocalizer, dayjsLocalizer, Event, SlotInfo, View} from 'react-big-calendar'
|
||||||
import dayjs, {Dayjs} from 'dayjs'
|
import dayjs, {Dayjs} from 'dayjs'
|
||||||
import 'react-big-calendar/lib/css/react-big-calendar.css'
|
import 'react-big-calendar/lib/css/react-big-calendar.css'
|
||||||
import 'react-big-calendar/lib/sass/styles.scss'
|
import 'react-big-calendar/lib/sass/styles.scss'
|
||||||
|
|
|
@ -223,24 +223,89 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
setSpinning(false)
|
setSpinning(false)
|
||||||
}
|
}
|
||||||
}, [props])
|
}, [props])
|
||||||
|
|
||||||
function childReduce(child: DataType[]): PidSelectTree[] {
|
function childReduce(child: DataType[]): PidSelectTree[] {
|
||||||
|
// 使用示例
|
||||||
|
const { trees, taskMap } = childReduceInner(child);
|
||||||
|
setPTaskMap(taskMap); // 一次性设置
|
||||||
|
return trees;
|
||||||
|
}
|
||||||
|
|
||||||
|
function childReduceInner(child: DataType[]): { trees: PidSelectTree[]; taskMap: Record<string, ParentTaskVO> } {
|
||||||
const result: PidSelectTree[] = [];
|
const result: PidSelectTree[] = [];
|
||||||
const parentTaskMap: Record<string, ParentTaskVO> = {};
|
const parentTaskMap: Record<string, ParentTaskVO> = {};
|
||||||
child.map(data => {
|
|
||||||
|
child.forEach(data => {
|
||||||
const resultData: PidSelectTree = {
|
const resultData: PidSelectTree = {
|
||||||
label: data.name, value: data.id, pid: data.pid,
|
label: data.name,
|
||||||
fId: data.fId, fName: data.fName
|
value: data.id,
|
||||||
|
pid: data.pid,
|
||||||
|
fId: data.fId,
|
||||||
|
fName: data.fName
|
||||||
};
|
};
|
||||||
parentTaskMap[data.id] = {pid: data.id, pName: data.name, fId: data.fId, fName: data.fName};
|
|
||||||
if (data.children) {
|
if (data.children) {
|
||||||
resultData.children = childReduce(data.children);
|
const childResult = childReduceInner(data.children);
|
||||||
|
resultData.children = childResult.trees;
|
||||||
|
Object.assign(parentTaskMap, childResult.taskMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parentTaskMap[data.id] = {
|
||||||
|
pid: data.id,
|
||||||
|
pName: data.name,
|
||||||
|
fId: data.fId,
|
||||||
|
fName: data.fName
|
||||||
|
};
|
||||||
result.push(resultData);
|
result.push(resultData);
|
||||||
})
|
});
|
||||||
setPTaskMap({...pTaskMap, ...parentTaskMap})
|
|
||||||
return result;
|
return { trees: result, taskMap: parentTaskMap };
|
||||||
}
|
}
|
||||||
|
// 错误闭包使用
|
||||||
|
// function childReduce(child: DataType[]): PidSelectTree[] {
|
||||||
|
// const result: PidSelectTree[] = [];
|
||||||
|
// const parentTaskMap: Record<string, ParentTaskVO> = {};
|
||||||
|
// child.map(data => {
|
||||||
|
// const resultData: PidSelectTree = {
|
||||||
|
// label: data.name, value: data.id, pid: data.pid,
|
||||||
|
// fId: data.fId, fName: data.fName
|
||||||
|
// };
|
||||||
|
// if (data.children) {
|
||||||
|
// resultData.children = childReduce(data.children);
|
||||||
|
// }
|
||||||
|
// parentTaskMap[data.id] = {pid: data.id, pName: data.name, fId: data.fId, fName: data.fName};
|
||||||
|
// result.push(resultData);
|
||||||
|
// })
|
||||||
|
// setPTaskMap({...pTaskMap, ...parentTaskMap})
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
// function childReduce(child: DataType[]): PidSelectTree[] {
|
||||||
|
// const result: PidSelectTree[] = [];
|
||||||
|
// const parentTaskMap: Record<string, ParentTaskVO> = {};
|
||||||
|
//
|
||||||
|
// child.forEach(data => {
|
||||||
|
// const resultData: PidSelectTree = {
|
||||||
|
// label: data.name,
|
||||||
|
// value: data.id,
|
||||||
|
// pid: data.pid,
|
||||||
|
// fId: data.fId,
|
||||||
|
// fName: data.fName
|
||||||
|
// };
|
||||||
|
// if (data.children) {
|
||||||
|
// resultData.children = childReduce(data.children);
|
||||||
|
// }
|
||||||
|
// parentTaskMap[data.id] = {
|
||||||
|
// pid: data.id,
|
||||||
|
// pName: data.name,
|
||||||
|
// fId: data.fId,
|
||||||
|
// fName: data.fName
|
||||||
|
// };
|
||||||
|
// result.push(resultData);
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// setPTaskMap(prev => ({ ...prev, ...parentTaskMap }));
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
// 如果不是添加任务需要回显
|
// 如果不是添加任务需要回显
|
||||||
// Form 当中的 initialValues
|
// Form 当中的 initialValues
|
||||||
|
@ -327,7 +392,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
if (taskType == '2') {
|
if (taskType == '2') {
|
||||||
result.push(<StepSort taskId={props.itemId!} stepList={requestTask?.stepList || []}/>)
|
result.push(<StepSort taskId={props.itemId!} stepList={requestTask?.stepList || []}/>)
|
||||||
}
|
}
|
||||||
if (taskType == '3') {
|
if (taskType == '3' && requestTask) {
|
||||||
result.push(<ClickRecord taskId={props.itemId!} taskName={requestTask!.name}
|
result.push(<ClickRecord taskId={props.itemId!} taskName={requestTask!.name}
|
||||||
reloadData={props.reloadData}
|
reloadData={props.reloadData}
|
||||||
onceConsume={requestTask!.onceConsume}/>)
|
onceConsume={requestTask!.onceConsume}/>)
|
||||||
|
@ -477,6 +542,10 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
||||||
placeholder="请输入团队名称"
|
placeholder="请输入团队名称"
|
||||||
disabled={editFormDisable}
|
disabled={editFormDisable}
|
||||||
/>
|
/>
|
||||||
|
<ProFormText
|
||||||
|
hidden={true}
|
||||||
|
name="cron"
|
||||||
|
/>
|
||||||
<ProFormTreeSelect
|
<ProFormTreeSelect
|
||||||
params={{pid:selectPid}}
|
params={{pid:selectPid}}
|
||||||
hidden={taskType == '1'}
|
hidden={taskType == '1'}
|
||||||
|
|
|
@ -241,12 +241,21 @@ const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
||||||
// // const response = await getTaskTreeResult(request)
|
// // const response = await getTaskTreeResult(request)
|
||||||
const search: TaskWebSelectVO =
|
const search: TaskWebSelectVO =
|
||||||
{
|
{
|
||||||
treeList: switchChecked,
|
|
||||||
treeFilter: filterChecked,
|
|
||||||
pid: pid,
|
pid: pid,
|
||||||
name: params.name,
|
name: params.name,
|
||||||
description: params.description,
|
description: params.description,
|
||||||
}
|
}
|
||||||
|
// 列表展示
|
||||||
|
if (!switchChecked) {
|
||||||
|
search.treeOrList=false;
|
||||||
|
search.treeList=true;
|
||||||
|
search.treeFilter=true;
|
||||||
|
}else {
|
||||||
|
// 树展示
|
||||||
|
search.treeOrList=true;
|
||||||
|
search.treeList=true;
|
||||||
|
search.treeFilter=filterChecked;
|
||||||
|
}
|
||||||
if (params.state) {
|
if (params.state) {
|
||||||
search.state = params.state.join(',');
|
search.state = params.state.join(',');
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ httpReq.interceptors.response.use(
|
||||||
message.warning('无权限');
|
message.warning('无权限');
|
||||||
}else if(response.data.status.success == false){
|
}else if(response.data.status.success == false){
|
||||||
message.error(response.data.status.message);
|
message.error(response.data.status.message);
|
||||||
|
return Promise.reject(response.data.status.message);
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue