Files
geg-gas-web/src/views/workflow/task/components/LaunchProcess.vue
2024-02-05 09:15:37 +08:00

337 lines
10 KiB
Vue

<template>
<LoadingBox v-if="showLoading" />
<ProcessLayout class="wrap" v-if="visible">
<template #title> {{ t('发起流程') }}{{ data.item.name }} </template>
<template #close>
<a-button type="primary" class="clean-icon" @click.stop="$emit('close')">{{
t('关闭')
}}</a-button>
</template>
<template #left>
<FlowPanel
:xml="data.xml"
:taskRecords="[]"
:predecessorTasks="selectedPredecessorTasks"
processId=""
position="top"
>
<FormInformation
:opinionsComponents="data.opinionsComponents"
:opinions="data.opinions"
:disabled="false"
:formInfos="data.formInfos"
:formAssignmentData="data.formAssignmentData"
ref="formInformation"
/>
</FlowPanel>
</template>
<template #right>
<div class="launch-box">
<div class="description-box">
<NodeHead :nodeName="t('发起流程')" class="title" />
<ProcessInfo class="item-box" :item="data.item" />
</div>
<PredecessorTask
v-if="data.relationTasks && data.relationTasks.length > 0"
@change="changePredecessorTasks"
:schemaId="schemaId"
:relationTasks="data.predecessorTasks"
/>
<ApproveUser
v-if="approveUserData.visible"
:taskList="approveUserData.list"
:schemaId="approveUserData.schemaId"
@change="changeApproveUserData"
/>
<div class="button-box">
<a-button
type="primary"
class="mr-2"
:disabled="isPublish"
:loading="data.submitLoading"
@click="saveLaunch"
>{{ t('发起') }}</a-button
>
<a-button class="mr-2" @click="saveDraft">{{ t('保存草稿') }}</a-button>
</div>
</div>
</template>
</ProcessLayout>
</template>
<script setup lang="ts">
import ProcessLayout from './flow/Layout.vue';
import FlowPanel from './flow/FlowPanel.vue';
import FormInformation from './flow/FormInformation.vue';
import { LoadingBox } from '/@/components/ModalPanel/index';
import ProcessInfo from './flow/ProcessInfo.vue';
import PredecessorTask from './PredecessorTask.vue';
import { NodeHead } from '/@/components/ModalPanel/index';
import ApproveUser from './flow/ApproveUser.vue';
import { postDraft, putDraft } from '/@/api/workflow/process';
import {
postLaunch,
getStartProcessInfo,
getReStartProcessInfo,
reLaunch,
} from '/@/api/workflow/task';
import { computed, onMounted, ref, toRaw, nextTick } from 'vue';
import { ApproveTask, SchemaTaskItem } from '/@/model/workflow/bpmnConfig';
import userTaskItem from './../hooks/userTaskItem';
import { separator } from '../../design/bpmn/config/info';
import { useI18n } from '/@/hooks/web/useI18n';
const { t } = useI18n();
const props = defineProps({
schemaId: {
type: String,
required: true,
},
draftsJsonStr: {
type: String,
},
draftsId: {
type: String,
},
taskId: {
type: String,
required: false,
default: '',
},
processId: {
type: String,
required: false,
default: '',
},
formData: {
type: Object,
},
formId: {
type: String,
},
rowKeyData: {
type: String,
},
});
let emits = defineEmits(['close']);
let formInformation = ref();
let visible = ref(false);
let showLoading = ref(false);
const { data, approveUserData, initProcessData, notificationError, notificationSuccess } =
userTaskItem();
const selectedPredecessorTasks = computed(() => {
return data.predecessorTasks.filter((ele) => {
return ele.taskId;
});
});
const isPublish = ref(true);
onMounted(async () => {
try {
if (props.processId) {
// 重新发起
let res = await getReStartProcessInfo(props.taskId, props.processId);
res.taskApproveOpinions = [];
initProcessData(res);
showLoading.value = false;
} else if (props.schemaId && props.formId) {
let res = await getStartProcessInfo(props.schemaId);
if (props.formData && props.formId) {
res.formInfos.map((m) => {
if (m.formConfig.formId === props.formId) {
m.formData = toRaw(props.formData);
}
});
}
initProcessData(res);
showLoading.value = false;
} else {
// 发起流程
let res = await getStartProcessInfo(props.schemaId);
initProcessData(res);
showLoading.value = false;
}
} catch (error) {
showLoading.value = false;
}
showLoading.value = false;
visible.value = true;
await nextTick();
initDraftsFormData();
});
async function initDraftsFormData() {
isPublish.value = Object.keys(data.formInfos).length > 0 ? false : true;
if (props.draftsJsonStr) {
let formDataJson = JSON.parse(props.draftsJsonStr);
let formData: Array<any> = [];
data.formInfos.forEach((item) => {
if (
formDataJson &&
item.formConfig &&
item.formConfig.key &&
formDataJson[item.formConfig.key]
) {
formData.push(item.formConfig.key ? formDataJson[item.formConfig.key] : {});
}
});
await formInformation.value.setFormData(formData);
}
}
function getUploadFileFolderIds(formModels) {
let fileFolderIds: Array<string> = [];
let uploadComponentIds = formInformation.value.getUploadComponentIds();
uploadComponentIds.forEach((ids) => {
if (ids.includes(separator)) {
let arr = ids.split(separator);
if (arr.length == 2 && formModels[arr[0]][arr[1]]) {
fileFolderIds.push(formModels[arr[0]][arr[1]]);
} else if (
arr.length == 3 &&
formModels[arr[0]][arr[1]] &&
Array.isArray(formModels[arr[0]][arr[1]])
) {
formModels[arr[0]][arr[1]].forEach((o) => {
fileFolderIds.push(o[arr[2]]);
});
}
}
});
return fileFolderIds;
}
async function saveLaunch() {
data.submitLoading = true;
try {
let validateForms = await formInformation.value.validateForm();
let system = formInformation.value.getSystemType();
if (validateForms.length > 0) {
let successValidate = validateForms.filter((ele) => {
return ele.validate;
});
if (successValidate.length == validateForms.length) {
let formModels = await formInformation.value.getFormModels();
let relationTasks: Array<{
schemaId: string;
taskId: string;
}> = [];
if (data.predecessorTasks && data.predecessorTasks.length > 0) {
relationTasks = data.predecessorTasks.map((ele) => {
return { taskId: ele.taskId, schemaId: ele.schemaId };
});
}
let fileFolderIds: Array<string> = getUploadFileFolderIds(formModels);
//如果传入了processId 代表是重新发起流程
let res;
if (props.processId) {
res = await reLaunch(
props.processId,
props.schemaId,
formModels,
relationTasks,
fileFolderIds,
system,
);
} else {
res = await postLaunch(
props.schemaId,
formModels,
relationTasks,
fileFolderIds,
system,
);
}
// 下一节点审批人
let taskList: Array<ApproveTask> = [];
if (res && res.length > 0) {
taskList = res
.filter((ele) => {
return ele.isMultiInstance == false && ele.isAppoint == true;
})
.map((ele) => {
return {
taskId: ele.taskId,
taskName: ele.taskName,
provisionalApprover: ele.provisionalApprover,
selectIds: [],
};
});
if (taskList.length > 0) {
approveUserData.list = taskList;
approveUserData.schemaId = props.schemaId;
approveUserData.visible = true;
data.submitLoading = false;
} else {
data.submitLoading = false;
save(true, t('发起流程'));
}
} else {
data.submitLoading = false;
save(true, t('发起流程'));
}
} else {
data.submitLoading = false;
notificationError(t('发起流程'), t('表单校验未通过'));
}
}
} catch (error) {
data.submitLoading = false;
notificationError(t('发起流程'), t('发起流程失败'));
}
}
async function saveDraft() {
try {
let formModels = await formInformation.value.saveDraftData();
if (props.draftsId) {
let res = await putDraft(props.schemaId, formModels, props.draftsId, props.rowKeyData);
save(res, t('保存草稿'));
} else {
let res = await postDraft(props.schemaId, formModels, props.rowKeyData);
save(res, t('保存草稿'));
}
} catch (error) {
notificationError(t('保存草稿'));
}
}
function changePredecessorTasks(list: Array<SchemaTaskItem>) {
data.predecessorTasks = list;
}
function save(res: boolean, title: string) {
if (res) {
notificationSuccess(title);
emits('close');
} else {
notificationError(title);
}
}
function changeApproveUserData() {
approveUserData.visible = false;
emits('close');
}
</script>
<style lang="less" scoped>
.description-box {
display: flex;
flex-direction: column;
padding-top: 10px;
align-items: center;
justify-content: center;
color: rgb(102 102 102 / 99.6%);
margin-bottom: 20px;
.title {
align-self: flex-start;
margin-bottom: 20px;
}
.item-box {
align-self: flex-start;
}
}
</style>