Commit 2a7b6d6a authored by chenshouchao's avatar chenshouchao

feat: 提交任务接口联调

parent fa9375be
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -34,6 +34,7 @@ const RESTAPI = { ...@@ -34,6 +34,7 @@ const RESTAPI = {
API_WORKBENCH_WORKFLOWJOB_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowjob`, //查询工作流任务 API_WORKBENCH_WORKFLOWJOB_LIST: `${BACKEND_API_URI_PREFIX}/cpp/workbench/project/workflowjob`, //查询工作流任务
API_WORKBENCH_DEL_WORKFLOWJOB: `${BACKEND_API_URI_PREFIX}/cpp/workflow/job/`, //删除工作流任务 API_WORKBENCH_DEL_WORKFLOWJOB: `${BACKEND_API_URI_PREFIX}/cpp/workflow/job/`, //删除工作流任务
API_WORKBENCH_CANCEL_WORKFLOWJOB: `${BACKEND_API_URI_PREFIX}/cpp/workflow/cancel`, //取消工作流 API_WORKBENCH_CANCEL_WORKFLOWJOB: `${BACKEND_API_URI_PREFIX}/cpp/workflow/cancel`, //取消工作流
API_SUBMIT_WORKFLOW: `${BACKEND_API_URI_PREFIX}/cpp/workflow/submit`, //提交工作流
}; };
export default RESTAPI; export default RESTAPI;
...@@ -202,9 +202,8 @@ const getDataFileDelPackage = (params: getDataFileDelPackageParams) => { ...@@ -202,9 +202,8 @@ const getDataFileDelPackage = (params: getDataFileDelPackageParams) => {
}); });
}; };
// 点击使用模版,获取模版数据 // 点击使用模版,获取模版数据
const fetchTemplateConfigInfo = (params: {id: string}) => { const fetchTemplateConfigInfo = (params: { id: string }) => {
return request({ return request({
url: `${Api.API_FETCH_TEMPLATE_INFO}/${params.id}`, url: `${Api.API_FETCH_TEMPLATE_INFO}/${params.id}`,
method: "get", method: "get",
...@@ -212,14 +211,29 @@ const fetchTemplateConfigInfo = (params: {id: string}) => { ...@@ -212,14 +211,29 @@ const fetchTemplateConfigInfo = (params: {id: string}) => {
}; };
// 点击工作列表,查看工作流详情 // 点击工作列表,查看工作流详情
const fetchWorkFlowJob = (params: {id: string}) => { const fetchWorkFlowJob = (params: { id: string }) => {
return request({ return request({
url: `${Api.API_WORK_FLOW_JOB}/${params.id}`, url: `${Api.API_WORK_FLOW_JOB}/${params.id}`,
method: "get", method: "get",
}); });
}; };
type submitWorkFlowParams = {
name: string;
projectId: string;
specId: string;
outputPath: string;
promotedParameters: any;
};
// 提交工作流
const submitWorkFlow = (params: submitWorkFlowParams) => {
return request({
url: Api.API_SUBMIT_WORKFLOW,
method: "post",
data: params,
});
};
export { export {
current, current,
...@@ -238,5 +252,6 @@ export { ...@@ -238,5 +252,6 @@ export {
getDataFileDel, getDataFileDel,
getDataFileDelPackage, getDataFileDelPackage,
fetchTemplateConfigInfo, fetchTemplateConfigInfo,
fetchWorkFlowJob fetchWorkFlowJob,
submitWorkFlow,
}; };
...@@ -26,10 +26,10 @@ ...@@ -26,10 +26,10 @@
box-sizing: border-box; box-sizing: border-box;
position: relative; position: relative;
} }
.backgroundTitleTextIcon{ .backgroundTitleTextIcon {
visibility: hidden; visibility: hidden;
} }
.backgroundTitleTextIconShow{ .backgroundTitleTextIconShow {
visibility: visible; visibility: visible;
} }
.backgroundTitleText { .backgroundTitleText {
...@@ -65,6 +65,17 @@ ...@@ -65,6 +65,17 @@
.taskConfigBox { .taskConfigBox {
padding: 24px 44px 40px 44px; padding: 24px 44px 40px 44px;
} }
.flowTitle {
/* line-height: 22px; */
line-height: 16px;
/* margin-bottom: 24px; */
margin: 3px 0 27px;
color: rgba(30, 38, 51, 1);
font-size: 14px;
font-weight: 600;
border-left: 3px solid rgba(19, 112, 255, 1);
padding-left: 3px;
}
.parameter { .parameter {
margin-bottom: 20px; margin-bottom: 20px;
position: relative; position: relative;
...@@ -76,7 +87,7 @@ ...@@ -76,7 +87,7 @@
line-height: 22px; line-height: 22px;
margin-bottom: 12px; margin-bottom: 12px;
} }
.parameterContent{ .parameterContent {
position: relative; position: relative;
} }
.parameterDesc { .parameterDesc {
......
...@@ -14,11 +14,12 @@ import { getCheckResult } from "../util"; ...@@ -14,11 +14,12 @@ import { getCheckResult } from "../util";
import fileSelectIcon from "@/assets/project/fileSelect.svg"; import fileSelectIcon from "@/assets/project/fileSelect.svg";
import questionMark from "@/assets/project/questionMark.svg"; import questionMark from "@/assets/project/questionMark.svg";
import jobSueIcon from "@/assets/project/jobSue.svg"; import jobSueIcon from "@/assets/project/jobSue.svg";
import { IParameter } from "../interface";
type ConfigFormProps = { type ConfigFormProps = {
templateConfigInfo?: ITemplateConfig; templateConfigInfo?: ITemplateConfig;
setParameter: any; setParameter: any;
onRef?: React.Ref<any> onRef?: React.Ref<any>;
}; };
const ConfigForm = (props: ConfigFormProps) => { const ConfigForm = (props: ConfigFormProps) => {
...@@ -30,20 +31,20 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -30,20 +31,20 @@ const ConfigForm = (props: ConfigFormProps) => {
); // 任务名称 ); // 任务名称
const [nameHelp, setNameHelp] = useState({ const [nameHelp, setNameHelp] = useState({
error: false, error: false,
helperText: '' helperText: "",
}) });
const [outputPath, setOutputPath] = useState<string>("ProjectData"); // 输出路径 const [outputPath, setOutputPath] = useState<string>("ProjectData"); // 输出路径
const [outputPathHelp, setOutputPathHelp] = useState({ const [outputPathHelp, setOutputPathHelp] = useState({
error: false, error: false,
helperText: '' helperText: "",
}) });
const getNameAndPath = () => { const getNameAndPath = () => {
return { return {
name, name,
outputPath, outputPath,
nameAndOutputPathCheck: !(checkName(name) || checkOutputPath(outputPath)) // 任务名称、输出路径是否通过校验 nameAndOutputPathCheck: !(checkName(name) || checkOutputPath(outputPath)), // 任务名称、输出路径是否通过校验
} };
} };
useImperativeHandle(props.onRef, () => { useImperativeHandle(props.onRef, () => {
return { return {
...@@ -51,60 +52,80 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -51,60 +52,80 @@ const ConfigForm = (props: ConfigFormProps) => {
}; };
}); });
const [fileSelectOpen, setFileSelectOpen] = useState(false); // 选择输出路径的弹窗显示控制 const [fileSelectOpen, setFileSelectOpen] = useState(false); // 选择输出路径的弹窗显示控制
const [fileSelectObject, setFileSelectObject] = useState({
taskId: "",
parameterName: "",
});
const onFileSelectConfirm = (path: string) => { const onFileSelectConfirm = (path: string) => {
setFileSelectOpen(false); setFileSelectOpen(false);
if (fileSelectObject.taskId) {
setParameter(
`ProjectData${path === "/" ? "" : path}`,
fileSelectObject.taskId,
fileSelectObject.parameterName
);
} else {
setOutputPath(`ProjectData${path === "/" ? "" : path}`); setOutputPath(`ProjectData${path === "/" ? "" : path}`);
checkOutputPath(`ProjectData${path === "/" ? "" : path}`) checkOutputPath(`ProjectData${path === "/" ? "" : path}`);
}
}; };
const handleFileSelectOnClose = () => { const handleFileSelectOnClose = () => {
setFileSelectOpen(false); setFileSelectOpen(false);
}; };
const handleOpenFileSelect = () => { const handleOpenFileSelect = (
taskId: string = "",
parameterName: string = ""
) => {
setFileSelectObject({
taskId,
parameterName,
});
setFileSelectOpen(true); setFileSelectOpen(true);
}; };
const handleNameChange = (e: any) => { const handleNameChange = (e: any) => {
setName(e.target.value); setName(e.target.value);
checkName(e.target.value) checkName(e.target.value);
}; };
const checkName = (name: string = '')=>{ const checkName = (name: string = "") => {
const reg = new RegExp(/^[a-zA-Z0-9\u4e00-\u9fa5-_]{3,30}$/) const reg = new RegExp(/^[a-zA-Z0-9\u4e00-\u9fa5-_]{3,30}$/);
if (reg.test(name)) { if (reg.test(name)) {
setNameHelp({ setNameHelp({
error: false, error: false,
helperText: '' helperText: "",
}) });
return false return false;
} else { } else {
setNameHelp({ setNameHelp({
error: true, error: true,
helperText: '请输入正确任务名称(3~30字符,可包含大小写字母、数字、中文、特殊符号“-”、“_”)' helperText:
}) "请输入正确任务名称(3~30字符,可包含大小写字母、数字、中文、特殊符号“-”、“_”)",
return true });
} return true;
} }
};
const checkOutputPath = (outputPath: string = '')=>{ const checkOutputPath = (outputPath: string = "") => {
if (outputPath) { if (outputPath) {
setOutputPathHelp({ setOutputPathHelp({
error: false, error: false,
helperText: '' helperText: "",
}) });
return false return false;
} else { } else {
setOutputPathHelp({ setOutputPathHelp({
error: true, error: true,
helperText: '请选择输出路径' helperText: "请选择输出路径",
}) });
return true return true;
}
} }
};
const renderTasks: IRenderTasks = useMemo(() => { const renderTasks: IRenderTasks = useMemo(() => {
const result: IRenderTasks = []; const result: IRenderTasks = [];
...@@ -116,31 +137,31 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -116,31 +137,31 @@ const ConfigForm = (props: ConfigFormProps) => {
} }
}); });
result.forEach((task) => { result.forEach((task) => {
let isCheck = true let isCheck = true;
if (task.parameters.length > 0) { if (task.parameters.length > 0) {
task.parameters.forEach((parameter)=>{ task.parameters.forEach((parameter) => {
const { error } = getCheckResult(parameter, parameter.value) const { error } = getCheckResult(parameter, parameter.value);
if (error) { if (error) {
isCheck = false isCheck = false;
return return;
} }
}) });
} }
if(task.flows.length>0) { if (task.flows.length > 0) {
task.flows.forEach((flow) => { task.flows.forEach((flow) => {
if (flow.parameters.length > 0) { if (flow.parameters.length > 0) {
flow.parameters.forEach((parameter)=>{ flow.parameters.forEach((parameter) => {
const { error } = getCheckResult(parameter, parameter.value) const { error } = getCheckResult(parameter, parameter.value);
if (error) { if (error) {
isCheck = false isCheck = false;
return return;
} }
}) });
} }
}) });
} }
task.isCheck = isCheck task.isCheck = isCheck;
}) });
return result; return result;
}, [templateConfigInfo]); }, [templateConfigInfo]);
...@@ -152,114 +173,108 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -152,114 +173,108 @@ const ConfigForm = (props: ConfigFormProps) => {
setParameter(e.target.value, taskId, parameterName); setParameter(e.target.value, taskId, parameterName);
}; };
const randerParameters = (parameters: Array<IParameter>, taskId: string) => {
return parameters
.filter((parameter) => parameter.hidden === false)
.map((parameter, parameterIndex) => {
return ( return (
<div className={styles.formBox}>
<div className={styles.templateDescBox}>
<div className={styles.templateDescTitle}>模板描述</div>
<div className={styles.templateDesc}>
{templateConfigInfo?.description || ""}
</div>
</div>
<div <div
className={classnames({ className={styles.parameter}
[styles.backgroundTitle]: true, key={parameter.id || "" + parameterIndex}
[styles.backgroundTitlePass]: true,
})}
> >
<img src="" alt="" />
<span className={styles.backgroundTitleText}>基础信息</span>
</div>
<div className={styles.formItems}>
<div className={styles.formItem}>
<div <div
className={classnames({ className={classnames({
[styles.formItemLable]: true, [styles.parameterTitle]: true,
[styles.required]: true, [styles.required]: parameter.required,
})} })}
> >
任务名称 {parameter.name}
<span className={styles.parameterDataType}>
{parameter.dataType}
</span>
</div> </div>
<div className={styles.formItem}> <div className={styles.parameterContent}>
{parameter.domType.toLowerCase() === "file" && (
<MyInput <MyInput
value={name} value={parameter.value || ""}
onChange={handleNameChange} InputProps={{
placeholder="请输入任务名称" endAdornment: (
error={nameHelp.error} <img
helperText={nameHelp.helperText} onClick={() =>
handleOpenFileSelect(taskId, parameter.name)
}
src={fileSelectIcon}
alt=""
className={styles.fileSelectImg}
/>
),
}}
error={parameter.error || false}
helperText={parameter.helperText}
></MyInput> ></MyInput>
</div> )}
</div> {parameter.domType.toLowerCase() === "pathselect" && (
<div className={styles.formItem}>
<div
className={classnames({
[styles.formItemLable]: true,
[styles.required]: true,
})}
>
输出路径
</div>
<div className={styles.formItem}>
<MyInput <MyInput
value={outputPath} value={parameter.value || ""}
InputProps={{ InputProps={{
endAdornment: ( endAdornment: (
<img <img
onClick={handleOpenFileSelect} onClick={() =>
handleOpenFileSelect(taskId, parameter.name)
}
src={fileSelectIcon} src={fileSelectIcon}
alt="选择输出路径" alt=""
className={styles.fileSelectImg} className={styles.fileSelectImg}
/> />
), ),
}} }}
error={outputPathHelp.error} error={parameter.error || false}
helperText={outputPathHelp.helperText} helperText={parameter.helperText}
></MyInput> ></MyInput>
</div> )}
</div> {parameter.domType.toLowerCase() === "datasetselect" && (
</div> <MyInput
{renderTasks.map((task, taskIndex) => { value={parameter.value || ""}
return ( InputProps={{
<div className={styles.taskBox} key={task.id + taskIndex}> endAdornment: (
<div
className={classnames({
[styles.backgroundTitle]: true,
[styles.backgroundTitlePass]: true,
})}
>
<img <img
className={classnames({ onClick={() =>
[styles.backgroundTitleTextIcon]: true, handleOpenFileSelect(taskId, parameter.name)
[styles.backgroundTitleTextIconShow]: task.isCheck, }
})} src={fileSelectIcon}
src={jobSueIcon} alt="" /> alt=""
<span className={styles.backgroundTitleText}>{task.title}</span> className={styles.fileSelectImg}
</div> />
<div className={styles.taskConfigBox}> ),
{task.parameters.filter(parameter => parameter.hidden === false).map((parameter, parameterIndex) => { }}
return ( error={parameter.error || false}
<div helperText={parameter.helperText}
className={styles.parameter} ></MyInput>
key={parameter.id || "" + parameterIndex} )}
> {parameter.domType.toLowerCase() === "fileselect" && (
<div className={classnames({ <MyInput
[styles.parameterTitle]: true, value={parameter.value || ""}
[styles.required]: parameter.required, InputProps={{
})}> endAdornment: (
{parameter.name} <img
<span className={styles.parameterDataType}> onClick={() =>
{parameter.dataType} handleOpenFileSelect(taskId, parameter.name)
</span> }
</div> src={fileSelectIcon}
<div className={styles.parameterContent}> alt=""
className={styles.fileSelectImg}
/>
),
}}
error={parameter.error || false}
helperText={parameter.helperText}
></MyInput>
)}
{parameter.domType.toLowerCase() === "input" && ( {parameter.domType.toLowerCase() === "input" && (
<MyInput <MyInput
value={parameter.value} value={parameter.value}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange( handleParameterChange(e, taskId, parameter.name || "")
e,
task.id,
parameter.name || ""
)
} }
placeholder="请输入" placeholder="请输入"
error={parameter.error || false} error={parameter.error || false}
...@@ -270,11 +285,7 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -270,11 +285,7 @@ const ConfigForm = (props: ConfigFormProps) => {
<MySelect <MySelect
value={parameter.value} value={parameter.value}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange( handleParameterChange(e, taskId, parameter.name || "")
e,
task.id,
parameter.name || ""
)
} }
error={parameter.error || false} error={parameter.error || false}
helperText={parameter.helperText} helperText={parameter.helperText}
...@@ -285,11 +296,7 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -285,11 +296,7 @@ const ConfigForm = (props: ConfigFormProps) => {
<MySelect <MySelect
value={parameter.value} value={parameter.value}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange( handleParameterChange(e, taskId, parameter.name || "")
e,
task.id,
parameter.name || ""
)
} }
multiple={true} multiple={true}
error={parameter.error || false} error={parameter.error || false}
...@@ -301,11 +308,7 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -301,11 +308,7 @@ const ConfigForm = (props: ConfigFormProps) => {
<MyRadio <MyRadio
value={parameter.value} value={parameter.value}
onChange={(e: any) => onChange={(e: any) =>
handleParameterChange( handleParameterChange(e, taskId, parameter.name || "")
e,
task.id,
parameter.name || ""
)
} }
options={optionsTransform(parameter.choices, "key")} options={optionsTransform(parameter.choices, "key")}
error={parameter.error || false} error={parameter.error || false}
...@@ -319,10 +322,10 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -319,10 +322,10 @@ const ConfigForm = (props: ConfigFormProps) => {
handleParameterChange( handleParameterChange(
{ {
target: { target: {
value: e value: e,
} },
}, },
task.id, taskId,
parameter.name || "" parameter.name || ""
) )
} }
...@@ -341,35 +344,114 @@ const ConfigForm = (props: ConfigFormProps) => { ...@@ -341,35 +344,114 @@ const ConfigForm = (props: ConfigFormProps) => {
</Tooltip> </Tooltip>
)} )}
</div> </div>
{/* question mark */}
</div> </div>
); );
});
};
return (
<div className={styles.formBox}>
<div className={styles.templateDescBox}>
<div className={styles.templateDescTitle}>模板描述</div>
<div className={styles.templateDesc}>
{templateConfigInfo?.description || ""}
</div>
</div>
<div
className={classnames({
[styles.backgroundTitle]: true,
[styles.backgroundTitlePass]: true,
})} })}
>
<img src="" alt="" />
<span className={styles.backgroundTitleText}>基础信息</span>
</div> </div>
<div className={styles.formItems}>
<div className={styles.formItem}>
<div
className={classnames({
[styles.formItemLable]: true,
[styles.required]: true,
})}
>
任务名称
</div>
<div className={styles.formItem}>
<MyInput
value={name}
onChange={handleNameChange}
placeholder="请输入任务名称"
error={nameHelp.error}
helperText={nameHelp.helperText}
></MyInput>
</div>
</div>
<div className={styles.formItem}>
<div
className={classnames({
[styles.formItemLable]: true,
[styles.required]: true,
})}
>
输出路径
</div>
<div className={styles.formItem}>
<MyInput
value={outputPath || ""}
InputProps={{
endAdornment: (
<img
onClick={() => handleOpenFileSelect()}
src={fileSelectIcon}
alt="选择输出路径"
className={styles.fileSelectImg}
/>
),
}}
error={outputPathHelp.error}
helperText={outputPathHelp.helperText}
></MyInput>
</div>
</div>
</div>
{renderTasks.map((task, taskIndex) => {
return (
<div className={styles.taskBox} key={task.id + taskIndex}>
<div
className={classnames({
[styles.backgroundTitle]: true,
[styles.backgroundTitlePass]: true,
})}
>
<img
className={classnames({
[styles.backgroundTitleTextIcon]: true,
[styles.backgroundTitleTextIconShow]: task.isCheck,
})}
src={jobSueIcon}
alt=""
/>
<span className={styles.backgroundTitleText}>{task.title}</span>
</div>
<div className={styles.taskConfigBox}>
{randerParameters(task.parameters, task.id)}
{task.flows.map((flow) => {
return (
<div className={styles.flowConfigBox} key={flow.id}>
<div className={styles.flowTitle}>{flow.title}</div>
{randerParameters(flow.parameters, flow.id)}
</div> </div>
); );
})} })}
{/* <MySelect </div>
value={selectValue} </div>
onChange={handleSelectChange} );
multiple={true} })}
options={optionsTransform(options, "key")} <FileSelect
></MySelect> */}
{/* <MyCheckBox
value={selectValue}
onChange={handleCheckBoxChange}
options={optionsTransform(options, "key")}
></MyCheckBox> */}
{/* <MyRadio
value={selectValue}
onChange={handleRadioChange}
options={optionsTransform(options, "key")}
></MyRadio> */}
{/* <FileSelect
onClose={handleFileSelectOnClose} onClose={handleFileSelectOnClose}
open={fileSelectOpen} open={fileSelectOpen}
onConfirm={onFileSelectConfirm} onConfirm={onFileSelectConfirm}
/> */} />
</div> </div>
); );
}; };
......
...@@ -16,15 +16,19 @@ import IconButton from "@mui/material/IconButton"; ...@@ -16,15 +16,19 @@ import IconButton from "@mui/material/IconButton";
import { ITemplateConfig } from "./interface"; import { ITemplateConfig } from "./interface";
import _ from "lodash"; import _ from "lodash";
import useMyRequest from "@/hooks/useMyRequest"; import useMyRequest from "@/hooks/useMyRequest";
import { fetchTemplateConfigInfo } from "@/api/project_api"; import { fetchTemplateConfigInfo, submitWorkFlow } from "@/api/project_api";
import { useLocation, useNavigate } from "react-router-dom"; import { useLocation, useNavigate } from "react-router-dom";
import { getCheckResult } from "./util"; import { getCheckResult } from "./util";
import { IResponse } from "@/api/http"; import { IResponse } from "@/api/http";
import { templateConfigJson } from "./mock"; import { templateConfigJson } from "./mock";
import { useMessage } from "@/components/MySnackbar"; import { useMessage } from "@/components/MySnackbar";
import { toJS } from "mobx";
import { useStores } from "@/store";
const ProjectSubmitWork = () => { const ProjectSubmitWork = () => {
const Message = useMessage(); const Message = useMessage();
const { currentProjectStore } = useStores();
const projectId = toJS(currentProjectStore.currentProjectInfo.id);
const [templateConfigInfo, setTemplateConfigInfo] = const [templateConfigInfo, setTemplateConfigInfo] =
useState<ITemplateConfig>(); useState<ITemplateConfig>();
const location: any = useLocation(); const location: any = useLocation();
...@@ -42,6 +46,12 @@ const ProjectSubmitWork = () => { ...@@ -42,6 +46,12 @@ const ProjectSubmitWork = () => {
// } // }
}); });
const { run: submitWorkFlowRun } = useMyRequest(submitWorkFlow, {
onSuccess: (res) => {
console.log(res);
},
});
useEffect(() => { useEffect(() => {
run({ run({
id: location?.state?.id, id: location?.state?.id,
...@@ -52,6 +62,7 @@ const ProjectSubmitWork = () => { ...@@ -52,6 +62,7 @@ const ProjectSubmitWork = () => {
const result: ITemplateConfig = _.cloneDeep(templateConfigInfo); const result: ITemplateConfig = _.cloneDeep(templateConfigInfo);
result.tasks.forEach((tack) => { result.tasks.forEach((tack) => {
if (tack.id === taskId) { if (tack.id === taskId) {
let isCheck = true;
tack.parameters.forEach((parameter) => { tack.parameters.forEach((parameter) => {
if (parameter.name === parameterName) { if (parameter.name === parameterName) {
parameter.value = value; parameter.value = value;
...@@ -61,6 +72,10 @@ const ProjectSubmitWork = () => { ...@@ -61,6 +72,10 @@ const ProjectSubmitWork = () => {
} else { } else {
return; return;
} }
if (getCheckResult(parameter, value).error === true) {
isCheck = false;
}
tack.isCheck = isCheck;
}); });
} else { } else {
return; return;
...@@ -90,6 +105,13 @@ const ProjectSubmitWork = () => { ...@@ -90,6 +105,13 @@ const ProjectSubmitWork = () => {
setTemplateConfigInfo(result); setTemplateConfigInfo(result);
if (check) { if (check) {
console.log("提交任务"); console.log("提交任务");
submitWorkFlowRun({
name,
outputPath,
projectId: projectId as string,
specId: templateConfigInfo?.id as string,
promotedParameters: {},
});
} else { } else {
Message.error("请完善左侧表单再提交"); Message.error("请完善左侧表单再提交");
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* @FilePath: /bkunyun/src/views/Project/ProjectSubmitWork/interface.ts * @FilePath: /bkunyun/src/views/Project/ProjectSubmitWork/interface.ts
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
type IType = 'BATCH' | 'FLOW' type IType = "BATCH" | "FLOW";
export interface IParameter { export interface IParameter {
hidden: boolean; hidden: boolean;
id?: string; id?: string;
...@@ -24,8 +24,8 @@ export interface IParameter { ...@@ -24,8 +24,8 @@ export interface IParameter {
tasks: ITask[]; tasks: ITask[];
validators: Array<IValidator>; validators: Array<IValidator>;
choices: Array<IChoice>; choices: Array<IChoice>;
error? : boolean; error?: boolean;
helperText? : string; helperText?: string;
} }
export interface ITask { export interface ITask {
...@@ -40,9 +40,9 @@ export interface ITask { ...@@ -40,9 +40,9 @@ export interface ITask {
parentNode?: string; parentNode?: string;
parameters: Array<IParameter>; parameters: Array<IParameter>;
edges: Array<IEdge>; edges: Array<IEdge>;
isCheck?: boolean;
} }
export interface ITemplateConfig { export interface ITemplateConfig {
title: string; title: string;
version: string; version: string;
...@@ -54,6 +54,7 @@ export interface ITemplateConfig { ...@@ -54,6 +54,7 @@ export interface ITemplateConfig {
source: string; source: string;
productId: string; productId: string;
tasks: ITask[]; tasks: ITask[];
id: string;
} }
export type IDomType = export type IDomType =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment