This commit is contained in:
周建 2023-06-25 14:06:14 +08:00
parent 7ca76a5304
commit 3b2d308ccc
5 changed files with 150 additions and 134 deletions

View File

@ -213,6 +213,7 @@ const getTenantId = async () => {
if (loginData.tenantEnable === 'true') { if (loginData.tenantEnable === 'true') {
const res = await LoginApi.getTenantIdByNameApi(loginData.loginForm.tenantName) const res = await LoginApi.getTenantIdByNameApi(loginData.loginForm.tenantName)
authUtil.setTenantId(res) authUtil.setTenantId(res)
authUtil.setTenantName(loginData.loginForm.tenantName)
} }
} }
// //

View File

@ -38,10 +38,17 @@
</el-col> </el-col>
</el-card> </el-card>
<el-card class="box-card"> <el-card class="box-card">
<!-- <div class="clearfix"> <div class="clearfix">
<span class="el-icon-picture-outline">流程图</span> <span class="el-icon-picture-outline">流程图</span>
</div> --> </div>
<ProcessInstanceBpmnViewer :bpmn-xml="bpmnXML" /> <!-- TODO 芋艿待完成 -->
<my-process-viewer
key="designer"
v-model="bpmnXML"
:value="bpmnXML"
v-bind="bpmnControlForm"
:prefix="bpmnControlForm.prefix"
/>
</el-card> </el-card>
</div> </div>
</ContentWrap> </ContentWrap>
@ -54,7 +61,7 @@ import * as ProcessInstanceApi from '@/api/bpm/processInstance'
import { setConfAndFields2 } from '@/utils/formCreate' import { setConfAndFields2 } from '@/utils/formCreate'
import type { ApiAttrs } from '@form-create/element-ui/types/config' import type { ApiAttrs } from '@form-create/element-ui/types/config'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import ProcessInstanceBpmnViewer from './detail/ProcessInstanceBpmnViewer.vue'
const router = useRouter() // const router = useRouter() //
const message = useMessage() // const message = useMessage() //
@ -133,9 +140,9 @@ const submitForm = async (formData) => {
// // BPMN // // BPMN
const bpmnXML = ref(null) const bpmnXML = ref(null)
// const bpmnControlForm = ref({ const bpmnControlForm = ref({
// prefix: 'flowable' prefix: 'flowable'
// }) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -49,7 +49,7 @@
pre-icon="ep:edit" pre-icon="ep:edit"
type="primary" type="primary"
title="转办" title="转办"
@click="openTaskUpdateAssigneeForm(item.id)" @click="handleUpdateAssignee(item)"
/> />
<XButton <XButton
pre-icon="ep:position" pre-icon="ep:position"
@ -78,7 +78,7 @@
</el-col> </el-col>
<!-- 情况二流程表单 --> <!-- 情况二流程表单 -->
<div v-if="processInstance?.processDefinition?.formType === 20"> <div v-if="processInstance?.processDefinition?.formType === 20">
<!-- <router-link <router-link
:to=" :to="
processInstance.processDefinition.formCustomViewPath + processInstance.processDefinition.formCustomViewPath +
'?id=' + '?id=' +
@ -86,21 +86,24 @@
" "
> >
<XButton type="primary" preIcon="ep:view" title="点击查看" /> <XButton type="primary" preIcon="ep:view" title="点击查看" />
</router-link> --> </router-link>
<autoComponent :id="processInstance.businessKey" />
</div> </div>
</el-card> </el-card>
<!-- 审批记录 --> <!-- 审批记录 -->
<!-- <el-card class="box-card" v-loading="tasksLoad"> <el-card class="box-card" v-loading="tasksLoad">
<template #header> <template #header>
<span class="el-icon-picture-outline">审批记录</span> <span class="el-icon-picture-outline">审批记录</span>
</template> </template>
<el-col :span="16" :offset="4"> <el-col :span="16" :offset="4">
<div class="block"> <div class="block">
<el-timeline> <el-timeline>
<el-timeline-item v-for="(item, index) in tasks" :key="index" :icon="getTimelineItemIcon(item)" <el-timeline-item
:type="getTimelineItemType(item)"> v-for="(item, index) in tasks"
:key="index"
:icon="getTimelineItemIcon(item)"
:type="getTimelineItemType(item)"
>
<p style="font-weight: 700">任务{{ item.name }}</p> <p style="font-weight: 700">任务{{ item.name }}</p>
<el-card :body-style="{ padding: '10px' }"> <el-card :body-style="{ padding: '10px' }">
<label v-if="item.assigneeUser" style="font-weight: normal; margin-right: 30px"> <label v-if="item.assigneeUser" style="font-weight: normal; margin-right: 30px">
@ -131,67 +134,79 @@
</el-timeline> </el-timeline>
</div> </div>
</el-col> </el-col>
</el-card> --> </el-card>
<ProcessInstanceTaskList :loading="tasksLoad" :tasks="tasks" />
<!-- 高亮流程图 --> <!-- 高亮流程图 -->
<!-- <el-card class="box-card" v-loading="processInstanceLoading"> --> <el-card class="box-card" v-loading="processInstanceLoading">
<!-- <template #header> <template #header>
<span class="el-icon-picture-outline">流程图</span> <span class="el-icon-picture-outline">流程图</span>
</template> </template>
<my-process-viewer key="designer" v-model="bpmnXML" :value="bpmnXML" v-bind="bpmnControlForm" <my-process-viewer
:prefix="bpmnControlForm.prefix" :activityData="activityList" :processInstanceData="processInstance" key="designer"
:taskData="tasks" /> --> v-model="bpmnXML"
<ProcessInstanceBpmnViewer :value="bpmnXML"
:id="`${id}`" v-bind="bpmnControlForm"
:bpmn-xml="bpmnXML" :prefix="bpmnControlForm.prefix"
:loading="processInstanceLoading" :activityData="activityList"
:process-instance="processInstance" :processInstanceData="processInstance"
:tasks="tasks" :taskData="tasks"
/> />
<!-- </el-card> --> </el-card>
<!-- 对话框(转派审批人) --> <!-- 对话框(转派审批人) -->
<!-- <XModal v-model="updateAssigneeVisible" title="转派审批人" width="500"> <XModal v-model="updateAssigneeVisible" title="转派审批人" width="500">
<el-form ref="updateAssigneeFormRef" :model="updateAssigneeForm" :rules="updateAssigneeRules" label-width="110px"> <el-form
ref="updateAssigneeFormRef"
:model="updateAssigneeForm"
:rules="updateAssigneeRules"
label-width="110px"
>
<el-form-item label="新审批人" prop="assigneeUserId"> <el-form-item label="新审批人" prop="assigneeUserId">
<el-select v-model="updateAssigneeForm.assigneeUserId" clearable style="width: 100%"> <el-select v-model="updateAssigneeForm.assigneeUserId" clearable style="width: 100%">
<el-option v-for="item in userOptions" :key="parseInt(item.id)" :label="item.nickname" <el-option
:value="parseInt(item.id)" /> v-for="item in userOptions"
:key="parseInt(item.id)"
:label="item.nickname"
:value="parseInt(item.id)"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
操作按钮 <!-- 操作按钮 -->
<template #footer> <template #footer>
按钮保存 <!-- 按钮保存 -->
<XButton type="primary" :title="t('action.save')" :loading="updateAssigneeLoading" <XButton
@click="submitUpdateAssigneeForm" /> type="primary"
按钮关闭 :title="t('action.save')"
<XButton :loading="updateAssigneeLoading" :title="t('dialog.close')" @click="updateAssigneeLoading = false" /> :loading="updateAssigneeLoading"
@click="submitUpdateAssigneeForm"
/>
<!-- 按钮关闭 -->
<XButton
:loading="updateAssigneeLoading"
:title="t('dialog.close')"
@click="updateAssigneeLoading = false"
/>
</template> </template>
</XModal> --> </XModal>
<TaskUpdateAssigneeForm ref="taskUpdateAssigneeFormRef" @success="getDetail" />
</ContentWrap> </ContentWrap>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// import dayjs from 'dayjs' import dayjs from 'dayjs'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import * as ProcessInstanceApi from '@/api/bpm/processInstance' import * as ProcessInstanceApi from '@/api/bpm/processInstance'
import * as DefinitionApi from '@/api/bpm/definition' import * as DefinitionApi from '@/api/bpm/definition'
import * as TaskApi from '@/api/bpm/task' import * as TaskApi from '@/api/bpm/task'
import * as ActivityApi from '@/api/bpm/activity' import * as ActivityApi from '@/api/bpm/activity'
// import { formatPast2 } from '@/utils/formatTime' import { formatPast2 } from '@/utils/formatTime'
import { setConfAndFields2 } from '@/utils/formCreate' import { setConfAndFields2 } from '@/utils/formCreate'
// import { OptionAttrs } from '@form-create/element-ui/types/config' // import { OptionAttrs } from '@form-create/element-ui/types/config'
import type { ApiAttrs } from '@form-create/element-ui/types/config' import type { ApiAttrs } from '@form-create/element-ui/types/config'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { registerComponent } from '@/utils/routerHelper'
import ProcessInstanceBpmnViewer from './detail/ProcessInstanceBpmnViewer.vue'
import ProcessInstanceTaskList from './detail/ProcessInstanceTaskList.vue'
import TaskUpdateAssigneeForm from './detail/TaskUpdateAssigneeForm.vue'
const { query } = useRoute() // const { query } = useRoute() //
const message = useMessage() // const message = useMessage() //
// const { t } = useI18n() // const { t } = useI18n() //
const { proxy } = getCurrentInstance() as any const { proxy } = getCurrentInstance() as any
// ========== ========== // ========== ==========
@ -247,85 +262,88 @@ const detailForm = ref({
const tasksLoad = ref(true) const tasksLoad = ref(true)
const tasks = ref<any[]>([]) const tasks = ref<any[]>([])
// const getTimelineItemIcon = (item) => { const getTimelineItemIcon = (item) => {
// if (item.result === 1) { if (item.result === 1) {
// return 'el-icon-time' return 'el-icon-time'
// } }
// if (item.result === 2) { if (item.result === 2) {
// return 'el-icon-check' return 'el-icon-check'
// } }
// if (item.result === 3) { if (item.result === 3) {
// return 'el-icon-close' return 'el-icon-close'
// } }
// if (item.result === 4) { if (item.result === 4) {
// return 'el-icon-remove-outline' return 'el-icon-remove-outline'
// } }
// return '' return ''
// } }
// const getTimelineItemType = (item) => { const getTimelineItemType = (item) => {
// if (item.result === 1) { if (item.result === 1) {
// return 'primary' return 'primary'
// } }
// if (item.result === 2) { if (item.result === 2) {
// return 'success' return 'success'
// } }
// if (item.result === 3) { if (item.result === 3) {
// return 'danger' return 'danger'
// } }
// if (item.result === 4) { if (item.result === 4) {
// return 'info' return 'info'
// } }
// return '' return ''
// } }
// ========== ========== // ========== ==========
// const updateAssigneeVisible = ref(false) const updateAssigneeVisible = ref(false)
// const updateAssigneeLoading = ref(false) const updateAssigneeLoading = ref(false)
// const updateAssigneeForm = ref({ const updateAssigneeForm = ref({
// id: undefined, id: undefined,
// assigneeUserId: undefined assigneeUserId: undefined
// }) })
// const updateAssigneeRules = ref({ const updateAssigneeRules = ref({
// assigneeUserId: [{ required: true, message: '', trigger: 'change' }] assigneeUserId: [{ required: true, message: '新审批人不能为空', trigger: 'change' }]
// }) })
// const updateAssigneeFormRef = ref() const updateAssigneeFormRef = ref()
const userOptions = ref<any[]>([]) const userOptions = ref<any[]>([])
// //
const taskUpdateAssigneeFormRef = ref() const handleUpdateAssignee = (task) => {
const openTaskUpdateAssigneeForm = (id: string) => { //
taskUpdateAssigneeFormRef.value.open(id) resetUpdateAssigneeForm()
updateAssigneeForm.value.id = task.id
//
updateAssigneeVisible.value = true
} }
// //
// const submitUpdateAssigneeForm = async () => { const submitUpdateAssigneeForm = async () => {
// // 1. // 1.
// const elForm = unref(updateAssigneeFormRef) const elForm = unref(updateAssigneeFormRef)
// if (!elForm) return if (!elForm) return
// const valid = await elForm.validate() const valid = await elForm.validate()
// if (!valid) return if (!valid) return
// // 2.1 // 2.1
// updateAssigneeLoading.value = true updateAssigneeLoading.value = true
// try { try {
// await TaskApi.updateTaskAssignee(updateAssigneeForm.value) await TaskApi.updateTaskAssignee(updateAssigneeForm.value)
// // 2.2 // 2.2
// updateAssigneeVisible.value = false updateAssigneeVisible.value = false
// // //
// getDetail() getDetail()
// } finally { } finally {
// updateAssigneeLoading.value = false updateAssigneeLoading.value = false
// } }
// } }
// //
// const resetUpdateAssigneeForm = () => { const resetUpdateAssigneeForm = () => {
// updateAssigneeForm.value = { updateAssigneeForm.value = {
// id: undefined, id: undefined,
// assigneeUserId: undefined assigneeUserId: undefined
// } }
// updateAssigneeFormRef.value?.resetFields() updateAssigneeFormRef.value?.resetFields()
// } }
/** 处理审批退回的操作 */ /** 处理审批退回的操作 */
const handleDelegate = async (task) => { const handleDelegate = async (task) => {
@ -350,9 +368,9 @@ const handleBack = async (task) => {
// ========== ========== // ========== ==========
const bpmnXML = ref(null) const bpmnXML = ref(null)
// const bpmnControlForm = ref({ const bpmnControlForm = ref({
// prefix: 'flowable' prefix: 'flowable'
// }) })
const activityList = ref([]) const activityList = ref([])
// ========== ========== // ========== ==========
@ -364,7 +382,7 @@ onMounted(() => {
userOptions.value.push(...data) userOptions.value.push(...data)
}) })
}) })
const autoComponent = ref(null) //
const getDetail = () => { const getDetail = () => {
// 1. // 1.
processInstanceLoading.value = true processInstanceLoading.value = true
@ -375,7 +393,6 @@ const getDetail = () => {
return return
} }
processInstance.value = data processInstance.value = data
autoComponent.value = registerComponent(data.processDefinition.formCustomViewPath)
// //
const processDefinition = data.processDefinition const processDefinition = data.processDefinition

View File

@ -137,8 +137,9 @@
empty-text="加载中,请稍候" empty-text="加载中,请稍候"
/> />
</el-card> </el-card>
</el-form-item> </el-col </el-form-item>
></el-row> </el-col>
</el-row>
</el-form> </el-form>
<!-- 操作按钮 --> <!-- 操作按钮 -->
<template #footer> <template #footer>

12
types/global.d.ts vendored
View File

@ -19,17 +19,7 @@ declare global {
| 'application/x-www-form-urlencoded' | 'application/x-www-form-urlencoded'
| 'multipart/form-data' | 'multipart/form-data'
type AxiosMethod = type AxiosMethod = 'get' | 'post' | 'delete' | 'put' | 'GET' | 'POST' | 'DELETE' | 'PUT'
| 'get'
| 'post'
| 'delete'
| 'put'
| 'patch'
| 'GET'
| 'POST'
| 'DELETE'
| 'PUT'
| 'PATCH'
type AxiosResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream' type AxiosResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'