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 {
|
||||
ModalForm,
|
||||
|
@ -16,6 +16,8 @@ import {
|
|||
import dayjs, {UnitTypeShort} from "dayjs";
|
||||
import {onceConsumerRead} from "@/utils/codeToReadName";
|
||||
import {betweenTime} from "@/utils/timeFormatUtil";
|
||||
import {QuestionCircleOutlined} from "@ant-design/icons";
|
||||
import {deleteTask} from "@/lib/task/project/data";
|
||||
|
||||
interface ClickRecordProps {
|
||||
openClickRecord?: boolean;
|
||||
|
@ -49,6 +51,12 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
|||
recordTimeRange: [res.data.data.startDate ? dayjs(res.data.data.startDate) : 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 {
|
||||
|
@ -79,22 +87,31 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
|||
render: (prop, defaultDoms) => {
|
||||
const result = [];
|
||||
if (recordId && !editAble) {
|
||||
result.push(<Button color="danger" key="edit"
|
||||
result.push(<Button danger key="edit" type="primary"
|
||||
onClick={() => setEditAble(true)}>编辑
|
||||
</Button>)
|
||||
result.push(<Button type="primary" key="close"
|
||||
onClick={() => setOpenClickRecord?.(false)}>关闭
|
||||
</Button>)
|
||||
result.push(<Button color="danger" key="delete"
|
||||
onClick={() => {
|
||||
deleteClickRecordAPI(recordId).then(res => {
|
||||
if (res.data.status.success) {
|
||||
setOpenClickRecord?.(false)
|
||||
reloadData?.()
|
||||
}
|
||||
})
|
||||
}}>删除
|
||||
</Button>)
|
||||
result.push(
|
||||
<Popconfirm
|
||||
key='delete'
|
||||
title="删除记录"
|
||||
description="确认要删除记录?"
|
||||
icon={<QuestionCircleOutlined style={{color: 'red'}}/>}
|
||||
okText="确认"
|
||||
cancelText="取消"
|
||||
onConfirm={() => {
|
||||
deleteClickRecordAPI(recordId).then(res => {
|
||||
if (res.data.status.success) {
|
||||
setOpenClickRecord?.(false)
|
||||
reloadData?.()
|
||||
}
|
||||
})
|
||||
}}
|
||||
>
|
||||
<Button danger type="primary" key="delete">删除
|
||||
</Button></Popconfirm>)
|
||||
} else {
|
||||
result.push(defaultDoms)
|
||||
}
|
||||
|
@ -116,14 +133,19 @@ const ClickRecord: React.FC<ClickRecordProps> = ({
|
|||
if (values.recordTimeRange[1]) {
|
||||
values.recordDate = new Date(values.recordTimeRange[1])
|
||||
}
|
||||
if (values.id) {
|
||||
await editClickRecordAPI(values);
|
||||
} else {
|
||||
await clickRecordAPI(values);
|
||||
try{
|
||||
if (values.id) {
|
||||
await editClickRecordAPI(values);
|
||||
} else {
|
||||
await clickRecordAPI(values);
|
||||
}
|
||||
setOpenClickRecord?.(false)
|
||||
reloadData?.()
|
||||
return true
|
||||
}catch (e){
|
||||
console.error(e)
|
||||
return false
|
||||
}
|
||||
setOpenClickRecord?.(false)
|
||||
reloadData?.()
|
||||
return true
|
||||
}}
|
||||
>
|
||||
<ProFormDateTimeRangePicker name="recordTimeRange" label="记录时间"
|
||||
|
|
|
@ -17,7 +17,7 @@ interface CronGeneratorProps {
|
|||
function cronToChinese(cronExpression: string) {
|
||||
// 解析Cron表达式各部分
|
||||
const parts = cronExpression.split(' ');
|
||||
if (parts.length < 5) {
|
||||
if (parts.length != 5) {
|
||||
return '非法的Cron表达式';
|
||||
}
|
||||
const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;
|
||||
|
@ -155,7 +155,7 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
|||
cron,canSetting}) => {
|
||||
const [showModal, setShowModal] = useState(false);
|
||||
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 [cronHours, setCronHours] = useState<string>(cron ? cron.split(' ')[2] : '*');
|
||||
const [cronDayOfMonth, setCronDayOfMonth] = useState<string>(cron ? cron.split(' ')[3] : '*');
|
||||
|
@ -179,7 +179,10 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
|||
setCurrent(index);
|
||||
};
|
||||
useEffect(() => {
|
||||
setCanReadCron(cronToChinese(fullCronExpression))
|
||||
if (cron){
|
||||
console.log({fullCronExpression})
|
||||
setCanReadCron(cronToChinese(fullCronExpression))
|
||||
}
|
||||
}, [fullCronExpression]);
|
||||
|
||||
const onClickConfirmCron = () => {
|
||||
|
@ -189,7 +192,7 @@ const CronGenerator: React.FC<CronGeneratorProps> = ({setCronFunction,setExpecte
|
|||
setNextOccurrences(res.data.data.map((next: string) => dayjs(next)));
|
||||
setExpectedTimeRange([dayjs(res.data.data[0]),
|
||||
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)
|
||||
} catch (error) {
|
||||
|
|
|
@ -3,7 +3,7 @@ import {Dayjs} from "dayjs";
|
|||
export type TaskWebSelectVO ={
|
||||
name?:string,
|
||||
description?:string,
|
||||
treeList:boolean,
|
||||
treeList?:boolean,
|
||||
treeFilter?:boolean,
|
||||
treeOrList?:boolean,
|
||||
pid?:string,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'use client'
|
||||
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 'react-big-calendar/lib/css/react-big-calendar.css'
|
||||
import 'react-big-calendar/lib/sass/styles.scss'
|
||||
|
|
|
@ -223,24 +223,89 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
|||
setSpinning(false)
|
||||
}
|
||||
}, [props])
|
||||
|
||||
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 parentTaskMap: Record<string, ParentTaskVO> = {};
|
||||
child.map(data => {
|
||||
|
||||
child.forEach(data => {
|
||||
const resultData: PidSelectTree = {
|
||||
label: data.name, value: data.id, pid: data.pid,
|
||||
fId: data.fId, fName: data.fName
|
||||
label: data.name,
|
||||
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) {
|
||||
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);
|
||||
})
|
||||
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
|
||||
|
@ -327,7 +392,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
|||
if (taskType == '2') {
|
||||
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}
|
||||
reloadData={props.reloadData}
|
||||
onceConsume={requestTask!.onceConsume}/>)
|
||||
|
@ -477,6 +542,10 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
|||
placeholder="请输入团队名称"
|
||||
disabled={editFormDisable}
|
||||
/>
|
||||
<ProFormText
|
||||
hidden={true}
|
||||
name="cron"
|
||||
/>
|
||||
<ProFormTreeSelect
|
||||
params={{pid:selectPid}}
|
||||
hidden={taskType == '1'}
|
||||
|
|
|
@ -5,7 +5,7 @@ import {
|
|||
} from '@ant-design/icons';
|
||||
import type {ActionType, FormInstance, ProColumns, ProFormInstance} from '@ant-design/pro-components';
|
||||
import {ProTable, TableDropdown} from '@ant-design/pro-components';
|
||||
import { DatePicker, Dropdown, Space, Switch, Tag, Tooltip} from 'antd';
|
||||
import {DatePicker, Dropdown, Space, Switch, Tag, Tooltip} from 'antd';
|
||||
import React, {Fragment, useContext, useEffect, useRef} from 'react';
|
||||
import {DataType} from "@/lib/definitions";
|
||||
import {
|
||||
|
@ -22,7 +22,7 @@ import {useSearchParams} from "next/navigation";
|
|||
import {TaskWebSelectVO} from "@/lib/task/project/definitions";
|
||||
import TaskNameAndIcon from "@/components/TaskNameAndIcon";
|
||||
|
||||
const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
||||
const TreeTablePro: React.FC = (props: { joinId?: string }) => {
|
||||
// 刷新表格
|
||||
const actionRef = useRef<ActionType>();
|
||||
// 列表和树切换
|
||||
|
@ -56,7 +56,7 @@ const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
|||
],
|
||||
},
|
||||
render: (_, record) => {
|
||||
return <TaskNameAndIcon task={record}/>
|
||||
return <TaskNameAndIcon task={record}/>
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -64,7 +64,7 @@ const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
|||
title: '任务描述',
|
||||
dataIndex: 'description',
|
||||
render: (_, record) => {
|
||||
return <Tooltip placement="topLeft" title={record.description}>
|
||||
return <Tooltip placement="topLeft" title={record.description}>
|
||||
<div className='text-ellipsis'>{record.description}</div>
|
||||
</Tooltip>
|
||||
}
|
||||
|
@ -187,7 +187,7 @@ const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
|||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (props.joinId){
|
||||
if (props.joinId) {
|
||||
|
||||
}
|
||||
}, []);
|
||||
|
@ -241,12 +241,21 @@ const TreeTablePro: React.FC = (props:{joinId?:string}) => {
|
|||
// // const response = await getTaskTreeResult(request)
|
||||
const search: TaskWebSelectVO =
|
||||
{
|
||||
treeList: switchChecked,
|
||||
treeFilter: filterChecked,
|
||||
pid: pid,
|
||||
name: params.name,
|
||||
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) {
|
||||
search.state = params.state.join(',');
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ httpReq.interceptors.response.use(
|
|||
message.warning('无权限');
|
||||
}else if(response.data.status.success == false){
|
||||
message.error(response.data.status.message);
|
||||
return Promise.reject(response.data.status.message);
|
||||
}
|
||||
return response;
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue