From 51c593f319048fac1e521457297bf9b5cc9a325b Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Fri, 9 Jan 2026 14:23:37 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20[bpm]=20=E5=AE=A1=E6=89=B9=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=93=8D=E4=BD=9C=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/processInstance/index.ts | 2 + src/api/bpm/task/index.ts | 6 + .../detail/components/operation-button.vue | 207 ++++++++++++++++++ .../processInstance/detail/index.vue | 71 ++---- src/pages/bpm/components/todo-list.vue | 2 +- 5 files changed, 236 insertions(+), 52 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/components/operation-button.vue diff --git a/src/api/bpm/processInstance/index.ts b/src/api/bpm/processInstance/index.ts index 3aa3930..bcb3f44 100644 --- a/src/api/bpm/processInstance/index.ts +++ b/src/api/bpm/processInstance/index.ts @@ -1,3 +1,4 @@ +import type { Task } from '@/api/bpm/task' import type { PageParam, PageResult } from '@/http/types' import { http } from '@/http/http' @@ -47,6 +48,7 @@ export interface ProcessInstance { export interface ApprovalDetail { processInstance: ProcessInstance processDefinition: ProcessDefinition + todoTask: Task } /** 抄送流程实例 */ diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index 115ba2e..8635186 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -11,6 +11,10 @@ export interface TaskUser { deptName?: string } +export interface OperationButtonSetting { + displayName: string // 按钮名称 + enable: boolean // 是否启用 +} /** 流程任务 */ export interface Task { id: string @@ -24,6 +28,8 @@ export interface Task { ownerUser?: TaskUser processInstanceId?: string // 流程实例 ID processInstance: ProcessInstance + reasonRequire?: boolean // 是否填写审批意见 + buttonsSetting?: Record // 按钮设置 } /** 查询待办任务分页列表 */ diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue new file mode 100644 index 0000000..4c957e1 --- /dev/null +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -0,0 +1,207 @@ + + + + diff --git a/src/pages-bpm/processInstance/detail/index.vue b/src/pages-bpm/processInstance/detail/index.vue index 5474c8d..519aa5c 100644 --- a/src/pages-bpm/processInstance/detail/index.vue +++ b/src/pages-bpm/processInstance/detail/index.vue @@ -88,29 +88,15 @@ - - - - - 拒绝 - - - 同意 - - - - - - - + + diff --git a/src/pages/bpm/components/todo-list.vue b/src/pages/bpm/components/todo-list.vue index d0f61a0..3c49bfd 100644 --- a/src/pages/bpm/components/todo-list.vue +++ b/src/pages/bpm/components/todo-list.vue @@ -118,7 +118,7 @@ function handleReset() { /** 查看详情 */ function handleDetail(item: Task) { - uni.navigateTo({ url: `/pages-bpm/processInstance/detail/index?id=${item.processInstance.id}` }) + uni.navigateTo({ url: `/pages-bpm/processInstance/detail/index?id=${item.processInstance.id}&taskId=${item.id}` }) } /** 同意 */ -- Gitee From 73c9a8212de75b325b732c0d0e61eb18fdf64a49 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 10 Jan 2026 08:35:59 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=20tabbar=20=E6=98=BE=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.ku.vue | 15 ++++----------- src/App.vue | 3 +-- src/router/interceptor.ts | 5 ++++- src/tabbar/store.ts | 21 ++++++++++++++++++++- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/App.ku.vue b/src/App.ku.vue index 8aab489..996bd9c 100644 --- a/src/App.ku.vue +++ b/src/App.ku.vue @@ -2,23 +2,16 @@ import { ref } from 'vue' import { useThemeStore } from '@/store' import FgTabbar from '@/tabbar/index.vue' -import { isPageTabbar } from './tabbar/store' +import { tabbarVisible, updateTabbarVisible } from './tabbar/store' import { currRoute } from './utils' const themeStore = useThemeStore() -const isCurrentPageTabbar = ref(true) onShow(() => { console.log('App.ku.vue onShow', currRoute()) const { path } = currRoute() - // “蜡笔小开心”提到本地是 '/pages/index/index',线上是 '/' 导致线上 tabbar 不见了 - // 所以这里需要判断一下,如果是 '/' 就当做首页,也要显示 tabbar - if (path === '/') { - isCurrentPageTabbar.value = true - } - else { - isCurrentPageTabbar.value = isPageTabbar(path) - } + // 更新 tabbar 的显示状态 + updateTabbarVisible(path) }) const helloKuRoot = ref('Hello AppKuVue') @@ -39,7 +32,7 @@ defineExpose({ - + diff --git a/src/App.vue b/src/App.vue index 0ea6924..85a6f3e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,8 +11,7 @@ onShow((options) => { // https://github.com/unibest-tech/unibest/issues/192 if (options?.path) { navigateToInterceptor.invoke({ url: `/${options.path}`, query: options.query }) - } - else { + } else { navigateToInterceptor.invoke({ url: '/' }) } }) diff --git a/src/router/interceptor.ts b/src/router/interceptor.ts index 36031b1..fc09c8f 100644 --- a/src/router/interceptor.ts +++ b/src/router/interceptor.ts @@ -6,7 +6,7 @@ import { isMp } from '@uni-helper/uni-env' * 黑、白名单的配置,请看 config.ts 文件, EXCLUDE_LOGIN_PATH_LIST */ import { useTokenStore } from '@/store/token' -import { isPageTabbar, tabbarStore } from '@/tabbar/store' +import { isPageTabbar, tabbarStore, updateTabbarVisible } from '@/tabbar/store' import { getAllPages, getLastPage, HOME_PAGE, parseUrlToObj } from '@/utils/index' import { toLoginPage } from '@/utils/toLoginPage' import { EXCLUDE_LOGIN_PATH_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_ENABLE_IN_MP, NOT_FOUND_PAGE } from './config' @@ -70,6 +70,9 @@ export const navigateToInterceptor = { path = url } + // 更新 tabbar 的显示状态 + updateTabbarVisible(path) + // 处理直接进入路由非首页时,tabbarIndex 不正确的问题 tabbarStore.setAutoCurIdx(path) diff --git a/src/tabbar/store.ts b/src/tabbar/store.ts index b936173..79d6e1f 100644 --- a/src/tabbar/store.ts +++ b/src/tabbar/store.ts @@ -1,6 +1,6 @@ /* eslint-disable brace-style */ // 原因:unibest 官方维护的代码,尽量不要大概,避免难以合并 import type { CustomTabBarItem, CustomTabBarItemBadge } from './types' -import { reactive } from 'vue' +import { reactive, ref } from 'vue' import { isNeedLoginMode } from '@/router/config' import { FG_LOG_ENABLE, judgeIsExcludePath } from '@/router/interceptor' @@ -33,6 +33,25 @@ export function isPageTabbar(path: string) { return tabbarList.some(item => item.pagePath === _path) } +// tabbar 的显示状态 +export const tabbarVisible = ref(true) + +/** + * 更新 tabbar 的显示状态, 仅在 onShow 更新。微信小程序中 tabbar 显示不正确 + * src/router/interceptor.ts 中的 navigateToInterceptor 会调用 updateTabbarVisible + * + * @param path 当前页面的 path + */ +export function updateTabbarVisible(path: string) { + // “蜡笔小开心”提到本地是 '/pages/index/index',线上是 '/' 导致线上 tabbar 不见了 + // 所以这里需要判断一下,如果是 '/' 就当做首页,也要显示 tabbar + if (path === '/') { + tabbarVisible.value = true + return + } + tabbarVisible.value = isPageTabbar(path) +} + /** * 自定义 tabbar 的状态管理,原生 tabbar 无需关注本文件 * tabbar 状态,增加 storageSync 保证刷新浏览器时在正确的 tabbar 页面 -- Gitee From eca81e8ee32d295d318376a05cfe20412bc75f2d Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 10 Jan 2026 22:35:29 +0800 Subject: [PATCH 3/8] =?UTF-8?q?Revert=20"feat:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=20tabbar=20=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 73c9a8212de75b325b732c0d0e61eb18fdf64a49. --- src/App.ku.vue | 15 +++++++++++---- src/App.vue | 3 ++- src/router/interceptor.ts | 5 +---- src/tabbar/store.ts | 21 +-------------------- 4 files changed, 15 insertions(+), 29 deletions(-) diff --git a/src/App.ku.vue b/src/App.ku.vue index 996bd9c..8aab489 100644 --- a/src/App.ku.vue +++ b/src/App.ku.vue @@ -2,16 +2,23 @@ import { ref } from 'vue' import { useThemeStore } from '@/store' import FgTabbar from '@/tabbar/index.vue' -import { tabbarVisible, updateTabbarVisible } from './tabbar/store' +import { isPageTabbar } from './tabbar/store' import { currRoute } from './utils' const themeStore = useThemeStore() +const isCurrentPageTabbar = ref(true) onShow(() => { console.log('App.ku.vue onShow', currRoute()) const { path } = currRoute() - // 更新 tabbar 的显示状态 - updateTabbarVisible(path) + // “蜡笔小开心”提到本地是 '/pages/index/index',线上是 '/' 导致线上 tabbar 不见了 + // 所以这里需要判断一下,如果是 '/' 就当做首页,也要显示 tabbar + if (path === '/') { + isCurrentPageTabbar.value = true + } + else { + isCurrentPageTabbar.value = isPageTabbar(path) + } }) const helloKuRoot = ref('Hello AppKuVue') @@ -32,7 +39,7 @@ defineExpose({ - + diff --git a/src/App.vue b/src/App.vue index 85a6f3e..0ea6924 100644 --- a/src/App.vue +++ b/src/App.vue @@ -11,7 +11,8 @@ onShow((options) => { // https://github.com/unibest-tech/unibest/issues/192 if (options?.path) { navigateToInterceptor.invoke({ url: `/${options.path}`, query: options.query }) - } else { + } + else { navigateToInterceptor.invoke({ url: '/' }) } }) diff --git a/src/router/interceptor.ts b/src/router/interceptor.ts index fc09c8f..36031b1 100644 --- a/src/router/interceptor.ts +++ b/src/router/interceptor.ts @@ -6,7 +6,7 @@ import { isMp } from '@uni-helper/uni-env' * 黑、白名单的配置,请看 config.ts 文件, EXCLUDE_LOGIN_PATH_LIST */ import { useTokenStore } from '@/store/token' -import { isPageTabbar, tabbarStore, updateTabbarVisible } from '@/tabbar/store' +import { isPageTabbar, tabbarStore } from '@/tabbar/store' import { getAllPages, getLastPage, HOME_PAGE, parseUrlToObj } from '@/utils/index' import { toLoginPage } from '@/utils/toLoginPage' import { EXCLUDE_LOGIN_PATH_LIST, isNeedLoginMode, LOGIN_PAGE, LOGIN_PAGE_ENABLE_IN_MP, NOT_FOUND_PAGE } from './config' @@ -70,9 +70,6 @@ export const navigateToInterceptor = { path = url } - // 更新 tabbar 的显示状态 - updateTabbarVisible(path) - // 处理直接进入路由非首页时,tabbarIndex 不正确的问题 tabbarStore.setAutoCurIdx(path) diff --git a/src/tabbar/store.ts b/src/tabbar/store.ts index 79d6e1f..b936173 100644 --- a/src/tabbar/store.ts +++ b/src/tabbar/store.ts @@ -1,6 +1,6 @@ /* eslint-disable brace-style */ // 原因:unibest 官方维护的代码,尽量不要大概,避免难以合并 import type { CustomTabBarItem, CustomTabBarItemBadge } from './types' -import { reactive, ref } from 'vue' +import { reactive } from 'vue' import { isNeedLoginMode } from '@/router/config' import { FG_LOG_ENABLE, judgeIsExcludePath } from '@/router/interceptor' @@ -33,25 +33,6 @@ export function isPageTabbar(path: string) { return tabbarList.some(item => item.pagePath === _path) } -// tabbar 的显示状态 -export const tabbarVisible = ref(true) - -/** - * 更新 tabbar 的显示状态, 仅在 onShow 更新。微信小程序中 tabbar 显示不正确 - * src/router/interceptor.ts 中的 navigateToInterceptor 会调用 updateTabbarVisible - * - * @param path 当前页面的 path - */ -export function updateTabbarVisible(path: string) { - // “蜡笔小开心”提到本地是 '/pages/index/index',线上是 '/' 导致线上 tabbar 不见了 - // 所以这里需要判断一下,如果是 '/' 就当做首页,也要显示 tabbar - if (path === '/') { - tabbarVisible.value = true - return - } - tabbarVisible.value = isPageTabbar(path) -} - /** * 自定义 tabbar 的状态管理,原生 tabbar 无需关注本文件 * tabbar 状态,增加 storageSync 保证刷新浏览器时在正确的 tabbar 页面 -- Gitee From 956f04379d99baddd0d801316ee4594553d4d594 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 11 Jan 2026 21:40:40 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20[bpm]=20=E8=BD=AC=E5=8A=9E=E5=92=8C?= =?UTF-8?q?=E5=A7=94=E6=B4=BE=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/task/index.ts | 10 ++ .../detail/components/operation-button.vue | 8 +- .../processInstance/detail/reassign/index.vue | 153 ++++++++++++++++++ 3 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/reassign/index.vue diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index 8635186..e7d854b 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -61,3 +61,13 @@ export function getTaskListByProcessInstanceId(processInstanceId: string) { export function getTaskManagerPage(params: PageParam) { return http.get>('/bpm/task/manager-page', params) } + +/** 委派任务 */ +export function delegateTask(data: { id: string, delegateUserId: string, reason: string }) { + return http.put('/bpm/task/delegate', data) +} + +/** 转办任务 */ +export function transferTask(data: { id: string, assigneeUserId: string, reason: string }) { + return http.put('/bpm/task/transfer', data) +} diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue index 4c957e1..0792418 100644 --- a/src/pages-bpm/processInstance/detail/components/operation-button.vue +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -144,10 +144,14 @@ function handleOperation(operationType: number) { uni.navigateTo({ url: `/pages-bpm/processInstance/detail/audit/index?id=${runningTask.value.id}&pass=false` }) break case BpmTaskOperationButtonTypeEnum.DELEGATE: - toast.show('委派功能待实现') + uni.navigateTo({ + url: `/pages-bpm/processInstance/detail/reassign/index?processInstanceId=${runningTask.value.processInstanceId}&taskId=${runningTask.value.id}&type=delegate`, + }) break case BpmTaskOperationButtonTypeEnum.TRANSFER: - toast.show('转办功能待实现') + uni.navigateTo({ + url: `/pages-bpm/processInstance/detail/reassign/index?processInstanceId=${runningTask.value.processInstanceId}&taskId=${runningTask.value.id}&type=transfer`, + }) break case BpmTaskOperationButtonTypeEnum.ADD_SIGN: toast.show('加签功能待实现') diff --git a/src/pages-bpm/processInstance/detail/reassign/index.vue b/src/pages-bpm/processInstance/detail/reassign/index.vue new file mode 100644 index 0000000..a4a4488 --- /dev/null +++ b/src/pages-bpm/processInstance/detail/reassign/index.vue @@ -0,0 +1,153 @@ + + + -- Gitee From dda2d4240abc939fe85b83896860e3c8fbad5302 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 11 Jan 2026 23:00:51 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20[bpm]=20=E9=80=80=E5=9B=9E=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/task/index.ts | 10 ++ .../detail/components/operation-button.vue | 68 ++++---- .../processInstance/detail/return/index.vue | 157 ++++++++++++++++++ 3 files changed, 202 insertions(+), 33 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/return/index.vue diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index e7d854b..38386d5 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -71,3 +71,13 @@ export function delegateTask(data: { id: string, delegateUserId: string, reason: export function transferTask(data: { id: string, assigneeUserId: string, reason: string }) { return http.put('/bpm/task/transfer', data) } + +/** 退回任务 */ +export function returnTask(data: { id: string, targetTaskDefinitionKey: string, reason: string }) { + return http.put('/bpm/task/return', data) +} + +/** 获取可退回的节点列表 */ +export function getTaskListByReturn(taskId: string) { + return http.get(`/bpm/task/list-by-return?id=${taskId}`) +} diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue index 0792418..5441f64 100644 --- a/src/pages-bpm/processInstance/detail/components/operation-button.vue +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -1,40 +1,39 @@ -- Gitee From 0a58e7b97396a7885478152139306ebc30a4dc27 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Mon, 12 Jan 2026 10:00:52 +0800 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20[bpm]=20=E5=8A=A0=E7=AD=BE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/task/index.ts | 5 + src/components/system-select/user-picker.vue | 3 + .../processInstance/detail/add-sign/index.vue | 150 ++++++++++++++++++ .../detail/components/operation-button.vue | 5 +- .../processInstance/detail/return/index.vue | 1 - 5 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/add-sign/index.vue diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index 38386d5..4341290 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -81,3 +81,8 @@ export function returnTask(data: { id: string, targetTaskDefinitionKey: string, export function getTaskListByReturn(taskId: string) { return http.get(`/bpm/task/list-by-return?id=${taskId}`) } + +/** 加签任务 */ +export function signCreateTask(data: { id: string, type: string, userIds: number[], reason: string }) { + return http.put('/bpm/task/create-sign', data) +} diff --git a/src/components/system-select/user-picker.vue b/src/components/system-select/user-picker.vue index 3dbeca6..6efedbe 100644 --- a/src/components/system-select/user-picker.vue +++ b/src/components/system-select/user-picker.vue @@ -7,6 +7,7 @@ value-key="id" label-key="nickname" :type="type" + :prop="prop" filterable :placeholder="placeholder" @confirm="handleConfirm" @@ -23,10 +24,12 @@ const props = withDefaults(defineProps<{ type?: 'radio' | 'checkbox' label?: string placeholder?: string + prop?: string }>(), { type: 'checkbox', label: '', placeholder: '请选择', + prop: '', }) const emit = defineEmits<{ diff --git a/src/pages-bpm/processInstance/detail/add-sign/index.vue b/src/pages-bpm/processInstance/detail/add-sign/index.vue new file mode 100644 index 0000000..801108a --- /dev/null +++ b/src/pages-bpm/processInstance/detail/add-sign/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue index 5441f64..c4dcc3b 100644 --- a/src/pages-bpm/processInstance/detail/components/operation-button.vue +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -108,7 +108,6 @@ function loadTodoTask(task: Task) { plain: false, }) } - console.log('rightOperationTypes====>', rightOperationTypes) // TODO 减签 // 左侧操作,和更多操作 Object.keys(task.buttonsSetting || {}).forEach((key) => { @@ -154,7 +153,9 @@ function handleOperation(operationType: number) { }) break case BpmTaskOperationButtonTypeEnum.ADD_SIGN: - toast.show('加签功能待实现') + uni.navigateTo({ + url: `/pages-bpm/processInstance/detail/add-sign/index?processInstanceId=${runningTask.value.processInstanceId}&taskId=${runningTask.value.id}`, + }) break case BpmTaskOperationButtonTypeEnum.RETURN: uni.navigateTo({ diff --git a/src/pages-bpm/processInstance/detail/return/index.vue b/src/pages-bpm/processInstance/detail/return/index.vue index a0ebfe7..b245c7c 100644 --- a/src/pages-bpm/processInstance/detail/return/index.vue +++ b/src/pages-bpm/processInstance/detail/return/index.vue @@ -105,7 +105,6 @@ if (!props.taskId || !props.processInstanceId) { async function loadReturnTaskList() { try { const result = await getTaskListByReturn(taskId.value) - console.log('[return] 获取可退回节点:', result) if (result && Array.isArray(result)) { activityOptions.value = result } -- Gitee From 2be09644b71ca070ca646b635b3714b41a947492 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Tue, 13 Jan 2026 11:00:54 +0800 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20[bpm]=20=E5=87=8F=E7=AD=BE=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/task/index.ts | 6 + .../detail/components/operation-button.vue | 63 +++++- .../detail/delete-sign/index.vue | 181 ++++++++++++++++++ src/utils/constants/biz-bpm-enum.ts | 6 + 4 files changed, 253 insertions(+), 3 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/delete-sign/index.vue diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index 4341290..8ff897a 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -30,6 +30,7 @@ export interface Task { processInstance: ProcessInstance reasonRequire?: boolean // 是否填写审批意见 buttonsSetting?: Record // 按钮设置 + children?: Task[] // 由加签生成,包含多层子任务 } /** 查询待办任务分页列表 */ @@ -86,3 +87,8 @@ export function getTaskListByReturn(taskId: string) { export function signCreateTask(data: { id: string, type: string, userIds: number[], reason: string }) { return http.put('/bpm/task/create-sign', data) } + +/** 减签任务 */ +export function signDeleteTask(data: { id: string, reason: string }) { + return http.delete('/bpm/task/delete-sign', data) +} diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue index c4dcc3b..1076eba 100644 --- a/src/pages-bpm/processInstance/detail/components/operation-button.vue +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -41,7 +41,9 @@ import type { Action } from 'wot-design-uni/components/wd-action-sheet/types' import type { ButtonType } from 'wot-design-uni/components/wd-button/types' import type { Task } from '@/api/bpm/task' import { useToast } from 'wot-design-uni' +import { useUserStore } from '@/store' import { + BpmProcessInstanceStatus, BpmTaskOperationButtonTypeEnum, BpmTaskStatusEnum, OPERATION_BUTTON_NAME, @@ -71,7 +73,10 @@ const operationIconsMap: Record = { [BpmTaskOperationButtonTypeEnum.DELEGATE]: 'share', [BpmTaskOperationButtonTypeEnum.RETURN]: 'arrow-left', [BpmTaskOperationButtonTypeEnum.COPY]: 'copy', + [BpmTaskOperationButtonTypeEnum.DELETE_SIGN]: 'remove', } + +const userStore = useUserStore() /** 左侧操作按钮 【最多两个】{转办, 委派, 退回, 加签, 抄送等} */ const leftOperations = ref([]) @@ -90,7 +95,7 @@ function loadTodoTask(task: Task) { if (task) { reasonRequire.value = task.reasonRequire ?? false // 右侧按钮 - if (isHandleTaskStatus() && task.buttonsSetting && task.buttonsSetting[BpmTaskOperationButtonTypeEnum.REJECT]?.enable) { + if (isHandleTaskStatus() && isShowButton(BpmTaskOperationButtonTypeEnum.REJECT)) { rightOperationTypes.push(BpmTaskOperationButtonTypeEnum.REJECT) rightOperations.value.push({ operationType: BpmTaskOperationButtonTypeEnum.REJECT, @@ -99,7 +104,7 @@ function loadTodoTask(task: Task) { plain: true, }) } - if (isHandleTaskStatus() && task.buttonsSetting && task.buttonsSetting[BpmTaskOperationButtonTypeEnum.APPROVE]?.enable) { + if (isHandleTaskStatus() && isShowButton(BpmTaskOperationButtonTypeEnum.APPROVE)) { rightOperationTypes.push(BpmTaskOperationButtonTypeEnum.APPROVE) rightOperations.value.push({ operationType: BpmTaskOperationButtonTypeEnum.APPROVE, @@ -108,7 +113,7 @@ function loadTodoTask(task: Task) { plain: false, }) } - // TODO 减签 + // 左侧操作,和更多操作 Object.keys(task.buttonsSetting || {}).forEach((key) => { const operationType = Number(key) @@ -128,6 +133,21 @@ function loadTodoTask(task: Task) { } } }) + /** 减签操作的显示 */ + if (isShowDeleteSign()) { + if (leftOperations.value.length >= 2) { + moreOperations.value.push({ + name: getButtonDisplayName(BpmTaskOperationButtonTypeEnum.DELETE_SIGN), + operationType: BpmTaskOperationButtonTypeEnum.DELETE_SIGN, + }) + } else { + leftOperations.value.push({ + operationType: BpmTaskOperationButtonTypeEnum.DELETE_SIGN, + iconName: operationIconsMap[BpmTaskOperationButtonTypeEnum.DELETE_SIGN], + displayName: getButtonDisplayName(BpmTaskOperationButtonTypeEnum.DELETE_SIGN), + }) + } + } } } /** 跳转到相应的操作页面 */ @@ -162,6 +182,11 @@ function handleOperation(operationType: number) { url: `/pages-bpm/processInstance/detail/return/index?processInstanceId=${runningTask.value.processInstanceId}&taskId=${runningTask.value.id}`, }) break + case BpmTaskOperationButtonTypeEnum.DELETE_SIGN: + uni.navigateTo({ + url: `/pages-bpm/processInstance/detail/delete-sign/index?processInstanceId=${runningTask.value.processInstanceId}&taskId=${runningTask.value.id}&children=${encodeURIComponent(JSON.stringify(runningTask.value.children || []))}`, + }) + break } } @@ -209,6 +234,38 @@ function isHandleTaskStatus() { return canHandle } +/** 流程状态是否为结束状态 */ +function isEndProcessStatus(status: number) { + let isEndStatus = false + if ( + BpmProcessInstanceStatus.APPROVE === status + || BpmProcessInstanceStatus.REJECT === status + || BpmProcessInstanceStatus.CANCEL === status + ) { + isEndStatus = true + } + return isEndStatus +} + +/** 流程发起人是否为当前用户 */ +function isProcessStartUser() { + let isStartUser = false + if (userStore.userInfo?.userId === runningTask.value?.processInstance?.startUser?.id) { + isStartUser = true + } + return isStartUser +} + +/** 是否显示减签 */ +function isShowDeleteSign() { + return runningTask.value?.children?.length > 0 +} + +/** 是否显示流程发起人取消 */ +function isShowProcessStartCancel() { + return isProcessStartUser +} + /** 暴露方法 */ defineExpose({ loadTodoTask }) diff --git a/src/pages-bpm/processInstance/detail/delete-sign/index.vue b/src/pages-bpm/processInstance/detail/delete-sign/index.vue new file mode 100644 index 0000000..0f5da26 --- /dev/null +++ b/src/pages-bpm/processInstance/detail/delete-sign/index.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/utils/constants/biz-bpm-enum.ts b/src/utils/constants/biz-bpm-enum.ts index 93e18c9..32cdceb 100644 --- a/src/utils/constants/biz-bpm-enum.ts +++ b/src/utils/constants/biz-bpm-enum.ts @@ -147,6 +147,10 @@ export enum BpmTaskOperationButtonTypeEnum { * 委派 */ DELEGATE = 4, + /** + * 减签 + */ + DELETE_SIGN = 8, /** * 拒绝 */ @@ -159,6 +163,7 @@ export enum BpmTaskOperationButtonTypeEnum { * 转办 */ TRANSFER = 3, + } /** @@ -286,6 +291,7 @@ OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.DELEGATE, '委派') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.ADD_SIGN, '加签') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.RETURN, '退回') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.COPY, '抄送') +OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.DELETE_SIGN, '减签') /** * 流程实例的变量枚举 -- Gitee From db6c85a834cb69d5cb28bfadcdf9db8ed8f52483 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Tue, 13 Jan 2026 14:23:57 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20[bpm]=20=E6=B5=81=E7=A8=8B=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/components/operation-button.vue | 63 +++++++-- .../processInstance/detail/index.vue | 27 ++-- .../detail/process-cancel/index.vue | 133 ++++++++++++++++++ src/store/user.ts | 2 + src/utils/constants/biz-bpm-enum.ts | 6 +- 5 files changed, 206 insertions(+), 25 deletions(-) create mode 100644 src/pages-bpm/processInstance/detail/process-cancel/index.vue diff --git a/src/pages-bpm/processInstance/detail/components/operation-button.vue b/src/pages-bpm/processInstance/detail/components/operation-button.vue index 1076eba..f209081 100644 --- a/src/pages-bpm/processInstance/detail/components/operation-button.vue +++ b/src/pages-bpm/processInstance/detail/components/operation-button.vue @@ -33,12 +33,24 @@ - + + + + 取消 + + diff --git a/src/pages-bpm/processInstance/detail/index.vue b/src/pages-bpm/processInstance/detail/index.vue index 519aa5c..196a33c 100644 --- a/src/pages-bpm/processInstance/detail/index.vue +++ b/src/pages-bpm/processInstance/detail/index.vue @@ -12,32 +12,31 @@ - {{ processInstance.name }} - - {{ getStatusText(processInstance.status) }} + {{ processInstance?.name }} + + {{ getStatusText(processInstance?.status) }} - {{ processInstance.startUser?.nickname?.[0] || '?' }} + {{ processInstance?.startUser?.nickname?.[0] || '?' }} - {{ processInstance.startUser?.nickname }} - - {{ processInstance.startUser?.deptName }} + {{ processInstance?.startUser?.nickname }} + + {{ processInstance?.startUser?.deptName }} - 提交于 {{ formatDateTime(processInstance.startTime) }} + 提交于 {{ formatDateTime(processInstance?.startTime) }} - @@ -89,7 +88,7 @@ - + @@ -120,8 +119,8 @@ definePage({ const userStore = useUserStore() const toast = useToast() -const processInstance = ref>({}) -const processDefinition = ref>({}) +const processInstance = ref() +const processDefinition = ref() const tasks = ref([]) const orderAsc = ref(true) @@ -238,8 +237,8 @@ async function loadProcessInstance() { return } processInstance.value = data.processInstance - processDefinition.value = data.processDefinition || {} - operationButtonRef.value?.loadTodoTask(data.todoTask) + processDefinition.value = data.processDefinition + operationButtonRef.value?.init(data.processInstance, data.todoTask) } /** 加载任务列表 */ diff --git a/src/pages-bpm/processInstance/detail/process-cancel/index.vue b/src/pages-bpm/processInstance/detail/process-cancel/index.vue new file mode 100644 index 0000000..d360bea --- /dev/null +++ b/src/pages-bpm/processInstance/detail/process-cancel/index.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/store/user.ts b/src/store/user.ts index 651d080..6577f03 100644 --- a/src/store/user.ts +++ b/src/store/user.ts @@ -63,6 +63,8 @@ export const useUserStore = defineStore( /** 获取用户信息 */ const fetchUserInfo = async () => { const res = await getAuthPermissionInfo() + // 后端返回的用户 Id 字段为 id. + res.user.userId = res.user.id setUserInfo(res) return res } diff --git a/src/utils/constants/biz-bpm-enum.ts b/src/utils/constants/biz-bpm-enum.ts index 32cdceb..1149c1d 100644 --- a/src/utils/constants/biz-bpm-enum.ts +++ b/src/utils/constants/biz-bpm-enum.ts @@ -151,6 +151,10 @@ export enum BpmTaskOperationButtonTypeEnum { * 减签 */ DELETE_SIGN = 8, + /** + * 流程发起人取消 + */ + PROCESS_START_CANCEL = 9, /** * 拒绝 */ @@ -163,7 +167,6 @@ export enum BpmTaskOperationButtonTypeEnum { * 转办 */ TRANSFER = 3, - } /** @@ -292,6 +295,7 @@ OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.ADD_SIGN, '加签') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.RETURN, '退回') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.COPY, '抄送') OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.DELETE_SIGN, '减签') +OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.PROCESS_START_CANCEL, '取消') /** * 流程实例的变量枚举 -- Gitee