bpm:初始化流程实例的代码

pull/2/head
YunaiV 2023-01-22 13:42:26 +08:00
parent 2f46e230af
commit e6fadf073a
6 changed files with 895 additions and 180 deletions

View File

@ -0,0 +1,133 @@
<template>
<div class="app-container">
<!-- 第一步通过流程定义的列表选择对应的流程 -->
<div v-if="!selectProcessInstance">
<XTable @register="registerTable">
<template #version_default="{ row }">
<el-tag v-if="row">v{{ row.version }}</el-tag>
</template>
<template #actionbtns_default="{ row }">
<el-button type="text" size="small" icon="el-icon-plus" @click="handleSelect(row)"
>选择</el-button
>
</template>
</XTable>
</div>
<!-- 第二步填写表单进行流程的提交 -->
<div v-else>
<el-card class="box-card">
<div class="clearfix">
<span class="el-icon-document">申请信息{{ selectProcessInstance.name }}</span>
<el-button style="float: right" type="primary" @click="selectProcessInstance = undefined"
>选择其它流程</el-button
>
</div>
<el-col :span="16" :offset="6">
<div>
<!-- <parser :key="new Date().getTime()" :form-conf="detailForm" @submit="submitForm" /> -->
</div>
</el-col>
</el-card>
<el-card class="box-card">
<div class="clearfix">
<span class="el-icon-picture-outline">流程图</span>
</div>
<!-- <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" /> -->
</el-card>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { useXTable } from '@/hooks/web/useXTable'
import * as definitionApi from '@/api/bpm/definition'
// import {DICT_TYPE, getDictDatas} from "@/utils/dict";
import { decodeFields } from '@/utils/formGenerator'
// import Parser from '@/components/parser/Parser'
// import * as processInstanceApi from "@/api/bpm/processInstance";
import { allSchemas } from './process.create'
import { useRouter } from 'vue-router'
const router = useRouter()
const queryParams = reactive({
suspensionState: 1
})
const [registerTable] = useXTable({
allSchemas: allSchemas,
params: queryParams,
getListApi: definitionApi.getProcessDefinitionListApi
})
//
const detailForm = ref({
fields: []
})
// // BPMN
const bpmnXML = ref(null)
// const bpmnControlForm=ref( {
// prefix: "flowable"
// })
//
const selectProcessInstance = ref(undefined) //
/** 处理选择流程的按钮操作 **/
const handleSelect = (row) => {
//
selectProcessInstance.value = row
//
if (row.formId) {
//
detailForm.value = {
...JSON.parse(row.formConf),
fields: decodeFields([], row.formFields)
}
//
definitionApi.getProcessDefinitionBpmnXMLApi(row.id).then((response) => {
bpmnXML.value = response.data
})
} else if (row.formCustomCreatePath) {
router.push({ path: row.formCustomCreatePath })
// Tab
}
}
/** 提交按钮 */
// const submitForm=(params)=> {
// if (!params) {
// return;
// }
// //
// const conf = params.conf;
// conf.disabled = true; //
// conf.formBtns = false; //
// //
// const variables = params.values;
// await processInstanceApi.createProcessInstanceApi({
// processDefinitionId: this.selectProcessInstance.id,
// variables: variables
// }).then(response => {
// this.$modal.msgSuccess("");
// //
// this.$tab.closeOpenPage();
// this.$router.go(-1);
// }).catch(() => {
// conf.disabled = false; //
// conf.formBtns = true; //
// })
// }
</script>
<style lang="scss">
.my-process-designer {
height: calc(100vh - 200px);
}
.box-card {
width: 100%;
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,506 @@
<template>
<div class="app-container">
<!-- 审批信息 -->
<el-card
class="box-card"
v-loading="processInstanceLoading"
v-for="(item, index) in runningTasks"
:key="index"
>
<div slot="header" class="clearfix">
<span class="el-icon-picture-outline">审批任务{{ item.name }}</span>
</div>
<el-col :span="16" :offset="6">
<el-form
:ref="'form' + index"
:model="auditForms[index]"
:rules="auditRule"
label-width="100px"
>
<el-form-item label="流程名" v-if="processInstance && processInstance.name">
{{ processInstance.name }}
</el-form-item>
<el-form-item label="流程发起人" v-if="processInstance && processInstance.startUser">
{{ processInstance.startUser.nickname }}
<el-tag type="info" size="mini">{{ processInstance.startUser.deptName }}</el-tag>
</el-form-item>
<el-form-item label="审批建议" prop="reason">
<el-input
type="textarea"
v-model="auditForms[index].reason"
placeholder="请输入审批建议"
/>
</el-form-item>
</el-form>
<div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
<el-button
icon="el-icon-edit-outline"
type="success"
size="mini"
@click="handleAudit(item, true)"
>通过</el-button
>
<el-button
icon="el-icon-circle-close"
type="danger"
size="mini"
@click="handleAudit(item, false)"
>不通过</el-button
>
<el-button
icon="el-icon-edit-outline"
type="primary"
size="mini"
@click="handleUpdateAssignee(item)"
>转办</el-button
>
<el-button
icon="el-icon-edit-outline"
type="primary"
size="mini"
@click="handleDelegate(item)"
>委派</el-button
>
<el-button
icon="el-icon-refresh-left"
type="warning"
size="mini"
@click="handleBack(item)"
>退回</el-button
>
</div>
</el-col>
</el-card>
<!-- 申请信息 -->
<el-card class="box-card" v-loading="processInstanceLoading">
<div slot="header" class="clearfix">
<span class="el-icon-document">申请信息{{ processInstance.name }}</span>
</div>
<el-col
v-if="
this.processInstance.processDefinition &&
this.processInstance.processDefinition.formType === 10
"
:span="16"
:offset="6"
>
<div>
<parser :key="new Date().getTime()" :form-conf="detailForm" />
</div>
</el-col>
<div
v-if="
this.processInstance.processDefinition &&
this.processInstance.processDefinition.formType === 20
"
>
<router-link
:to="
this.processInstance.processDefinition.formCustomViewPath +
'?id=' +
this.processInstance.businessKey
"
>
<el-button type="primary">点击查看</el-button>
</router-link>
</div>
</el-card>
<!-- 审批记录 -->
<el-card class="box-card" v-loading="tasksLoad">
<div slot="header" class="clearfix">
<span class="el-icon-picture-outline">审批记录</span>
</div>
<el-col :span="16" :offset="4">
<div class="block">
<el-timeline>
<el-timeline-item
v-for="(item, index) in tasks"
:key="index"
:icon="getTimelineItemIcon(item)"
:type="getTimelineItemType(item)"
>
<p style="font-weight: 700">任务{{ item.name }}</p>
<el-card :body-style="{ padding: '10px' }">
<label v-if="item.assigneeUser" style="font-weight: normal; margin-right: 30px">
审批人{{ item.assigneeUser.nickname }}
<el-tag type="info" size="mini">{{ item.assigneeUser.deptName }}</el-tag>
</label>
<label style="font-weight: normal" v-if="item.createTime"></label>
<label style="color: #8a909c; font-weight: normal">{{
parseTime(item.createTime)
}}</label>
<label v-if="item.endTime" style="margin-left: 30px; font-weight: normal"
>审批时间</label
>
<label v-if="item.endTime" style="color: #8a909c; font-weight: normal">
{{ parseTime(item.endTime) }}</label
>
<label v-if="item.durationInMillis" style="margin-left: 30px; font-weight: normal"
>耗时</label
>
<label v-if="item.durationInMillis" style="color: #8a909c; font-weight: normal">
{{ getDateStar(item.durationInMillis) }}
</label>
<p v-if="item.reason">
<el-tag :type="getTimelineItemType(item)">{{ item.reason }}</el-tag>
</p>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</el-col>
</el-card>
<!-- 高亮流程图 -->
<el-card class="box-card" v-loading="processInstanceLoading">
<div slot="header" class="clearfix">
<span class="el-icon-picture-outline">流程图</span>
</div>
<my-process-viewer
key="designer"
v-model="bpmnXML"
v-bind="bpmnControlForm"
:activityData="activityList"
:processInstanceData="processInstance"
:taskData="tasks"
/>
</el-card>
<!-- 对话框(转派审批人) -->
<el-dialog title="转派审批人" :visible.sync="updateAssignee.open" width="500px" append-to-body>
<el-form
ref="updateAssigneeForm"
:model="updateAssignee.form"
:rules="updateAssignee.rules"
label-width="110px"
>
<el-form-item label="新审批人" prop="assigneeUserId">
<el-select v-model="updateAssignee.form.assigneeUserId" clearable style="width: 100%">
<el-option
v-for="item in userOptions"
:key="parseInt(item.id)"
:label="item.nickname"
:value="parseInt(item.id)"
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpdateAssigneeForm"> </el-button>
<el-button @click="cancelUpdateAssigneeForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getProcessDefinitionBpmnXML } from "@/api/bpm/definition"
import { DICT_TYPE, getDictOptions } from "@/utils/dict"
import store from "@/store"
import { decodeFields } from "@/utils/formGenerator"
import Parser from '@/components/parser/Parser'
import { getProcessInstanceApi } from "@/api/bpm/processInstance"
import { approveTask, getTaskListByProcessInstanceId, rejectTask, updateTaskAssignee } from "@/api/bpm/task"
import { getDate } from "@/utils/dateUtils"
import { getListSimpleUsersApi } from "@/api/system/user"
import { getActivityList } from "@/api/bpm/activity"
//
export default {
name: "ProcessInstanceDetail",
components: {
Parser
},
data () {
return {
//
processInstanceLoading: true,
//
id: undefined, //
processInstance: {},
//
detailForm: {
fields: []
},
// BPMN
bpmnXML: null,
bpmnControlForm: {
prefix: "flowable"
},
activityList: [],
//
tasksLoad: true,
tasks: [],
//
runningTasks: [],
auditForms: [],
auditRule: {
reason: [{ required: true, message: "审批建议不能为空", trigger: "blur" }],
},
//
userOptions: [],
updateAssignee: {
open: false,
form: {
assigneeUserId: undefined,
},
rules: {
assigneeUserId: [{ required: true, message: "新审批人不能为空", trigger: "change" }],
}
},
//
categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY),
}
},
created () {
this.id = this.$route.query.id
if (!this.id) {
this.$message.error('未传递 id 参数,无法查看流程信息')
return
}
this.getDetail()
//
this.userOptions = []
getListSimpleUsersApi().then(response => {
this.userOptions.push(...response.data)
})
},
methods: {
/** 获得流程实例 */
getDetail () {
//
this.processInstanceLoading = true
getProcessInstanceApi(this.id).then(response => {
if (!response.data) {
this.$message.error('查询不到流程信息!')
return
}
//
this.processInstance = response.data
//
if (this.processInstance.processDefinition.formType === 10) {
this.detailForm = {
...JSON.parse(this.processInstance.processDefinition.formConf),
disabled: true, //
formBtns: false, //
fields: decodeFields(this.processInstance.processDefinition.formFields)
}
//
this.detailForm.fields.forEach(item => {
const val = this.processInstance.formVariables[item.__vModel__]
if (val) {
item.__config__.defaultValue = val
}
})
}
//
getProcessDefinitionBpmnXML(this.processInstance.processDefinition.id).then(response => {
this.bpmnXML = response.data
})
//
getActivityList({
processInstanceId: this.processInstance.id
}).then(response => {
this.activityList = response.data
})
//
this.processInstanceLoading = false
})
//
this.tasksLoad = true
this.runningTasks = []
this.auditForms = []
getTaskListByProcessInstanceId(this.id).then(response => {
//
this.tasks = []
//
response.data.forEach(task => {
if (task.result !== 4) {
this.tasks.push(task)
}
})
//
this.tasks.sort((a, b) => {
//
if (a.endTime && b.endTime) {
return b.endTime - a.endTime
} else if (a.endTime) {
return 1
} else if (b.endTime) {
return -1
//
} else {
return b.createTime - a.createTime
}
})
//
const userId = store.getters.userId
this.tasks.forEach(task => {
if (task.result !== 1) { //
return
}
if (!task.assigneeUser || task.assigneeUser.id !== userId) { //
return
}
this.runningTasks.push({ ...task })
this.auditForms.push({
reason: ''
})
})
//
this.tasksLoad = false
})
},
/** 处理选择流程的按钮操作 **/
handleSelect (row) {
//
this.selectProcessInstance = row
//
if (row.formId) {
//
this.detailForm = {
...JSON.parse(row.formConf),
fields: decodeFields(row.formFields)
}
} else if (row.formCustomCreatePath) {
this.$router.push({ path: row.formCustomCreatePath })
// Tab
}
},
getDateStar (ms) {
return getDate(ms)
},
getTimelineItemIcon (item) {
if (item.result === 1) {
return 'el-icon-time'
}
if (item.result === 2) {
return 'el-icon-check'
}
if (item.result === 3) {
return 'el-icon-close'
}
if (item.result === 4) {
return 'el-icon-remove-outline'
}
return ''
},
getTimelineItemType (item) {
if (item.result === 1) {
return 'primary'
}
if (item.result === 2) {
return 'success'
}
if (item.result === 3) {
return 'danger'
}
if (item.result === 4) {
return 'info'
}
return ''
},
/** 处理审批通过和不通过的操作 */
handleAudit (task, pass) {
const index = this.runningTasks.indexOf(task)
this.$refs['form' + index][0].validate(valid => {
if (!valid) {
return
}
const data = {
id: task.id,
reason: this.auditForms[index].reason
}
if (pass) {
approveTask(data).then(response => {
this.$modal.msgSuccess("审批通过成功!")
this.getDetail() //
})
} else {
rejectTask(data).then(response => {
this.$modal.msgSuccess("审批不通过成功!")
this.getDetail() //
})
}
})
},
/** 处理转派审批人 */
handleUpdateAssignee (task) {
//
this.resetUpdateAssigneeForm()
this.updateAssignee.form.id = task.id
//
this.updateAssignee.open = true
},
/** 提交转派审批人 */
submitUpdateAssigneeForm () {
this.$refs['updateAssigneeForm'].validate(valid => {
if (!valid) {
return
}
updateTaskAssignee(this.updateAssignee.form).then(response => {
this.$modal.msgSuccess("转派任务成功!")
this.updateAssignee.open = false
this.getDetail() //
})
})
},
/** 取消转派审批人 */
cancelUpdateAssigneeForm () {
this.updateAssignee.open = false
this.resetUpdateAssigneeForm()
},
/** 重置转派审批人 */
resetUpdateAssigneeForm () {
this.updateAssignee.form = {
id: undefined,
assigneeUserId: undefined,
}
this.resetForm("updateAssigneeForm")
},
/** 处理审批退回的操作 */
handleDelegate (task) {
this.$modal.msgError("暂不支持【委派】功能,可以使用【转派】替代!")
},
/** 处理审批退回的操作 */
handleBack (task) {
this.$modal.msgError("暂不支持【退回】功能!")
// http://blog.wya1.com/article/636697030/details/7296
// const data = {
// id: task.id,
// assigneeUserId: 1
// }
// backTask(data).then(response => {
// this.$modal.msgSuccess("退");
// this.getDetail(); //
// });
}
}
};
</script>
<style lang="scss">
.my-process-designer {
height: calc(100vh - 200px);
}
.box-card {
width: 100%;
margin-bottom: 20px;
}
</style>

View File

@ -1,113 +1,110 @@
<script setup lang="ts" name="ProcessInstance"> <template>
import dayjs from 'dayjs' <ContentWrap>
import { DICT_TYPE } from '@/utils/dict' <!-- 列表 -->
import { useTable } from '@/hooks/web/useTable' <XTable @register="registerTable">
import type { ProcessInstanceVO } from '@/api/bpm/processInstance/types' <template #toolbar_buttons>
import { allSchemas } from './process.data' <!-- 操作新增 -->
<XButton
type="primary"
preIcon="ep:zoom-in"
title="新建流程"
v-hasPermi="['bpm:process-instance:query']"
@click="handleCreate"
/>
</template>
<!-- 当前审批任务 -->
<template #tasks_default="{ row }">
<el-button
v-for="task in row.tasks"
:key="task.id"
type="text"
@click="handleFormDetail(task.id)"
>
<span>{{ task.name }}</span>
</el-button>
</template>
<!-- 操作 -->
<template #actionbtns_default="{ row }">
<XButton
type="primary"
title="取消"
v-if="row.result === 1"
preIcon="ep:delete"
@click="handleCancel(row)"
/>
<XButton type="primary" title="详情" preIcon="ep:edit-pen" @click="handleDetail(row)" />
</template>
</XTable>
</ContentWrap>
</template>
<script setup lang="ts">
// import
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useXTable } from '@/hooks/web/useXTable'
import { useRouter } from 'vue-router'
// import
import * as ProcessInstanceApi from '@/api/bpm/processInstance' import * as ProcessInstanceApi from '@/api/bpm/processInstance'
import { ElMessageBox } from 'element-plus' // import { decodeFields } from '@/utils/formGenerator' // TODO
const { t } = useI18n() // import { allSchemas } from './process.data'
const message = useMessage()
const router = useRouter() //
// ========== ========== // ========== ==========
const { register, tableObject, methods } = useTable<ProcessInstanceVO>({ const [registerTable] = useXTable({
allSchemas: allSchemas,
getListApi: ProcessInstanceApi.getMyProcessInstancePageApi getListApi: ProcessInstanceApi.getMyProcessInstancePageApi
}) })
const { getList, setSearchParams } = methods //
const detailOpen = ref(false)
// ========== CRUD ========== const detailForm = ref()
const dialogVisible = ref(false) // /** 发起流程操作 **/
// const handleCreate = () => {
const handleAdd = () => { router.push({
console.info('add') name: 'BpmProcessInstanceCreate'
}
//
const handleCancel = (row: ProcessInstanceVO) => {
ElMessageBox.prompt('请输入取消原因?', '取消流程', {
confirmButtonText: t('common.ok'),
cancelButtonText: t('common.cancel'),
type: 'warning',
inputPattern: /^[\s\S]*.*[^\s][\s\S]*$/, //
inputErrorMessage: '取消原因不能为空'
}).then(async ({ value }) => {
await ProcessInstanceApi.cancelProcessInstanceApi(row.id, value)
message.success('取消成功')
getList()
}) })
} }
/** 流程表单的详情按钮操作 */
// ========== ========== const handleFormDetail = (row) => {
const detailData = ref() // Ref // 使
if (row.formId) {
// // TODO
const handleDetail = async (row: ProcessInstanceVO) => { detailForm.value = {
// ...JSON.parse(row.formConf),
detailData.value = row fields: decodeFields([], row.formFields)
dialogVisible.value = true }
//
detailOpen.value = true
// 使
} else if (row.formCustomCreatePath) {
router.push({ path: row.formCustomCreatePath })
}
} }
// ========== ========== //
getList() const handleDetail = (row) => {
console.log(row, 'row')
router.push({ path: '/process-instance/detail', query: { id: row.id } })
}
/** 取消按钮操作 */
const handleCancel = (row) => {
const id = row.id
ElMessageBox.prompt('请输入取消原因?', '取消流程', {
type: 'warning',
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /^[\s\S]*.*\S[\s\S]*$/, //
inputErrorMessage: '取消原因不能为空'
})
.then(({ value }) => {
return ProcessInstanceApi.cancelProcessInstanceApi(id, value)
})
.then(() => {
ElMessage({
message: '取消成功',
type: 'success'
})
})
}
</script> </script>
<template>
<!-- 搜索工作区 -->
<ContentWrap>
<Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
</ContentWrap>
<ContentWrap>
<!-- 操作工具栏 -->
<div class="mb-10px">
<el-button type="primary" v-hasPermi="['bpm:process-instance:query']" @click="handleAdd">
<Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
</el-button>
</div>
<!-- 列表 -->
<Table
:columns="allSchemas.tableColumns"
:selection="false"
:data="tableObject.tableList"
:loading="tableObject.loading"
:pagination="{
total: tableObject.total
}"
v-model:pageSize="tableObject.pageSize"
v-model:currentPage="tableObject.currentPage"
@register="register"
>
<template #status="{ row }">
<DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" />
</template>
<template #createTime="{ row }">
<span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
</template>
<template #action="{ row }">
<el-button
link
type="primary"
v-hasPermi="['bpm:process-instance:query']"
@click="handleDetail(row)"
>
<Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
</el-button>
<el-button
link
type="primary"
v-hasPermi="['bpm:process-instance:cancel']"
@click="handleCancel(row)"
>
<Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
</el-button>
</template>
</Table>
</ContentWrap>
<XModal v-model="dialogVisible" :title="t('action.detail')">
<!-- 对话框(详情) -->
<Descriptions :schema="allSchemas.detailSchema" :data="detailData" />
<!-- 操作按钮 -->
<template #footer>
<el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
</template>
</XModal>
</template>

View File

@ -0,0 +1,36 @@
import { reactive } from 'vue'
// import { useI18n } from '@/hooks/web/useI18n'
import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
import { DICT_TYPE } from '@/utils/dict'
// const { t } = useI18n() // 国际化
// CrudSchema
const crudSchemas = reactive<VxeCrudSchema>({
primaryKey: 'id',
primaryType: 'id',
primaryTitle: '流程名称',
action: true,
actionWidth: '200px',
columns: [
{
title: '流程分类',
field: 'category',
dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
dictClass: 'number'
},
{
title: '流程版本',
field: 'processDefinition.version',
table: {
slots: {
default: 'version_default'
}
}
},
{
title: '流程描述',
field: 'description'
}
]
})
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)

View File

@ -1,84 +1,91 @@
import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' import { reactive } from 'vue'
import { useI18n } from '@/hooks/web/useI18n'
import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
import { DICT_TYPE } from '@/utils/dict'
const { t } = useI18n() // 国际化 const { t } = useI18n() // 国际化
// CrudSchema // CrudSchema
const crudSchemas = reactive<CrudSchema[]>([ const crudSchemas = reactive<VxeCrudSchema>({
primaryKey: 'id',
primaryType: null,
primaryTitle: '编号',
action: true,
actionWidth: '200px',
columns: [
{ {
label: t('common.index'), title: '编号',
field: 'id', field: 'id',
type: 'index', table: {
form: { width: 320
show: false
},
detail: {
show: false
} }
}, },
{ {
label: '流程名', title: '流程名',
field: 'name', field: 'name',
search: { isSearch: true
show: true
}
}, },
{ {
label: '流程分类', title: '所属流程',
field: 'processDefinitionId',
isSearch: true,
isTable: false
},
{
title: '流程分类',
field: 'category', field: 'category',
dictType: DICT_TYPE.BPM_MODEL_CATEGORY, dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
dictClass: 'number', dictClass: 'number',
search: { isSearch: true
show: true },
{
title: '当前审批任务',
field: 'tasks',
table: {
width: 100,
slots: {
default: 'tasks_default'
}
} }
}, },
{ {
label: '当前审批任务', title: t('common.status'),
field: 'tasks'
},
{
label: t('common.status'),
field: 'status', field: 'status',
dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS, dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS,
dictClass: 'number', dictClass: 'number',
search: { isSearch: true
show: true
}
}, },
{ {
label: '结果', title: '结果',
field: 'result', field: 'result',
dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT, dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT,
dictClass: 'number', dictClass: 'number',
search: { isSearch: true
show: true
}
}, },
{ {
label: '提交时间', title: '提交时间',
field: 'createTime', field: 'createTime',
form: { formatter: 'formatDate',
show: false table: {
width: 180
}, },
isForm: false,
isSearch: true,
search: { search: {
show: true show: true,
itemRender: {
name: 'XDataTimePicker'
}
} }
}, },
{ {
label: '结束时间', title: '结束时间',
field: 'endTime', field: 'endTime',
form: { formatter: 'formatDate',
show: false table: {
} width: 180
}, },
{ isForm: false
label: t('table.action'),
field: 'action',
width: '240px',
form: {
show: false
},
detail: {
show: false
} }
} ]
]) })
export const { allSchemas } = useCrudSchemas(crudSchemas) export const { allSchemas } = useVxeCrudSchemas(crudSchemas)

View File

@ -0,0 +1,36 @@
import { reactive } from 'vue'
// import { useI18n } from '@/hooks/web/useI18n'
import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
import { DICT_TYPE } from '@/utils/dict'
// const { t } = useI18n() // 国际化
// CrudSchema
const crudSchemas = reactive<VxeCrudSchema>({
primaryKey: 'id',
primaryType: 'id',
primaryTitle: '流程名称',
action: true,
actionWidth: '200px',
columns: [
{
title: '流程分类',
field: 'category',
dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
dictClass: 'number'
},
{
title: '流程版本',
field: 'processDefinition.version',
table: {
slots: {
default: 'version_default'
}
}
},
{
title: '流程描述',
field: 'description'
}
]
})
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)