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 {AxiosResponse} from "axios";
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";
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;
}
export async function addTask(task: DataType): Promise<ResponseVO<string>> {
export function addTask(task: DataType): Promise<AxiosResponse<ResponseVO<TaskMessage>>> {
noStore();
// 使用 Axios 发送 POST 请求添加数据
const response: AxiosResponse<ResponseVO<string>> = await httpReq.post(process.env.NEXT_PUBLIC_TODO_REQUEST_URL + '/task', task);
// 从响应中提取数据并返回
return response.data;
switch(task.taskType){
// 常规任务
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>> {

View File

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

View File

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