diff --git a/src/api/bpm/oa/leave/index.ts b/src/api/bpm/oa/leave/index.ts index 6266b44..38ee117 100644 --- a/src/api/bpm/oa/leave/index.ts +++ b/src/api/bpm/oa/leave/index.ts @@ -8,9 +8,9 @@ export interface Leave { type: number reason: string processInstanceId: string - startTime: number - endTime: number - createTime: number + startTime: Date | any + endTime: Date | any + createTime: Date startUserSelectAssignees?: Record } @@ -19,11 +19,6 @@ export function createLeave(data: Partial) { return http.post('/bpm/oa/leave/create', data) } -/** 更新请假申请 */ -export function updateLeave(data: Partial) { - return http.put('/bpm/oa/leave/update', data) -} - /** 获得请假申请 */ export function getLeave(id: number) { return http.get(`/bpm/oa/leave/get?id=${id}`) diff --git a/src/pages-bpm/oa/leave/components/search-form.vue b/src/pages-bpm/oa/leave/components/search-form.vue index 6e0e00b..f0b7587 100644 --- a/src/pages-bpm/oa/leave/components/search-form.vue +++ b/src/pages-bpm/oa/leave/components/search-form.vue @@ -7,7 +7,6 @@ - 请假类型 @@ -21,7 +20,6 @@ - 审批结果 @@ -35,7 +33,6 @@ - 创建时间 @@ -72,7 +69,6 @@ - 请假原因 @@ -83,7 +79,6 @@ clearable /> - 重置 diff --git a/src/pages-bpm/oa/leave/create/index.vue b/src/pages-bpm/oa/leave/create/index.vue index 81e9f8c..a74dfdf 100644 --- a/src/pages-bpm/oa/leave/create/index.vue +++ b/src/pages-bpm/oa/leave/create/index.vue @@ -2,95 +2,60 @@ - - - - - - 请假信息 - - - - - * 请假类型 - - - - - - - * 开始时间 - - - - - - - * 结束时间 - - - - - - - * 请假原因 - - - - - + + + + + + + + - - - - - - - - 流程信息 - - - 提交后将进入审批流程 - - - - - - - + + + + - - 取消 - 提交 @@ -100,11 +65,11 @@ diff --git a/src/pages-bpm/oa/leave/detail/index.vue b/src/pages-bpm/oa/leave/detail/index.vue index 8d84ba2..0900c81 100644 --- a/src/pages-bpm/oa/leave/detail/index.vue +++ b/src/pages-bpm/oa/leave/detail/index.vue @@ -7,75 +7,37 @@ @click-left="handleBack" /> - - - - - - - - - - - 请假信息 - - - - 请假类型 - - - - - 开始时间 - {{ formatDateTime(formData.startTime) }} - - - - 结束时间 - {{ formatDateTime(formData.endTime) }} - - - - 请假原因 - {{ formData.reason }} - - - - - - - - - 审批状态 - - - 当前状态 - - - - - - - - - 查看审批进度 - - + + + + + + + + + + + + + diff --git a/src/pages-bpm/oa/leave/index.vue b/src/pages-bpm/oa/leave/index.vue index ee549ac..555e1f8 100644 --- a/src/pages-bpm/oa/leave/index.vue +++ b/src/pages-bpm/oa/leave/index.vue @@ -49,14 +49,13 @@ {{ formatDateTime(item.createTime) }} - - + 详情 - + 审批进度 - - - + /> @@ -96,24 +95,15 @@ import type { Leave } from '@/api/bpm/oa/leave' import type { LoadMoreState } from '@/http/types' import { onReachBottom } from '@dcloudio/uni-app' import { computed, onMounted, ref } from 'vue' -import { useMessage } from 'wot-design-uni' import { getLeavePage } from '@/api/bpm/oa/leave' import { cancelProcessInstanceByStartUser } from '@/api/bpm/processInstance' import { useUserStore } from '@/store' import { navigateBackPlus } from '@/utils' -import { DICT_TYPE } from '@/utils/constants' +import { BpmProcessInstanceStatus, DICT_TYPE } from '@/utils/constants' import { formatDateTime } from '@/utils/date' import LeaveSearchForm from './components/search-form.vue' import '@/pages/bpm/styles/index.scss' -/** 流程实例状态枚举 */ -const BpmProcessInstanceStatus = { - RUNNING: 1, // 审批中 - APPROVE: 2, // 审批通过 - REJECT: 3, // 审批不通过 - CANCEL: 4, // 已取消 -} - definePage({ style: { navigationBarTitleText: '', @@ -122,7 +112,6 @@ definePage({ }) const userStore = useUserStore() -const message = useMessage() const userNickname = computed(() => userStore.userInfo?.nickname || '') const total = ref(0) @@ -136,7 +125,7 @@ const queryParams = ref({ /** 返回上一页 */ function handleBack() { - navigateBackPlus('/pages/bpm/index') + navigateBackPlus() } /** 查询列表 */ @@ -190,22 +179,25 @@ function handleProgress(item: Leave) { /** 取消请假 */ function handleCancel(item: Leave) { - message.confirm({ + uni.showModal({ title: '取消流程', - msg: '确定要取消该请假申请吗?', - }).then(async ({ action }) => { - if (action !== 'confirm') { - return - } - // TODO:原始 vben 版本支持输入取消原因,uniapp 的 message.confirm 不支持输入框 - // 参考:yudao-ui-admin-vben-v5/apps/web-antd/src/views/bpm/oa/leave/index.vue 第 35-60 行 - try { - await cancelProcessInstanceByStartUser(String(item.id), '用户取消') + editable: true, + placeholderText: '请输入取消原因', + success: async (res) => { + if (!res.confirm) { + return + } + const reason = res.content?.trim() + if (!reason) { + uni.showToast({ title: '请输入取消原因', icon: 'none' }) + return + } + await cancelProcessInstanceByStartUser(String(item.processInstanceId), reason) + // 更新状态 uni.showToast({ title: '取消成功', icon: 'success' }) - handleSearch() - } catch (error) { - console.error('[leave] 取消失败:', error) - } + item.status = BpmProcessInstanceStatus.CANCEL + item.endTime = new Date() + }, }) } diff --git a/src/pages/index/index.ts b/src/pages/index/index.ts index 648a693..e75389f 100644 --- a/src/pages/index/index.ts +++ b/src/pages/index/index.ts @@ -30,7 +30,6 @@ const menuGroupsData: MenuGroup[] = [ key: 'system', name: '系统管理', menus: [ - // === 用户权限相关(蓝色系)=== { key: 'user', name: '用户管理', @@ -42,7 +41,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'role', name: '角色管理', - icon: 'secured', // 安全/权限 + icon: 'secured', url: '/pages-system/role/index', iconColor: '#2f54eb', permission: 'system:role:query', @@ -55,11 +54,10 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#597ef7', permission: 'system:menu:query', }, - // === 组织架构相关(青色系)=== { key: 'dept', name: '部门管理', - icon: 'layers', // 层级结构 + icon: 'layers', url: '/pages-system/dept/index', iconColor: '#13c2c2', permission: 'system:dept:query', @@ -72,11 +70,10 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#36cfc9', permission: 'system:post:query', }, - // === 日志相关(紫色系)=== { key: 'operateLog', name: '操作日志', - icon: 'history', // 历史记录 + icon: 'history', url: '/pages-system/operate-log/index', iconColor: '#722ed1', permission: 'system:operate-log:query', @@ -84,16 +81,15 @@ const menuGroupsData: MenuGroup[] = [ { key: 'loginLog', name: '登录日志', - icon: 'login', // 登录 + icon: 'login', url: '/pages-system/login-log/index', iconColor: '#9254de', permission: 'system:login-log:query', }, - // === 消息通知相关(橙色系)=== { key: 'notice', name: '通知公告', - icon: 'notification', // 通知 + icon: 'notification', url: '/pages-system/notice/index', iconColor: '#fa8c16', permission: 'system:notice:query', @@ -101,7 +97,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'sms', name: '短信管理', - icon: 'chat1', // 消息 + icon: 'chat1', url: '/pages-system/sms/index', iconColor: '#faad14', permission: 'system:sms-channel:query', @@ -117,12 +113,11 @@ const menuGroupsData: MenuGroup[] = [ { key: 'notify', name: '站内信管理', - icon: 'read', // 阅读/消息 + icon: 'read', url: '/pages-system/notify/index', iconColor: '#ff7a45', permission: 'system:notify-template:query', }, - // === 系统配置相关(粉色系)=== { key: 'tenant', name: '租户管理', @@ -142,7 +137,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'oauth2', name: 'OAuth2.0', - icon: 'lock-on', // 授权/锁 + icon: 'lock-on', url: '/pages-system/oauth2/index', iconColor: '#ff85c0', permission: 'system:oauth2-client:query', @@ -150,7 +145,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'dict', name: '字典管理', - icon: 'books', // 字典/书籍 + icon: 'books', url: '/pages-system/dict/index', iconColor: '#c41d7f', permission: 'system:dict:query', @@ -168,11 +163,10 @@ const menuGroupsData: MenuGroup[] = [ key: 'infra', name: '基础设施', menus: [ - // === 日志监控相关(红蓝色系)=== { key: 'accessLog', name: '访问日志', - icon: 'view-list', // 列表/日志 + icon: 'view-list', url: '/pages-infra/api-access-log/index', iconColor: '#1890ff', permission: 'infra:api-access-log:query', @@ -185,7 +179,6 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#f5222d', permission: 'infra:api-error-log:query', }, - // === 配置相关(青紫色系)=== { key: 'config', name: '参数配置', @@ -197,12 +190,11 @@ const menuGroupsData: MenuGroup[] = [ { key: 'dataSourceConfig', name: '数据源配置', - icon: 'server', // 服务器/数据源 + icon: 'server', url: '/pages-infra/data-source-config/index', iconColor: '#9254de', permission: 'infra:data-source-config:query', }, - // === 文件存储相关(蓝色系)=== { key: 'file', name: '文件管理', @@ -211,24 +203,21 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#2f54eb', permission: 'infra:file:query', }, - // === 通信相关(青色系)=== { key: 'websocket', name: 'WebSocket', - icon: 'wifi', // 网络连接 + icon: 'wifi', url: '/pages-infra/web-socket/index', iconColor: '#13c2c2', }, - // === 任务调度相关(橙色系)=== { key: 'job', name: '定时任务', - icon: 'time', // 时间/定时 + icon: 'time', url: '/pages-infra/job/index', iconColor: '#fa8c16', permission: 'infra:job:query', }, - // === 开发工具相关(绿色系)=== { key: 'codegen', name: '代码生成', @@ -253,7 +242,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'druid', name: '监控中心', - icon: 'dashboard', // 仪表盘 + icon: 'dashboard', url: ONLY_PC_PAGE, iconColor: '#389e0d', }, @@ -263,11 +252,10 @@ const menuGroupsData: MenuGroup[] = [ key: 'bpm', name: '工作流程', menus: [ - // === 个人工作台(蓝色系)=== { key: 'bpmMy', name: '我的流程', - icon: 'user-circle', // 个人 + icon: 'user-circle', url: '/pages/bpm/index?tab=my', iconColor: '#1890ff', permission: 'bpm:process-instance:query', @@ -275,7 +263,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'bpmTodo', name: '待办任务', - icon: 'time', // 待处理/时间 + icon: 'time', url: '/pages/bpm/index?tab=todo', iconColor: '#fa8c16', permission: 'bpm:task:query', @@ -296,11 +284,18 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#13c2c2', permission: 'bpm:process-instance-cc:query', }, - // === 流程设计相关(紫色系)=== + { + key: 'oaLeave', + name: '请假申请', + icon: 'calendar', + url: '/pages-bpm/oa/leave/index', + iconColor: '#52c41a', + permission: 'bpm:oa-leave:query', + }, { key: 'bpmModel', name: '流程模型', - icon: 'app', // 应用/模型 + icon: 'app', url: ONLY_PC_PAGE, iconColor: '#722ed1', permission: 'bpm:process-definition:query', @@ -308,16 +303,15 @@ const menuGroupsData: MenuGroup[] = [ { key: 'bpmForm', name: '流程表单', - icon: 'edit-1', // 编辑/表单 + icon: 'edit-1', url: ONLY_PC_PAGE, iconColor: '#9254de', permission: 'bpm:form:query', }, - // === 流程配置相关(橙黄色系)=== { key: 'bpmCategory', name: '流程分类', - icon: 'folder-open', // 分类/文件夹 + icon: 'folder-open', url: '/pages-bpm/category/index', iconColor: '#faad14', permission: 'bpm:category:query', @@ -330,11 +324,10 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#ffc53d', permission: 'bpm:user-group:query', }, - // === 流程扩展相关(粉色系)=== { key: 'bpmProcessListener', name: '流程监听器', - icon: 'sound', // 监听/声音 + icon: 'sound', url: '/pages-bpm/process-listener/index', iconColor: '#eb2f96', permission: 'bpm:process-listener:query', @@ -347,11 +340,10 @@ const menuGroupsData: MenuGroup[] = [ iconColor: '#f759ab', permission: 'bpm:process-expression:query', }, - // === 流程管理相关(青色系)=== { key: 'bpmProcessInstanceManager', name: '流程实例', - icon: 'queue', // 队列/实例 + icon: 'queue', url: '/pages-bpm/processInstance/manager/index', iconColor: '#36cfc9', permission: 'bpm:process-instance:manager-query', @@ -359,7 +351,7 @@ const menuGroupsData: MenuGroup[] = [ { key: 'bpmTaskManager', name: '流程任务', - icon: 'bulletpoint', // 任务列表 + icon: 'bulletpoint', url: '/pages-bpm/task/manager/index', iconColor: '#5cdbd3', permission: 'bpm:task:manager-query', diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 42648fd..1d86fd2 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,3 +1,4 @@ +export * from './constants/biz-bpm-enum' export * from './constants/biz-infra-enum' export * from './constants/biz-system-enum' export * from './constants/dict-enum' diff --git a/src/utils/constants/biz-bpm-enum.ts b/src/utils/constants/biz-bpm-enum.ts new file mode 100644 index 0000000..93e18c9 --- /dev/null +++ b/src/utils/constants/biz-bpm-enum.ts @@ -0,0 +1,306 @@ +// 候选人策略枚举 ( 用于审批节点。抄送节点 ) +export enum BpmCandidateStrategyEnum { + /** + * 审批人自选 + */ + APPROVE_USER_SELECT = 34, + /** + * 部门的负责人 + */ + DEPT_LEADER = 21, + /** + * 部门成员 + */ + DEPT_MEMBER = 20, + /** + * 流程表达式 + */ + EXPRESSION = 60, + /** + * 表单内部门负责人 + */ + FORM_DEPT_LEADER = 51, + /** + * 表单内用户字段 + */ + FORM_USER = 50, + /** + * 连续多级部门的负责人 + */ + MULTI_LEVEL_DEPT_LEADER = 23, + /** + * 指定岗位 + */ + POST = 22, + /** + * 指定角色 + */ + ROLE = 10, + /** + * 发起人自己 + */ + START_USER = 36, + /** + * 发起人部门负责人 + */ + START_USER_DEPT_LEADER = 37, + /** + * 发起人连续多级部门的负责人 + */ + START_USER_MULTI_LEVEL_DEPT_LEADER = 38, + /** + * 发起人自选 + */ + START_USER_SELECT = 35, + /** + * 指定用户 + */ + USER = 30, + /** + * 指定用户组 + */ + USER_GROUP = 40, +} + +/** + * 节点类型 + */ +export enum BpmNodeTypeEnum { + /** + * 子流程节点 + */ + CHILD_PROCESS_NODE = 20, + /** + * 条件分支节点 (对应排他网关) + */ + CONDITION_BRANCH_NODE = 51, + /** + * 条件节点 + */ + CONDITION_NODE = 50, + + /** + * 抄送人节点 + */ + COPY_TASK_NODE = 12, + + /** + * 延迟器节点 + */ + DELAY_TIMER_NODE = 14, + + /** + * 结束节点 + */ + END_EVENT_NODE = 1, + + /** + * 包容分支节点 (对应包容网关) + */ + INCLUSIVE_BRANCH_NODE = 53, + + /** + * 并行分支节点 (对应并行网关) + */ + PARALLEL_BRANCH_NODE = 52, + + /** + * 路由分支节点 + */ + ROUTER_BRANCH_NODE = 54, + /** + * 发起人节点 + */ + START_USER_NODE = 10, + /** + * 办理人节点 + */ + TRANSACTOR_NODE = 13, + + /** + * 触发器节点 + */ + TRIGGER_NODE = 15, + /** + * 审批人节点 + */ + USER_TASK_NODE = 11, +} + +/** + * 流程任务操作按钮 + */ +export enum BpmTaskOperationButtonTypeEnum { + /** + * 加签 + */ + ADD_SIGN = 5, + /** + * 通过 + */ + APPROVE = 1, + /** + * 抄送 + */ + COPY = 7, + /** + * 委派 + */ + DELEGATE = 4, + /** + * 拒绝 + */ + REJECT = 2, + /** + * 退回 + */ + RETURN = 6, + /** + * 转办 + */ + TRANSFER = 3, +} + +/** + * 任务状态枚举 + */ +export enum BpmTaskStatusEnum { + /** + * 审批通过 + */ + APPROVE = 2, + /** + * 审批通过中 + */ + APPROVING = 7, + + /** + * 已取消 + */ + CANCEL = 4, + /** + * 未开始 + */ + NOT_START = -1, + /** + * 审批不通过 + */ + REJECT = 3, + + /** + * 已退回 + */ + RETURN = 5, + + /** + * 审批中 + */ + RUNNING = 1, + /** + * 跳过 + */ + SKIP = -2, + /** + * 待审批 + */ + WAIT = 0, +} + +/** + * 节点 Id 枚举 + */ +export enum BpmNodeIdEnum { + /** + * 发起人节点 Id + */ + END_EVENT_NODE_ID = 'EndEvent', + + /** + * 发起人节点 Id + */ + START_USER_NODE_ID = 'StartUserNode', +} + +/** + * 表单权限的枚举 + */ +export enum BpmFieldPermissionType { + /** + * 隐藏 + */ + NONE = '3', + /** + * 只读 + */ + READ = '1', + /** + * 编辑 + */ + WRITE = '2', +} + +/** + * 流程模型类型 + */ +export const BpmModelType = { + BPMN: 10, // BPMN 设计器 + SIMPLE: 20, // 简易设计器 +} + +/** + * 流程模型表单类型 + */ +export const BpmModelFormType = { + NORMAL: 10, // 流程表单 + CUSTOM: 20, // 业务表单 +} + +/** + * 流程实例状态 + */ +export const BpmProcessInstanceStatus = { + NOT_START: -1, // 未开始 + RUNNING: 1, // 审批中 + APPROVE: 2, // 审批通过 + REJECT: 3, // 审批不通过 + CANCEL: 4, // 已取消 +} + +/** + * 自动审批类型 + */ +export const BpmAutoApproveType = { + NONE: 0, // 不自动通过 + APPROVE_ALL: 1, // 仅审批一次,后续重复的审批节点均自动通过 + APPROVE_SEQUENT: 2, // 仅针对连续审批的节点自动通过 +} + +/** + * 审批操作按钮名称 + */ +export const OPERATION_BUTTON_NAME = new Map() +OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.APPROVE, '通过') +OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.REJECT, '拒绝') +OPERATION_BUTTON_NAME.set(BpmTaskOperationButtonTypeEnum.TRANSFER, '转办') +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, '抄送') + +/** + * 流程实例的变量枚举 + */ +export enum ProcessVariableEnum { + /** + * 流程定义名称 + */ + PROCESS_DEFINITION_NAME = 'PROCESS_DEFINITION_NAME', + /** + * 发起时间 + */ + START_TIME = 'PROCESS_START_TIME', + /** + * 发起用户 ID + */ + START_USER_ID = 'PROCESS_START_USER_ID', +}