From 54de9faad9bf00e13b23f024e94bf486a9b3c959 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期四, 29 一月 2026 08:42:48 +0800
Subject: [PATCH] lsh#

---
 rsf-admin/src/page/taskInstance/TaskInstancePanel.jsx                                                     |  231 +
 rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeCreate.jsx                                    |  226 +
 rsf-admin/src/page/flowStepTemplate/FlowStepTemplateList.jsx                                              |  180 
 rsf-admin/src/page/flowStepLog/FlowStepLogPanel.jsx                                                       |   93 
 rsf-admin/src/page/flowStepInstance/FlowStepInstanceCreate.jsx                                            |  224 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateController.java         |  110 
 rsf-server/src/main/java/taskPathTemplateNode.sql                                                         |   37 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceController.java             |  110 
 rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeEdit.jsx                                              |  223 +
 rsf-admin/src/page/flowInstance/FlowInstancePanel.jsx                                                     |  177 
 rsf-admin/src/page/flowStepLog/FlowStepLogList.jsx                                                        |  164 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateNodeMapper.java             |   12 
 rsf-admin/src/page/flowStepTemplate/FlowStepTemplateEdit.jsx                                              |  191 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepLog.java                            |  125 
 rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodePanel.jsx                                     |  147 
 rsf-admin/src/page/flowStepLog/index.jsx                                                                  |   18 
 rsf-server/src/main/java/flowStepTemplate.sql                                                             |   36 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepInstanceService.java               |    8 
 rsf-admin/src/page/flowStepTemplate/index.jsx                                                             |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowInstanceService.java                   |    8 
 rsf-admin/src/page/taskInstance/index.jsx                                                                 |   18 
 rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeList.jsx                                              |  190 +
 rsf-server/src/main/resources/mapper/system/FlowInstanceMapper.xml                                        |    5 
 rsf-admin/src/page/flowStepInstance/FlowStepInstancePanel.jsx                                             |  147 
 rsf-admin/src/page/flowStepLog/FlowStepLogCreate.jsx                                                      |  162 
 rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeCreate.jsx                                            |  251 +
 rsf-admin/src/page/taskPathTemplate/TaskPathTemplatePanel.jsx                                             |  165 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceNodeServiceImpl.java      |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplate.java                       |  254 +
 rsf-admin/src/page/taskInstanceNode/index.jsx                                                             |   18 
 rsf-admin/src/page/taskPathTemplate/TaskPathTemplateCreate.jsx                                            |  244 +
 rsf-server/src/main/resources/mapper/system/FlowStepInstanceMapper.xml                                    |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepLogMapper.java                      |   12 
 rsf-admin/src/page/flowInstance/index.jsx                                                                 |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java                       |  237 +
 rsf-server/src/main/java/flowStepInstance.sql                                                             |   37 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/SubsystemFlowTemplateServiceImpl.java |   12 
 rsf-admin/src/page/taskPathTemplate/TaskPathTemplateEdit.jsx                                              |  216 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateNodeController.java     |  110 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstance.java                           |  379 ++
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceService.java                   |    8 
 rsf-server/src/main/java/flowInstance.sql                                                                 |   42 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowInstanceController.java             |  107 
 rsf-admin/src/page/flowStepInstance/index.jsx                                                             |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateService.java               |    8 
 rsf-admin/src/page/subsystemFlowTemplate/index.jsx                                                        |   18 
 rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateCreate.jsx                                  |  210 +
 rsf-server/src/main/java/flowStepLog.sql                                                                  |   28 
 rsf-server/src/main/resources/mapper/system/TaskPathTemplateNodeMapper.xml                                |    5 
 rsf-server/src/main/resources/mapper/system/TaskInstanceNodeMapper.xml                                    |    5 
 rsf-admin/src/page/taskInstance/TaskInstanceList.jsx                                                      |  210 +
 rsf-admin/src/page/taskPathTemplate/index.jsx                                                             |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceServiceImpl.java          |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepLogServiceImpl.java           |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceNodeService.java               |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepInstanceServiceImpl.java      |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepInstanceMapper.java                 |   12 
 rsf-server/src/main/resources/mapper/system/TaskInstanceMapper.xml                                        |    5 
 rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeList.jsx                                      |  182 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/SubsystemFlowTemplateController.java    |  110 
 rsf-admin/src/page/flowStepTemplate/FlowStepTemplateCreate.jsx                                            |  219 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceNodeMapper.java                 |   12 
 rsf-server/src/main/java/taskInstance.sql                                                                 |   51 
 rsf-admin/src/page/taskInstance/TaskInstanceCreate.jsx                                                    |  321 +
 rsf-admin/src/page/taskInstance/TaskInstanceEdit.jsx                                                      |  293 +
 rsf-server/src/main/resources/mapper/system/FlowStepTemplateMapper.xml                                    |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplateNode.java                   |  205 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/SubsystemFlowTemplateService.java          |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateServiceImpl.java      |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowInstance.java                           |  297 +
 rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeEdit.jsx                                      |  198 +
 rsf-admin/src/page/flowStepInstance/FlowStepInstanceEdit.jsx                                              |  196 +
 rsf-admin/src/page/flowStepTemplate/FlowStepTemplatePanel.jsx                                             |  141 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepTemplate.java                       |  197 +
 rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateEdit.jsx                                    |  182 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepTemplateServiceImpl.java      |   12 
 rsf-server/src/main/java/taskPathTemplate.sql                                                             |   40 
 rsf-admin/src/page/flowInstance/FlowInstanceEdit.jsx                                                      |  228 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowInstanceServiceImpl.java          |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepLogService.java                    |    8 
 rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx                                              |  188 +
 rsf-admin/src/page/taskInstanceNode/TaskInstanceNodePanel.jsx                                             |  171 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepTemplateMapper.java                 |   12 
 rsf-server/src/main/resources/mapper/system/FlowStepLogMapper.xml                                         |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateNodeService.java           |    8 
 rsf-admin/src/page/flowInstance/FlowInstanceList.jsx                                                      |  192 +
 rsf-admin/src/page/flowStepLog/FlowStepLogEdit.jsx                                                        |  134 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepInstanceController.java         |  107 
 rsf-server/src/main/java/taskInstanceNode.sql                                                             |   41 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/SubsystemFlowTemplateMapper.java            |   12 
 rsf-admin/src/page/flowStepInstance/FlowStepInstanceList.jsx                                              |  182 
 rsf-server/src/main/resources/mapper/system/TaskPathTemplateMapper.xml                                    |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepTemplateController.java         |  110 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepTemplateService.java               |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepLogController.java              |  110 
 rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceNodeController.java         |  107 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceMapper.java                     |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateMapper.java                 |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateNodeServiceImpl.java  |   12 
 rsf-admin/src/page/flowInstance/FlowInstanceCreate.jsx                                                    |  256 +
 rsf-server/src/main/resources/mapper/system/SubsystemFlowTemplateMapper.xml                               |    5 
 rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateList.jsx                                    |  178 
 rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowInstanceMapper.java                     |   12 
 rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplatePanel.jsx                                   |  135 
 rsf-server/src/main/java/subsystemFlowTemplate.sql                                                        |   35 
 rsf-admin/src/page/taskPathTemplateNode/index.jsx                                                         |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstanceNode.java                       |  289 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SubsystemFlowTemplate.java                  |  215 +
 108 files changed, 11,068 insertions(+), 0 deletions(-)

diff --git a/rsf-admin/src/page/flowInstance/FlowInstanceCreate.jsx b/rsf-admin/src/page/flowInstance/FlowInstanceCreate.jsx
new file mode 100644
index 0000000..4d827da
--- /dev/null
+++ b/rsf-admin/src/page/flowInstance/FlowInstanceCreate.jsx
@@ -0,0 +1,256 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const FlowInstanceCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.flowInstanceNo"
+                                        source="flowInstanceNo"
+                                        parse={v => v}
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.taskId"
+                                        source="taskId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.taskNo"
+                                        source="taskNo"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.nodeInstanceId"
+                                        source="nodeInstanceId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.nodeCode"
+                                        source="nodeCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.flowTemplateId"
+                                        source="flowTemplateId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.flowTemplateCode"
+                                        source="flowTemplateCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.templateVersion"
+                                        source="templateVersion"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.currentStepCode"
+                                        source="currentStepCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.currentStepOrder"
+                                        source="currentStepOrder"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.executeParams"
+                                        source="executeParams"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.executeResult"
+                                        source="executeResult"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.errorCode"
+                                        source="errorCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.errorMessage"
+                                        source="errorMessage"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowInstance.startTime"
+                                        source="startTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowInstance.endTime"
+                                        source="endTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowInstance.timeoutAt"
+                                        source="timeoutAt"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.durationSeconds"
+                                        source="durationSeconds"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowInstance.retryTimes"
+                                        source="retryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowInstance.lastRetryTime"
+                                        source="lastRetryTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowInstance.contextData"
+                                        source="contextData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default FlowInstanceCreate;
diff --git a/rsf-admin/src/page/flowInstance/FlowInstanceEdit.jsx b/rsf-admin/src/page/flowInstance/FlowInstanceEdit.jsx
new file mode 100644
index 0000000..0378523
--- /dev/null
+++ b/rsf-admin/src/page/flowInstance/FlowInstanceEdit.jsx
@@ -0,0 +1,228 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const FlowInstanceEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.flowInstanceNo"
+                                source="flowInstanceNo"
+                                parse={v => v}
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.taskId"
+                                source="taskId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.taskNo"
+                                source="taskNo"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.nodeInstanceId"
+                                source="nodeInstanceId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.nodeCode"
+                                source="nodeCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.flowTemplateId"
+                                source="flowTemplateId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.flowTemplateCode"
+                                source="flowTemplateCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.templateVersion"
+                                source="templateVersion"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.currentStepCode"
+                                source="currentStepCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.currentStepOrder"
+                                source="currentStepOrder"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.executeParams"
+                                source="executeParams"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.executeResult"
+                                source="executeResult"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.errorCode"
+                                source="errorCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.errorMessage"
+                                source="errorMessage"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowInstance.startTime"
+                                source="startTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowInstance.endTime"
+                                source="endTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowInstance.timeoutAt"
+                                source="timeoutAt"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.durationSeconds"
+                                source="durationSeconds"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowInstance.retryTimes"
+                                source="retryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowInstance.lastRetryTime"
+                                source="lastRetryTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowInstance.contextData"
+                                source="contextData"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default FlowInstanceEdit;
diff --git a/rsf-admin/src/page/flowInstance/FlowInstanceList.jsx b/rsf-admin/src/page/flowInstance/FlowInstanceList.jsx
new file mode 100644
index 0000000..da49183
--- /dev/null
+++ b/rsf-admin/src/page/flowInstance/FlowInstanceList.jsx
@@ -0,0 +1,192 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import FlowInstanceCreate from "./FlowInstanceCreate";
+import FlowInstancePanel from "./FlowInstancePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <TextInput source="flowInstanceNo" label="table.field.flowInstance.flowInstanceNo" />,
+    <NumberInput source="taskId" label="table.field.flowInstance.taskId" />,
+    <TextInput source="taskNo" label="table.field.flowInstance.taskNo" />,
+    <NumberInput source="nodeInstanceId" label="table.field.flowInstance.nodeInstanceId" />,
+    <TextInput source="nodeCode" label="table.field.flowInstance.nodeCode" />,
+    <NumberInput source="flowTemplateId" label="table.field.flowInstance.flowTemplateId" />,
+    <TextInput source="flowTemplateCode" label="table.field.flowInstance.flowTemplateCode" />,
+    <NumberInput source="templateVersion" label="table.field.flowInstance.templateVersion" />,
+    <TextInput source="currentStepCode" label="table.field.flowInstance.currentStepCode" />,
+    <NumberInput source="currentStepOrder" label="table.field.flowInstance.currentStepOrder" />,
+    <TextInput source="executeParams" label="table.field.flowInstance.executeParams" />,
+    <TextInput source="executeResult" label="table.field.flowInstance.executeResult" />,
+    <TextInput source="errorCode" label="table.field.flowInstance.errorCode" />,
+    <TextInput source="errorMessage" label="table.field.flowInstance.errorMessage" />,
+    <DateInput source="startTime" label="table.field.flowInstance.startTime" />,
+    <DateInput source="endTime" label="table.field.flowInstance.endTime" />,
+    <DateInput source="timeoutAt" label="table.field.flowInstance.timeoutAt" />,
+    <NumberInput source="durationSeconds" label="table.field.flowInstance.durationSeconds" />,
+    <NumberInput source="retryTimes" label="table.field.flowInstance.retryTimes" />,
+    <DateInput source="lastRetryTime" label="table.field.flowInstance.lastRetryTime" />,
+    <TextInput source="contextData" label="table.field.flowInstance.contextData" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const FlowInstanceList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.flowInstance"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='flowInstance' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='flowInstance'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <FlowInstancePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <TextField source="flowInstanceNo" label="table.field.flowInstance.flowInstanceNo" />
+                    <NumberField source="taskId" label="table.field.flowInstance.taskId" />
+                    <TextField source="taskNo" label="table.field.flowInstance.taskNo" />
+                    <NumberField source="nodeInstanceId" label="table.field.flowInstance.nodeInstanceId" />
+                    <TextField source="nodeCode" label="table.field.flowInstance.nodeCode" />
+                    <NumberField source="flowTemplateId" label="table.field.flowInstance.flowTemplateId" />
+                    <TextField source="flowTemplateCode" label="table.field.flowInstance.flowTemplateCode" />
+                    <NumberField source="templateVersion" label="table.field.flowInstance.templateVersion" />
+                    <TextField source="currentStepCode" label="table.field.flowInstance.currentStepCode" />
+                    <NumberField source="currentStepOrder" label="table.field.flowInstance.currentStepOrder" />
+                    <TextField source="executeParams" label="table.field.flowInstance.executeParams" />
+                    <TextField source="executeResult" label="table.field.flowInstance.executeResult" />
+                    <TextField source="errorCode" label="table.field.flowInstance.errorCode" />
+                    <TextField source="errorMessage" label="table.field.flowInstance.errorMessage" />
+                    <DateField source="startTime" label="table.field.flowInstance.startTime" showTime />
+                    <DateField source="endTime" label="table.field.flowInstance.endTime" showTime />
+                    <DateField source="timeoutAt" label="table.field.flowInstance.timeoutAt" showTime />
+                    <NumberField source="durationSeconds" label="table.field.flowInstance.durationSeconds" />
+                    <NumberField source="retryTimes" label="table.field.flowInstance.retryTimes" />
+                    <DateField source="lastRetryTime" label="table.field.flowInstance.lastRetryTime" showTime />
+                    <TextField source="contextData" label="table.field.flowInstance.contextData" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <FlowInstanceCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='FlowInstance Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default FlowInstanceList;
diff --git a/rsf-admin/src/page/flowInstance/FlowInstancePanel.jsx b/rsf-admin/src/page/flowInstance/FlowInstancePanel.jsx
new file mode 100644
index 0000000..b84a008
--- /dev/null
+++ b/rsf-admin/src/page/flowInstance/FlowInstancePanel.jsx
@@ -0,0 +1,177 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const FlowInstancePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.flowInstance.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.flowInstanceNo" 
+                                property={record.flowInstanceNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.taskId" 
+                                property={record.taskId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.taskNo" 
+                                property={record.taskNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.nodeInstanceId" 
+                                property={record.nodeInstanceId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.nodeCode" 
+                                property={record.nodeCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.flowTemplateId" 
+                                property={record.flowTemplateId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.flowTemplateCode" 
+                                property={record.flowTemplateCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.templateVersion" 
+                                property={record.templateVersion}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.currentStepCode" 
+                                property={record.currentStepCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.currentStepOrder" 
+                                property={record.currentStepOrder}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.executeParams" 
+                                property={record.executeParams}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.executeResult" 
+                                property={record.executeResult}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.errorCode" 
+                                property={record.errorCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.errorMessage" 
+                                property={record.errorMessage}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.startTime" 
+                                property={record.startTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.endTime" 
+                                property={record.endTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.timeoutAt" 
+                                property={record.timeoutAt$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.durationSeconds" 
+                                property={record.durationSeconds}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.retryTimes" 
+                                property={record.retryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.lastRetryTime" 
+                                property={record.lastRetryTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowInstance.contextData" 
+                                property={record.contextData}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default FlowInstancePanel;
diff --git a/rsf-admin/src/page/flowInstance/index.jsx b/rsf-admin/src/page/flowInstance/index.jsx
new file mode 100644
index 0000000..458533a
--- /dev/null
+++ b/rsf-admin/src/page/flowInstance/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import FlowInstanceList from "./FlowInstanceList";
+import FlowInstanceEdit from "./FlowInstanceEdit";
+
+export default {
+    list: FlowInstanceList,
+    edit: FlowInstanceEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/flowStepInstance/FlowStepInstanceCreate.jsx b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceCreate.jsx
new file mode 100644
index 0000000..9b71fdd
--- /dev/null
+++ b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceCreate.jsx
@@ -0,0 +1,224 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const FlowStepInstanceCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepInstance.flowInstanceId"
+                                        source="flowInstanceId"
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.flowInstanceNo"
+                                        source="flowInstanceNo"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepInstance.stepOrder"
+                                        source="stepOrder"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.stepCode"
+                                        source="stepCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.stepName"
+                                        source="stepName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.stepType"
+                                        source="stepType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepInstance.stepTemplateId"
+                                        source="stepTemplateId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.executeResult"
+                                        source="executeResult"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.errorCode"
+                                        source="errorCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.errorMessage"
+                                        source="errorMessage"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowStepInstance.startTime"
+                                        source="startTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.flowStepInstance.endTime"
+                                        source="endTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepInstance.durationSeconds"
+                                        source="durationSeconds"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.inputData"
+                                        source="inputData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepInstance.outputData"
+                                        source="outputData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepInstance.retryTimes"
+                                        source="retryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default FlowStepInstanceCreate;
diff --git a/rsf-admin/src/page/flowStepInstance/FlowStepInstanceEdit.jsx b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceEdit.jsx
new file mode 100644
index 0000000..5003fae
--- /dev/null
+++ b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceEdit.jsx
@@ -0,0 +1,196 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const FlowStepInstanceEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepInstance.flowInstanceId"
+                                source="flowInstanceId"
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.flowInstanceNo"
+                                source="flowInstanceNo"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepInstance.stepOrder"
+                                source="stepOrder"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.stepCode"
+                                source="stepCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.stepName"
+                                source="stepName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.stepType"
+                                source="stepType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepInstance.stepTemplateId"
+                                source="stepTemplateId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.executeResult"
+                                source="executeResult"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.errorCode"
+                                source="errorCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.errorMessage"
+                                source="errorMessage"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowStepInstance.startTime"
+                                source="startTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.flowStepInstance.endTime"
+                                source="endTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepInstance.durationSeconds"
+                                source="durationSeconds"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.inputData"
+                                source="inputData"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepInstance.outputData"
+                                source="outputData"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepInstance.retryTimes"
+                                source="retryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default FlowStepInstanceEdit;
diff --git a/rsf-admin/src/page/flowStepInstance/FlowStepInstanceList.jsx b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceList.jsx
new file mode 100644
index 0000000..11d65b4
--- /dev/null
+++ b/rsf-admin/src/page/flowStepInstance/FlowStepInstanceList.jsx
@@ -0,0 +1,182 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import FlowStepInstanceCreate from "./FlowStepInstanceCreate";
+import FlowStepInstancePanel from "./FlowStepInstancePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="flowInstanceId" label="table.field.flowStepInstance.flowInstanceId" />,
+    <TextInput source="flowInstanceNo" label="table.field.flowStepInstance.flowInstanceNo" />,
+    <NumberInput source="stepOrder" label="table.field.flowStepInstance.stepOrder" />,
+    <TextInput source="stepCode" label="table.field.flowStepInstance.stepCode" />,
+    <TextInput source="stepName" label="table.field.flowStepInstance.stepName" />,
+    <TextInput source="stepType" label="table.field.flowStepInstance.stepType" />,
+    <NumberInput source="stepTemplateId" label="table.field.flowStepInstance.stepTemplateId" />,
+    <TextInput source="executeResult" label="table.field.flowStepInstance.executeResult" />,
+    <TextInput source="errorCode" label="table.field.flowStepInstance.errorCode" />,
+    <TextInput source="errorMessage" label="table.field.flowStepInstance.errorMessage" />,
+    <DateInput source="startTime" label="table.field.flowStepInstance.startTime" />,
+    <DateInput source="endTime" label="table.field.flowStepInstance.endTime" />,
+    <NumberInput source="durationSeconds" label="table.field.flowStepInstance.durationSeconds" />,
+    <TextInput source="inputData" label="table.field.flowStepInstance.inputData" />,
+    <TextInput source="outputData" label="table.field.flowStepInstance.outputData" />,
+    <NumberInput source="retryTimes" label="table.field.flowStepInstance.retryTimes" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const FlowStepInstanceList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.flowStepInstance"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='flowStepInstance' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='flowStepInstance'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <FlowStepInstancePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="flowInstanceId" label="table.field.flowStepInstance.flowInstanceId" />
+                    <TextField source="flowInstanceNo" label="table.field.flowStepInstance.flowInstanceNo" />
+                    <NumberField source="stepOrder" label="table.field.flowStepInstance.stepOrder" />
+                    <TextField source="stepCode" label="table.field.flowStepInstance.stepCode" />
+                    <TextField source="stepName" label="table.field.flowStepInstance.stepName" />
+                    <TextField source="stepType" label="table.field.flowStepInstance.stepType" />
+                    <NumberField source="stepTemplateId" label="table.field.flowStepInstance.stepTemplateId" />
+                    <TextField source="executeResult" label="table.field.flowStepInstance.executeResult" />
+                    <TextField source="errorCode" label="table.field.flowStepInstance.errorCode" />
+                    <TextField source="errorMessage" label="table.field.flowStepInstance.errorMessage" />
+                    <DateField source="startTime" label="table.field.flowStepInstance.startTime" showTime />
+                    <DateField source="endTime" label="table.field.flowStepInstance.endTime" showTime />
+                    <NumberField source="durationSeconds" label="table.field.flowStepInstance.durationSeconds" />
+                    <TextField source="inputData" label="table.field.flowStepInstance.inputData" />
+                    <TextField source="outputData" label="table.field.flowStepInstance.outputData" />
+                    <NumberField source="retryTimes" label="table.field.flowStepInstance.retryTimes" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <FlowStepInstanceCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='FlowStepInstance Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default FlowStepInstanceList;
diff --git a/rsf-admin/src/page/flowStepInstance/FlowStepInstancePanel.jsx b/rsf-admin/src/page/flowStepInstance/FlowStepInstancePanel.jsx
new file mode 100644
index 0000000..5011436
--- /dev/null
+++ b/rsf-admin/src/page/flowStepInstance/FlowStepInstancePanel.jsx
@@ -0,0 +1,147 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const FlowStepInstancePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.flowStepInstance.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.flowInstanceId" 
+                                property={record.flowInstanceId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.flowInstanceNo" 
+                                property={record.flowInstanceNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.stepOrder" 
+                                property={record.stepOrder}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.stepCode" 
+                                property={record.stepCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.stepName" 
+                                property={record.stepName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.stepType" 
+                                property={record.stepType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.stepTemplateId" 
+                                property={record.stepTemplateId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.executeResult" 
+                                property={record.executeResult}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.errorCode" 
+                                property={record.errorCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.errorMessage" 
+                                property={record.errorMessage}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.startTime" 
+                                property={record.startTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.endTime" 
+                                property={record.endTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.durationSeconds" 
+                                property={record.durationSeconds}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.inputData" 
+                                property={record.inputData}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.outputData" 
+                                property={record.outputData}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepInstance.retryTimes" 
+                                property={record.retryTimes}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default FlowStepInstancePanel;
diff --git a/rsf-admin/src/page/flowStepInstance/index.jsx b/rsf-admin/src/page/flowStepInstance/index.jsx
new file mode 100644
index 0000000..3c30070
--- /dev/null
+++ b/rsf-admin/src/page/flowStepInstance/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import FlowStepInstanceList from "./FlowStepInstanceList";
+import FlowStepInstanceEdit from "./FlowStepInstanceEdit";
+
+export default {
+    list: FlowStepInstanceList,
+    edit: FlowStepInstanceEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/flowStepLog/FlowStepLogCreate.jsx b/rsf-admin/src/page/flowStepLog/FlowStepLogCreate.jsx
new file mode 100644
index 0000000..f2bb5cc
--- /dev/null
+++ b/rsf-admin/src/page/flowStepLog/FlowStepLogCreate.jsx
@@ -0,0 +1,162 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const FlowStepLogCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepLog.flowInstanceId"
+                                        source="flowInstanceId"
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepLog.stepInstanceId"
+                                        source="stepInstanceId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepLog.logType"
+                                        source="logType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepLog.logLevel"
+                                        source="logLevel"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepLog.logContent"
+                                        source="logContent"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepLog.requestData"
+                                        source="requestData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepLog.responseData"
+                                        source="responseData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default FlowStepLogCreate;
diff --git a/rsf-admin/src/page/flowStepLog/FlowStepLogEdit.jsx b/rsf-admin/src/page/flowStepLog/FlowStepLogEdit.jsx
new file mode 100644
index 0000000..90f6ce0
--- /dev/null
+++ b/rsf-admin/src/page/flowStepLog/FlowStepLogEdit.jsx
@@ -0,0 +1,134 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const FlowStepLogEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepLog.flowInstanceId"
+                                source="flowInstanceId"
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepLog.stepInstanceId"
+                                source="stepInstanceId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepLog.logType"
+                                source="logType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepLog.logLevel"
+                                source="logLevel"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepLog.logContent"
+                                source="logContent"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepLog.requestData"
+                                source="requestData"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepLog.responseData"
+                                source="responseData"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default FlowStepLogEdit;
diff --git a/rsf-admin/src/page/flowStepLog/FlowStepLogList.jsx b/rsf-admin/src/page/flowStepLog/FlowStepLogList.jsx
new file mode 100644
index 0000000..83ed099
--- /dev/null
+++ b/rsf-admin/src/page/flowStepLog/FlowStepLogList.jsx
@@ -0,0 +1,164 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import FlowStepLogCreate from "./FlowStepLogCreate";
+import FlowStepLogPanel from "./FlowStepLogPanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="flowInstanceId" label="table.field.flowStepLog.flowInstanceId" />,
+    <NumberInput source="stepInstanceId" label="table.field.flowStepLog.stepInstanceId" />,
+    <TextInput source="logType" label="table.field.flowStepLog.logType" />,
+    <TextInput source="logLevel" label="table.field.flowStepLog.logLevel" />,
+    <TextInput source="logContent" label="table.field.flowStepLog.logContent" />,
+    <TextInput source="requestData" label="table.field.flowStepLog.requestData" />,
+    <TextInput source="responseData" label="table.field.flowStepLog.responseData" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const FlowStepLogList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.flowStepLog"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='flowStepLog' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='flowStepLog'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <FlowStepLogPanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="flowInstanceId" label="table.field.flowStepLog.flowInstanceId" />
+                    <NumberField source="stepInstanceId" label="table.field.flowStepLog.stepInstanceId" />
+                    <TextField source="logType" label="table.field.flowStepLog.logType" />
+                    <TextField source="logLevel" label="table.field.flowStepLog.logLevel" />
+                    <TextField source="logContent" label="table.field.flowStepLog.logContent" />
+                    <TextField source="requestData" label="table.field.flowStepLog.requestData" />
+                    <TextField source="responseData" label="table.field.flowStepLog.responseData" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <FlowStepLogCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='FlowStepLog Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default FlowStepLogList;
diff --git a/rsf-admin/src/page/flowStepLog/FlowStepLogPanel.jsx b/rsf-admin/src/page/flowStepLog/FlowStepLogPanel.jsx
new file mode 100644
index 0000000..d9ff88a
--- /dev/null
+++ b/rsf-admin/src/page/flowStepLog/FlowStepLogPanel.jsx
@@ -0,0 +1,93 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const FlowStepLogPanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.flowStepLog.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.flowInstanceId" 
+                                property={record.flowInstanceId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.stepInstanceId" 
+                                property={record.stepInstanceId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.logType" 
+                                property={record.logType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.logLevel" 
+                                property={record.logLevel}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.logContent" 
+                                property={record.logContent}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.requestData" 
+                                property={record.requestData}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepLog.responseData" 
+                                property={record.responseData}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default FlowStepLogPanel;
diff --git a/rsf-admin/src/page/flowStepLog/index.jsx b/rsf-admin/src/page/flowStepLog/index.jsx
new file mode 100644
index 0000000..02790bf
--- /dev/null
+++ b/rsf-admin/src/page/flowStepLog/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import FlowStepLogList from "./FlowStepLogList";
+import FlowStepLogEdit from "./FlowStepLogEdit";
+
+export default {
+    list: FlowStepLogList,
+    edit: FlowStepLogEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateCreate.jsx b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateCreate.jsx
new file mode 100644
index 0000000..9fce71b
--- /dev/null
+++ b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateCreate.jsx
@@ -0,0 +1,219 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const FlowStepTemplateCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepTemplate.flowId"
+                                        source="flowId"
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.flowCode"
+                                        source="flowCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepTemplate.stepOrder"
+                                        source="stepOrder"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.stepCode"
+                                        source="stepCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.stepName"
+                                        source="stepName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.stepType"
+                                        source="stepType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.actionType"
+                                        source="actionType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.actionConfig"
+                                        source="actionConfig"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.inputMapping"
+                                        source="inputMapping"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.outputMapping"
+                                        source="outputMapping"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.conditionExpression"
+                                        source="conditionExpression"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepTemplate.skipOnFail"
+                                        source="skipOnFail"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepTemplate.retryEnabled"
+                                        source="retryEnabled"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.flowStepTemplate.retryConfig"
+                                        source="retryConfig"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.flowStepTemplate.timeoutSeconds"
+                                        source="timeoutSeconds"
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default FlowStepTemplateCreate;
diff --git a/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateEdit.jsx b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateEdit.jsx
new file mode 100644
index 0000000..9a4eae9
--- /dev/null
+++ b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateEdit.jsx
@@ -0,0 +1,191 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const FlowStepTemplateEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepTemplate.flowId"
+                                source="flowId"
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.flowCode"
+                                source="flowCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepTemplate.stepOrder"
+                                source="stepOrder"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.stepCode"
+                                source="stepCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.stepName"
+                                source="stepName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.stepType"
+                                source="stepType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.actionType"
+                                source="actionType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.actionConfig"
+                                source="actionConfig"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.inputMapping"
+                                source="inputMapping"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.outputMapping"
+                                source="outputMapping"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.conditionExpression"
+                                source="conditionExpression"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepTemplate.skipOnFail"
+                                source="skipOnFail"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepTemplate.retryEnabled"
+                                source="retryEnabled"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.flowStepTemplate.retryConfig"
+                                source="retryConfig"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.flowStepTemplate.timeoutSeconds"
+                                source="timeoutSeconds"
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default FlowStepTemplateEdit;
diff --git a/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateList.jsx b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateList.jsx
new file mode 100644
index 0000000..c02e91f
--- /dev/null
+++ b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplateList.jsx
@@ -0,0 +1,180 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import FlowStepTemplateCreate from "./FlowStepTemplateCreate";
+import FlowStepTemplatePanel from "./FlowStepTemplatePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="flowId" label="table.field.flowStepTemplate.flowId" />,
+    <TextInput source="flowCode" label="table.field.flowStepTemplate.flowCode" />,
+    <NumberInput source="stepOrder" label="table.field.flowStepTemplate.stepOrder" />,
+    <TextInput source="stepCode" label="table.field.flowStepTemplate.stepCode" />,
+    <TextInput source="stepName" label="table.field.flowStepTemplate.stepName" />,
+    <TextInput source="stepType" label="table.field.flowStepTemplate.stepType" />,
+    <TextInput source="actionType" label="table.field.flowStepTemplate.actionType" />,
+    <TextInput source="actionConfig" label="table.field.flowStepTemplate.actionConfig" />,
+    <TextInput source="inputMapping" label="table.field.flowStepTemplate.inputMapping" />,
+    <TextInput source="outputMapping" label="table.field.flowStepTemplate.outputMapping" />,
+    <TextInput source="conditionExpression" label="table.field.flowStepTemplate.conditionExpression" />,
+    <NumberInput source="skipOnFail" label="table.field.flowStepTemplate.skipOnFail" />,
+    <NumberInput source="retryEnabled" label="table.field.flowStepTemplate.retryEnabled" />,
+    <TextInput source="retryConfig" label="table.field.flowStepTemplate.retryConfig" />,
+    <NumberInput source="timeoutSeconds" label="table.field.flowStepTemplate.timeoutSeconds" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const FlowStepTemplateList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.flowStepTemplate"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='flowStepTemplate' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='flowStepTemplate'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <FlowStepTemplatePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="flowId" label="table.field.flowStepTemplate.flowId" />
+                    <TextField source="flowCode" label="table.field.flowStepTemplate.flowCode" />
+                    <NumberField source="stepOrder" label="table.field.flowStepTemplate.stepOrder" />
+                    <TextField source="stepCode" label="table.field.flowStepTemplate.stepCode" />
+                    <TextField source="stepName" label="table.field.flowStepTemplate.stepName" />
+                    <TextField source="stepType" label="table.field.flowStepTemplate.stepType" />
+                    <TextField source="actionType" label="table.field.flowStepTemplate.actionType" />
+                    <TextField source="actionConfig" label="table.field.flowStepTemplate.actionConfig" />
+                    <TextField source="inputMapping" label="table.field.flowStepTemplate.inputMapping" />
+                    <TextField source="outputMapping" label="table.field.flowStepTemplate.outputMapping" />
+                    <TextField source="conditionExpression" label="table.field.flowStepTemplate.conditionExpression" />
+                    <NumberField source="skipOnFail" label="table.field.flowStepTemplate.skipOnFail" />
+                    <NumberField source="retryEnabled" label="table.field.flowStepTemplate.retryEnabled" />
+                    <TextField source="retryConfig" label="table.field.flowStepTemplate.retryConfig" />
+                    <NumberField source="timeoutSeconds" label="table.field.flowStepTemplate.timeoutSeconds" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <FlowStepTemplateCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='FlowStepTemplate Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default FlowStepTemplateList;
diff --git a/rsf-admin/src/page/flowStepTemplate/FlowStepTemplatePanel.jsx b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplatePanel.jsx
new file mode 100644
index 0000000..337de44
--- /dev/null
+++ b/rsf-admin/src/page/flowStepTemplate/FlowStepTemplatePanel.jsx
@@ -0,0 +1,141 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const FlowStepTemplatePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.flowStepTemplate.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.flowId" 
+                                property={record.flowId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.flowCode" 
+                                property={record.flowCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.stepOrder" 
+                                property={record.stepOrder}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.stepCode" 
+                                property={record.stepCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.stepName" 
+                                property={record.stepName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.stepType" 
+                                property={record.stepType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.actionType" 
+                                property={record.actionType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.actionConfig" 
+                                property={record.actionConfig}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.inputMapping" 
+                                property={record.inputMapping}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.outputMapping" 
+                                property={record.outputMapping}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.conditionExpression" 
+                                property={record.conditionExpression}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.skipOnFail" 
+                                property={record.skipOnFail}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.retryEnabled" 
+                                property={record.retryEnabled}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.retryConfig" 
+                                property={record.retryConfig}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.flowStepTemplate.timeoutSeconds" 
+                                property={record.timeoutSeconds}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default FlowStepTemplatePanel;
diff --git a/rsf-admin/src/page/flowStepTemplate/index.jsx b/rsf-admin/src/page/flowStepTemplate/index.jsx
new file mode 100644
index 0000000..b07ab60
--- /dev/null
+++ b/rsf-admin/src/page/flowStepTemplate/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import FlowStepTemplateList from "./FlowStepTemplateList";
+import FlowStepTemplateEdit from "./FlowStepTemplateEdit";
+
+export default {
+    list: FlowStepTemplateList,
+    edit: FlowStepTemplateEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateCreate.jsx b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateCreate.jsx
new file mode 100644
index 0000000..b60647b
--- /dev/null
+++ b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateCreate.jsx
@@ -0,0 +1,210 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const SubsystemFlowTemplateCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.flowCode"
+                                        source="flowCode"
+                                        parse={v => v}
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.flowName"
+                                        source="flowName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.systemCode"
+                                        source="systemCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.systemName"
+                                        source="systemName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.nodeType"
+                                        source="nodeType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.subsystemFlowTemplate.version"
+                                        source="version"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.subsystemFlowTemplate.isCurrent"
+                                        source="isCurrent"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.subsystemFlowTemplate.effectiveTime"
+                                        source="effectiveTime"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.timeoutStrategy"
+                                        source="timeoutStrategy"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.subsystemFlowTemplate.timeoutSeconds"
+                                        source="timeoutSeconds"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.subsystemFlowTemplate.maxRetryTimes"
+                                        source="maxRetryTimes"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.subsystemFlowTemplate.needNotify"
+                                        source="needNotify"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.notifyTemplate"
+                                        source="notifyTemplate"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.subsystemFlowTemplate.remark"
+                                        source="remark"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default SubsystemFlowTemplateCreate;
diff --git a/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateEdit.jsx b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateEdit.jsx
new file mode 100644
index 0000000..240858e
--- /dev/null
+++ b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateEdit.jsx
@@ -0,0 +1,182 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const SubsystemFlowTemplateEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.flowCode"
+                                source="flowCode"
+                                parse={v => v}
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.flowName"
+                                source="flowName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.systemCode"
+                                source="systemCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.systemName"
+                                source="systemName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.nodeType"
+                                source="nodeType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.subsystemFlowTemplate.version"
+                                source="version"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.subsystemFlowTemplate.isCurrent"
+                                source="isCurrent"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.subsystemFlowTemplate.effectiveTime"
+                                source="effectiveTime"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.timeoutStrategy"
+                                source="timeoutStrategy"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.subsystemFlowTemplate.timeoutSeconds"
+                                source="timeoutSeconds"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.subsystemFlowTemplate.maxRetryTimes"
+                                source="maxRetryTimes"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.subsystemFlowTemplate.needNotify"
+                                source="needNotify"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.notifyTemplate"
+                                source="notifyTemplate"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.subsystemFlowTemplate.remark"
+                                source="remark"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default SubsystemFlowTemplateEdit;
diff --git a/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateList.jsx b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateList.jsx
new file mode 100644
index 0000000..756dc65
--- /dev/null
+++ b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplateList.jsx
@@ -0,0 +1,178 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import SubsystemFlowTemplateCreate from "./SubsystemFlowTemplateCreate";
+import SubsystemFlowTemplatePanel from "./SubsystemFlowTemplatePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <TextInput source="flowCode" label="table.field.subsystemFlowTemplate.flowCode" />,
+    <TextInput source="flowName" label="table.field.subsystemFlowTemplate.flowName" />,
+    <TextInput source="systemCode" label="table.field.subsystemFlowTemplate.systemCode" />,
+    <TextInput source="systemName" label="table.field.subsystemFlowTemplate.systemName" />,
+    <TextInput source="nodeType" label="table.field.subsystemFlowTemplate.nodeType" />,
+    <NumberInput source="version" label="table.field.subsystemFlowTemplate.version" />,
+    <NumberInput source="isCurrent" label="table.field.subsystemFlowTemplate.isCurrent" />,
+    <DateInput source="effectiveTime" label="table.field.subsystemFlowTemplate.effectiveTime" />,
+    <TextInput source="timeoutStrategy" label="table.field.subsystemFlowTemplate.timeoutStrategy" />,
+    <NumberInput source="timeoutSeconds" label="table.field.subsystemFlowTemplate.timeoutSeconds" />,
+    <NumberInput source="maxRetryTimes" label="table.field.subsystemFlowTemplate.maxRetryTimes" />,
+    <NumberInput source="needNotify" label="table.field.subsystemFlowTemplate.needNotify" />,
+    <TextInput source="notifyTemplate" label="table.field.subsystemFlowTemplate.notifyTemplate" />,
+    <TextInput source="remark" label="table.field.subsystemFlowTemplate.remark" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const SubsystemFlowTemplateList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.subsystemFlowTemplate"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='subsystemFlowTemplate' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='subsystemFlowTemplate'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <SubsystemFlowTemplatePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <TextField source="flowCode" label="table.field.subsystemFlowTemplate.flowCode" />
+                    <TextField source="flowName" label="table.field.subsystemFlowTemplate.flowName" />
+                    <TextField source="systemCode" label="table.field.subsystemFlowTemplate.systemCode" />
+                    <TextField source="systemName" label="table.field.subsystemFlowTemplate.systemName" />
+                    <TextField source="nodeType" label="table.field.subsystemFlowTemplate.nodeType" />
+                    <NumberField source="version" label="table.field.subsystemFlowTemplate.version" />
+                    <NumberField source="isCurrent" label="table.field.subsystemFlowTemplate.isCurrent" />
+                    <DateField source="effectiveTime" label="table.field.subsystemFlowTemplate.effectiveTime" showTime />
+                    <TextField source="timeoutStrategy" label="table.field.subsystemFlowTemplate.timeoutStrategy" />
+                    <NumberField source="timeoutSeconds" label="table.field.subsystemFlowTemplate.timeoutSeconds" />
+                    <NumberField source="maxRetryTimes" label="table.field.subsystemFlowTemplate.maxRetryTimes" />
+                    <NumberField source="needNotify" label="table.field.subsystemFlowTemplate.needNotify" />
+                    <TextField source="notifyTemplate" label="table.field.subsystemFlowTemplate.notifyTemplate" />
+                    <TextField source="remark" label="table.field.subsystemFlowTemplate.remark" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <SubsystemFlowTemplateCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='SubsystemFlowTemplate Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default SubsystemFlowTemplateList;
diff --git a/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplatePanel.jsx b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplatePanel.jsx
new file mode 100644
index 0000000..c099311
--- /dev/null
+++ b/rsf-admin/src/page/subsystemFlowTemplate/SubsystemFlowTemplatePanel.jsx
@@ -0,0 +1,135 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const SubsystemFlowTemplatePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.subsystemFlowTemplate.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.flowCode" 
+                                property={record.flowCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.flowName" 
+                                property={record.flowName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.systemCode" 
+                                property={record.systemCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.systemName" 
+                                property={record.systemName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.nodeType" 
+                                property={record.nodeType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.version" 
+                                property={record.version}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.isCurrent" 
+                                property={record.isCurrent}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.effectiveTime" 
+                                property={record.effectiveTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.timeoutStrategy" 
+                                property={record.timeoutStrategy}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.timeoutSeconds" 
+                                property={record.timeoutSeconds}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.maxRetryTimes" 
+                                property={record.maxRetryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.needNotify" 
+                                property={record.needNotify}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.notifyTemplate" 
+                                property={record.notifyTemplate}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.subsystemFlowTemplate.remark" 
+                                property={record.remark}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default SubsystemFlowTemplatePanel;
diff --git a/rsf-admin/src/page/subsystemFlowTemplate/index.jsx b/rsf-admin/src/page/subsystemFlowTemplate/index.jsx
new file mode 100644
index 0000000..5529d2d
--- /dev/null
+++ b/rsf-admin/src/page/subsystemFlowTemplate/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import SubsystemFlowTemplateList from "./SubsystemFlowTemplateList";
+import SubsystemFlowTemplateEdit from "./SubsystemFlowTemplateEdit";
+
+export default {
+    list: SubsystemFlowTemplateList,
+    edit: SubsystemFlowTemplateEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/taskInstance/TaskInstanceCreate.jsx b/rsf-admin/src/page/taskInstance/TaskInstanceCreate.jsx
new file mode 100644
index 0000000..6f6786c
--- /dev/null
+++ b/rsf-admin/src/page/taskInstance/TaskInstanceCreate.jsx
@@ -0,0 +1,321 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskInstanceCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.taskNo"
+                                        source="taskNo"
+                                        parse={v => v}
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.bizNo"
+                                        source="bizNo"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.bizType"
+                                        source="bizType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.templateId"
+                                        source="templateId"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.templateCode"
+                                        source="templateCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.templateVersion"
+                                        source="templateVersion"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.sourceInfo"
+                                        source="sourceInfo"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.targetInfo"
+                                        source="targetInfo"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.sourceCode"
+                                        source="sourceCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.targetCode"
+                                        source="targetCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.plannedPath"
+                                        source="plannedPath"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.actualPath"
+                                        source="actualPath"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.priority"
+                                        source="priority"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstance.timeoutAt"
+                                        source="timeoutAt"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.currentNodeCode"
+                                        source="currentNodeCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.currentNodeName"
+                                        source="currentNodeName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.totalNodes"
+                                        source="totalNodes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.completedNodes"
+                                        source="completedNodes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.progressRate"
+                                        source="progressRate"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.estimatedDurationMinutes"
+                                        source="estimatedDurationMinutes"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.actualDurationMinutes"
+                                        source="actualDurationMinutes"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstance.startTime"
+                                        source="startTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstance.endTime"
+                                        source="endTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.resultCode"
+                                        source="resultCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.resultMessage"
+                                        source="resultMessage"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.resultData"
+                                        source="resultData"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstance.retryTimes"
+                                        source="retryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstance.lastRetryTime"
+                                        source="lastRetryTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.extParams"
+                                        source="extParams"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstance.remark"
+                                        source="remark"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskInstanceCreate;
diff --git a/rsf-admin/src/page/taskInstance/TaskInstanceEdit.jsx b/rsf-admin/src/page/taskInstance/TaskInstanceEdit.jsx
new file mode 100644
index 0000000..5cf629c
--- /dev/null
+++ b/rsf-admin/src/page/taskInstance/TaskInstanceEdit.jsx
@@ -0,0 +1,293 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const TaskInstanceEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.taskNo"
+                                source="taskNo"
+                                parse={v => v}
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.bizNo"
+                                source="bizNo"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.bizType"
+                                source="bizType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.templateId"
+                                source="templateId"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.templateCode"
+                                source="templateCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.templateVersion"
+                                source="templateVersion"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.sourceInfo"
+                                source="sourceInfo"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.targetInfo"
+                                source="targetInfo"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.sourceCode"
+                                source="sourceCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.targetCode"
+                                source="targetCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.plannedPath"
+                                source="plannedPath"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.actualPath"
+                                source="actualPath"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.priority"
+                                source="priority"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstance.timeoutAt"
+                                source="timeoutAt"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.currentNodeCode"
+                                source="currentNodeCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.currentNodeName"
+                                source="currentNodeName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.totalNodes"
+                                source="totalNodes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.completedNodes"
+                                source="completedNodes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.progressRate"
+                                source="progressRate"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.estimatedDurationMinutes"
+                                source="estimatedDurationMinutes"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.actualDurationMinutes"
+                                source="actualDurationMinutes"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstance.startTime"
+                                source="startTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstance.endTime"
+                                source="endTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.resultCode"
+                                source="resultCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.resultMessage"
+                                source="resultMessage"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.resultData"
+                                source="resultData"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstance.retryTimes"
+                                source="retryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstance.lastRetryTime"
+                                source="lastRetryTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.extParams"
+                                source="extParams"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstance.remark"
+                                source="remark"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default TaskInstanceEdit;
diff --git a/rsf-admin/src/page/taskInstance/TaskInstanceList.jsx b/rsf-admin/src/page/taskInstance/TaskInstanceList.jsx
new file mode 100644
index 0000000..dadec96
--- /dev/null
+++ b/rsf-admin/src/page/taskInstance/TaskInstanceList.jsx
@@ -0,0 +1,210 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskInstanceCreate from "./TaskInstanceCreate";
+import TaskInstancePanel from "./TaskInstancePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <TextInput source="taskNo" label="table.field.taskInstance.taskNo" />,
+    <TextInput source="bizNo" label="table.field.taskInstance.bizNo" />,
+    <TextInput source="bizType" label="table.field.taskInstance.bizType" />,
+    <NumberInput source="templateId" label="table.field.taskInstance.templateId" />,
+    <TextInput source="templateCode" label="table.field.taskInstance.templateCode" />,
+    <NumberInput source="templateVersion" label="table.field.taskInstance.templateVersion" />,
+    <TextInput source="sourceInfo" label="table.field.taskInstance.sourceInfo" />,
+    <TextInput source="targetInfo" label="table.field.taskInstance.targetInfo" />,
+    <TextInput source="sourceCode" label="table.field.taskInstance.sourceCode" />,
+    <TextInput source="targetCode" label="table.field.taskInstance.targetCode" />,
+    <TextInput source="plannedPath" label="table.field.taskInstance.plannedPath" />,
+    <TextInput source="actualPath" label="table.field.taskInstance.actualPath" />,
+    <NumberInput source="priority" label="table.field.taskInstance.priority" />,
+    <DateInput source="timeoutAt" label="table.field.taskInstance.timeoutAt" />,
+    <TextInput source="currentNodeCode" label="table.field.taskInstance.currentNodeCode" />,
+    <TextInput source="currentNodeName" label="table.field.taskInstance.currentNodeName" />,
+    <NumberInput source="totalNodes" label="table.field.taskInstance.totalNodes" />,
+    <NumberInput source="completedNodes" label="table.field.taskInstance.completedNodes" />,
+    <NumberInput source="progressRate" label="table.field.taskInstance.progressRate" />,
+    <NumberInput source="estimatedDurationMinutes" label="table.field.taskInstance.estimatedDurationMinutes" />,
+    <NumberInput source="actualDurationMinutes" label="table.field.taskInstance.actualDurationMinutes" />,
+    <DateInput source="startTime" label="table.field.taskInstance.startTime" />,
+    <DateInput source="endTime" label="table.field.taskInstance.endTime" />,
+    <TextInput source="resultCode" label="table.field.taskInstance.resultCode" />,
+    <TextInput source="resultMessage" label="table.field.taskInstance.resultMessage" />,
+    <TextInput source="resultData" label="table.field.taskInstance.resultData" />,
+    <NumberInput source="retryTimes" label="table.field.taskInstance.retryTimes" />,
+    <DateInput source="lastRetryTime" label="table.field.taskInstance.lastRetryTime" />,
+    <TextInput source="extParams" label="table.field.taskInstance.extParams" />,
+    <TextInput source="remark" label="table.field.taskInstance.remark" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskInstanceList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskInstance"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='taskInstance' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskInstance'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <TaskInstancePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <TextField source="taskNo" label="table.field.taskInstance.taskNo" />
+                    <TextField source="bizNo" label="table.field.taskInstance.bizNo" />
+                    <TextField source="bizType" label="table.field.taskInstance.bizType" />
+                    <NumberField source="templateId" label="table.field.taskInstance.templateId" />
+                    <TextField source="templateCode" label="table.field.taskInstance.templateCode" />
+                    <NumberField source="templateVersion" label="table.field.taskInstance.templateVersion" />
+                    <TextField source="sourceInfo" label="table.field.taskInstance.sourceInfo" />
+                    <TextField source="targetInfo" label="table.field.taskInstance.targetInfo" />
+                    <TextField source="sourceCode" label="table.field.taskInstance.sourceCode" />
+                    <TextField source="targetCode" label="table.field.taskInstance.targetCode" />
+                    <TextField source="plannedPath" label="table.field.taskInstance.plannedPath" />
+                    <TextField source="actualPath" label="table.field.taskInstance.actualPath" />
+                    <NumberField source="priority" label="table.field.taskInstance.priority" />
+                    <DateField source="timeoutAt" label="table.field.taskInstance.timeoutAt" showTime />
+                    <TextField source="currentNodeCode" label="table.field.taskInstance.currentNodeCode" />
+                    <TextField source="currentNodeName" label="table.field.taskInstance.currentNodeName" />
+                    <NumberField source="totalNodes" label="table.field.taskInstance.totalNodes" />
+                    <NumberField source="completedNodes" label="table.field.taskInstance.completedNodes" />
+                    <NumberField source="progressRate" label="table.field.taskInstance.progressRate" />
+                    <NumberField source="estimatedDurationMinutes" label="table.field.taskInstance.estimatedDurationMinutes" />
+                    <NumberField source="actualDurationMinutes" label="table.field.taskInstance.actualDurationMinutes" />
+                    <DateField source="startTime" label="table.field.taskInstance.startTime" showTime />
+                    <DateField source="endTime" label="table.field.taskInstance.endTime" showTime />
+                    <TextField source="resultCode" label="table.field.taskInstance.resultCode" />
+                    <TextField source="resultMessage" label="table.field.taskInstance.resultMessage" />
+                    <TextField source="resultData" label="table.field.taskInstance.resultData" />
+                    <NumberField source="retryTimes" label="table.field.taskInstance.retryTimes" />
+                    <DateField source="lastRetryTime" label="table.field.taskInstance.lastRetryTime" showTime />
+                    <TextField source="extParams" label="table.field.taskInstance.extParams" />
+                    <TextField source="remark" label="table.field.taskInstance.remark" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <TaskInstanceCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='TaskInstance Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskInstanceList;
diff --git a/rsf-admin/src/page/taskInstance/TaskInstancePanel.jsx b/rsf-admin/src/page/taskInstance/TaskInstancePanel.jsx
new file mode 100644
index 0000000..69aa078
--- /dev/null
+++ b/rsf-admin/src/page/taskInstance/TaskInstancePanel.jsx
@@ -0,0 +1,231 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const TaskInstancePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.taskInstance.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.taskNo" 
+                                property={record.taskNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.bizNo" 
+                                property={record.bizNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.bizType" 
+                                property={record.bizType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.templateId" 
+                                property={record.templateId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.templateCode" 
+                                property={record.templateCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.templateVersion" 
+                                property={record.templateVersion}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.sourceInfo" 
+                                property={record.sourceInfo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.targetInfo" 
+                                property={record.targetInfo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.sourceCode" 
+                                property={record.sourceCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.targetCode" 
+                                property={record.targetCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.plannedPath" 
+                                property={record.plannedPath}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.actualPath" 
+                                property={record.actualPath}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.priority" 
+                                property={record.priority}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.timeoutAt" 
+                                property={record.timeoutAt$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.currentNodeCode" 
+                                property={record.currentNodeCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.currentNodeName" 
+                                property={record.currentNodeName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.totalNodes" 
+                                property={record.totalNodes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.completedNodes" 
+                                property={record.completedNodes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.progressRate" 
+                                property={record.progressRate}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.estimatedDurationMinutes" 
+                                property={record.estimatedDurationMinutes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.actualDurationMinutes" 
+                                property={record.actualDurationMinutes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.startTime" 
+                                property={record.startTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.endTime" 
+                                property={record.endTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.resultCode" 
+                                property={record.resultCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.resultMessage" 
+                                property={record.resultMessage}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.resultData" 
+                                property={record.resultData}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.retryTimes" 
+                                property={record.retryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.lastRetryTime" 
+                                property={record.lastRetryTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.extParams" 
+                                property={record.extParams}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstance.remark" 
+                                property={record.remark}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskInstancePanel;
diff --git a/rsf-admin/src/page/taskInstance/index.jsx b/rsf-admin/src/page/taskInstance/index.jsx
new file mode 100644
index 0000000..b5e4b55
--- /dev/null
+++ b/rsf-admin/src/page/taskInstance/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskInstanceList from "./TaskInstanceList";
+import TaskInstanceEdit from "./TaskInstanceEdit";
+
+export default {
+    list: TaskInstanceList,
+    edit: TaskInstanceEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeCreate.jsx b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeCreate.jsx
new file mode 100644
index 0000000..2a40a91
--- /dev/null
+++ b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeCreate.jsx
@@ -0,0 +1,251 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskInstanceNodeCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstanceNode.taskId"
+                                        source="taskId"
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.taskNo"
+                                        source="taskNo"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstanceNode.nodeOrder"
+                                        source="nodeOrder"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.nodeCode"
+                                        source="nodeCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.nodeName"
+                                        source="nodeName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.nodeType"
+                                        source="nodeType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.systemCode"
+                                        source="systemCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.systemName"
+                                        source="systemName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.executeParams"
+                                        source="executeParams"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.executeResult"
+                                        source="executeResult"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.errorCode"
+                                        source="errorCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.errorMessage"
+                                        source="errorMessage"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstanceNode.estimatedStartTime"
+                                        source="estimatedStartTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstanceNode.actualStartTime"
+                                        source="actualStartTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstanceNode.actualEndTime"
+                                        source="actualEndTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskInstanceNode.timeoutAt"
+                                        source="timeoutAt"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstanceNode.durationSeconds"
+                                        source="durationSeconds"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstanceNode.retryTimes"
+                                        source="retryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskInstanceNode.maxRetryTimes"
+                                        source="maxRetryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskInstanceNode.dependsOnNodes"
+                                        source="dependsOnNodes"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskInstanceNodeCreate;
diff --git a/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeEdit.jsx b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeEdit.jsx
new file mode 100644
index 0000000..e059465
--- /dev/null
+++ b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeEdit.jsx
@@ -0,0 +1,223 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const TaskInstanceNodeEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstanceNode.taskId"
+                                source="taskId"
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.taskNo"
+                                source="taskNo"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstanceNode.nodeOrder"
+                                source="nodeOrder"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.nodeCode"
+                                source="nodeCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.nodeName"
+                                source="nodeName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.nodeType"
+                                source="nodeType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.systemCode"
+                                source="systemCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.systemName"
+                                source="systemName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.executeParams"
+                                source="executeParams"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.executeResult"
+                                source="executeResult"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.errorCode"
+                                source="errorCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.errorMessage"
+                                source="errorMessage"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstanceNode.estimatedStartTime"
+                                source="estimatedStartTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstanceNode.actualStartTime"
+                                source="actualStartTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstanceNode.actualEndTime"
+                                source="actualEndTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskInstanceNode.timeoutAt"
+                                source="timeoutAt"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstanceNode.durationSeconds"
+                                source="durationSeconds"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstanceNode.retryTimes"
+                                source="retryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskInstanceNode.maxRetryTimes"
+                                source="maxRetryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskInstanceNode.dependsOnNodes"
+                                source="dependsOnNodes"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default TaskInstanceNodeEdit;
diff --git a/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeList.jsx b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeList.jsx
new file mode 100644
index 0000000..fd874f8
--- /dev/null
+++ b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodeList.jsx
@@ -0,0 +1,190 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskInstanceNodeCreate from "./TaskInstanceNodeCreate";
+import TaskInstanceNodePanel from "./TaskInstanceNodePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="taskId" label="table.field.taskInstanceNode.taskId" />,
+    <TextInput source="taskNo" label="table.field.taskInstanceNode.taskNo" />,
+    <NumberInput source="nodeOrder" label="table.field.taskInstanceNode.nodeOrder" />,
+    <TextInput source="nodeCode" label="table.field.taskInstanceNode.nodeCode" />,
+    <TextInput source="nodeName" label="table.field.taskInstanceNode.nodeName" />,
+    <TextInput source="nodeType" label="table.field.taskInstanceNode.nodeType" />,
+    <TextInput source="systemCode" label="table.field.taskInstanceNode.systemCode" />,
+    <TextInput source="systemName" label="table.field.taskInstanceNode.systemName" />,
+    <TextInput source="executeParams" label="table.field.taskInstanceNode.executeParams" />,
+    <TextInput source="executeResult" label="table.field.taskInstanceNode.executeResult" />,
+    <TextInput source="errorCode" label="table.field.taskInstanceNode.errorCode" />,
+    <TextInput source="errorMessage" label="table.field.taskInstanceNode.errorMessage" />,
+    <DateInput source="estimatedStartTime" label="table.field.taskInstanceNode.estimatedStartTime" />,
+    <DateInput source="actualStartTime" label="table.field.taskInstanceNode.actualStartTime" />,
+    <DateInput source="actualEndTime" label="table.field.taskInstanceNode.actualEndTime" />,
+    <DateInput source="timeoutAt" label="table.field.taskInstanceNode.timeoutAt" />,
+    <NumberInput source="durationSeconds" label="table.field.taskInstanceNode.durationSeconds" />,
+    <NumberInput source="retryTimes" label="table.field.taskInstanceNode.retryTimes" />,
+    <NumberInput source="maxRetryTimes" label="table.field.taskInstanceNode.maxRetryTimes" />,
+    <TextInput source="dependsOnNodes" label="table.field.taskInstanceNode.dependsOnNodes" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskInstanceNodeList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskInstanceNode"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='taskInstanceNode' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskInstanceNode'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <TaskInstanceNodePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="taskId" label="table.field.taskInstanceNode.taskId" />
+                    <TextField source="taskNo" label="table.field.taskInstanceNode.taskNo" />
+                    <NumberField source="nodeOrder" label="table.field.taskInstanceNode.nodeOrder" />
+                    <TextField source="nodeCode" label="table.field.taskInstanceNode.nodeCode" />
+                    <TextField source="nodeName" label="table.field.taskInstanceNode.nodeName" />
+                    <TextField source="nodeType" label="table.field.taskInstanceNode.nodeType" />
+                    <TextField source="systemCode" label="table.field.taskInstanceNode.systemCode" />
+                    <TextField source="systemName" label="table.field.taskInstanceNode.systemName" />
+                    <TextField source="executeParams" label="table.field.taskInstanceNode.executeParams" />
+                    <TextField source="executeResult" label="table.field.taskInstanceNode.executeResult" />
+                    <TextField source="errorCode" label="table.field.taskInstanceNode.errorCode" />
+                    <TextField source="errorMessage" label="table.field.taskInstanceNode.errorMessage" />
+                    <DateField source="estimatedStartTime" label="table.field.taskInstanceNode.estimatedStartTime" showTime />
+                    <DateField source="actualStartTime" label="table.field.taskInstanceNode.actualStartTime" showTime />
+                    <DateField source="actualEndTime" label="table.field.taskInstanceNode.actualEndTime" showTime />
+                    <DateField source="timeoutAt" label="table.field.taskInstanceNode.timeoutAt" showTime />
+                    <NumberField source="durationSeconds" label="table.field.taskInstanceNode.durationSeconds" />
+                    <NumberField source="retryTimes" label="table.field.taskInstanceNode.retryTimes" />
+                    <NumberField source="maxRetryTimes" label="table.field.taskInstanceNode.maxRetryTimes" />
+                    <TextField source="dependsOnNodes" label="table.field.taskInstanceNode.dependsOnNodes" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <TaskInstanceNodeCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='TaskInstanceNode Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskInstanceNodeList;
diff --git a/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodePanel.jsx b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodePanel.jsx
new file mode 100644
index 0000000..f47652b
--- /dev/null
+++ b/rsf-admin/src/page/taskInstanceNode/TaskInstanceNodePanel.jsx
@@ -0,0 +1,171 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const TaskInstanceNodePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.taskInstanceNode.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.taskId" 
+                                property={record.taskId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.taskNo" 
+                                property={record.taskNo}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.nodeOrder" 
+                                property={record.nodeOrder}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.nodeCode" 
+                                property={record.nodeCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.nodeName" 
+                                property={record.nodeName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.nodeType" 
+                                property={record.nodeType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.systemCode" 
+                                property={record.systemCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.systemName" 
+                                property={record.systemName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.executeParams" 
+                                property={record.executeParams}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.executeResult" 
+                                property={record.executeResult}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.errorCode" 
+                                property={record.errorCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.errorMessage" 
+                                property={record.errorMessage}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.estimatedStartTime" 
+                                property={record.estimatedStartTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.actualStartTime" 
+                                property={record.actualStartTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.actualEndTime" 
+                                property={record.actualEndTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.timeoutAt" 
+                                property={record.timeoutAt$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.durationSeconds" 
+                                property={record.durationSeconds}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.retryTimes" 
+                                property={record.retryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.maxRetryTimes" 
+                                property={record.maxRetryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskInstanceNode.dependsOnNodes" 
+                                property={record.dependsOnNodes}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskInstanceNodePanel;
diff --git a/rsf-admin/src/page/taskInstanceNode/index.jsx b/rsf-admin/src/page/taskInstanceNode/index.jsx
new file mode 100644
index 0000000..c0e0ffe
--- /dev/null
+++ b/rsf-admin/src/page/taskInstanceNode/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskInstanceNodeList from "./TaskInstanceNodeList";
+import TaskInstanceNodeEdit from "./TaskInstanceNodeEdit";
+
+export default {
+    list: TaskInstanceNodeList,
+    edit: TaskInstanceNodeEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateCreate.jsx b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateCreate.jsx
new file mode 100644
index 0000000..58fa634
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateCreate.jsx
@@ -0,0 +1,244 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskPathTemplateCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.templateCode"
+                                        source="templateCode"
+                                        parse={v => v}
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.templateName"
+                                        source="templateName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.sourceType"
+                                        source="sourceType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.targetType"
+                                        source="targetType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.conditionExpression"
+                                        source="conditionExpression"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.conditionDesc"
+                                        source="conditionDesc"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.version"
+                                        source="version"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.isCurrent"
+                                        source="isCurrent"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskPathTemplate.effectiveTime"
+                                        source="effectiveTime"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskPathTemplate.expireTime"
+                                        source="expireTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.priority"
+                                        source="priority"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.timeoutMinutes"
+                                        source="timeoutMinutes"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.maxRetryTimes"
+                                        source="maxRetryTimes"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplate.retryIntervalSeconds"
+                                        source="retryIntervalSeconds"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.remark"
+                                        source="remark"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.createdBy"
+                                        source="createdBy"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplate.updatedBy"
+                                        source="updatedBy"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskPathTemplate.createdTime"
+                                        source="createdTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskPathTemplate.updatedTime"
+                                        source="updatedTime"
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskPathTemplateCreate;
diff --git a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateEdit.jsx b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateEdit.jsx
new file mode 100644
index 0000000..fedf5d5
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateEdit.jsx
@@ -0,0 +1,216 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const TaskPathTemplateEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.templateCode"
+                                source="templateCode"
+                                parse={v => v}
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.templateName"
+                                source="templateName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.sourceType"
+                                source="sourceType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.targetType"
+                                source="targetType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.conditionExpression"
+                                source="conditionExpression"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.conditionDesc"
+                                source="conditionDesc"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.version"
+                                source="version"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.isCurrent"
+                                source="isCurrent"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskPathTemplate.effectiveTime"
+                                source="effectiveTime"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskPathTemplate.expireTime"
+                                source="expireTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.priority"
+                                source="priority"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.timeoutMinutes"
+                                source="timeoutMinutes"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.maxRetryTimes"
+                                source="maxRetryTimes"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplate.retryIntervalSeconds"
+                                source="retryIntervalSeconds"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.remark"
+                                source="remark"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.createdBy"
+                                source="createdBy"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplate.updatedBy"
+                                source="updatedBy"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskPathTemplate.createdTime"
+                                source="createdTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskPathTemplate.updatedTime"
+                                source="updatedTime"
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default TaskPathTemplateEdit;
diff --git a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx
new file mode 100644
index 0000000..56117a7
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx
@@ -0,0 +1,188 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskPathTemplateCreate from "./TaskPathTemplateCreate";
+import TaskPathTemplatePanel from "./TaskPathTemplatePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <TextInput source="templateCode" label="table.field.taskPathTemplate.templateCode" />,
+    <TextInput source="templateName" label="table.field.taskPathTemplate.templateName" />,
+    <TextInput source="sourceType" label="table.field.taskPathTemplate.sourceType" />,
+    <TextInput source="targetType" label="table.field.taskPathTemplate.targetType" />,
+    <TextInput source="conditionExpression" label="table.field.taskPathTemplate.conditionExpression" />,
+    <TextInput source="conditionDesc" label="table.field.taskPathTemplate.conditionDesc" />,
+    <NumberInput source="version" label="table.field.taskPathTemplate.version" />,
+    <NumberInput source="isCurrent" label="table.field.taskPathTemplate.isCurrent" />,
+    <DateInput source="effectiveTime" label="table.field.taskPathTemplate.effectiveTime" />,
+    <DateInput source="expireTime" label="table.field.taskPathTemplate.expireTime" />,
+    <NumberInput source="priority" label="table.field.taskPathTemplate.priority" />,
+    <NumberInput source="timeoutMinutes" label="table.field.taskPathTemplate.timeoutMinutes" />,
+    <NumberInput source="maxRetryTimes" label="table.field.taskPathTemplate.maxRetryTimes" />,
+    <NumberInput source="retryIntervalSeconds" label="table.field.taskPathTemplate.retryIntervalSeconds" />,
+    <TextInput source="remark" label="table.field.taskPathTemplate.remark" />,
+    <TextInput source="createdBy" label="table.field.taskPathTemplate.createdBy" />,
+    <TextInput source="updatedBy" label="table.field.taskPathTemplate.updatedBy" />,
+    <DateInput source="createdTime" label="table.field.taskPathTemplate.createdTime" />,
+    <DateInput source="updatedTime" label="table.field.taskPathTemplate.updatedTime" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskPathTemplateList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskPathTemplate"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='taskPathTemplate' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskPathTemplate'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <TaskPathTemplatePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <TextField source="templateCode" label="table.field.taskPathTemplate.templateCode" />
+                    <TextField source="templateName" label="table.field.taskPathTemplate.templateName" />
+                    <TextField source="sourceType" label="table.field.taskPathTemplate.sourceType" />
+                    <TextField source="targetType" label="table.field.taskPathTemplate.targetType" />
+                    <TextField source="conditionExpression" label="table.field.taskPathTemplate.conditionExpression" />
+                    <TextField source="conditionDesc" label="table.field.taskPathTemplate.conditionDesc" />
+                    <NumberField source="version" label="table.field.taskPathTemplate.version" />
+                    <NumberField source="isCurrent" label="table.field.taskPathTemplate.isCurrent" />
+                    <DateField source="effectiveTime" label="table.field.taskPathTemplate.effectiveTime" showTime />
+                    <DateField source="expireTime" label="table.field.taskPathTemplate.expireTime" showTime />
+                    <NumberField source="priority" label="table.field.taskPathTemplate.priority" />
+                    <NumberField source="timeoutMinutes" label="table.field.taskPathTemplate.timeoutMinutes" />
+                    <NumberField source="maxRetryTimes" label="table.field.taskPathTemplate.maxRetryTimes" />
+                    <NumberField source="retryIntervalSeconds" label="table.field.taskPathTemplate.retryIntervalSeconds" />
+                    <TextField source="remark" label="table.field.taskPathTemplate.remark" />
+                    <TextField source="createdBy" label="table.field.taskPathTemplate.createdBy" />
+                    <TextField source="updatedBy" label="table.field.taskPathTemplate.updatedBy" />
+                    <DateField source="createdTime" label="table.field.taskPathTemplate.createdTime" showTime />
+                    <DateField source="updatedTime" label="table.field.taskPathTemplate.updatedTime" showTime />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <TaskPathTemplateCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='TaskPathTemplate Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskPathTemplateList;
diff --git a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplatePanel.jsx b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplatePanel.jsx
new file mode 100644
index 0000000..96d9ddc
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplatePanel.jsx
@@ -0,0 +1,165 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const TaskPathTemplatePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.taskPathTemplate.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.templateCode" 
+                                property={record.templateCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.templateName" 
+                                property={record.templateName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.sourceType" 
+                                property={record.sourceType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.targetType" 
+                                property={record.targetType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.conditionExpression" 
+                                property={record.conditionExpression}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.conditionDesc" 
+                                property={record.conditionDesc}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.version" 
+                                property={record.version}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.isCurrent" 
+                                property={record.isCurrent}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.effectiveTime" 
+                                property={record.effectiveTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.expireTime" 
+                                property={record.expireTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.priority" 
+                                property={record.priority}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.timeoutMinutes" 
+                                property={record.timeoutMinutes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.maxRetryTimes" 
+                                property={record.maxRetryTimes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.retryIntervalSeconds" 
+                                property={record.retryIntervalSeconds}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.remark" 
+                                property={record.remark}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.createdBy" 
+                                property={record.createdBy}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.updatedBy" 
+                                property={record.updatedBy}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.createdTime" 
+                                property={record.createdTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplate.updatedTime" 
+                                property={record.updatedTime$}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskPathTemplatePanel;
diff --git a/rsf-admin/src/page/taskPathTemplate/index.jsx b/rsf-admin/src/page/taskPathTemplate/index.jsx
new file mode 100644
index 0000000..7493f53
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplate/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskPathTemplateList from "./TaskPathTemplateList";
+import TaskPathTemplateEdit from "./TaskPathTemplateEdit";
+
+export default {
+    list: TaskPathTemplateList,
+    edit: TaskPathTemplateEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeCreate.jsx b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeCreate.jsx
new file mode 100644
index 0000000..9a29182
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeCreate.jsx
@@ -0,0 +1,226 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskPathTemplateNodeCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplateNode.templateId"
+                                        source="templateId"
+                                        autoFocus
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.templateCode"
+                                        source="templateCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplateNode.nodeOrder"
+                                        source="nodeOrder"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.nodeCode"
+                                        source="nodeCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.nodeName"
+                                        source="nodeName"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.nodeType"
+                                        source="nodeType"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.systemCode"
+                                        source="systemCode"
+                                        parse={v => v}
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.systemName"
+                                        source="systemName"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.executeParams"
+                                        source="executeParams"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.resultSchema"
+                                        source="resultSchema"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplateNode.timeoutMinutes"
+                                        source="timeoutMinutes"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplateNode.mandatory"
+                                        source="mandatory"
+                                        validate={required()}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskPathTemplateNode.parallelExecutable"
+                                        source="parallelExecutable"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.preCondition"
+                                        source="preCondition"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.postCondition"
+                                        source="postCondition"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskPathTemplateNode.nextNodeRules"
+                                        source="nextNodeRules"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskPathTemplateNodeCreate;
diff --git a/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeEdit.jsx b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeEdit.jsx
new file mode 100644
index 0000000..b4a3af5
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeEdit.jsx
@@ -0,0 +1,198 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../components/EditBaseAside";
+import CustomerTopToolBar from "../components/EditTopToolBar";
+import MemoInput from "../components/MemoInput";
+import StatusSelectInput from "../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const TaskPathTemplateNodeEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Edit
+            redirect="list"
+            mutationMode={EDIT_MODE}
+            actions={<CustomerTopToolBar />}
+            aside={<EditBaseAside />}
+        >
+            <SimpleForm
+                shouldUnregister
+                warnWhenUnsavedChanges
+                toolbar={<FormToolbar />}
+                mode="onTouched"
+                defaultValues={{}}
+            // validate={(values) => { }}
+            >
+                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                    <Grid item xs={12} md={8}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.main')}
+                        </Typography>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplateNode.templateId"
+                                source="templateId"
+                                autoFocus
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.templateCode"
+                                source="templateCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplateNode.nodeOrder"
+                                source="nodeOrder"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.nodeCode"
+                                source="nodeCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.nodeName"
+                                source="nodeName"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.nodeType"
+                                source="nodeType"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.systemCode"
+                                source="systemCode"
+                                parse={v => v}
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.systemName"
+                                source="systemName"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.executeParams"
+                                source="executeParams"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.resultSchema"
+                                source="resultSchema"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplateNode.timeoutMinutes"
+                                source="timeoutMinutes"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplateNode.mandatory"
+                                source="mandatory"
+                                validate={required()}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskPathTemplateNode.parallelExecutable"
+                                source="parallelExecutable"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.preCondition"
+                                source="preCondition"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.postCondition"
+                                source="postCondition"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskPathTemplateNode.nextNodeRules"
+                                source="nextNodeRules"
+                                parse={v => v}
+                            />
+                        </Stack>
+
+                    </Grid>
+                    <Grid item xs={12} md={4}>
+                        <Typography variant="h6" gutterBottom>
+                            {translate('common.edit.title.common')}
+                        </Typography>
+                        <StatusSelectInput />
+                        <Box mt="2em" />
+                        <MemoInput />
+                    </Grid>
+                </Grid>
+            </SimpleForm>
+        </Edit >
+    )
+}
+
+export default TaskPathTemplateNodeEdit;
diff --git a/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeList.jsx b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeList.jsx
new file mode 100644
index 0000000..8ca4955
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodeList.jsx
@@ -0,0 +1,182 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskPathTemplateNodeCreate from "./TaskPathTemplateNodeCreate";
+import TaskPathTemplateNodePanel from "./TaskPathTemplateNodePanel";
+import EmptyData from "../components/EmptyData";
+import MyCreateButton from "../components/MyCreateButton";
+import MyExportButton from '../components/MyExportButton';
+import PageDrawer from "../components/PageDrawer";
+import MyField from "../components/MyField";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import * as Common from '@/utils/common';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="templateId" label="table.field.taskPathTemplateNode.templateId" />,
+    <TextInput source="templateCode" label="table.field.taskPathTemplateNode.templateCode" />,
+    <NumberInput source="nodeOrder" label="table.field.taskPathTemplateNode.nodeOrder" />,
+    <TextInput source="nodeCode" label="table.field.taskPathTemplateNode.nodeCode" />,
+    <TextInput source="nodeName" label="table.field.taskPathTemplateNode.nodeName" />,
+    <TextInput source="nodeType" label="table.field.taskPathTemplateNode.nodeType" />,
+    <TextInput source="systemCode" label="table.field.taskPathTemplateNode.systemCode" />,
+    <TextInput source="systemName" label="table.field.taskPathTemplateNode.systemName" />,
+    <TextInput source="executeParams" label="table.field.taskPathTemplateNode.executeParams" />,
+    <TextInput source="resultSchema" label="table.field.taskPathTemplateNode.resultSchema" />,
+    <NumberInput source="timeoutMinutes" label="table.field.taskPathTemplateNode.timeoutMinutes" />,
+    <NumberInput source="mandatory" label="table.field.taskPathTemplateNode.mandatory" />,
+    <NumberInput source="parallelExecutable" label="table.field.taskPathTemplateNode.parallelExecutable" />,
+    <TextInput source="preCondition" label="table.field.taskPathTemplateNode.preCondition" />,
+    <TextInput source="postCondition" label="table.field.taskPathTemplateNode.postCondition" />,
+    <TextInput source="nextNodeRules" label="table.field.taskPathTemplateNode.nextNodeRules" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskPathTemplateNodeList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskPathTemplateNode"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='taskPathTemplateNode' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskPathTemplateNode'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <TaskPathTemplateNodePanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="templateId" label="table.field.taskPathTemplateNode.templateId" />
+                    <TextField source="templateCode" label="table.field.taskPathTemplateNode.templateCode" />
+                    <NumberField source="nodeOrder" label="table.field.taskPathTemplateNode.nodeOrder" />
+                    <TextField source="nodeCode" label="table.field.taskPathTemplateNode.nodeCode" />
+                    <TextField source="nodeName" label="table.field.taskPathTemplateNode.nodeName" />
+                    <TextField source="nodeType" label="table.field.taskPathTemplateNode.nodeType" />
+                    <TextField source="systemCode" label="table.field.taskPathTemplateNode.systemCode" />
+                    <TextField source="systemName" label="table.field.taskPathTemplateNode.systemName" />
+                    <TextField source="executeParams" label="table.field.taskPathTemplateNode.executeParams" />
+                    <TextField source="resultSchema" label="table.field.taskPathTemplateNode.resultSchema" />
+                    <NumberField source="timeoutMinutes" label="table.field.taskPathTemplateNode.timeoutMinutes" />
+                    <NumberField source="mandatory" label="table.field.taskPathTemplateNode.mandatory" />
+                    <NumberField source="parallelExecutable" label="table.field.taskPathTemplateNode.parallelExecutable" />
+                    <TextField source="preCondition" label="table.field.taskPathTemplateNode.preCondition" />
+                    <TextField source="postCondition" label="table.field.taskPathTemplateNode.postCondition" />
+                    <TextField source="nextNodeRules" label="table.field.taskPathTemplateNode.nextNodeRules" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                    <WrapperField cellClassName="opt" label="common.field.opt">
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            <TaskPathTemplateNodeCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='TaskPathTemplateNode Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskPathTemplateNodeList;
diff --git a/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodePanel.jsx b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodePanel.jsx
new file mode 100644
index 0000000..37d4c1e
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplateNode/TaskPathTemplateNodePanel.jsx
@@ -0,0 +1,147 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const TaskPathTemplateNodePanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.taskPathTemplateNode.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.templateId" 
+                                property={record.templateId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.templateCode" 
+                                property={record.templateCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.nodeOrder" 
+                                property={record.nodeOrder}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.nodeCode" 
+                                property={record.nodeCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.nodeName" 
+                                property={record.nodeName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.nodeType" 
+                                property={record.nodeType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.systemCode" 
+                                property={record.systemCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.systemName" 
+                                property={record.systemName}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.executeParams" 
+                                property={record.executeParams}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.resultSchema" 
+                                property={record.resultSchema}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.timeoutMinutes" 
+                                property={record.timeoutMinutes}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.mandatory" 
+                                property={record.mandatory}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.parallelExecutable" 
+                                property={record.parallelExecutable}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.preCondition" 
+                                property={record.preCondition}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.postCondition" 
+                                property={record.postCondition}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskPathTemplateNode.nextNodeRules" 
+                                property={record.nextNodeRules}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskPathTemplateNodePanel;
diff --git a/rsf-admin/src/page/taskPathTemplateNode/index.jsx b/rsf-admin/src/page/taskPathTemplateNode/index.jsx
new file mode 100644
index 0000000..3f82c82
--- /dev/null
+++ b/rsf-admin/src/page/taskPathTemplateNode/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskPathTemplateNodeList from "./TaskPathTemplateNodeList";
+import TaskPathTemplateNodeEdit from "./TaskPathTemplateNodeEdit";
+
+export default {
+    list: TaskPathTemplateNodeList,
+    edit: TaskPathTemplateNodeEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowInstanceController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowInstanceController.java
new file mode 100644
index 0000000..829696d
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowInstanceController.java
@@ -0,0 +1,107 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.FlowInstance;
+import com.vincent.rsf.server.system.service.FlowInstanceService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class FlowInstanceController extends BaseController {
+
+    @Autowired
+    private FlowInstanceService flowInstanceService;
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @PostMapping("/flowInstance/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<FlowInstance, BaseParam> pageParam = new PageParam<>(baseParam, FlowInstance.class);
+        return R.ok().add(flowInstanceService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @PostMapping("/flowInstance/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(flowInstanceService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @PostMapping({"/flowInstance/many/{ids}", "/flowInstances/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(flowInstanceService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @GetMapping("/flowInstance/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(flowInstanceService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:save')")
+    @OperationLog("Create 瀹炰緥鍖栧瓙娴佺▼涓昏〃")
+    @PostMapping("/flowInstance/save")
+    public R save(@RequestBody FlowInstance flowInstance) {
+        flowInstance.setCreateTime(new Date());
+        flowInstance.setUpdateTime(new Date());
+        if (!flowInstanceService.save(flowInstance)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(flowInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:update')")
+    @OperationLog("Update 瀹炰緥鍖栧瓙娴佺▼涓昏〃")
+    @PostMapping("/flowInstance/update")
+    public R update(@RequestBody FlowInstance flowInstance) {
+        flowInstance.setUpdateTime(new Date());
+        if (!flowInstanceService.updateById(flowInstance)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(flowInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:remove')")
+    @OperationLog("Delete 瀹炰緥鍖栧瓙娴佺▼涓昏〃")
+    @PostMapping("/flowInstance/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!flowInstanceService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @PostMapping("/flowInstance/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<FlowInstance> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(FlowInstance::getId, condition);
+        }
+        flowInstanceService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowInstance:list')")
+    @PostMapping("/flowInstance/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(flowInstanceService.list(), FlowInstance.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepInstanceController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepInstanceController.java
new file mode 100644
index 0000000..8f6324c
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepInstanceController.java
@@ -0,0 +1,107 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.FlowStepInstance;
+import com.vincent.rsf.server.system.service.FlowStepInstanceService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class FlowStepInstanceController extends BaseController {
+
+    @Autowired
+    private FlowStepInstanceService flowStepInstanceService;
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @PostMapping("/flowStepInstance/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<FlowStepInstance, BaseParam> pageParam = new PageParam<>(baseParam, FlowStepInstance.class);
+        return R.ok().add(flowStepInstanceService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @PostMapping("/flowStepInstance/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(flowStepInstanceService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @PostMapping({"/flowStepInstance/many/{ids}", "/flowStepInstances/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(flowStepInstanceService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @GetMapping("/flowStepInstance/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(flowStepInstanceService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:save')")
+    @OperationLog("Create 瀛愭祦绋嬫楠ゅ疄渚�")
+    @PostMapping("/flowStepInstance/save")
+    public R save(@RequestBody FlowStepInstance flowStepInstance) {
+        flowStepInstance.setCreateTime(new Date());
+        flowStepInstance.setUpdateTime(new Date());
+        if (!flowStepInstanceService.save(flowStepInstance)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(flowStepInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:update')")
+    @OperationLog("Update 瀛愭祦绋嬫楠ゅ疄渚�")
+    @PostMapping("/flowStepInstance/update")
+    public R update(@RequestBody FlowStepInstance flowStepInstance) {
+        flowStepInstance.setUpdateTime(new Date());
+        if (!flowStepInstanceService.updateById(flowStepInstance)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(flowStepInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:remove')")
+    @OperationLog("Delete 瀛愭祦绋嬫楠ゅ疄渚�")
+    @PostMapping("/flowStepInstance/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!flowStepInstanceService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @PostMapping("/flowStepInstance/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<FlowStepInstance> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(FlowStepInstance::getId, condition);
+        }
+        flowStepInstanceService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepInstance:list')")
+    @PostMapping("/flowStepInstance/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(flowStepInstanceService.list(), FlowStepInstance.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepLogController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepLogController.java
new file mode 100644
index 0000000..620ca00
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepLogController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.FlowStepLog;
+import com.vincent.rsf.server.system.service.FlowStepLogService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class FlowStepLogController extends BaseController {
+
+    @Autowired
+    private FlowStepLogService flowStepLogService;
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @PostMapping("/flowStepLog/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<FlowStepLog, BaseParam> pageParam = new PageParam<>(baseParam, FlowStepLog.class);
+        return R.ok().add(flowStepLogService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @PostMapping("/flowStepLog/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(flowStepLogService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @PostMapping({"/flowStepLog/many/{ids}", "/flowStepLogs/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(flowStepLogService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @GetMapping("/flowStepLog/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(flowStepLogService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:save')")
+    @OperationLog("Create 姝ラ鎵ц鏃ュ織")
+    @PostMapping("/flowStepLog/save")
+    public R save(@RequestBody FlowStepLog flowStepLog) {
+        flowStepLog.setCreateBy(getLoginUserId());
+        flowStepLog.setCreateTime(new Date());
+        flowStepLog.setUpdateBy(getLoginUserId());
+        flowStepLog.setUpdateTime(new Date());
+        if (!flowStepLogService.save(flowStepLog)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(flowStepLog);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:update')")
+    @OperationLog("Update 姝ラ鎵ц鏃ュ織")
+    @PostMapping("/flowStepLog/update")
+    public R update(@RequestBody FlowStepLog flowStepLog) {
+        flowStepLog.setUpdateBy(getLoginUserId());
+        flowStepLog.setUpdateTime(new Date());
+        if (!flowStepLogService.updateById(flowStepLog)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(flowStepLog);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:remove')")
+    @OperationLog("Delete 姝ラ鎵ц鏃ュ織")
+    @PostMapping("/flowStepLog/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!flowStepLogService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @PostMapping("/flowStepLog/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<FlowStepLog> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(FlowStepLog::getId, condition);
+        }
+        flowStepLogService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepLog:list')")
+    @PostMapping("/flowStepLog/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(flowStepLogService.list(), FlowStepLog.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepTemplateController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepTemplateController.java
new file mode 100644
index 0000000..9ac3230
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/FlowStepTemplateController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.FlowStepTemplate;
+import com.vincent.rsf.server.system.service.FlowStepTemplateService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class FlowStepTemplateController extends BaseController {
+
+    @Autowired
+    private FlowStepTemplateService flowStepTemplateService;
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @PostMapping("/flowStepTemplate/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<FlowStepTemplate, BaseParam> pageParam = new PageParam<>(baseParam, FlowStepTemplate.class);
+        return R.ok().add(flowStepTemplateService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @PostMapping("/flowStepTemplate/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(flowStepTemplateService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @PostMapping({"/flowStepTemplate/many/{ids}", "/flowStepTemplates/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(flowStepTemplateService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @GetMapping("/flowStepTemplate/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(flowStepTemplateService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:save')")
+    @OperationLog("Create 瀛愭祦绋嬫楠ゆā鏉�")
+    @PostMapping("/flowStepTemplate/save")
+    public R save(@RequestBody FlowStepTemplate flowStepTemplate) {
+        flowStepTemplate.setCreateBy(getLoginUserId());
+        flowStepTemplate.setCreateTime(new Date());
+        flowStepTemplate.setUpdateBy(getLoginUserId());
+        flowStepTemplate.setUpdateTime(new Date());
+        if (!flowStepTemplateService.save(flowStepTemplate)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(flowStepTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:update')")
+    @OperationLog("Update 瀛愭祦绋嬫楠ゆā鏉�")
+    @PostMapping("/flowStepTemplate/update")
+    public R update(@RequestBody FlowStepTemplate flowStepTemplate) {
+        flowStepTemplate.setUpdateBy(getLoginUserId());
+        flowStepTemplate.setUpdateTime(new Date());
+        if (!flowStepTemplateService.updateById(flowStepTemplate)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(flowStepTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:remove')")
+    @OperationLog("Delete 瀛愭祦绋嬫楠ゆā鏉�")
+    @PostMapping("/flowStepTemplate/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!flowStepTemplateService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @PostMapping("/flowStepTemplate/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<FlowStepTemplate> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(FlowStepTemplate::getId, condition);
+        }
+        flowStepTemplateService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:flowStepTemplate:list')")
+    @PostMapping("/flowStepTemplate/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(flowStepTemplateService.list(), FlowStepTemplate.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/SubsystemFlowTemplateController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/SubsystemFlowTemplateController.java
new file mode 100644
index 0000000..5aae0cc
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/SubsystemFlowTemplateController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.SubsystemFlowTemplate;
+import com.vincent.rsf.server.system.service.SubsystemFlowTemplateService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class SubsystemFlowTemplateController extends BaseController {
+
+    @Autowired
+    private SubsystemFlowTemplateService subsystemFlowTemplateService;
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @PostMapping("/subsystemFlowTemplate/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<SubsystemFlowTemplate, BaseParam> pageParam = new PageParam<>(baseParam, SubsystemFlowTemplate.class);
+        return R.ok().add(subsystemFlowTemplateService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @PostMapping("/subsystemFlowTemplate/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(subsystemFlowTemplateService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @PostMapping({"/subsystemFlowTemplate/many/{ids}", "/subsystemFlowTemplates/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(subsystemFlowTemplateService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @GetMapping("/subsystemFlowTemplate/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(subsystemFlowTemplateService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:save')")
+    @OperationLog("Create 瀛愮郴缁熸ā鏉�")
+    @PostMapping("/subsystemFlowTemplate/save")
+    public R save(@RequestBody SubsystemFlowTemplate subsystemFlowTemplate) {
+        subsystemFlowTemplate.setCreateBy(getLoginUserId());
+        subsystemFlowTemplate.setCreateTime(new Date());
+        subsystemFlowTemplate.setUpdateBy(getLoginUserId());
+        subsystemFlowTemplate.setUpdateTime(new Date());
+        if (!subsystemFlowTemplateService.save(subsystemFlowTemplate)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(subsystemFlowTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:update')")
+    @OperationLog("Update 瀛愮郴缁熸ā鏉�")
+    @PostMapping("/subsystemFlowTemplate/update")
+    public R update(@RequestBody SubsystemFlowTemplate subsystemFlowTemplate) {
+        subsystemFlowTemplate.setUpdateBy(getLoginUserId());
+        subsystemFlowTemplate.setUpdateTime(new Date());
+        if (!subsystemFlowTemplateService.updateById(subsystemFlowTemplate)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(subsystemFlowTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:remove')")
+    @OperationLog("Delete 瀛愮郴缁熸ā鏉�")
+    @PostMapping("/subsystemFlowTemplate/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!subsystemFlowTemplateService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @PostMapping("/subsystemFlowTemplate/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<SubsystemFlowTemplate> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(SubsystemFlowTemplate::getId, condition);
+        }
+        subsystemFlowTemplateService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:subsystemFlowTemplate:list')")
+    @PostMapping("/subsystemFlowTemplate/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(subsystemFlowTemplateService.list(), SubsystemFlowTemplate.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceController.java
new file mode 100644
index 0000000..2692323
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.TaskInstance;
+import com.vincent.rsf.server.system.service.TaskInstanceService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class TaskInstanceController extends BaseController {
+
+    @Autowired
+    private TaskInstanceService taskInstanceService;
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @PostMapping("/taskInstance/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<TaskInstance, BaseParam> pageParam = new PageParam<>(baseParam, TaskInstance.class);
+        return R.ok().add(taskInstanceService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @PostMapping("/taskInstance/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(taskInstanceService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @PostMapping({"/taskInstance/many/{ids}", "/taskInstances/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(taskInstanceService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @GetMapping("/taskInstance/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(taskInstanceService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:save')")
+    @OperationLog("Create 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstance/save")
+    public R save(@RequestBody TaskInstance taskInstance) {
+        taskInstance.setCreateBy(getLoginUserId());
+        taskInstance.setCreateTime(new Date());
+        taskInstance.setUpdateBy(getLoginUserId());
+        taskInstance.setUpdateTime(new Date());
+        if (!taskInstanceService.save(taskInstance)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(taskInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:update')")
+    @OperationLog("Update 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstance/update")
+    public R update(@RequestBody TaskInstance taskInstance) {
+        taskInstance.setUpdateBy(getLoginUserId());
+        taskInstance.setUpdateTime(new Date());
+        if (!taskInstanceService.updateById(taskInstance)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(taskInstance);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:remove')")
+    @OperationLog("Delete 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstance/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!taskInstanceService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @PostMapping("/taskInstance/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<TaskInstance> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(TaskInstance::getId, condition);
+        }
+        taskInstanceService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstance:list')")
+    @PostMapping("/taskInstance/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(taskInstanceService.list(), TaskInstance.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceNodeController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceNodeController.java
new file mode 100644
index 0000000..c630076
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskInstanceNodeController.java
@@ -0,0 +1,107 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.TaskInstanceNode;
+import com.vincent.rsf.server.system.service.TaskInstanceNodeService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class TaskInstanceNodeController extends BaseController {
+
+    @Autowired
+    private TaskInstanceNodeService taskInstanceNodeService;
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @PostMapping("/taskInstanceNode/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<TaskInstanceNode, BaseParam> pageParam = new PageParam<>(baseParam, TaskInstanceNode.class);
+        return R.ok().add(taskInstanceNodeService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @PostMapping("/taskInstanceNode/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(taskInstanceNodeService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @PostMapping({"/taskInstanceNode/many/{ids}", "/taskInstanceNodes/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(taskInstanceNodeService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @GetMapping("/taskInstanceNode/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(taskInstanceNodeService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:save')")
+    @OperationLog("Create 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstanceNode/save")
+    public R save(@RequestBody TaskInstanceNode taskInstanceNode) {
+        taskInstanceNode.setCreateTime(new Date());
+        taskInstanceNode.setUpdateTime(new Date());
+        if (!taskInstanceNodeService.save(taskInstanceNode)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(taskInstanceNode);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:update')")
+    @OperationLog("Update 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstanceNode/update")
+    public R update(@RequestBody TaskInstanceNode taskInstanceNode) {
+        taskInstanceNode.setUpdateTime(new Date());
+        if (!taskInstanceNodeService.updateById(taskInstanceNode)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(taskInstanceNode);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:remove')")
+    @OperationLog("Delete 鐗╂枡鏉冮檺")
+    @PostMapping("/taskInstanceNode/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!taskInstanceNodeService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @PostMapping("/taskInstanceNode/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<TaskInstanceNode> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(TaskInstanceNode::getId, condition);
+        }
+        taskInstanceNodeService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskInstanceNode:list')")
+    @PostMapping("/taskInstanceNode/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(taskInstanceNodeService.list(), TaskInstanceNode.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateController.java
new file mode 100644
index 0000000..4a05c7e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.TaskPathTemplate;
+import com.vincent.rsf.server.system.service.TaskPathTemplateService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class TaskPathTemplateController extends BaseController {
+
+    @Autowired
+    private TaskPathTemplateService taskPathTemplateService;
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @PostMapping("/taskPathTemplate/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<TaskPathTemplate, BaseParam> pageParam = new PageParam<>(baseParam, TaskPathTemplate.class);
+        return R.ok().add(taskPathTemplateService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @PostMapping("/taskPathTemplate/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(taskPathTemplateService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @PostMapping({"/taskPathTemplate/many/{ids}", "/taskPathTemplates/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(taskPathTemplateService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @GetMapping("/taskPathTemplate/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(taskPathTemplateService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:save')")
+    @OperationLog("Create 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplate/save")
+    public R save(@RequestBody TaskPathTemplate taskPathTemplate) {
+        taskPathTemplate.setCreateBy(getLoginUserId());
+        taskPathTemplate.setCreateTime(new Date());
+        taskPathTemplate.setUpdateBy(getLoginUserId());
+        taskPathTemplate.setUpdateTime(new Date());
+        if (!taskPathTemplateService.save(taskPathTemplate)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(taskPathTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:update')")
+    @OperationLog("Update 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplate/update")
+    public R update(@RequestBody TaskPathTemplate taskPathTemplate) {
+        taskPathTemplate.setUpdateBy(getLoginUserId());
+        taskPathTemplate.setUpdateTime(new Date());
+        if (!taskPathTemplateService.updateById(taskPathTemplate)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(taskPathTemplate);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:remove')")
+    @OperationLog("Delete 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplate/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!taskPathTemplateService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @PostMapping("/taskPathTemplate/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<TaskPathTemplate> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(TaskPathTemplate::getId, condition);
+        }
+        taskPathTemplateService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplate:list')")
+    @PostMapping("/taskPathTemplate/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(taskPathTemplateService.list(), TaskPathTemplate.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateNodeController.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateNodeController.java
new file mode 100644
index 0000000..66a99c3
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/controller/TaskPathTemplateNodeController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.system.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.system.entity.TaskPathTemplateNode;
+import com.vincent.rsf.server.system.service.TaskPathTemplateNodeService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class TaskPathTemplateNodeController extends BaseController {
+
+    @Autowired
+    private TaskPathTemplateNodeService taskPathTemplateNodeService;
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @PostMapping("/taskPathTemplateNode/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<TaskPathTemplateNode, BaseParam> pageParam = new PageParam<>(baseParam, TaskPathTemplateNode.class);
+        return R.ok().add(taskPathTemplateNodeService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @PostMapping("/taskPathTemplateNode/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(taskPathTemplateNodeService.list());
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @PostMapping({"/taskPathTemplateNode/many/{ids}", "/taskPathTemplateNodes/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(taskPathTemplateNodeService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @GetMapping("/taskPathTemplateNode/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(taskPathTemplateNodeService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:save')")
+    @OperationLog("Create 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplateNode/save")
+    public R save(@RequestBody TaskPathTemplateNode taskPathTemplateNode) {
+        taskPathTemplateNode.setCreateBy(getLoginUserId());
+        taskPathTemplateNode.setCreateTime(new Date());
+        taskPathTemplateNode.setUpdateBy(getLoginUserId());
+        taskPathTemplateNode.setUpdateTime(new Date());
+        if (!taskPathTemplateNodeService.save(taskPathTemplateNode)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(taskPathTemplateNode);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:update')")
+    @OperationLog("Update 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplateNode/update")
+    public R update(@RequestBody TaskPathTemplateNode taskPathTemplateNode) {
+        taskPathTemplateNode.setUpdateBy(getLoginUserId());
+        taskPathTemplateNode.setUpdateTime(new Date());
+        if (!taskPathTemplateNodeService.updateById(taskPathTemplateNode)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(taskPathTemplateNode);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:remove')")
+    @OperationLog("Delete 鐗╂枡鏉冮檺")
+    @PostMapping("/taskPathTemplateNode/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!taskPathTemplateNodeService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @PostMapping("/taskPathTemplateNode/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<TaskPathTemplateNode> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(TaskPathTemplateNode::getId, condition);
+        }
+        taskPathTemplateNodeService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('system:taskPathTemplateNode:list')")
+    @PostMapping("/taskPathTemplateNode/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(taskPathTemplateNodeService.list(), TaskPathTemplateNode.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowInstance.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowInstance.java
new file mode 100644
index 0000000..9558c79
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowInstance.java
@@ -0,0 +1,297 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_flow_instance")
+public class FlowInstance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 娴佺▼瀹炰緥缂栧彿
+     */
+    @ApiModelProperty(value= "娴佺▼瀹炰緥缂栧彿")
+    private String flowInstanceNo;
+
+    /**
+     * 鍏宠仈task_instance.id
+     */
+    @ApiModelProperty(value= "鍏宠仈task_instance.id")
+    private Long taskId;
+
+    /**
+     * 浠诲姟缂栧彿
+     */
+    @ApiModelProperty(value= "浠诲姟缂栧彿")
+    private String taskNo;
+
+    /**
+     * 鍏宠仈task_instance_node.id
+     */
+    @ApiModelProperty(value= "鍏宠仈task_instance_node.id")
+    private Long nodeInstanceId;
+
+    /**
+     * 鑺傜偣缂栫爜
+     */
+    @ApiModelProperty(value= "鑺傜偣缂栫爜")
+    private String nodeCode;
+
+    /**
+     * 浣跨敤鐨勬祦绋嬫ā鏉縄D
+     */
+    @ApiModelProperty(value= "浣跨敤鐨勬祦绋嬫ā鏉縄D")
+    private Long flowTemplateId;
+
+    /**
+     * 娴佺▼妯℃澘缂栫爜
+     */
+    @ApiModelProperty(value= "娴佺▼妯℃澘缂栫爜")
+    private String flowTemplateCode;
+
+    /**
+     * 妯℃澘鐗堟湰
+     */
+    @ApiModelProperty(value= "妯℃澘鐗堟湰")
+    private Integer templateVersion;
+
+    /**
+     * 鐘舵�侊細0-鏈紑濮� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-鍙栨秷 5-瓒呮椂
+     */
+    @ApiModelProperty(value= "鐘舵�侊細0-鏈紑濮� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-鍙栨秷 5-瓒呮椂")
+    private Short status;
+
+    /**
+     * 褰撳墠姝ラ缂栫爜
+     */
+    @ApiModelProperty(value= "褰撳墠姝ラ缂栫爜")
+    private String currentStepCode;
+
+    /**
+     * 褰撳墠姝ラ椤哄簭
+     */
+    @ApiModelProperty(value= "褰撳墠姝ラ椤哄簭")
+    private Integer currentStepOrder;
+
+    /**
+     * 鎵ц鍏ュ弬
+     */
+    @ApiModelProperty(value= "鎵ц鍏ュ弬")
+    private String executeParams;
+
+    /**
+     * 鎵ц缁撴灉
+     */
+    @ApiModelProperty(value= "鎵ц缁撴灉")
+    private String executeResult;
+
+    /**
+     * 閿欒鐮�
+     */
+    @ApiModelProperty(value= "閿欒鐮�")
+    private String errorCode;
+
+    /**
+     * 閿欒淇℃伅
+     */
+    @ApiModelProperty(value= "閿欒淇℃伅")
+    private String errorMessage;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 瓒呮椂鏃堕棿
+     */
+    @ApiModelProperty(value= "瓒呮椂鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date timeoutAt;
+
+    /**
+     * 鎵ц鑰楁椂(绉�)
+     */
+    @ApiModelProperty(value= "鎵ц鑰楁椂(绉�)")
+    private Integer durationSeconds;
+
+    /**
+     * 宸查噸璇曟鏁�
+     */
+    @ApiModelProperty(value= "宸查噸璇曟鏁�")
+    private Integer retryTimes;
+
+    /**
+     * 鏈�鍚庨噸璇曟椂闂�
+     */
+    @ApiModelProperty(value= "鏈�鍚庨噸璇曟椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date lastRetryTime;
+
+    /**
+     * 娴佺▼涓婁笅鏂囨暟鎹�
+     */
+    @ApiModelProperty(value= "娴佺▼涓婁笅鏂囨暟鎹�")
+    private String contextData;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public FlowInstance() {}
+
+    public FlowInstance(String flowInstanceNo,Long taskId,String taskNo,Long nodeInstanceId,String nodeCode,Long flowTemplateId,String flowTemplateCode,Integer templateVersion,Short status,String currentStepCode,Integer currentStepOrder,String executeParams,String executeResult,String errorCode,String errorMessage,Date startTime,Date endTime,Date timeoutAt,Integer durationSeconds,Integer retryTimes,Date lastRetryTime,String contextData,Date createTime,Date updateTime) {
+        this.flowInstanceNo = flowInstanceNo;
+        this.taskId = taskId;
+        this.taskNo = taskNo;
+        this.nodeInstanceId = nodeInstanceId;
+        this.nodeCode = nodeCode;
+        this.flowTemplateId = flowTemplateId;
+        this.flowTemplateCode = flowTemplateCode;
+        this.templateVersion = templateVersion;
+        this.status = status;
+        this.currentStepCode = currentStepCode;
+        this.currentStepOrder = currentStepOrder;
+        this.executeParams = executeParams;
+        this.executeResult = executeResult;
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.timeoutAt = timeoutAt;
+        this.durationSeconds = durationSeconds;
+        this.retryTimes = retryTimes;
+        this.lastRetryTime = lastRetryTime;
+        this.contextData = contextData;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    FlowInstance flowInstance = new FlowInstance(
+//            null,    // 娴佺▼瀹炰緥缂栧彿[闈炵┖]
+//            null,    // 鍏宠仈task_instance.id[闈炵┖]
+//            null,    // 浠诲姟缂栧彿[闈炵┖]
+//            null,    // 鍏宠仈task_instance_node.id[闈炵┖]
+//            null,    // 鑺傜偣缂栫爜[闈炵┖]
+//            null,    // 浣跨敤鐨勬祦绋嬫ā鏉縄D[闈炵┖]
+//            null,    // 娴佺▼妯℃澘缂栫爜[闈炵┖]
+//            null,    // 妯℃澘鐗堟湰[闈炵┖]
+//            null,    // 鐘舵�侊細0-鏈紑濮� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-鍙栨秷 5-瓒呮椂[闈炵┖]
+//            null,    // 褰撳墠姝ラ缂栫爜
+//            null,    // 褰撳墠姝ラ椤哄簭
+//            null,    // 鎵ц鍏ュ弬
+//            null,    // 鎵ц缁撴灉
+//            null,    // 閿欒鐮�
+//            null,    // 閿欒淇℃伅
+//            null,    // 寮�濮嬫椂闂�
+//            null,    // 缁撴潫鏃堕棿
+//            null,    // 瓒呮椂鏃堕棿
+//            null,    // 鎵ц鑰楁椂(绉�)
+//            null,    // 宸查噸璇曟鏁癧闈炵┖]
+//            null,    // 鏈�鍚庨噸璇曟椂闂�
+//            null,    // 娴佺▼涓婁笅鏂囨暟鎹�
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getStartTime$(){
+        if (Cools.isEmpty(this.startTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
+    }
+
+    public String getEndTime$(){
+        if (Cools.isEmpty(this.endTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
+    }
+
+    public String getTimeoutAt$(){
+        if (Cools.isEmpty(this.timeoutAt)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.timeoutAt);
+    }
+
+    public String getLastRetryTime$(){
+        if (Cools.isEmpty(this.lastRetryTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lastRetryTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java
new file mode 100644
index 0000000..8fbe04e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java
@@ -0,0 +1,237 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_flow_step_instance")
+public class FlowStepInstance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈flow_instance.id
+     */
+    @ApiModelProperty(value= "鍏宠仈flow_instance.id")
+    private Long flowInstanceId;
+
+    /**
+     * 娴佺▼瀹炰緥缂栧彿
+     */
+    @ApiModelProperty(value= "娴佺▼瀹炰緥缂栧彿")
+    private String flowInstanceNo;
+
+    /**
+     * 姝ラ椤哄簭
+     */
+    @ApiModelProperty(value= "姝ラ椤哄簭")
+    private Integer stepOrder;
+
+    /**
+     * 姝ラ缂栫爜
+     */
+    @ApiModelProperty(value= "姝ラ缂栫爜")
+    private String stepCode;
+
+    /**
+     * 姝ラ鍚嶇О
+     */
+    @ApiModelProperty(value= "姝ラ鍚嶇О")
+    private String stepName;
+
+    /**
+     * 姝ラ绫诲瀷
+     */
+    @ApiModelProperty(value= "姝ラ绫诲瀷")
+    private String stepType;
+
+    /**
+     * 姝ラ妯℃澘ID
+     */
+    @ApiModelProperty(value= "姝ラ妯℃澘ID")
+    private Long stepTemplateId;
+
+    /**
+     * 鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-璺宠繃 5-瓒呮椂
+     */
+    @ApiModelProperty(value= "鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-璺宠繃 5-瓒呮椂")
+    private Short status;
+
+    /**
+     * 鎵ц缁撴灉
+     */
+    @ApiModelProperty(value= "鎵ц缁撴灉")
+    private String executeResult;
+
+    /**
+     * 閿欒鐮�
+     */
+    @ApiModelProperty(value= "閿欒鐮�")
+    private String errorCode;
+
+    /**
+     * 閿欒淇℃伅
+     */
+    @ApiModelProperty(value= "閿欒淇℃伅")
+    private String errorMessage;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 鎵ц鑰楁椂(绉�)
+     */
+    @ApiModelProperty(value= "鎵ц鑰楁椂(绉�)")
+    private Integer durationSeconds;
+
+    /**
+     * 杈撳叆鏁版嵁蹇収
+     */
+    @ApiModelProperty(value= "杈撳叆鏁版嵁蹇収")
+    private String inputData;
+
+    /**
+     * 杈撳嚭鏁版嵁蹇収
+     */
+    @ApiModelProperty(value= "杈撳嚭鏁版嵁蹇収")
+    private String outputData;
+
+    /**
+     * 姝ラ閲嶈瘯娆℃暟
+     */
+    @ApiModelProperty(value= "姝ラ閲嶈瘯娆℃暟")
+    private Integer retryTimes;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public FlowStepInstance() {}
+
+    public FlowStepInstance(Long flowInstanceId,String flowInstanceNo,Integer stepOrder,String stepCode,String stepName,String stepType,Long stepTemplateId,Short status,String executeResult,String errorCode,String errorMessage,Date startTime,Date endTime,Integer durationSeconds,String inputData,String outputData,Integer retryTimes,Date createTime,Date updateTime) {
+        this.flowInstanceId = flowInstanceId;
+        this.flowInstanceNo = flowInstanceNo;
+        this.stepOrder = stepOrder;
+        this.stepCode = stepCode;
+        this.stepName = stepName;
+        this.stepType = stepType;
+        this.stepTemplateId = stepTemplateId;
+        this.status = status;
+        this.executeResult = executeResult;
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.durationSeconds = durationSeconds;
+        this.inputData = inputData;
+        this.outputData = outputData;
+        this.retryTimes = retryTimes;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    FlowStepInstance flowStepInstance = new FlowStepInstance(
+//            null,    // 鍏宠仈flow_instance.id[闈炵┖]
+//            null,    // 娴佺▼瀹炰緥缂栧彿[闈炵┖]
+//            null,    // 姝ラ椤哄簭[闈炵┖]
+//            null,    // 姝ラ缂栫爜[闈炵┖]
+//            null,    // 姝ラ鍚嶇О[闈炵┖]
+//            null,    // 姝ラ绫诲瀷[闈炵┖]
+//            null,    // 姝ラ妯℃澘ID[闈炵┖]
+//            null,    // 鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎴愬姛 3-澶辫触 4-璺宠繃 5-瓒呮椂[闈炵┖]
+//            null,    // 鎵ц缁撴灉
+//            null,    // 閿欒鐮�
+//            null,    // 閿欒淇℃伅
+//            null,    // 寮�濮嬫椂闂�
+//            null,    // 缁撴潫鏃堕棿
+//            null,    // 鎵ц鑰楁椂(绉�)
+//            null,    // 杈撳叆鏁版嵁蹇収
+//            null,    // 杈撳嚭鏁版嵁蹇収
+//            null,    // 姝ラ閲嶈瘯娆℃暟[闈炵┖]
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getStartTime$(){
+        if (Cools.isEmpty(this.startTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
+    }
+
+    public String getEndTime$(){
+        if (Cools.isEmpty(this.endTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepLog.java
new file mode 100644
index 0000000..f4443c8
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepLog.java
@@ -0,0 +1,125 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_flow_step_log")
+public class FlowStepLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 娴佺▼瀹炰緥ID
+     */
+    @ApiModelProperty(value= "娴佺▼瀹炰緥ID")
+    private Long flowInstanceId;
+
+    /**
+     * 姝ラ瀹炰緥ID
+     */
+    @ApiModelProperty(value= "姝ラ瀹炰緥ID")
+    private Long stepInstanceId;
+
+    /**
+     * 鏃ュ織绫诲瀷锛歊EQUEST, RESPONSE, ERROR, DEBUG
+     */
+    @ApiModelProperty(value= "鏃ュ織绫诲瀷锛歊EQUEST, RESPONSE, ERROR, DEBUG")
+    private String logType;
+
+    /**
+     * 鏃ュ織绾у埆锛欼NFO, WARN, ERROR
+     */
+    @ApiModelProperty(value= "鏃ュ織绾у埆锛欼NFO, WARN, ERROR")
+    private String logLevel;
+
+    /**
+     * 鏃ュ織鍐呭
+     */
+    @ApiModelProperty(value= "鏃ュ織鍐呭")
+    private String logContent;
+
+    /**
+     * 璇锋眰鏁版嵁
+     */
+    @ApiModelProperty(value= "璇锋眰鏁版嵁")
+    private String requestData;
+
+    /**
+     * 鍝嶅簲鏁版嵁
+     */
+    @ApiModelProperty(value= "鍝嶅簲鏁版嵁")
+    private String responseData;
+
+    /**
+     * 绮剧‘鍒版绉�
+     */
+    @ApiModelProperty(value= "绮剧‘鍒版绉�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    public FlowStepLog() {}
+
+    public FlowStepLog(Long flowInstanceId,Long stepInstanceId,String logType,String logLevel,String logContent,String requestData,String responseData,Date createTime) {
+        this.flowInstanceId = flowInstanceId;
+        this.stepInstanceId = stepInstanceId;
+        this.logType = logType;
+        this.logLevel = logLevel;
+        this.logContent = logContent;
+        this.requestData = requestData;
+        this.responseData = responseData;
+        this.createTime = createTime;
+    }
+
+//    FlowStepLog flowStepLog = new FlowStepLog(
+//            null,    // 娴佺▼瀹炰緥ID[闈炵┖]
+//            null,    // 姝ラ瀹炰緥ID[闈炵┖]
+//            null,    // 鏃ュ織绫诲瀷锛歊EQUEST, RESPONSE, ERROR, DEBUG[闈炵┖]
+//            null,    // 鏃ュ織绾у埆锛欼NFO, WARN, ERROR[闈炵┖]
+//            null,    // 鏃ュ織鍐呭
+//            null,    // 璇锋眰鏁版嵁
+//            null,    // 鍝嶅簲鏁版嵁
+//            null    // 绮剧‘鍒版绉�
+//    );
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepTemplate.java
new file mode 100644
index 0000000..85346e8
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepTemplate.java
@@ -0,0 +1,197 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_flow_step_template")
+public class FlowStepTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈flow_template.id
+     */
+    @ApiModelProperty(value= "鍏宠仈flow_template.id")
+    private Long flowId;
+
+    /**
+     * 娴佺▼缂栫爜
+     */
+    @ApiModelProperty(value= "娴佺▼缂栫爜")
+    private String flowCode;
+
+    /**
+     * 姝ラ椤哄簭
+     */
+    @ApiModelProperty(value= "姝ラ椤哄簭")
+    private Integer stepOrder;
+
+    /**
+     * 姝ラ缂栫爜
+     */
+    @ApiModelProperty(value= "姝ラ缂栫爜")
+    private String stepCode;
+
+    /**
+     * 姝ラ鍚嶇О
+     */
+    @ApiModelProperty(value= "姝ラ鍚嶇О")
+    private String stepName;
+
+    /**
+     * 姝ラ绫诲瀷锛歊EQUEST-璇锋眰, RESPONSE-鍝嶅簲, VALIDATE-鏍¢獙, TRANSFORM-杞崲
+     */
+    @ApiModelProperty(value= "姝ラ绫诲瀷锛歊EQUEST-璇锋眰, RESPONSE-鍝嶅簲, VALIDATE-鏍¢獙, TRANSFORM-杞崲")
+    private String stepType;
+
+    /**
+     * 鍔ㄤ綔绫诲瀷锛欻TTP_CALL, RPC_CALL, MQ_SEND, DB_OPERATION
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔绫诲瀷锛欻TTP_CALL, RPC_CALL, MQ_SEND, DB_OPERATION")
+    private String actionType;
+
+    /**
+     * 鍔ㄤ綔閰嶇疆(JSON)
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔閰嶇疆(JSON)")
+    private String actionConfig;
+
+    /**
+     * 杈撳叆鍙傛暟鏄犲皠瑙勫垯
+     */
+    @ApiModelProperty(value= "杈撳叆鍙傛暟鏄犲皠瑙勫垯")
+    private String inputMapping;
+
+    /**
+     * 杈撳嚭鍙傛暟鏄犲皠瑙勫垯
+     */
+    @ApiModelProperty(value= "杈撳嚭鍙傛暟鏄犲皠瑙勫垯")
+    private String outputMapping;
+
+    /**
+     * 鎵ц鏉′欢琛ㄨ揪寮�
+     */
+    @ApiModelProperty(value= "鎵ц鏉′欢琛ㄨ揪寮�")
+    private String conditionExpression;
+
+    /**
+     * 澶辫触鏃舵槸鍚﹁烦杩囧悗缁楠�
+     */
+    @ApiModelProperty(value= "澶辫触鏃舵槸鍚﹁烦杩囧悗缁楠�")
+    private Short skipOnFail;
+
+    /**
+     * 鏄惁鍚敤閲嶈瘯
+     */
+    @ApiModelProperty(value= "鏄惁鍚敤閲嶈瘯")
+    private Short retryEnabled;
+
+    /**
+     * 閲嶈瘯閰嶇疆
+     */
+    @ApiModelProperty(value= "閲嶈瘯閰嶇疆")
+    private String retryConfig;
+
+    /**
+     * 姝ラ瓒呮椂鏃堕棿
+     */
+    @ApiModelProperty(value= "姝ラ瓒呮椂鏃堕棿")
+    private Integer timeoutSeconds;
+
+    @ApiModelProperty(value= "")
+    private Long createBy;
+
+    @ApiModelProperty(value= "")
+    private Long updateBy;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public FlowStepTemplate() {}
+
+    public FlowStepTemplate(Long flowId,String flowCode,Integer stepOrder,String stepCode,String stepName,String stepType,String actionType,String actionConfig,String inputMapping,String outputMapping,String conditionExpression,Short skipOnFail,Short retryEnabled,String retryConfig,Integer timeoutSeconds,Long createBy,Long updateBy,Date createTime,Date updateTime) {
+        this.flowId = flowId;
+        this.flowCode = flowCode;
+        this.stepOrder = stepOrder;
+        this.stepCode = stepCode;
+        this.stepName = stepName;
+        this.stepType = stepType;
+        this.actionType = actionType;
+        this.actionConfig = actionConfig;
+        this.inputMapping = inputMapping;
+        this.outputMapping = outputMapping;
+        this.conditionExpression = conditionExpression;
+        this.skipOnFail = skipOnFail;
+        this.retryEnabled = retryEnabled;
+        this.retryConfig = retryConfig;
+        this.timeoutSeconds = timeoutSeconds;
+        this.createBy = createBy;
+        this.updateBy = updateBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    FlowStepTemplate flowStepTemplate = new FlowStepTemplate(
+//            null,    // 鍏宠仈flow_template.id[闈炵┖]
+//            null,    // 娴佺▼缂栫爜[闈炵┖]
+//            null,    // 姝ラ椤哄簭[闈炵┖]
+//            null,    // 姝ラ缂栫爜[闈炵┖]
+//            null,    // 姝ラ鍚嶇О[闈炵┖]
+//            null,    // 姝ラ绫诲瀷锛歊EQUEST-璇锋眰, RESPONSE-鍝嶅簲, VALIDATE-鏍¢獙, TRANSFORM-杞崲[闈炵┖]
+//            null,    // 鍔ㄤ綔绫诲瀷锛欻TTP_CALL, RPC_CALL, MQ_SEND, DB_OPERATION[闈炵┖]
+//            null,    // 鍔ㄤ綔閰嶇疆(JSON)[闈炵┖]
+//            null,    // 杈撳叆鍙傛暟鏄犲皠瑙勫垯
+//            null,    // 杈撳嚭鍙傛暟鏄犲皠瑙勫垯
+//            null,    // 鎵ц鏉′欢琛ㄨ揪寮�
+//            null,    // 澶辫触鏃舵槸鍚﹁烦杩囧悗缁楠�
+//            null,    // 鏄惁鍚敤閲嶈瘯
+//            null,    // 閲嶈瘯閰嶇疆
+//            null,    // 姝ラ瓒呮椂鏃堕棿
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SubsystemFlowTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SubsystemFlowTemplate.java
new file mode 100644
index 0000000..00ea3bc
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/SubsystemFlowTemplate.java
@@ -0,0 +1,215 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_subsystem_flow_template")
+public class SubsystemFlowTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 娴佺▼缂栫爜
+     */
+    @ApiModelProperty(value= "娴佺▼缂栫爜")
+    private String flowCode;
+
+    /**
+     * 娴佺▼鍚嶇О
+     */
+    @ApiModelProperty(value= "娴佺▼鍚嶇О")
+    private String flowName;
+
+    /**
+     * 瀛愮郴缁熺紪鐮�
+     */
+    @ApiModelProperty(value= "瀛愮郴缁熺紪鐮�")
+    private String systemCode;
+
+    /**
+     * 瀛愮郴缁熷悕绉�
+     */
+    @ApiModelProperty(value= "瀛愮郴缁熷悕绉�")
+    private String systemName;
+
+    /**
+     * 閫傜敤鐨勮妭鐐圭被鍨�
+     */
+    @ApiModelProperty(value= "閫傜敤鐨勮妭鐐圭被鍨�")
+    private String nodeType;
+
+    @ApiModelProperty(value= "")
+    private Integer version;
+
+    /**
+     * 鏄惁褰撳墠鐢熸晥
+     */
+    @ApiModelProperty(value= "鏄惁褰撳墠鐢熸晥")
+    private Short isCurrent;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date effectiveTime;
+
+    /**
+     * 瓒呮椂绛栫暐锛欶AIL-澶辫触, RETRY-閲嶈瘯, SKIP-璺宠繃
+     */
+    @ApiModelProperty(value= "瓒呮椂绛栫暐锛欶AIL-澶辫触, RETRY-閲嶈瘯, SKIP-璺宠繃")
+    private String timeoutStrategy;
+
+    /**
+     * 鏁翠綋瓒呮椂鏃堕棿(绉�)
+     */
+    @ApiModelProperty(value= "鏁翠綋瓒呮椂鏃堕棿(绉�)")
+    private Integer timeoutSeconds;
+
+    /**
+     * 鏈�澶ч噸璇曟鏁�
+     */
+    @ApiModelProperty(value= "鏈�澶ч噸璇曟鏁�")
+    private Integer maxRetryTimes;
+
+    /**
+     * 鏄惁闇�瑕侀�氱煡
+     */
+    @ApiModelProperty(value= "鏄惁闇�瑕侀�氱煡")
+    private Short needNotify;
+
+    /**
+     * 閫氱煡妯℃澘閰嶇疆
+     */
+    @ApiModelProperty(value= "閫氱煡妯℃澘閰嶇疆")
+    private String notifyTemplate;
+
+    /**
+     * 鐘舵�� 0-绂佺敤 1-鍚敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 0-绂佺敤 1-鍚敤")
+    private Short status;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value= "")
+    private Long createBy;
+
+    @ApiModelProperty(value= "")
+    private Long updateBy;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public SubsystemFlowTemplate() {}
+
+    public SubsystemFlowTemplate(String flowCode,String flowName,String systemCode,String systemName,String nodeType,Integer version,Short isCurrent,Date effectiveTime,String timeoutStrategy,Integer timeoutSeconds,Integer maxRetryTimes,Short needNotify,String notifyTemplate,Short status,String remark,Long createBy,Long updateBy,Date createTime,Date updateTime) {
+        this.flowCode = flowCode;
+        this.flowName = flowName;
+        this.systemCode = systemCode;
+        this.systemName = systemName;
+        this.nodeType = nodeType;
+        this.version = version;
+        this.isCurrent = isCurrent;
+        this.effectiveTime = effectiveTime;
+        this.timeoutStrategy = timeoutStrategy;
+        this.timeoutSeconds = timeoutSeconds;
+        this.maxRetryTimes = maxRetryTimes;
+        this.needNotify = needNotify;
+        this.notifyTemplate = notifyTemplate;
+        this.status = status;
+        this.remark = remark;
+        this.createBy = createBy;
+        this.updateBy = updateBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    SubsystemFlowTemplate subsystemFlowTemplate = new SubsystemFlowTemplate(
+//            null,    // 娴佺▼缂栫爜[闈炵┖]
+//            null,    // 娴佺▼鍚嶇О[闈炵┖]
+//            null,    // 瀛愮郴缁熺紪鐮乕闈炵┖]
+//            null,    // 瀛愮郴缁熷悕绉�
+//            null,    // 閫傜敤鐨勮妭鐐圭被鍨媅闈炵┖]
+//            null,    // [闈炵┖]
+//            null,    // 鏄惁褰撳墠鐢熸晥[闈炵┖]
+//            null,    // [闈炵┖]
+//            null,    // 瓒呮椂绛栫暐锛欶AIL-澶辫触, RETRY-閲嶈瘯, SKIP-璺宠繃
+//            null,    // 鏁翠綋瓒呮椂鏃堕棿(绉�)
+//            null,    // 鏈�澶ч噸璇曟鏁�
+//            null,    // 鏄惁闇�瑕侀�氱煡
+//            null,    // 閫氱煡妯℃澘閰嶇疆
+//            null,    // 鐘舵�� 0-绂佺敤 1-鍚敤[闈炵┖]
+//            null,    // 澶囨敞
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getEffectiveTime$(){
+        if (Cools.isEmpty(this.effectiveTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.effectiveTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstance.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstance.java
new file mode 100644
index 0000000..4150acb
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstance.java
@@ -0,0 +1,379 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_task_instance")
+public class TaskInstance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 浠诲姟缂栧彿锛屼笟鍔″敮涓�
+     */
+    @ApiModelProperty(value= "浠诲姟缂栧彿锛屼笟鍔″敮涓�")
+    private String taskNo;
+
+    /**
+     * 涓氬姟鍗曞彿锛屽閮ㄧ郴缁熶紶鍏�
+     */
+    @ApiModelProperty(value= "涓氬姟鍗曞彿锛屽閮ㄧ郴缁熶紶鍏�")
+    private String bizNo;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    private String bizType;
+
+    /**
+     * 浣跨敤鐨勬ā鏉縄D
+     */
+    @ApiModelProperty(value= "浣跨敤鐨勬ā鏉縄D")
+    private Long templateId;
+
+    /**
+     * 妯℃澘缂栫爜
+     */
+    @ApiModelProperty(value= "妯℃澘缂栫爜")
+    private String templateCode;
+
+    /**
+     * 浣跨敤鐨勬ā鏉跨増鏈�
+     */
+    @ApiModelProperty(value= "浣跨敤鐨勬ā鏉跨増鏈�")
+    private Integer templateVersion;
+
+    /**
+     * 璧风偣淇℃伅(JSON)
+     */
+    @ApiModelProperty(value= "璧风偣淇℃伅(JSON)")
+    private String sourceInfo;
+
+    /**
+     * 缁堢偣淇℃伅(JSON)
+     */
+    @ApiModelProperty(value= "缁堢偣淇℃伅(JSON)")
+    private String targetInfo;
+
+    /**
+     * 璧风偣缂栫爜
+     */
+    @ApiModelProperty(value= "璧风偣缂栫爜")
+    private String sourceCode;
+
+    /**
+     * 缁堢偣缂栫爜
+     */
+    @ApiModelProperty(value= "缁堢偣缂栫爜")
+    private String targetCode;
+
+    /**
+     * 瑙勫垝璺緞(JSON鏁扮粍)
+     */
+    @ApiModelProperty(value= "瑙勫垝璺緞(JSON鏁扮粍)")
+    private String plannedPath;
+
+    /**
+     * 瀹為檯鎵ц璺緞(JSON鏁扮粍)
+     */
+    @ApiModelProperty(value= "瀹為檯鎵ц璺緞(JSON鏁扮粍)")
+    private String actualPath;
+
+    /**
+     * 浼樺厛绾�
+     */
+    @ApiModelProperty(value= "浼樺厛绾�")
+    private Short priority;
+
+    /**
+     * 鏁翠綋瓒呮椂鏃堕棿
+     */
+    @ApiModelProperty(value= "鏁翠綋瓒呮椂鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date timeoutAt;
+
+    /**
+     * 鐘舵�侊細0-宸插垱寤� 1-鎵ц涓� 2-宸插畬鎴� 3-宸插け璐� 4-宸插彇娑� 5-宸茶秴鏃�
+     */
+    @ApiModelProperty(value= "鐘舵�侊細0-宸插垱寤� 1-鎵ц涓� 2-宸插畬鎴� 3-宸插け璐� 4-宸插彇娑� 5-宸茶秴鏃�")
+    private Short status;
+
+    /**
+     * 褰撳墠鎵�鍦ㄨ妭鐐圭紪鐮�
+     */
+    @ApiModelProperty(value= "褰撳墠鎵�鍦ㄨ妭鐐圭紪鐮�")
+    private String currentNodeCode;
+
+    /**
+     * 褰撳墠鎵�鍦ㄨ妭鐐瑰悕绉�
+     */
+    @ApiModelProperty(value= "褰撳墠鎵�鍦ㄨ妭鐐瑰悕绉�")
+    private String currentNodeName;
+
+    /**
+     * 鎬昏妭鐐规暟
+     */
+    @ApiModelProperty(value= "鎬昏妭鐐规暟")
+    private Integer totalNodes;
+
+    /**
+     * 宸插畬鎴愯妭鐐规暟
+     */
+    @ApiModelProperty(value= "宸插畬鎴愯妭鐐规暟")
+    private Integer completedNodes;
+
+    /**
+     * 杩涘害鐧惧垎姣�
+     */
+    @ApiModelProperty(value= "杩涘害鐧惧垎姣�")
+    private Double progressRate;
+
+    /**
+     * 棰勪及鑰楁椂(鍒嗛挓)
+     */
+    @ApiModelProperty(value= "棰勪及鑰楁椂(鍒嗛挓)")
+    private Integer estimatedDurationMinutes;
+
+    /**
+     * 瀹為檯鑰楁椂(鍒嗛挓)
+     */
+    @ApiModelProperty(value= "瀹為檯鑰楁椂(鍒嗛挓)")
+    private Integer actualDurationMinutes;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 缁撴灉缂栫爜锛歋UCCESS, FAILED, PARTIAL_SUCCESS绛�
+     */
+    @ApiModelProperty(value= "缁撴灉缂栫爜锛歋UCCESS, FAILED, PARTIAL_SUCCESS绛�")
+    private String resultCode;
+
+    /**
+     * 缁撴灉鎻忚堪
+     */
+    @ApiModelProperty(value= "缁撴灉鎻忚堪")
+    private String resultMessage;
+
+    /**
+     * 鏈�缁堢粨鏋滄暟鎹�
+     */
+    @ApiModelProperty(value= "鏈�缁堢粨鏋滄暟鎹�")
+    private String resultData;
+
+    /**
+     * 宸查噸璇曟鏁�
+     */
+    @ApiModelProperty(value= "宸查噸璇曟鏁�")
+    private Integer retryTimes;
+
+    /**
+     * 鏈�鍚庨噸璇曟椂闂�
+     */
+    @ApiModelProperty(value= "鏈�鍚庨噸璇曟椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date lastRetryTime;
+
+    /**
+     * 鎵╁睍鍙傛暟
+     */
+    @ApiModelProperty(value= "鎵╁睍鍙傛暟")
+    private String extParams;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value= "")
+    private Long createBy;
+
+    @ApiModelProperty(value= "")
+    private Long updateBy;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public TaskInstance() {}
+
+    public TaskInstance(String taskNo,String bizNo,String bizType,Long templateId,String templateCode,Integer templateVersion,String sourceInfo,String targetInfo,String sourceCode,String targetCode,String plannedPath,String actualPath,Short priority,Date timeoutAt,Short status,String currentNodeCode,String currentNodeName,Integer totalNodes,Integer completedNodes,Double progressRate,Integer estimatedDurationMinutes,Integer actualDurationMinutes,Date startTime,Date endTime,String resultCode,String resultMessage,String resultData,Integer retryTimes,Date lastRetryTime,String extParams,String remark,Long createBy,Long updateBy,Date createTime,Date updateTime) {
+        this.taskNo = taskNo;
+        this.bizNo = bizNo;
+        this.bizType = bizType;
+        this.templateId = templateId;
+        this.templateCode = templateCode;
+        this.templateVersion = templateVersion;
+        this.sourceInfo = sourceInfo;
+        this.targetInfo = targetInfo;
+        this.sourceCode = sourceCode;
+        this.targetCode = targetCode;
+        this.plannedPath = plannedPath;
+        this.actualPath = actualPath;
+        this.priority = priority;
+        this.timeoutAt = timeoutAt;
+        this.status = status;
+        this.currentNodeCode = currentNodeCode;
+        this.currentNodeName = currentNodeName;
+        this.totalNodes = totalNodes;
+        this.completedNodes = completedNodes;
+        this.progressRate = progressRate;
+        this.estimatedDurationMinutes = estimatedDurationMinutes;
+        this.actualDurationMinutes = actualDurationMinutes;
+        this.startTime = startTime;
+        this.endTime = endTime;
+        this.resultCode = resultCode;
+        this.resultMessage = resultMessage;
+        this.resultData = resultData;
+        this.retryTimes = retryTimes;
+        this.lastRetryTime = lastRetryTime;
+        this.extParams = extParams;
+        this.remark = remark;
+        this.createBy = createBy;
+        this.updateBy = updateBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    TaskInstance taskInstance = new TaskInstance(
+//            null,    // 浠诲姟缂栧彿锛屼笟鍔″敮涓�[闈炵┖]
+//            null,    // 涓氬姟鍗曞彿锛屽閮ㄧ郴缁熶紶鍏�
+//            null,    // 涓氬姟绫诲瀷[闈炵┖]
+//            null,    // 浣跨敤鐨勬ā鏉縄D[闈炵┖]
+//            null,    // 妯℃澘缂栫爜[闈炵┖]
+//            null,    // 浣跨敤鐨勬ā鏉跨増鏈琜闈炵┖]
+//            null,    // 璧风偣淇℃伅(JSON)[闈炵┖]
+//            null,    // 缁堢偣淇℃伅(JSON)[闈炵┖]
+//            null,    // 璧风偣缂栫爜[闈炵┖]
+//            null,    // 缁堢偣缂栫爜[闈炵┖]
+//            null,    // 瑙勫垝璺緞(JSON鏁扮粍)
+//            null,    // 瀹為檯鎵ц璺緞(JSON鏁扮粍)
+//            null,    // 浼樺厛绾闈炵┖]
+//            null,    // 鏁翠綋瓒呮椂鏃堕棿
+//            null,    // 鐘舵�侊細0-宸插垱寤� 1-鎵ц涓� 2-宸插畬鎴� 3-宸插け璐� 4-宸插彇娑� 5-宸茶秴鏃禰闈炵┖]
+//            null,    // 褰撳墠鎵�鍦ㄨ妭鐐圭紪鐮�
+//            null,    // 褰撳墠鎵�鍦ㄨ妭鐐瑰悕绉�
+//            null,    // 鎬昏妭鐐规暟[闈炵┖]
+//            null,    // 宸插畬鎴愯妭鐐规暟[闈炵┖]
+//            null,    // 杩涘害鐧惧垎姣�
+//            null,    // 棰勪及鑰楁椂(鍒嗛挓)
+//            null,    // 瀹為檯鑰楁椂(鍒嗛挓)
+//            null,    // 寮�濮嬫椂闂�
+//            null,    // 缁撴潫鏃堕棿
+//            null,    // 缁撴灉缂栫爜锛歋UCCESS, FAILED, PARTIAL_SUCCESS绛�
+//            null,    // 缁撴灉鎻忚堪
+//            null,    // 鏈�缁堢粨鏋滄暟鎹�
+//            null,    // 宸查噸璇曟鏁癧闈炵┖]
+//            null,    // 鏈�鍚庨噸璇曟椂闂�
+//            null,    // 鎵╁睍鍙傛暟
+//            null,    // 澶囨敞
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getTimeoutAt$(){
+        if (Cools.isEmpty(this.timeoutAt)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.timeoutAt);
+    }
+
+    public String getStartTime$(){
+        if (Cools.isEmpty(this.startTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.startTime);
+    }
+
+    public String getEndTime$(){
+        if (Cools.isEmpty(this.endTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.endTime);
+    }
+
+    public String getLastRetryTime$(){
+        if (Cools.isEmpty(this.lastRetryTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lastRetryTime);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstanceNode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstanceNode.java
new file mode 100644
index 0000000..533f1ab
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskInstanceNode.java
@@ -0,0 +1,289 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_task_instance_node")
+public class TaskInstanceNode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈task_instance.id
+     */
+    @ApiModelProperty(value= "鍏宠仈task_instance.id")
+    private Long taskId;
+
+    /**
+     * 浠诲姟缂栧彿
+     */
+    @ApiModelProperty(value= "浠诲姟缂栧彿")
+    private String taskNo;
+
+    /**
+     * 鑺傜偣椤哄簭
+     */
+    @ApiModelProperty(value= "鑺傜偣椤哄簭")
+    private Integer nodeOrder;
+
+    /**
+     * 鑺傜偣缂栫爜
+     */
+    @ApiModelProperty(value= "鑺傜偣缂栫爜")
+    private String nodeCode;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    @ApiModelProperty(value= "鑺傜偣鍚嶇О")
+    private String nodeName;
+
+    /**
+     * 鑺傜偣绫诲瀷
+     */
+    @ApiModelProperty(value= "鑺傜偣绫诲瀷")
+    private String nodeType;
+
+    /**
+     * 瀛愮郴缁熺紪鐮�
+     */
+    @ApiModelProperty(value= "瀛愮郴缁熺紪鐮�")
+    private String systemCode;
+
+    /**
+     * 瀛愮郴缁熷悕绉�
+     */
+    @ApiModelProperty(value= "瀛愮郴缁熷悕绉�")
+    private String systemName;
+
+    /**
+     * 瀹為檯鎵ц鍙傛暟
+     */
+    @ApiModelProperty(value= "瀹為檯鎵ц鍙傛暟")
+    private String executeParams;
+
+    /**
+     * 鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎵ц鎴愬姛 3-鎵ц澶辫触 4-宸茶烦杩� 5-宸插彇娑�
+     */
+    @ApiModelProperty(value= "鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎵ц鎴愬姛 3-鎵ц澶辫触 4-宸茶烦杩� 5-宸插彇娑�")
+    private Short status;
+
+    /**
+     * 鎵ц缁撴灉鏁版嵁
+     */
+    @ApiModelProperty(value= "鎵ц缁撴灉鏁版嵁")
+    private String executeResult;
+
+    /**
+     * 閿欒鐮�
+     */
+    @ApiModelProperty(value= "閿欒鐮�")
+    private String errorCode;
+
+    /**
+     * 閿欒淇℃伅
+     */
+    @ApiModelProperty(value= "閿欒淇℃伅")
+    private String errorMessage;
+
+    /**
+     * 棰勮寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "棰勮寮�濮嬫椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date estimatedStartTime;
+
+    /**
+     * 瀹為檯寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "瀹為檯寮�濮嬫椂闂�")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date actualStartTime;
+
+    /**
+     * 瀹為檯缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "瀹為檯缁撴潫鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date actualEndTime;
+
+    /**
+     * 鑺傜偣瓒呮椂鏃堕棿
+     */
+    @ApiModelProperty(value= "鑺傜偣瓒呮椂鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date timeoutAt;
+
+    /**
+     * 鎵ц鑰楁椂(绉�)
+     */
+    @ApiModelProperty(value= "鎵ц鑰楁椂(绉�)")
+    private Integer durationSeconds;
+
+    /**
+     * 鑺傜偣閲嶈瘯娆℃暟
+     */
+    @ApiModelProperty(value= "鑺傜偣閲嶈瘯娆℃暟")
+    private Integer retryTimes;
+
+    /**
+     * 鑺傜偣鏈�澶ч噸璇曟鏁�
+     */
+    @ApiModelProperty(value= "鑺傜偣鏈�澶ч噸璇曟鏁�")
+    private Integer maxRetryTimes;
+
+    /**
+     * 渚濊禆鐨勫墠缃妭鐐瑰垪琛�
+     */
+    @ApiModelProperty(value= "渚濊禆鐨勫墠缃妭鐐瑰垪琛�")
+    private String dependsOnNodes;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public TaskInstanceNode() {}
+
+    public TaskInstanceNode(Long taskId,String taskNo,Integer nodeOrder,String nodeCode,String nodeName,String nodeType,String systemCode,String systemName,String executeParams,Short status,String executeResult,String errorCode,String errorMessage,Date estimatedStartTime,Date actualStartTime,Date actualEndTime,Date timeoutAt,Integer durationSeconds,Integer retryTimes,Integer maxRetryTimes,String dependsOnNodes,Date createTime,Date updateTime) {
+        this.taskId = taskId;
+        this.taskNo = taskNo;
+        this.nodeOrder = nodeOrder;
+        this.nodeCode = nodeCode;
+        this.nodeName = nodeName;
+        this.nodeType = nodeType;
+        this.systemCode = systemCode;
+        this.systemName = systemName;
+        this.executeParams = executeParams;
+        this.status = status;
+        this.executeResult = executeResult;
+        this.errorCode = errorCode;
+        this.errorMessage = errorMessage;
+        this.estimatedStartTime = estimatedStartTime;
+        this.actualStartTime = actualStartTime;
+        this.actualEndTime = actualEndTime;
+        this.timeoutAt = timeoutAt;
+        this.durationSeconds = durationSeconds;
+        this.retryTimes = retryTimes;
+        this.maxRetryTimes = maxRetryTimes;
+        this.dependsOnNodes = dependsOnNodes;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    TaskInstanceNode taskInstanceNode = new TaskInstanceNode(
+//            null,    // 鍏宠仈task_instance.id[闈炵┖]
+//            null,    // 浠诲姟缂栧彿[闈炵┖]
+//            null,    // 鑺傜偣椤哄簭[闈炵┖]
+//            null,    // 鑺傜偣缂栫爜[闈炵┖]
+//            null,    // 鑺傜偣鍚嶇О[闈炵┖]
+//            null,    // 鑺傜偣绫诲瀷[闈炵┖]
+//            null,    // 瀛愮郴缁熺紪鐮乕闈炵┖]
+//            null,    // 瀛愮郴缁熷悕绉�
+//            null,    // 瀹為檯鎵ц鍙傛暟
+//            null,    // 鐘舵�侊細0-寰呮墽琛� 1-鎵ц涓� 2-鎵ц鎴愬姛 3-鎵ц澶辫触 4-宸茶烦杩� 5-宸插彇娑圼闈炵┖]
+//            null,    // 鎵ц缁撴灉鏁版嵁
+//            null,    // 閿欒鐮�
+//            null,    // 閿欒淇℃伅
+//            null,    // 棰勮寮�濮嬫椂闂�
+//            null,    // 瀹為檯寮�濮嬫椂闂�
+//            null,    // 瀹為檯缁撴潫鏃堕棿
+//            null,    // 鑺傜偣瓒呮椂鏃堕棿
+//            null,    // 鎵ц鑰楁椂(绉�)
+//            null,    // 鑺傜偣閲嶈瘯娆℃暟[闈炵┖]
+//            null,    // 鑺傜偣鏈�澶ч噸璇曟鏁癧闈炵┖]
+//            null,    // 渚濊禆鐨勫墠缃妭鐐瑰垪琛�
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getEstimatedStartTime$(){
+        if (Cools.isEmpty(this.estimatedStartTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.estimatedStartTime);
+    }
+
+    public String getActualStartTime$(){
+        if (Cools.isEmpty(this.actualStartTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.actualStartTime);
+    }
+
+    public String getActualEndTime$(){
+        if (Cools.isEmpty(this.actualEndTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.actualEndTime);
+    }
+
+    public String getTimeoutAt$(){
+        if (Cools.isEmpty(this.timeoutAt)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.timeoutAt);
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplate.java
new file mode 100644
index 0000000..6b33330
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplate.java
@@ -0,0 +1,254 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_task_path_template")
+public class TaskPathTemplate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @ApiModelProperty(value= "涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 妯℃澘缂栫爜锛屽敮涓�鏍囪瘑
+     */
+    @ApiModelProperty(value= "妯℃澘缂栫爜锛屽敮涓�鏍囪瘑")
+    private String templateCode;
+
+    /**
+     * 妯℃澘鍚嶇О
+     */
+    @ApiModelProperty(value= "妯℃澘鍚嶇О")
+    private String templateName;
+
+    /**
+     * 璧风偣绫诲瀷/璧风偣绯荤粺鏍囪瘑
+     */
+    @ApiModelProperty(value= "璧风偣绫诲瀷/璧风偣绯荤粺鏍囪瘑")
+    private String sourceType;
+
+    /**
+     * 缁堢偣绫诲瀷/缁堢偣绯荤粺鏍囪瘑
+     */
+    @ApiModelProperty(value= "缁堢偣绫诲瀷/缁堢偣绯荤粺鏍囪瘑")
+    private String targetType;
+
+    /**
+     * 鏉′欢琛ㄨ揪寮�(JSON)锛岀敤浜庢洿澶嶆潅鐨勫尮閰�
+     */
+    @ApiModelProperty(value= "鏉′欢琛ㄨ揪寮�(JSON)锛岀敤浜庢洿澶嶆潅鐨勫尮閰�")
+    private String conditionExpression;
+
+    /**
+     * 鏉′欢鎻忚堪锛屼汉宸ュ彲璇�
+     */
+    @ApiModelProperty(value= "鏉′欢鎻忚堪锛屼汉宸ュ彲璇�")
+    private String conditionDesc;
+
+    /**
+     * 鐗堟湰鍙�
+     */
+    @ApiModelProperty(value= "鐗堟湰鍙�")
+    private Integer version;
+
+    /**
+     * 鏄惁涓哄綋鍓嶇敓鏁堢増鏈� 0-鍚� 1-鏄�
+     */
+    @ApiModelProperty(value= "鏄惁涓哄綋鍓嶇敓鏁堢増鏈� 0-鍚� 1-鏄�")
+    private Short isCurrent;
+
+    /**
+     * 鐢熸晥鏃堕棿
+     */
+    @ApiModelProperty(value= "鐢熸晥鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date effectiveTime;
+
+    /**
+     * 澶辨晥鏃堕棿
+     */
+    @ApiModelProperty(value= "澶辨晥鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date expireTime;
+
+    /**
+     * 浼樺厛绾� 1-10锛屾暟瀛楄秺灏忎紭鍏堢骇瓒婇珮
+     */
+    @ApiModelProperty(value= "浼樺厛绾� 1-10锛屾暟瀛楄秺灏忎紭鍏堢骇瓒婇珮")
+    private Short priority;
+
+    /**
+     * 鏁翠綋瓒呮椂鏃堕棿(鍒嗛挓)
+     */
+    @ApiModelProperty(value= "鏁翠綋瓒呮椂鏃堕棿(鍒嗛挓)")
+    private Integer timeoutMinutes;
+
+    /**
+     * 鏈�澶ч噸璇曟鏁�
+     */
+    @ApiModelProperty(value= "鏈�澶ч噸璇曟鏁�")
+    private Integer maxRetryTimes;
+
+    /**
+     * 閲嶈瘯闂撮殧(绉�)
+     */
+    @ApiModelProperty(value= "閲嶈瘯闂撮殧(绉�)")
+    private Integer retryIntervalSeconds;
+
+    /**
+     * 鐘舵�� 0-绂佺敤 1-鍚敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 0-绂佺敤 1-鍚敤")
+    private Short status;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String remark;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value= "鍒涘缓浜�")
+    private Long createBy;
+
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty(value= "鏇存柊浜�")
+    private Long updateBy;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public TaskPathTemplate() {}
+
+    public TaskPathTemplate(String templateCode,String templateName,String sourceType,String targetType,String conditionExpression,String conditionDesc,Integer version,Short isCurrent,Date effectiveTime,Date expireTime,Short priority,Integer timeoutMinutes,Integer maxRetryTimes,Integer retryIntervalSeconds,Short status,String remark,Long createBy,Long updateBy,Date createTime,Date updateTime) {
+        this.templateCode = templateCode;
+        this.templateName = templateName;
+        this.sourceType = sourceType;
+        this.targetType = targetType;
+        this.conditionExpression = conditionExpression;
+        this.conditionDesc = conditionDesc;
+        this.version = version;
+        this.isCurrent = isCurrent;
+        this.effectiveTime = effectiveTime;
+        this.expireTime = expireTime;
+        this.priority = priority;
+        this.timeoutMinutes = timeoutMinutes;
+        this.maxRetryTimes = maxRetryTimes;
+        this.retryIntervalSeconds = retryIntervalSeconds;
+        this.status = status;
+        this.remark = remark;
+        this.createBy = createBy;
+        this.updateBy = updateBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    TaskPathTemplate taskPathTemplate = new TaskPathTemplate(
+//            null,    // 妯℃澘缂栫爜锛屽敮涓�鏍囪瘑[闈炵┖]
+//            null,    // 妯℃澘鍚嶇О[闈炵┖]
+//            null,    // 璧风偣绫诲瀷/璧风偣绯荤粺鏍囪瘑[闈炵┖]
+//            null,    // 缁堢偣绫诲瀷/缁堢偣绯荤粺鏍囪瘑[闈炵┖]
+//            null,    // 鏉′欢琛ㄨ揪寮�(JSON)锛岀敤浜庢洿澶嶆潅鐨勫尮閰�
+//            null,    // 鏉′欢鎻忚堪锛屼汉宸ュ彲璇�
+//            null,    // 鐗堟湰鍙穂闈炵┖]
+//            null,    // 鏄惁涓哄綋鍓嶇敓鏁堢増鏈� 0-鍚� 1-鏄痆闈炵┖]
+//            null,    // 鐢熸晥鏃堕棿[闈炵┖]
+//            null,    // 澶辨晥鏃堕棿
+//            null,    // 浼樺厛绾� 1-10锛屾暟瀛楄秺灏忎紭鍏堢骇瓒婇珮[闈炵┖]
+//            null,    // 鏁翠綋瓒呮椂鏃堕棿(鍒嗛挓)
+//            null,    // 鏈�澶ч噸璇曟鏁癧闈炵┖]
+//            null,    // 閲嶈瘯闂撮殧(绉�)[闈炵┖]
+//            null,    // 鐘舵�� 0-绂佺敤 1-鍚敤[闈炵┖]
+//            null,    // 澶囨敞
+//            null,    // 鍒涘缓浜�
+//            null,    // 鏇存柊浜�
+//            null,    // 鍒涘缓鏃堕棿
+//            null    // 鏇存柊鏃堕棿
+//    );
+
+    public String getEffectiveTime$(){
+        if (Cools.isEmpty(this.effectiveTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.effectiveTime);
+    }
+
+    public String getExpireTime$(){
+        if (Cools.isEmpty(this.expireTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.expireTime);
+    }
+
+    public String getCreatedTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdatedTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplateNode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplateNode.java
new file mode 100644
index 0000000..709012e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/TaskPathTemplateNode.java
@@ -0,0 +1,205 @@
+package com.vincent.rsf.server.system.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("mission_task_path_template_node")
+public class TaskPathTemplateNode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈template.id
+     */
+    @ApiModelProperty(value= "鍏宠仈template.id")
+    private Long templateId;
+
+    /**
+     * 妯℃澘缂栫爜锛屽啑浣欏瓨鍌ㄤ究浜庢煡璇�
+     */
+    @ApiModelProperty(value= "妯℃澘缂栫爜锛屽啑浣欏瓨鍌ㄤ究浜庢煡璇�")
+    private String templateCode;
+
+    /**
+     * 鑺傜偣椤哄簭锛屼粠1寮�濮�
+     */
+    @ApiModelProperty(value= "鑺傜偣椤哄簭锛屼粠1寮�濮�")
+    private Integer nodeOrder;
+
+    /**
+     * 鑺傜偣缂栫爜锛屽锛欳_SYSTEM, D_SYSTEM
+     */
+    @ApiModelProperty(value= "鑺傜偣缂栫爜锛屽锛欳_SYSTEM, D_SYSTEM")
+    private String nodeCode;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    @ApiModelProperty(value= "鑺傜偣鍚嶇О")
+    private String nodeName;
+
+    /**
+     * 鑺傜偣绫诲瀷锛欵XECUTE-鎵ц鑺傜偣, CHECK-妫�鏌ョ偣, DECISION-鍐崇瓥鐐�
+     */
+    @ApiModelProperty(value= "鑺傜偣绫诲瀷锛欵XECUTE-鎵ц鑺傜偣, CHECK-妫�鏌ョ偣, DECISION-鍐崇瓥鐐�")
+    private String nodeType;
+
+    /**
+     * 瀵瑰簲鐨勫瓙绯荤粺缂栫爜
+     */
+    @ApiModelProperty(value= "瀵瑰簲鐨勫瓙绯荤粺缂栫爜")
+    private String systemCode;
+
+    /**
+     * 瀛愮郴缁熷悕绉�
+     */
+    @ApiModelProperty(value= "瀛愮郴缁熷悕绉�")
+    private String systemName;
+
+    /**
+     * 鑺傜偣鎵ц鍙傛暟妯℃澘(JSON)
+     */
+    @ApiModelProperty(value= "鑺傜偣鎵ц鍙傛暟妯℃澘(JSON)")
+    private String executeParams;
+
+    /**
+     * 鏈熸湜鐨勭粨鏋滄暟鎹牸寮�(JSON Schema)
+     */
+    @ApiModelProperty(value= "鏈熸湜鐨勭粨鏋滄暟鎹牸寮�(JSON Schema)")
+    private String resultSchema;
+
+    /**
+     * 鑺傜偣瓒呮椂鏃堕棿(鍒嗛挓)锛屼负绌哄垯浣跨敤妯℃澘鐨�
+     */
+    @ApiModelProperty(value= "鑺傜偣瓒呮椂鏃堕棿(鍒嗛挓)锛屼负绌哄垯浣跨敤妯℃澘鐨�")
+    private Integer timeoutMinutes;
+
+    /**
+     * 鏄惁蹇呴』鑺傜偣 0-鍙�� 1-蹇呴』
+     */
+    @ApiModelProperty(value= "鏄惁蹇呴』鑺傜偣 0-鍙�� 1-蹇呴』")
+    private Short mandatory;
+
+    /**
+     * 鏄惁鍙苟琛屾墽琛� 0-鍚� 1-鏄�
+     */
+    @ApiModelProperty(value= "鏄惁鍙苟琛屾墽琛� 0-鍚� 1-鏄�")
+    private Short parallelExecutable;
+
+    /**
+     * 鎵ц鍓嶇疆鏉′欢
+     */
+    @ApiModelProperty(value= "鎵ц鍓嶇疆鏉′欢")
+    private String preCondition;
+
+    /**
+     * 鎵ц鍚庣疆鏉′欢
+     */
+    @ApiModelProperty(value= "鎵ц鍚庣疆鏉′欢")
+    private String postCondition;
+
+    /**
+     * 涓嬩竴鑺傜偣璺敱瑙勫垯
+     */
+    @ApiModelProperty(value= "涓嬩竴鑺傜偣璺敱瑙勫垯")
+    private String nextNodeRules;
+
+    @ApiModelProperty(value= "")
+    private Long createBy;
+
+    @ApiModelProperty(value= "")
+    private Long updateBy;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @ApiModelProperty(value= "")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public TaskPathTemplateNode() {}
+
+    public TaskPathTemplateNode(Long templateId,String templateCode,Integer nodeOrder,String nodeCode,String nodeName,String nodeType,String systemCode,String systemName,String executeParams,String resultSchema,Integer timeoutMinutes,Short mandatory,Short parallelExecutable,String preCondition,String postCondition,String nextNodeRules,Long createBy,Long updateBy,Date createTime,Date updateTime) {
+        this.templateId = templateId;
+        this.templateCode = templateCode;
+        this.nodeOrder = nodeOrder;
+        this.nodeCode = nodeCode;
+        this.nodeName = nodeName;
+        this.nodeType = nodeType;
+        this.systemCode = systemCode;
+        this.systemName = systemName;
+        this.executeParams = executeParams;
+        this.resultSchema = resultSchema;
+        this.timeoutMinutes = timeoutMinutes;
+        this.mandatory = mandatory;
+        this.parallelExecutable = parallelExecutable;
+        this.preCondition = preCondition;
+        this.postCondition = postCondition;
+        this.nextNodeRules = nextNodeRules;
+        this.createBy = createBy;
+        this.updateBy = updateBy;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+    }
+
+//    TaskPathTemplateNode taskPathTemplateNode = new TaskPathTemplateNode(
+//            null,    // 鍏宠仈template.id[闈炵┖]
+//            null,    // 妯℃澘缂栫爜锛屽啑浣欏瓨鍌ㄤ究浜庢煡璇闈炵┖]
+//            null,    // 鑺傜偣椤哄簭锛屼粠1寮�濮媅闈炵┖]
+//            null,    // 鑺傜偣缂栫爜锛屽锛欳_SYSTEM, D_SYSTEM[闈炵┖]
+//            null,    // 鑺傜偣鍚嶇О[闈炵┖]
+//            null,    // 鑺傜偣绫诲瀷锛欵XECUTE-鎵ц鑺傜偣, CHECK-妫�鏌ョ偣, DECISION-鍐崇瓥鐐筟闈炵┖]
+//            null,    // 瀵瑰簲鐨勫瓙绯荤粺缂栫爜[闈炵┖]
+//            null,    // 瀛愮郴缁熷悕绉�
+//            null,    // 鑺傜偣鎵ц鍙傛暟妯℃澘(JSON)
+//            null,    // 鏈熸湜鐨勭粨鏋滄暟鎹牸寮�(JSON Schema)
+//            null,    // 鑺傜偣瓒呮椂鏃堕棿(鍒嗛挓)锛屼负绌哄垯浣跨敤妯℃澘鐨�
+//            null,    // 鏄惁蹇呴』鑺傜偣 0-鍙�� 1-蹇呴』[闈炵┖]
+//            null,    // 鏄惁鍙苟琛屾墽琛� 0-鍚� 1-鏄�
+//            null,    // 鎵ц鍓嶇疆鏉′欢
+//            null,    // 鎵ц鍚庣疆鏉′欢
+//            null,    // 涓嬩竴鑺傜偣璺敱瑙勫垯
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowInstanceMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowInstanceMapper.java
new file mode 100644
index 0000000..9c9b7a9
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowInstanceMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.FlowInstance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface FlowInstanceMapper extends BaseMapper<FlowInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepInstanceMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepInstanceMapper.java
new file mode 100644
index 0000000..20dd85d
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepInstanceMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.FlowStepInstance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface FlowStepInstanceMapper extends BaseMapper<FlowStepInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepLogMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepLogMapper.java
new file mode 100644
index 0000000..a56d426
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepLogMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.FlowStepLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface FlowStepLogMapper extends BaseMapper<FlowStepLog> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepTemplateMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepTemplateMapper.java
new file mode 100644
index 0000000..006ac22
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/FlowStepTemplateMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.FlowStepTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface FlowStepTemplateMapper extends BaseMapper<FlowStepTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/SubsystemFlowTemplateMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/SubsystemFlowTemplateMapper.java
new file mode 100644
index 0000000..7ced37b
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/SubsystemFlowTemplateMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.SubsystemFlowTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface SubsystemFlowTemplateMapper extends BaseMapper<SubsystemFlowTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceMapper.java
new file mode 100644
index 0000000..c026657
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.TaskInstance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface TaskInstanceMapper extends BaseMapper<TaskInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceNodeMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceNodeMapper.java
new file mode 100644
index 0000000..8e6168a
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskInstanceNodeMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.TaskInstanceNode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface TaskInstanceNodeMapper extends BaseMapper<TaskInstanceNode> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateMapper.java
new file mode 100644
index 0000000..a78a1a4
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.TaskPathTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface TaskPathTemplateMapper extends BaseMapper<TaskPathTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateNodeMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateNodeMapper.java
new file mode 100644
index 0000000..471003e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/mapper/TaskPathTemplateNodeMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.mapper;
+
+import com.vincent.rsf.server.system.entity.TaskPathTemplateNode;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface TaskPathTemplateNodeMapper extends BaseMapper<TaskPathTemplateNode> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowInstanceService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowInstanceService.java
new file mode 100644
index 0000000..3eecb62
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowInstanceService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.FlowInstance;
+
+public interface FlowInstanceService extends IService<FlowInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepInstanceService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepInstanceService.java
new file mode 100644
index 0000000..ac336ea
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepInstanceService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.FlowStepInstance;
+
+public interface FlowStepInstanceService extends IService<FlowStepInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepLogService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepLogService.java
new file mode 100644
index 0000000..f50d184
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepLogService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.FlowStepLog;
+
+public interface FlowStepLogService extends IService<FlowStepLog> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepTemplateService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepTemplateService.java
new file mode 100644
index 0000000..240c49e
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/FlowStepTemplateService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.FlowStepTemplate;
+
+public interface FlowStepTemplateService extends IService<FlowStepTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/SubsystemFlowTemplateService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/SubsystemFlowTemplateService.java
new file mode 100644
index 0000000..a8c0429
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/SubsystemFlowTemplateService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.SubsystemFlowTemplate;
+
+public interface SubsystemFlowTemplateService extends IService<SubsystemFlowTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceNodeService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceNodeService.java
new file mode 100644
index 0000000..3dc9590
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceNodeService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.TaskInstanceNode;
+
+public interface TaskInstanceNodeService extends IService<TaskInstanceNode> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceService.java
new file mode 100644
index 0000000..9636c59
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskInstanceService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.TaskInstance;
+
+public interface TaskInstanceService extends IService<TaskInstance> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateNodeService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateNodeService.java
new file mode 100644
index 0000000..c317557
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateNodeService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.TaskPathTemplateNode;
+
+public interface TaskPathTemplateNodeService extends IService<TaskPathTemplateNode> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateService.java
new file mode 100644
index 0000000..8a44fd4
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/TaskPathTemplateService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.system.entity.TaskPathTemplate;
+
+public interface TaskPathTemplateService extends IService<TaskPathTemplate> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowInstanceServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowInstanceServiceImpl.java
new file mode 100644
index 0000000..1d95d97
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowInstanceServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.FlowInstanceMapper;
+import com.vincent.rsf.server.system.entity.FlowInstance;
+import com.vincent.rsf.server.system.service.FlowInstanceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("flowInstanceService")
+public class FlowInstanceServiceImpl extends ServiceImpl<FlowInstanceMapper, FlowInstance> implements FlowInstanceService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepInstanceServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepInstanceServiceImpl.java
new file mode 100644
index 0000000..6472db6
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepInstanceServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.FlowStepInstanceMapper;
+import com.vincent.rsf.server.system.entity.FlowStepInstance;
+import com.vincent.rsf.server.system.service.FlowStepInstanceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("flowStepInstanceService")
+public class FlowStepInstanceServiceImpl extends ServiceImpl<FlowStepInstanceMapper, FlowStepInstance> implements FlowStepInstanceService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepLogServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepLogServiceImpl.java
new file mode 100644
index 0000000..053e5f5
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepLogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.FlowStepLogMapper;
+import com.vincent.rsf.server.system.entity.FlowStepLog;
+import com.vincent.rsf.server.system.service.FlowStepLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("flowStepLogService")
+public class FlowStepLogServiceImpl extends ServiceImpl<FlowStepLogMapper, FlowStepLog> implements FlowStepLogService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepTemplateServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepTemplateServiceImpl.java
new file mode 100644
index 0000000..bdaf9e3
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/FlowStepTemplateServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.FlowStepTemplateMapper;
+import com.vincent.rsf.server.system.entity.FlowStepTemplate;
+import com.vincent.rsf.server.system.service.FlowStepTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("flowStepTemplateService")
+public class FlowStepTemplateServiceImpl extends ServiceImpl<FlowStepTemplateMapper, FlowStepTemplate> implements FlowStepTemplateService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/SubsystemFlowTemplateServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/SubsystemFlowTemplateServiceImpl.java
new file mode 100644
index 0000000..cb1f107
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/SubsystemFlowTemplateServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.SubsystemFlowTemplateMapper;
+import com.vincent.rsf.server.system.entity.SubsystemFlowTemplate;
+import com.vincent.rsf.server.system.service.SubsystemFlowTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("subsystemFlowTemplateService")
+public class SubsystemFlowTemplateServiceImpl extends ServiceImpl<SubsystemFlowTemplateMapper, SubsystemFlowTemplate> implements SubsystemFlowTemplateService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceNodeServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceNodeServiceImpl.java
new file mode 100644
index 0000000..33b656f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceNodeServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.TaskInstanceNodeMapper;
+import com.vincent.rsf.server.system.entity.TaskInstanceNode;
+import com.vincent.rsf.server.system.service.TaskInstanceNodeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("taskInstanceNodeService")
+public class TaskInstanceNodeServiceImpl extends ServiceImpl<TaskInstanceNodeMapper, TaskInstanceNode> implements TaskInstanceNodeService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceServiceImpl.java
new file mode 100644
index 0000000..dacf320
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskInstanceServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.TaskInstanceMapper;
+import com.vincent.rsf.server.system.entity.TaskInstance;
+import com.vincent.rsf.server.system.service.TaskInstanceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("taskInstanceService")
+public class TaskInstanceServiceImpl extends ServiceImpl<TaskInstanceMapper, TaskInstance> implements TaskInstanceService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateNodeServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateNodeServiceImpl.java
new file mode 100644
index 0000000..ab73fea
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateNodeServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.TaskPathTemplateNodeMapper;
+import com.vincent.rsf.server.system.entity.TaskPathTemplateNode;
+import com.vincent.rsf.server.system.service.TaskPathTemplateNodeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("taskPathTemplateNodeService")
+public class TaskPathTemplateNodeServiceImpl extends ServiceImpl<TaskPathTemplateNodeMapper, TaskPathTemplateNode> implements TaskPathTemplateNodeService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateServiceImpl.java
new file mode 100644
index 0000000..25edcfa
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/TaskPathTemplateServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.system.service.impl;
+
+import com.vincent.rsf.server.system.mapper.TaskPathTemplateMapper;
+import com.vincent.rsf.server.system.entity.TaskPathTemplate;
+import com.vincent.rsf.server.system.service.TaskPathTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("taskPathTemplateService")
+public class TaskPathTemplateServiceImpl extends ServiceImpl<TaskPathTemplateMapper, TaskPathTemplate> implements TaskPathTemplateService {
+
+}
diff --git a/rsf-server/src/main/java/flowInstance.sql b/rsf-server/src/main/java/flowInstance.sql
new file mode 100644
index 0000000..ffe72da
--- /dev/null
+++ b/rsf-server/src/main/java/flowInstance.sql
@@ -0,0 +1,42 @@
+-- save flowInstance record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.flowInstance', '0', '/system/flowInstance', 'flowInstance', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀹炰緥鍖栧瓙娴佺▼涓昏〃', '', '1', 'system:flowInstance:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀹炰緥鍖栧瓙娴佺▼涓昏〃', '', '1', 'system:flowInstance:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀹炰緥鍖栧瓙娴佺▼涓昏〃', '', '1', 'system:flowInstance:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀹炰緥鍖栧瓙娴佺▼涓昏〃', '', '1', 'system:flowInstance:remove', '3', '1', '1');
+
+-- locale menu name
+flowInstance: 'FlowInstance',
+
+-- locale field
+flowInstance: {
+    flowInstanceNo: "flowInstanceNo",
+    taskId: "taskId",
+    taskNo: "taskNo",
+    nodeInstanceId: "nodeInstanceId",
+    nodeCode: "nodeCode",
+    flowTemplateId: "flowTemplateId",
+    flowTemplateCode: "flowTemplateCode",
+    templateVersion: "templateVersion",
+    currentStepCode: "currentStepCode",
+    currentStepOrder: "currentStepOrder",
+    executeParams: "executeParams",
+    executeResult: "executeResult",
+    errorCode: "errorCode",
+    errorMessage: "errorMessage",
+    startTime: "startTime",
+    endTime: "endTime",
+    timeoutAt: "timeoutAt",
+    durationSeconds: "durationSeconds",
+    retryTimes: "retryTimes",
+    lastRetryTime: "lastRetryTime",
+    contextData: "contextData",
+},
+
+-- ResourceContent
+import flowInstance from './flowInstance';
+
+case 'flowInstance':
+    return flowInstance;
diff --git a/rsf-server/src/main/java/flowStepInstance.sql b/rsf-server/src/main/java/flowStepInstance.sql
new file mode 100644
index 0000000..e96746e
--- /dev/null
+++ b/rsf-server/src/main/java/flowStepInstance.sql
@@ -0,0 +1,37 @@
+-- save flowStepInstance record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.flowStepInstance', '0', '/system/flowStepInstance', 'flowStepInstance', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀛愭祦绋嬫楠ゅ疄渚�', '', '1', 'system:flowStepInstance:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀛愭祦绋嬫楠ゅ疄渚�', '', '1', 'system:flowStepInstance:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀛愭祦绋嬫楠ゅ疄渚�', '', '1', 'system:flowStepInstance:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀛愭祦绋嬫楠ゅ疄渚�', '', '1', 'system:flowStepInstance:remove', '3', '1', '1');
+
+-- locale menu name
+flowStepInstance: 'FlowStepInstance',
+
+-- locale field
+flowStepInstance: {
+    flowInstanceId: "flowInstanceId",
+    flowInstanceNo: "flowInstanceNo",
+    stepOrder: "stepOrder",
+    stepCode: "stepCode",
+    stepName: "stepName",
+    stepType: "stepType",
+    stepTemplateId: "stepTemplateId",
+    executeResult: "executeResult",
+    errorCode: "errorCode",
+    errorMessage: "errorMessage",
+    startTime: "startTime",
+    endTime: "endTime",
+    durationSeconds: "durationSeconds",
+    inputData: "inputData",
+    outputData: "outputData",
+    retryTimes: "retryTimes",
+},
+
+-- ResourceContent
+import flowStepInstance from './flowStepInstance';
+
+case 'flowStepInstance':
+    return flowStepInstance;
diff --git a/rsf-server/src/main/java/flowStepLog.sql b/rsf-server/src/main/java/flowStepLog.sql
new file mode 100644
index 0000000..e83280d
--- /dev/null
+++ b/rsf-server/src/main/java/flowStepLog.sql
@@ -0,0 +1,28 @@
+-- save flowStepLog record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.flowStepLog', '0', '/system/flowStepLog', 'flowStepLog', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 姝ラ鎵ц鏃ュ織', '', '1', 'system:flowStepLog:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 姝ラ鎵ц鏃ュ織', '', '1', 'system:flowStepLog:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 姝ラ鎵ц鏃ュ織', '', '1', 'system:flowStepLog:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 姝ラ鎵ц鏃ュ織', '', '1', 'system:flowStepLog:remove', '3', '1', '1');
+
+-- locale menu name
+flowStepLog: 'FlowStepLog',
+
+-- locale field
+flowStepLog: {
+    flowInstanceId: "flowInstanceId",
+    stepInstanceId: "stepInstanceId",
+    logType: "logType",
+    logLevel: "logLevel",
+    logContent: "logContent",
+    requestData: "requestData",
+    responseData: "responseData",
+},
+
+-- ResourceContent
+import flowStepLog from './flowStepLog';
+
+case 'flowStepLog':
+    return flowStepLog;
diff --git a/rsf-server/src/main/java/flowStepTemplate.sql b/rsf-server/src/main/java/flowStepTemplate.sql
new file mode 100644
index 0000000..1058115
--- /dev/null
+++ b/rsf-server/src/main/java/flowStepTemplate.sql
@@ -0,0 +1,36 @@
+-- save flowStepTemplate record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.flowStepTemplate', '0', '/system/flowStepTemplate', 'flowStepTemplate', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀛愭祦绋嬫楠ゆā鏉�', '', '1', 'system:flowStepTemplate:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀛愭祦绋嬫楠ゆā鏉�', '', '1', 'system:flowStepTemplate:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀛愭祦绋嬫楠ゆā鏉�', '', '1', 'system:flowStepTemplate:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀛愭祦绋嬫楠ゆā鏉�', '', '1', 'system:flowStepTemplate:remove', '3', '1', '1');
+
+-- locale menu name
+flowStepTemplate: 'FlowStepTemplate',
+
+-- locale field
+flowStepTemplate: {
+    flowId: "flowId",
+    flowCode: "flowCode",
+    stepOrder: "stepOrder",
+    stepCode: "stepCode",
+    stepName: "stepName",
+    stepType: "stepType",
+    actionType: "actionType",
+    actionConfig: "actionConfig",
+    inputMapping: "inputMapping",
+    outputMapping: "outputMapping",
+    conditionExpression: "conditionExpression",
+    skipOnFail: "skipOnFail",
+    retryEnabled: "retryEnabled",
+    retryConfig: "retryConfig",
+    timeoutSeconds: "timeoutSeconds",
+},
+
+-- ResourceContent
+import flowStepTemplate from './flowStepTemplate';
+
+case 'flowStepTemplate':
+    return flowStepTemplate;
diff --git a/rsf-server/src/main/java/subsystemFlowTemplate.sql b/rsf-server/src/main/java/subsystemFlowTemplate.sql
new file mode 100644
index 0000000..472f315
--- /dev/null
+++ b/rsf-server/src/main/java/subsystemFlowTemplate.sql
@@ -0,0 +1,35 @@
+-- save subsystemFlowTemplate record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.subsystemFlowTemplate', '0', '/system/subsystemFlowTemplate', 'subsystemFlowTemplate', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀛愮郴缁熸ā鏉�', '', '1', 'system:subsystemFlowTemplate:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀛愮郴缁熸ā鏉�', '', '1', 'system:subsystemFlowTemplate:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀛愮郴缁熸ā鏉�', '', '1', 'system:subsystemFlowTemplate:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀛愮郴缁熸ā鏉�', '', '1', 'system:subsystemFlowTemplate:remove', '3', '1', '1');
+
+-- locale menu name
+subsystemFlowTemplate: 'SubsystemFlowTemplate',
+
+-- locale field
+subsystemFlowTemplate: {
+    flowCode: "flowCode",
+    flowName: "flowName",
+    systemCode: "systemCode",
+    systemName: "systemName",
+    nodeType: "nodeType",
+    version: "version",
+    isCurrent: "isCurrent",
+    effectiveTime: "effectiveTime",
+    timeoutStrategy: "timeoutStrategy",
+    timeoutSeconds: "timeoutSeconds",
+    maxRetryTimes: "maxRetryTimes",
+    needNotify: "needNotify",
+    notifyTemplate: "notifyTemplate",
+    remark: "remark",
+},
+
+-- ResourceContent
+import subsystemFlowTemplate from './subsystemFlowTemplate';
+
+case 'subsystemFlowTemplate':
+    return subsystemFlowTemplate;
diff --git a/rsf-server/src/main/java/taskInstance.sql b/rsf-server/src/main/java/taskInstance.sql
new file mode 100644
index 0000000..a68f9f3
--- /dev/null
+++ b/rsf-server/src/main/java/taskInstance.sql
@@ -0,0 +1,51 @@
+-- save taskInstance record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.taskInstance', '0', '/system/taskInstance', 'taskInstance', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 瀹為檯浠诲姟涓昏〃', '', '1', 'system:taskInstance:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 瀹為檯浠诲姟涓昏〃', '', '1', 'system:taskInstance:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 瀹為檯浠诲姟涓昏〃', '', '1', 'system:taskInstance:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 瀹為檯浠诲姟涓昏〃', '', '1', 'system:taskInstance:remove', '3', '1', '1');
+
+-- locale menu name
+taskInstance: 'TaskInstance',
+
+-- locale field
+taskInstance: {
+    taskNo: "taskNo",
+    bizNo: "bizNo",
+    bizType: "bizType",
+    templateId: "templateId",
+    templateCode: "templateCode",
+    templateVersion: "templateVersion",
+    sourceInfo: "sourceInfo",
+    targetInfo: "targetInfo",
+    sourceCode: "sourceCode",
+    targetCode: "targetCode",
+    plannedPath: "plannedPath",
+    actualPath: "actualPath",
+    priority: "priority",
+    timeoutAt: "timeoutAt",
+    currentNodeCode: "currentNodeCode",
+    currentNodeName: "currentNodeName",
+    totalNodes: "totalNodes",
+    completedNodes: "completedNodes",
+    progressRate: "progressRate",
+    estimatedDurationMinutes: "estimatedDurationMinutes",
+    actualDurationMinutes: "actualDurationMinutes",
+    startTime: "startTime",
+    endTime: "endTime",
+    resultCode: "resultCode",
+    resultMessage: "resultMessage",
+    resultData: "resultData",
+    retryTimes: "retryTimes",
+    lastRetryTime: "lastRetryTime",
+    extParams: "extParams",
+    remark: "remark",
+},
+
+-- ResourceContent
+import taskInstance from './taskInstance';
+
+case 'taskInstance':
+    return taskInstance;
diff --git a/rsf-server/src/main/java/taskInstanceNode.sql b/rsf-server/src/main/java/taskInstanceNode.sql
new file mode 100644
index 0000000..ab66dc1
--- /dev/null
+++ b/rsf-server/src/main/java/taskInstanceNode.sql
@@ -0,0 +1,41 @@
+-- save taskInstanceNode record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.taskInstanceNode', '0', '/system/taskInstanceNode', 'taskInstanceNode', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 浠诲姟鎵ц鑺傜偣鏄庣粏琛�', '', '1', 'system:taskInstanceNode:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 浠诲姟鎵ц鑺傜偣鏄庣粏琛�', '', '1', 'system:taskInstanceNode:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 浠诲姟鎵ц鑺傜偣鏄庣粏琛�', '', '1', 'system:taskInstanceNode:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 浠诲姟鎵ц鑺傜偣鏄庣粏琛�', '', '1', 'system:taskInstanceNode:remove', '3', '1', '1');
+
+-- locale menu name
+taskInstanceNode: 'TaskInstanceNode',
+
+-- locale field
+taskInstanceNode: {
+    taskId: "taskId",
+    taskNo: "taskNo",
+    nodeOrder: "nodeOrder",
+    nodeCode: "nodeCode",
+    nodeName: "nodeName",
+    nodeType: "nodeType",
+    systemCode: "systemCode",
+    systemName: "systemName",
+    executeParams: "executeParams",
+    executeResult: "executeResult",
+    errorCode: "errorCode",
+    errorMessage: "errorMessage",
+    estimatedStartTime: "estimatedStartTime",
+    actualStartTime: "actualStartTime",
+    actualEndTime: "actualEndTime",
+    timeoutAt: "timeoutAt",
+    durationSeconds: "durationSeconds",
+    retryTimes: "retryTimes",
+    maxRetryTimes: "maxRetryTimes",
+    dependsOnNodes: "dependsOnNodes",
+},
+
+-- ResourceContent
+import taskInstanceNode from './taskInstanceNode';
+
+case 'taskInstanceNode':
+    return taskInstanceNode;
diff --git a/rsf-server/src/main/java/taskPathTemplate.sql b/rsf-server/src/main/java/taskPathTemplate.sql
new file mode 100644
index 0000000..9ec4a4f
--- /dev/null
+++ b/rsf-server/src/main/java/taskPathTemplate.sql
@@ -0,0 +1,40 @@
+-- save taskPathTemplate record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.taskPathTemplate', '0', '/system/taskPathTemplate', 'taskPathTemplate', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 璺緞妯℃澘涓昏〃', '', '1', 'system:taskPathTemplate:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 璺緞妯℃澘涓昏〃', '', '1', 'system:taskPathTemplate:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 璺緞妯℃澘涓昏〃', '', '1', 'system:taskPathTemplate:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 璺緞妯℃澘涓昏〃', '', '1', 'system:taskPathTemplate:remove', '3', '1', '1');
+
+-- locale menu name
+taskPathTemplate: 'TaskPathTemplate',
+
+-- locale field
+taskPathTemplate: {
+    templateCode: "templateCode",
+    templateName: "templateName",
+    sourceType: "sourceType",
+    targetType: "targetType",
+    conditionExpression: "conditionExpression",
+    conditionDesc: "conditionDesc",
+    version: "version",
+    isCurrent: "isCurrent",
+    effectiveTime: "effectiveTime",
+    expireTime: "expireTime",
+    priority: "priority",
+    timeoutMinutes: "timeoutMinutes",
+    maxRetryTimes: "maxRetryTimes",
+    retryIntervalSeconds: "retryIntervalSeconds",
+    remark: "remark",
+    createdBy: "createdBy",
+    updatedBy: "updatedBy",
+    createdTime: "createdTime",
+    updatedTime: "updatedTime",
+},
+
+-- ResourceContent
+import taskPathTemplate from './taskPathTemplate';
+
+case 'taskPathTemplate':
+    return taskPathTemplate;
diff --git a/rsf-server/src/main/java/taskPathTemplateNode.sql b/rsf-server/src/main/java/taskPathTemplateNode.sql
new file mode 100644
index 0000000..558dbea
--- /dev/null
+++ b/rsf-server/src/main/java/taskPathTemplateNode.sql
@@ -0,0 +1,37 @@
+-- save taskPathTemplateNode record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.taskPathTemplateNode', '0', '/system/taskPathTemplateNode', 'taskPathTemplateNode', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 璺緞鑺傜偣鏄庣粏琛�', '', '1', 'system:taskPathTemplateNode:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 璺緞鑺傜偣鏄庣粏琛�', '', '1', 'system:taskPathTemplateNode:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 璺緞鑺傜偣鏄庣粏琛�', '', '1', 'system:taskPathTemplateNode:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 璺緞鑺傜偣鏄庣粏琛�', '', '1', 'system:taskPathTemplateNode:remove', '3', '1', '1');
+
+-- locale menu name
+taskPathTemplateNode: 'TaskPathTemplateNode',
+
+-- locale field
+taskPathTemplateNode: {
+    templateId: "templateId",
+    templateCode: "templateCode",
+    nodeOrder: "nodeOrder",
+    nodeCode: "nodeCode",
+    nodeName: "nodeName",
+    nodeType: "nodeType",
+    systemCode: "systemCode",
+    systemName: "systemName",
+    executeParams: "executeParams",
+    resultSchema: "resultSchema",
+    timeoutMinutes: "timeoutMinutes",
+    mandatory: "mandatory",
+    parallelExecutable: "parallelExecutable",
+    preCondition: "preCondition",
+    postCondition: "postCondition",
+    nextNodeRules: "nextNodeRules",
+},
+
+-- ResourceContent
+import taskPathTemplateNode from './taskPathTemplateNode';
+
+case 'taskPathTemplateNode':
+    return taskPathTemplateNode;
diff --git a/rsf-server/src/main/resources/mapper/system/FlowInstanceMapper.xml b/rsf-server/src/main/resources/mapper/system/FlowInstanceMapper.xml
new file mode 100644
index 0000000..4888644
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/FlowInstanceMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.FlowInstanceMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/FlowStepInstanceMapper.xml b/rsf-server/src/main/resources/mapper/system/FlowStepInstanceMapper.xml
new file mode 100644
index 0000000..6fc2250
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/FlowStepInstanceMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.FlowStepInstanceMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/FlowStepLogMapper.xml b/rsf-server/src/main/resources/mapper/system/FlowStepLogMapper.xml
new file mode 100644
index 0000000..7850729
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/FlowStepLogMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.FlowStepLogMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/FlowStepTemplateMapper.xml b/rsf-server/src/main/resources/mapper/system/FlowStepTemplateMapper.xml
new file mode 100644
index 0000000..750e2de
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/FlowStepTemplateMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.FlowStepTemplateMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/SubsystemFlowTemplateMapper.xml b/rsf-server/src/main/resources/mapper/system/SubsystemFlowTemplateMapper.xml
new file mode 100644
index 0000000..e3f0ac6
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/SubsystemFlowTemplateMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.SubsystemFlowTemplateMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/TaskInstanceMapper.xml b/rsf-server/src/main/resources/mapper/system/TaskInstanceMapper.xml
new file mode 100644
index 0000000..b2a26d0
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/TaskInstanceMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.TaskInstanceMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/TaskInstanceNodeMapper.xml b/rsf-server/src/main/resources/mapper/system/TaskInstanceNodeMapper.xml
new file mode 100644
index 0000000..8e7185c
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/TaskInstanceNodeMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.TaskInstanceNodeMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/TaskPathTemplateMapper.xml b/rsf-server/src/main/resources/mapper/system/TaskPathTemplateMapper.xml
new file mode 100644
index 0000000..475c120
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/TaskPathTemplateMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.TaskPathTemplateMapper">
+
+</mapper>
diff --git a/rsf-server/src/main/resources/mapper/system/TaskPathTemplateNodeMapper.xml b/rsf-server/src/main/resources/mapper/system/TaskPathTemplateNodeMapper.xml
new file mode 100644
index 0000000..49cb140
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/system/TaskPathTemplateNodeMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.system.mapper.TaskPathTemplateNodeMapper">
+
+</mapper>

--
Gitblit v1.9.1