|
|
@@ -0,0 +1,172 @@
|
|
|
+<template>
|
|
|
+ <div class="safety-platform-container">
|
|
|
+ <header class="safety-platform-container__header">
|
|
|
+ <BreadcrumbBack />
|
|
|
+ <span class="breadcrumb-title">{{ '编辑审批流程' }}</span>
|
|
|
+ </header>
|
|
|
+ <main class="safety-platform-container__main">
|
|
|
+ <div class="approval-node-container">
|
|
|
+ <div class="approval-node-container__title">流程模板信息</div>
|
|
|
+ <BasicForm
|
|
|
+ style="height: auto"
|
|
|
+ ref="basicFormRef"
|
|
|
+ :formData="ruleFormData"
|
|
|
+ :formRules="formRules"
|
|
|
+ :formConfig="ruleFormConfig"
|
|
|
+ >
|
|
|
+ </BasicForm>
|
|
|
+ <div class="approval-node-container__button">
|
|
|
+ <el-button type="primary" @click="handleEditApproval">保存</el-button>
|
|
|
+ </div>
|
|
|
+ <div class="approval-node-container__title">审批流程设置</div>
|
|
|
+ <div class="approval-node-container__button" style="">
|
|
|
+ <el-button type="primary" @click="handleCreateApprovalNode" :icon="Plus">添加审批节点</el-button>
|
|
|
+ </div>
|
|
|
+ <div style="flex-grow: 1">
|
|
|
+ <BasicTable :tableConfig="tableConfig" :tableData="tableData">
|
|
|
+ <template #approverType="scope">
|
|
|
+ <span> {{ APPROVER_TYPE_MAP[scope.row.approverType] }}</span>
|
|
|
+ </template>
|
|
|
+ <template #approvalType="scope">
|
|
|
+ <span> {{ APPROVAL_TYPE_MAP[scope.row.approvalType] }}</span>
|
|
|
+ </template>
|
|
|
+ <template #action="scope">
|
|
|
+ <ActionButton text="编辑节点" @click="handleEditApprovalNode(scope.row)" />
|
|
|
+ <ActionButton
|
|
|
+ v-if="scope.row.approverType === 0"
|
|
|
+ text="选择审批人"
|
|
|
+ @click="handleOpenAppoverSelect(scope.row)"
|
|
|
+ />
|
|
|
+ <ActionButton
|
|
|
+ text="删除节点"
|
|
|
+ :popconfirm="{
|
|
|
+ title: '确定要删除?',
|
|
|
+ }"
|
|
|
+ @confirm="handleDeleteNode(scope.row.id)"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </BasicTable>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </main>
|
|
|
+ <ApproverSelectDialog ref="approverSelectDialogRef" />
|
|
|
+ <ApprovalNodeCreateDialog ref="approvalNodeCreateDialogRef" />
|
|
|
+ <UploadLoading loading-text="加载中" :form-loading="formLoading" v-if="formLoading" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+ import { useRoute } from 'vue-router';
|
|
|
+ import { ElMessage } from 'element-plus';
|
|
|
+ import { Plus } from '@element-plus/icons-vue';
|
|
|
+ import { onMounted, ref } from 'vue';
|
|
|
+ import { useFormConfigHook } from '@/hooks/useFormConfigHook';
|
|
|
+ import UploadLoading from '@/components/UploadLoading.vue';
|
|
|
+ import BasicForm from '@/components/BasicForm.vue';
|
|
|
+ import ActionButton from '@/components/ActionButton.vue';
|
|
|
+ import BasicTable from '@/components/BasicTable.vue';
|
|
|
+ import { ApprovalInstanceRuleForm, ApprovalNodeInstanceType } from './types';
|
|
|
+ import { APPROVAL_FORM_CONFIG, APPROVAL_FORM_DATA, APPROVAL_FORM_RULES } from './config/form';
|
|
|
+ import useTableConfig from '@/hooks/useTableConfigHook';
|
|
|
+ import { APPROVAL_NODE_TABLE_COLUMNS, NODE_TABLE_OPTIONS } from './config/table';
|
|
|
+ import { APPROVER_TYPE_MAP, APPROVAL_TYPE_MAP } from './constants';
|
|
|
+ import ApproverSelectDialog from './components/ApproverSelectDialog.vue';
|
|
|
+ import ApprovalNodeCreateDialog from './components/ApprovalNodeCreateDialog.vue';
|
|
|
+ import { getApprovalNodeInstanceList } from '@/api/approval/approval';
|
|
|
+ import { updateApprovalInstance } from '@/api/approval/approval';
|
|
|
+ import { queryUserInfoByIds } from '@/api/system/person-group';
|
|
|
+
|
|
|
+ const route = useRoute();
|
|
|
+
|
|
|
+ const id = route.query.id;
|
|
|
+ const approvalInstance = ref<ApprovalInstanceRuleForm>();
|
|
|
+
|
|
|
+ const formLoading = ref(false);
|
|
|
+ const basicFormRef = ref<InstanceType<typeof BasicForm>>();
|
|
|
+ const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
|
|
|
+ useFormConfigHook<ApprovalInstanceRuleForm>(APPROVAL_FORM_CONFIG, APPROVAL_FORM_DATA, APPROVAL_FORM_RULES);
|
|
|
+ function initForm(initData: ApprovalInstanceRuleForm) {
|
|
|
+ ruleFormData.id = initData.id;
|
|
|
+ ruleFormData.templateName = initData.templateName;
|
|
|
+ ruleFormData.description = initData.description;
|
|
|
+ }
|
|
|
+
|
|
|
+ const { tableConfig } = useTableConfig(APPROVAL_NODE_TABLE_COLUMNS, NODE_TABLE_OPTIONS, false);
|
|
|
+ const tableData = ref<ApprovalNodeInstanceType[]>([]);
|
|
|
+
|
|
|
+ async function getTabelData() {
|
|
|
+ tableConfig.loading = true;
|
|
|
+ approvalInstance.value = await getApprovalNodeInstanceList(Number(id));
|
|
|
+ tableData.value = approvalInstance.value.approvalNodeInfoList!;
|
|
|
+ tableData.value.forEach((item) => {
|
|
|
+ item.approverNameList = item.approverInfoList.map((item) => item.approverName).join(',');
|
|
|
+ });
|
|
|
+ tableConfig.loading = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ formLoading.value = true;
|
|
|
+ await getTabelData();
|
|
|
+ initForm(approvalInstance.value!);
|
|
|
+ cloneRuleFormData();
|
|
|
+ beforeRouteLeave();
|
|
|
+ formLoading.value = false;
|
|
|
+ });
|
|
|
+
|
|
|
+ const handleEditApproval = async () => {
|
|
|
+ const validate = await basicFormRef.value?.validateForm();
|
|
|
+ if (!validate) return;
|
|
|
+ // 提交表单接口
|
|
|
+ try {
|
|
|
+ formLoading.value = true;
|
|
|
+ await updateApprovalInstance(ruleFormData);
|
|
|
+ formLoading.value = false;
|
|
|
+ ElMessage.success('提交成功');
|
|
|
+ cloneRuleFormData();
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const approvalNodeCreateDialogRef = ref();
|
|
|
+ const handleCreateApprovalNode = () => {
|
|
|
+ approvalNodeCreateDialogRef.value.initForm(true, { approvalTemplateId: id });
|
|
|
+ approvalNodeCreateDialogRef.value.openDialog();
|
|
|
+ };
|
|
|
+ const handleEditApprovalNode = (row: ApprovalNodeInstanceType) => {
|
|
|
+ console.log(row);
|
|
|
+ // approvalNodeCreateDialogRef.value.initForm(false, row);
|
|
|
+ // approvalNodeCreateDialogRef.value.openDialog();
|
|
|
+ };
|
|
|
+
|
|
|
+ const approverSelectDialogRef = ref();
|
|
|
+ const handleOpenAppoverSelect = async (node: ApprovalNodeInstanceType) => {
|
|
|
+ if (approverSelectDialogRef.value) {
|
|
|
+ const res = await queryUserInfoByIds(node.approverInfoList.map((x) => x.approverId));
|
|
|
+ approverSelectDialogRef.value.setSelectedUser(res);
|
|
|
+ approverSelectDialogRef.value.openDialog();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const handleDeleteNode = (id: number) => {};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+ @use '@/styles/page-details-layout.scss' as *;
|
|
|
+ .safety-platform-container__header {
|
|
|
+ flex-direction: row !important;
|
|
|
+ justify-content: flex-start !important;
|
|
|
+ gap: 8px !important;
|
|
|
+ }
|
|
|
+ .approval-node-container {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ .approval-node-container__title {
|
|
|
+ margin: 5px 0 10px;
|
|
|
+ }
|
|
|
+ .approval-node-container__button {
|
|
|
+ text-align: start;
|
|
|
+ margin: 10px 0 20px;
|
|
|
+ }
|
|
|
+</style>
|