vue-vben-admin/src/views/demo/workflow/h5/create.vue

293 lines
8.7 KiB
Vue

<template>
<PageWrapper :class="prefixCls">
<div class="btn-box">
<a-button type="primary" :icon="h(SendOutlined)" @click="handleSubmit" class="ml-2"
>发起流程
</a-button>
<a-button type="primary" :icon="h(SaveOutlined)" @click="handleSaveDraft" class="ml-2"
>保存草稿
</a-button>
<a-button
type="primary"
:icon="h(CloseCircleOutlined)"
@click="closePreview"
class="ml-2"
danger
>关闭
</a-button>
</div>
<a-tabs v-model:activeKey="activeName" @change="changeActive">
<a-tab-pane key="form" tab="表单信息" v-if="formVisble">
<FormViewer ref="formBoxRef" :formConfig="formConfig" v-if="formVisble"></FormViewer>
</a-tab-pane>
<a-tab-pane key="flow" tab="流程信息" force-render>
<div class="process-design" :style="'display: flex; height:' + designerData.height">
<process-viewer :key="`designer-${code}`" :xml="flowContent" v-if="processVisble" />
<div
class="form-box"
v-if="
designerData.isCustmerTitle ||
(designerData.delegateUsers && designerData.delegateUsers.length > 0)
"
>
<a-form
ref="formRef"
:model="formData"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<a-form-item
ref="title"
label="流程标题"
name="title"
v-if="designerData.isCustmerTitle"
>
<a-input v-model:value="formData.title" />
</a-form-item>
<a-form-item
label="流程发起人"
name="userId"
v-if="designerData.delegateUsers && designerData.delegateUsers.length > 0"
>
<a-select
v-model:value="formData.userId"
placeholder="请选择"
:options="delegateUsers"
></a-select>
</a-form-item>
</a-form>
</div>
</div>
</a-tab-pane>
</a-tabs>
</PageWrapper>
</template>
<script lang="ts" setup>
// http://192.168.10.127:5173/#/dashboard/create_preview/add?code=
import { h, ref, reactive, onBeforeMount } from 'vue';
import { ProcessViewer } from '@/components/ProcessViewer/index';
import { PageWrapper } from '@/components/Page';
import { FormViewer } from '@/components/FormViewer';
import {
SendOutlined,
SaveOutlined,
CloseCircleOutlined,
ZoomInOutlined,
RotateLeftOutlined,
RotateRightOutlined,
ClearOutlined,
} from '@ant-design/icons-vue';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { create, saveDraft } from '@/api/sys/WFProcess';
import { getLoadMyUserList } from '@/api/sys/WFDelegate';
import { functionsaveForm } from '@/api/demo/formScheme';
import { useUserStore } from '@/store/modules/user';
import { buildGUID } from '@/utils/uuid';
import { IFormConfig } from '@/views/demo/form-design/typings/v-form-component';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
import { LoadFormScheme } from '@/api/demo/formScheme';
const formBoxRef = ref<any>();
const userStore = useUserStore();
const userInfo: any = userStore.getUserInfo;
const prefixCls = 'preview-box';
const flowContent = ref('');
const formRef = ref();
const labelCol = { span: 7 };
const wrapperCol = { span: 13 };
const formVisble = ref(false);
const processVisble = ref(false);
import { useRoute, useRouter } from 'vue-router';
const route = useRoute();
const code:any = route.query.code;
const router = useRouter();
const keyValue = ref('');
// 表单数据
const formConfig = ref<IFormConfig>({
// 表单配置
schemas: [],
layout: 'horizontal',
labelLayout: 'flex',
labelWidth: 100,
labelCol: {},
wrapperCol: {},
currentItem: {
component: '',
componentProps: {},
},
activeKey: 1,
});
const designerData = reactive({
loading: false,
xmlString: '',
controlForm: {
prefix: 'flowable',
},
height: document.documentElement.clientHeight - 230.5 + 'px;',
midVisible: false,
isCustmerTitle: false,
nodeUsers: [],
selectUsersVisible: false,
isDraft: false,
delegateUsers: [],
formVerison: '',
formCode: '',
formCurrentNode: {},
});
const activeName = ref('form');
const formData = reactive({
userId: '',
title: '',
});
const rules = reactive({
title: [{ required: true, message: '请选择流程标题', trigger: 'blur' }],
userId: [{ required: true, message: '请选择流程发起人', trigger: 'blur' }],
});
function changeActive(activeKey) {
if (activeKey == 'flow') {
processVisble.value = true;
}
}
async function getDetailInfo() {
let data = await getDetail({ code: code });
flowContent.value = data.scheme.flowContent;
formData.userId = userInfo.id;
let content = JSON.parse(data.scheme.content);
let wfData = content.wfData;
const currentNode = wfData.find((t) => t.type == 'bpmn:StartEvent');
if (currentNode.authFields.length > 0) {
formVisble.value = true;
} else {
processVisble.value = true;
activeName.value = 'flow';
}
formConfig.value = currentNode.authFields;
designerData.formCurrentNode = currentNode;
getFormHistory();
}
async function getDelegateUsers() {
const data = await getLoadMyUserList({
code: code,
});
designerData.delegateUsers = data;
}
async function handleSaveDraft() {
var querys = {
schemeCode: designerData.isDraft ? '' : code,
userId: formData.userId,
title: formData.title,
processId: buildGUID(),
};
const data = await saveDraft(querys);
querys.schemeCode = '';
designerData.isDraft = true;
if (data) {
closePreview();
return createMessage.success('保存草稿成功');
} else {
return createMessage.error('保存草稿失败');
}
}
function handleSubmit() {
var processId = buildGUID();
var querys = {
schemeId: designerData.formCurrentNode.formVerison,
isUpdate: false,
pkey: keyValue.value,
pkeyValue: processId,
};
// 有表单内容,先存表单信息
if (formVisble.value) {
if (!designerData.formCurrentNode.formRelationId) {
return createMessage.error('请设置表单和流程关联字段');
}
formBoxRef.value
.getForm()
.then(async (res) => {
res[designerData.formCurrentNode.formRelationId] = processId;
for (var item in res) {
if (res[item] == undefined) {
res[item] = '';
if (item.search('_input_guid') != -1) {
res[item] = buildGUID();
}
}
}
querys.data = JSON.stringify(res);
const formValue = await functionsaveForm(querys);
if (formValue) {
handleCreateFlow(processId);
}
})
.catch((error) => {
console.log(error);
activeName.value = 'form';
return;
});
} else {
handleCreateFlow(processId);
}
}
async function handleCreateFlow(processId) {
var querys = {
schemeCode: designerData.isDraft ? '' : code,
userId: formData.userId,
title: formData.title,
processId: processId,
};
if (!designerData.isDraft) {
await saveDraft(querys);
querys.schemeCode = '';
designerData.isDraft = true;
}
const data = await create(querys);
if (data) {
closePreview();
return createMessage.success('发起流程成功');
} else {
return createMessage.error('发起流程失败');
}
}
async function getFormHistory() {
const data = await LoadFormScheme({
schemeId: designerData.formCurrentNode.formVerison,
});
if (data) {
const scheme = JSON.parse(data.scheme);
scheme.formInfo.schemas.forEach((element) => {
if (element.field == designerData.formCurrentNode.formRelationId) {
keyValue.value = element.componentProps.fieldName;
}
});
}
}
function closePreview() {
router.go(-1);
}
onBeforeMount(() => {
getDetailInfo();
getDelegateUsers();
});
</script>
<style lang="less" scoped>
.preview-box {
background-color: @component-background;
.btn-box {
padding: 10px;
justify-content: flex-end;
display: flex;
}
}
::v-deep .anticon svg {
width: 1em !important;
height: 1em !important;
}
.form-box {
width: 480px;
}
</style>