feat:报错提示返回异常,cron设置

This commit is contained in:
1708-huayu 2025-08-13 18:58:05 +08:00
parent ccea84285c
commit 698ef16905
7 changed files with 146 additions and 42 deletions

View File

@ -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="记录时间"

View File

@ -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) {

View File

@ -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,

View File

@ -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'

View File

@ -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'}

View File

@ -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(',');
} }

View File

@ -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;
}, },