| | |
| | | <template> |
| | | |
| | | <ContentWrap> |
| | | <!-- 搜索工作栏 --> |
| | | <el-form |
| | |
| | | :inline="true" |
| | | label-width="68px" |
| | | > |
| | | <el-form-item label="流程名称" prop="name"> |
| | | <el-form-item label="" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请输入流程名称" |
| | |
| | | class="!w-240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="所属流程" prop="processDefinitionId"> |
| | | <el-input |
| | | v-model="queryParams.processDefinitionId" |
| | | placeholder="请输入流程定义的编号" |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | class="!w-240px" |
| | | /> |
| | | |
| | | <el-form-item> |
| | | <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> |
| | | </el-form-item> |
| | | <el-form-item label="流程分类" prop="category"> |
| | | |
| | | <!-- TODO @ tuituji:style 可以使用 unocss --> |
| | | <el-form-item label="" prop="category" :style="{ position: 'absolute', right: '300px' }"> |
| | | <!-- TODO @tuituji:应该选择好分类,就触发搜索啦。 RE:done & to check--> |
| | | <el-select |
| | | v-model="queryParams.category" |
| | | placeholder="请选择流程分类" |
| | | clearable |
| | | class="!w-240px" |
| | | class="!w-155px" |
| | | @change="handleQuery" |
| | | > |
| | | <el-option |
| | | v-for="category in categoryList" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="流程状态" prop="status"> |
| | | |
| | | <el-form-item label="" prop="status" :style="{ position: 'absolute', right: '130px' }"> |
| | | <el-select |
| | | v-model="queryParams.status" |
| | | placeholder="请选择流程状态" |
| | | clearable |
| | | class="!w-240px" |
| | | class="!w-155px" |
| | | @change="handleQuery" |
| | | > |
| | | <el-option |
| | | v-for="dict in getIntDictOptions(DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS)" |
| | |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="发起时间" prop="createTime"> |
| | | <el-date-picker |
| | | v-model="queryParams.createTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" |
| | | class="!w-240px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> |
| | | <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | v-hasPermi="['bpm:process-instance:query']" |
| | | @click="handleCreate(undefined)" |
| | | |
| | | <!-- 高级筛选 --> |
| | | <!-- TODO @ tuituji:style 可以使用 unocss --> |
| | | <el-form-item :style="{ position: 'absolute', right: '0px' }"> |
| | | <el-popover |
| | | :visible="showPopover" |
| | | persistent |
| | | :width="400" |
| | | :show-arrow="false" |
| | | placement="bottom-end" |
| | | > |
| | | <Icon icon="ep:plus" class="mr-5px" /> 发起流程 |
| | | </el-button> |
| | | <template #reference> |
| | | <el-button @click="showPopover = !showPopover"> |
| | | <Icon icon="ep:plus" class="mr-5px" />高级筛选 |
| | | </el-button> |
| | | </template> |
| | | <el-form-item label="流程发起人" class="bold-label" label-position="top" prop="category"> |
| | | <el-select |
| | | v-model="queryParams.category" |
| | | placeholder="请选择流程发起人" |
| | | clearable |
| | | class="!w-390px" |
| | | > |
| | | <el-option |
| | | v-for="category in categoryList" |
| | | :key="category.code" |
| | | :label="category.name" |
| | | :value="category.code" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="所属流程" |
| | | class="bold-label" |
| | | label-position="top" |
| | | prop="processDefinitionKey" |
| | | > |
| | | <el-input |
| | | v-model="queryParams.processDefinitionKey" |
| | | placeholder="请输入流程定义的标识" |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | class="!w-390px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="发起时间" class="bold-label" label-position="top" prop="createTime"> |
| | | <el-date-picker |
| | | v-model="queryParams.createTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" |
| | | class="!w-240px" |
| | | /> |
| | | </el-form-item> |
| | | <!-- TODO tuituiji:参考钉钉,1)按照清空、取消、确认排序。2)右对齐。3)确认增加 primary --> |
| | | <el-form-item class="bold-label" label-position="top"> |
| | | <el-button @click="handleQuery"> 确认</el-button> |
| | | <el-button @click="showPopover = false"> 取消</el-button> |
| | | <el-button @click="resetQuery"> 清空</el-button> |
| | | </el-form-item> |
| | | </el-popover> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | |
| | | min-width="100" |
| | | fixed="left" |
| | | /> |
| | | <!-- TODO @芋艿:摘要 --> |
| | | <!-- TODO tuituiji:参考钉钉;1)审批中时,展示审批任务;2)非审批中,展示状态 --> |
| | | <el-table-column label="流程状态" prop="status" width="120"> |
| | | <template #default="scope"> |
| | | <dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS" :value="scope.row.status" /> |
| | |
| | | width="180" |
| | | :formatter="dateFormatter" |
| | | /> |
| | | <el-table-column align="center" label="耗时" prop="durationInMillis" width="160"> |
| | | <!--<el-table-column align="center" label="耗时" prop="durationInMillis" width="160"> |
| | | <template #default="scope"> |
| | | {{ scope.row.durationInMillis > 0 ? formatPast2(scope.row.durationInMillis) : '-' }} |
| | | </template> |
| | |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="流程编号" align="center" prop="id" min-width="320px" /> |
| | | --> |
| | | <el-table-column label="操作" align="center" fixed="right" width="180"> |
| | | <template #default="scope"> |
| | | <el-button |
| | |
| | | </ContentWrap> |
| | | </template> |
| | | <script lang="ts" setup> |
| | | // TODO @tuituji:List 改成 <Icon icon="ep:plus" class="mr-5px" /> 类似这种组件哈。 RE:done & to check |
| | | import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' |
| | | import { dateFormatter, formatPast2 } from '@/utils/formatTime' |
| | | import { dateFormatter } from '@/utils/formatTime' |
| | | import { ElMessageBox } from 'element-plus' |
| | | import * as ProcessInstanceApi from '@/api/bpm/processInstance' |
| | | import { CategoryApi } from '@/api/bpm/category' |
| | | import { CategoryApi, CategoryVO } from '@/api/bpm/category' |
| | | import { ProcessInstanceVO } from '@/api/bpm/processInstance' |
| | | import * as DefinitionApi from '@/api/bpm/definition' |
| | | |
| | |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | name: '', |
| | | processDefinitionId: undefined, |
| | | processDefinitionKey: undefined, |
| | | category: undefined, |
| | | status: undefined, |
| | | createTime: [] |
| | | }) |
| | | const queryFormRef = ref() // 搜索的表单 |
| | | const categoryList = ref([]) // 流程分类列表 |
| | | const categoryList = ref<CategoryVO[]>([]) // 流程分类列表 |
| | | |
| | | /** 查询列表 */ |
| | | const getList = async () => { |
| | |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | const showPopover = ref(false) |
| | | |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | |
| | | /** 查看详情 */ |
| | | const handleDetail = (row) => { |
| | | const handleDetail = (row: ProcessInstanceVO) => { |
| | | router.push({ |
| | | name: 'BpmProcessInstanceDetail', |
| | | query: { |
| | |
| | | } |
| | | |
| | | /** 取消按钮操作 */ |
| | | const handleCancel = async (row) => { |
| | | const handleCancel = async (row: ProcessInstanceVO) => { |
| | | // 二次确认 |
| | | const { value } = await ElMessageBox.prompt('请输入取消原因', '取消流程', { |
| | | confirmButtonText: t('common.ok'), |
| | |
| | | categoryList.value = await CategoryApi.getCategorySimpleList() |
| | | }) |
| | | </script> |
| | | <style> |
| | | .bold-label .el-form-item__label { |
| | | font-weight: bold; /* 将字体加粗 */ |
| | | } |
| | | </style> |