feat:协作计划按钮处理

This commit is contained in:
1708-huayu 2025-07-25 18:53:01 +08:00
parent 354fb92d28
commit e1a40a8980
3 changed files with 90 additions and 73 deletions

View File

@ -1,7 +1,7 @@
import {unstable_noStore as noStore} from 'next/cache'; import {unstable_noStore as noStore} from 'next/cache';
import {AxiosResponse} from "axios"; import {AxiosResponse} from "axios";
import {httpReq} from "@/utils/axiosReq"; import {httpReq} from "@/utils/axiosReq";
import {DataType, DictType, Request, ResponseVO, ResultPage} from "@/lib/definitions"; import {DataType, DictType, Request, ResponseVO, ResultPage, TaskMessage} from "@/lib/definitions";
import {TaskWebSelectVO} from "@/lib/task/project/definitions"; import {TaskWebSelectVO} from "@/lib/task/project/definitions";
export async function getTaskTreeResult(requestParam: string): Promise<ResponseVO<ResultPage<DataType>>> { export async function getTaskTreeResult(requestParam: string): Promise<ResponseVO<ResultPage<DataType>>> {
@ -52,12 +52,20 @@ export async function getTask(id: string): Promise<ResponseVO<DataType>> {
return response.data; return response.data;
} }
export async function addTask(task: DataType): Promise<ResponseVO<string>> { export function addTask(task: DataType): Promise<AxiosResponse<ResponseVO<TaskMessage>>> {
noStore(); noStore();
// 使用 Axios 发送 POST 请求添加数据 // 使用 Axios 发送 POST 请求添加数据
const response: AxiosResponse<ResponseVO<string>> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task', task); switch(task.taskType){
// 从响应中提取数据并返回 // 常规任务
return response.data; case '0':return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/V2/task', task);
// 团队任务
case '1':return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/V2/task', task);
// 顺序
case '2':return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task/step/sort', task);
// 周期
case '3':return httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task/schedule', task);
default:throw new Error("创建任务必选任务类型");
}
} }
export async function updateTask(task: DataType): Promise<ResponseVO<string>> { export async function updateTask(task: DataType): Promise<ResponseVO<string>> {

View File

@ -268,6 +268,7 @@ const CalShow: React.FC = () => {
{open && <DetailModelForm operationId={operationId} description={description} open={open} haveButton={false} {open && <DetailModelForm operationId={operationId} description={description} open={open} haveButton={false}
itemId={itemId} itemId={itemId}
reloadData={reloadData} expectedStartTime={expectedStartTime} reloadData={reloadData} expectedStartTime={expectedStartTime}
closeOpen={()=>setOpen(false)}
expectedEndTime={expectedEndTime}/>} expectedEndTime={expectedEndTime}/>}
<DragAndDropCalendar <DragAndDropCalendar
// 本地设置 // 本地设置

View File

@ -30,11 +30,12 @@ export type DetailModelFormProps = {
// 标题描述 // 标题描述
description: string, description: string,
// 任务内容描述 // 任务内容描述
taskContent?:string, taskContent?: string,
// 是否打开界面,用于非按钮操作 // 是否打开界面,用于非按钮操作
open: boolean, open: boolean,
// 使用按钮操作 // 使用按钮操作
haveButton: boolean, haveButton: boolean,
closeOpen?: () => void,
expectedStartTime?: Dayjs, expectedStartTime?: Dayjs,
expectedEndTime?: Dayjs, expectedEndTime?: Dayjs,
// 重新加载数据 // 重新加载数据
@ -44,14 +45,12 @@ export type PidSelectTree = { label: string; value: string; pid: string; childre
export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => { export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
console.log("DetailModelForm:props:", props) console.log("DetailModelForm:props:", props)
const [closeButton,setCloseButton] =useState(false)
const [form] = Form.useForm<DataType>(); const [form] = Form.useForm<DataType>();
const [requestTask,setRequestTask]=useState<DataType>() const [requestTask, setRequestTask] = useState<DataType>()
const [editFormDisable, setEditFormDisable] = useState(props.operationId === OPERATION_BUTTON_TYPE.DETAIL) const [editFormDisable, setEditFormDisable] = useState(props.operationId === OPERATION_BUTTON_TYPE.DETAIL)
// 团队第一层 pid必须为0 // 团队第一层 pid必须为0
const [taskType, setTaskType] = useState('0') const [taskType, setTaskType] = useState('0')
useEffect(() => { useEffect(() => {
setCloseButton(false)
if (props.itemId != undefined && ( if (props.itemId != undefined && (
props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE)) { props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE)) {
getTask(props.itemId).then(task => { getTask(props.itemId).then(task => {
@ -65,8 +64,8 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
task.data.expectedTimeRange = [task.data.expectedStartTime ? dayjs(task.data.expectedStartTime) : undefined, task.data.expectedTimeRange = [task.data.expectedStartTime ? dayjs(task.data.expectedStartTime) : undefined,
task.data.expectedEndTime ? dayjs(task.data.expectedEndTime) : undefined]; task.data.expectedEndTime ? dayjs(task.data.expectedEndTime) : undefined];
form.setFieldsValue(task.data) form.setFieldsValue(task.data)
if (task.data.pid=="0"){ if (task.data.pid == "0") {
form.setFieldValue("pid",undefined) form.setFieldValue("pid", undefined)
} }
setRequestTask(task.data) setRequestTask(task.data)
console.log("form.setFieldsValue(task.data)" + JSON.stringify(task.data)) console.log("form.setFieldsValue(task.data)" + JSON.stringify(task.data))
@ -79,8 +78,8 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
let data = { let data = {
'expectedTimeRange': [props.expectedStartTime ? props.expectedStartTime : dayjs(), props.expectedEndTime], 'expectedTimeRange': [props.expectedStartTime ? props.expectedStartTime : dayjs(), props.expectedEndTime],
'pid': props.pid, 'pid': props.pid,
'description':props.taskContent, 'description': props.taskContent,
'name':props.taskContent&&props.taskContent?.length>10?props.taskContent.substring(0,10):props.taskContent, 'name': props.taskContent && props.taskContent?.length > 10 ? props.taskContent.substring(0, 10) : props.taskContent,
}; };
form.setFieldsValue(data) form.setFieldsValue(data)
} }
@ -106,7 +105,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
return ( return (
<ModalForm<DataType> <ModalForm<DataType>
title={props.description} title={props.description}
open={props.open && !props.haveButton&&!closeButton} open={props.open && !props.haveButton}
trigger={props.haveButton ? trigger={props.haveButton ?
<Button type="primary"> <Button type="primary">
<PlusOutlined/> <PlusOutlined/>
@ -115,22 +114,16 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
} }
form={form} form={form}
autoFocusFirstInput autoFocusFirstInput
onOpenChange={(state)=>{
console.log("state",{state})
if(!state) {
setCloseButton(state)
}
}}
modalProps={{ modalProps={{
destroyOnClose: true, destroyOnClose: true,
onCancel: () => { onCancel: () => {
console.log('run');
props.reloadData?.(); props.reloadData?.();
}, },
}} }}
readonly={editFormDisable}
submitter={props.itemId !== undefined && props.itemId !== '-1' ? { submitter={props.itemId !== undefined && props.itemId !== '-1' ? {
render: (prop, defaultDoms) => { render: (prop, defaultDoms) => {
prop.resetButtonProps console.log("submitter render: ", {prop})
let result = [ let result = [
editFormDisable ? <Button editFormDisable ? <Button
key="edit" key="edit"
@ -138,9 +131,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
// props.submit(); // props.submit();
setEditFormDisable(false) setEditFormDisable(false)
}} }}
> ></Button> : undefined,
</Button> : undefined,
props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE ? props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE ?
<Popconfirm <Popconfirm
key='delete' key='delete'
@ -161,29 +152,50 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
} }
}} }}
> >
<Button type="primary" danger> <Button type="primary" key="delete" danger>
</Button> </Button>
</Popconfirm> : undefined </Popconfirm> : undefined,
, requestTask && requestTask.id ?
requestTask&&requestTask.id?<DiaryOption taskId={requestTask.id} taskName={requestTask.name}/>:undefined, <DiaryOption key="diary" taskId={requestTask.id} taskName={requestTask.name}/> : undefined,
] ]
// 非新增或者编辑状态不展示 // 非新增或者编辑状态不展示
if (!editFormDisable) { if (!editFormDisable) {
result.push(...defaultDoms) result.push(...defaultDoms)
}else { } else {
result.push(<Button type="primary" onClick={()=>setCloseButton(true)}> result.push(<Button type="primary" key="join"
onClick={() => props.closeOpen?.()}></Button>)
</Button>) result.push(<Button type="primary" key="close"
onClick={() => props.closeOpen?.()}></Button>)
} }
return result; return result;
}, },
} : undefined} } : {
render: (prop, defaultDoms) => {
console.log("submitter render: ", {prop}, {props},{taskType},{defaultDoms})
// if ( prop.searchConfig) {
// if (taskType == '1') {
// prop.searchConfig.submitText = "创建团队"
// }else {
// prop.searchConfig.submitText = "确认"
// }
// }
// return defaultDoms;
const result = defaultDoms.filter(defaultButton=>defaultButton.key=='rest');
result.push(<Button type="primary" key="create-team" onClick={() => form.submit()}>{taskType=='1'?"创建团队":"确认"}
</Button>)
return result;
}
}
}
onFinish={async (values) => { onFinish={async (values) => {
console.log('Received values of form: ', values,{...requestTask,...values}); {/* onFinish 返回true关闭窗口范湖false不关闭窗口 */
}
console.log('Received values of form: ', values, {...requestTask, ...values});
if (requestTask) { if (requestTask) {
const {sortNo}=requestTask; const {sortNo} = requestTask;
values.sortNo=sortNo; values.sortNo = sortNo;
} }
if (values.pid === undefined) { if (values.pid === undefined) {
values.pid = '0' values.pid = '0'
@ -231,16 +243,16 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
} else { } else {
await addTask(values).then(response => { await addTask(values).then(response => {
console.log('response', response) console.log('response', response)
if (response.status.success) { if (response.data.status.success) {
message.success("添加任务成功:" + response.data) message.success(`添加计划${response.data.data.name}成功`)
// 树任务重新刷新 // 树任务重新刷新
// 四象限任务重新刷新 // 四象限任务重新刷新
// 如果可以直接更新列表而不请求。。。。。。 // 如果可以直接更新列表而不请求。。。。。。
console.log('props.reloadData?.()', props.reloadData) console.log('props.reloadData?.()', props.reloadData)
result = (taskType!='1')
props.reloadData?.() props.reloadData?.()
result = true
} else { } else {
message.error(response.status.message) message.error(response.data.status.message)
result = false result = false
} }
} }
@ -259,7 +271,7 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
width="sm" width="sm"
name="taskType" name="taskType"
label="任务类型" label="任务类型"
initialValue='0' initialValue={taskType}
disabled={editFormDisable} disabled={editFormDisable}
onChange={(value: string, option) => { onChange={(value: string, option) => {
setTaskType(value) setTaskType(value)
@ -330,52 +342,48 @@ export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
/> />
</ProForm.Group> </ProForm.Group>
<ProFormTextArea <ProFormTextArea
// width="md" width="xl"
name="description" name="description"
label="任务描述" label="任务描述"
// tooltip="最长为 24 位" tooltip="最长255个字"
placeholder="请输入任务描述" placeholder="请输入任务描述"
disabled={editFormDisable} disabled={editFormDisable}
/> />
<ProForm.Group> <ProForm.Group>
<ProFormSelect <ProFormSelect
request={async () => taskPriorityList.map(taskState => { request={async () =>
return { taskPriorityList.map
'label': taskState.name, (
'value': taskState.code taskState => {
return {'label': taskState.name, 'value': taskState.code}
}
)
} }
})}
width="sm" width="sm"
name="priority" name="priority"
label="任务优先级" label="任务优先级"
initialValue='3' initialValue='3'
disabled={editFormDisable} disabled={editFormDisable}
rules={[ rules={[{required: true, message: "请选择计划优先级"}]}
{
required: true,
message: "请选择计划优先级"
}
]}
/> />
<ProFormSelect <ProFormSelect
width="sm" width="sm"
options={taskStateList.map(taskState => { options={taskStateList.map(taskState => {
return { return {'label': taskState.name, 'value': taskState.code}
'label': taskState.name,
'value': taskState.code
}
})} })}
name="state" name="state"
label="任务状态" label="任务状态"
initialValue='8' initialValue='8'
disabled={editFormDisable} disabled={editFormDisable}
rules={[ rules={
[
{ {
required: true, required: true,
message: "请选择计划状态" message: "请选择计划状态"
} }
]} ]
}
/> />
</ProForm.Group> </ProForm.Group>