Files
2026-10-16 23:46:49 +08:00

186 lines
5.3 KiB
JavaScript

/**
* 自定义审批流(移动端)接口封装。
* 对应后端 go/controllers/app_approval.go 的 /api/oa/approval/* 接口。
*
* 数据模型:yz_approval_instance(实例)+ yz_approval_task(任务)。
* 与 Web 端 /backend/approval/* 共用同一套数据与 services/approval 引擎,
* 仅鉴权放宽为 app 令牌(oaClaims)。
*/
import { request } from '@/api/request.js'
// ============================ 常量 ============================
/** 实例状态:0-草稿 1-审批中 2-已通过 3-已驳回 4-已撤回 5-已取消 */
export const APPROVAL_INSTANCE_STATUS_OPTIONS = [
{ value: 0, label: '草稿' },
{ value: 1, label: '审批中' },
{ value: 2, label: '已通过' },
{ value: 3, label: '已驳回' },
{ value: 4, label: '已撤回' },
{ value: 5, label: '已取消' }
]
/** 任务状态:0-待审批 1-已通过 2-已驳回 3-已退回 4-已跳过 5-已超时 6-已通知 */
export const APPROVAL_TASK_STATUS_OPTIONS = [
{ value: 0, label: '待审批' },
{ value: 1, label: '已通过' },
{ value: 2, label: '已驳回' },
{ value: 3, label: '已退回' },
{ value: 4, label: '已跳过' },
{ value: 5, label: '已超时' },
{ value: 6, label: '已通知' }
]
/** 多签方式:1-或签(任一通过)2-会签(全部通过) */
export const APPROVAL_MULTI_MODE_OPTIONS = [
{ value: 1, label: '或签' },
{ value: 2, label: '会签' }
]
/** uview-plus u-tag 类型映射 */
const APPROVAL_STATUS_TAG = {
0: 'info', // 草稿
1: 'warning', // 审批中
2: 'success', // 已通过
3: 'error', // 已驳回
4: 'info', // 已撤回
5: 'info' // 已取消
}
const APPROVAL_TASK_TAG = {
0: 'warning',
1: 'success',
2: 'error',
3: 'info',
4: 'info',
5: 'info',
6: 'info'
}
// ============================ 工具函数 ============================
function labelOf(options, value, fallback = '') {
const hit = options.find(item => item.value === Number(value))
return hit ? hit.label : fallback
}
export function getApprovalStatusLabel(value) {
return labelOf(APPROVAL_INSTANCE_STATUS_OPTIONS, value, '未知')
}
export function getApprovalStatusTag(value) {
return APPROVAL_STATUS_TAG[Number(value)] || 'info'
}
export function getApprovalTaskStatusLabel(value) {
return labelOf(APPROVAL_TASK_STATUS_OPTIONS, value, '未知')
}
export function getApprovalTaskStatusTag(value) {
return APPROVAL_TASK_TAG[Number(value)] || 'info'
}
export function getApprovalMultiModeLabel(value) {
return labelOf(APPROVAL_MULTI_MODE_OPTIONS, value, '或签')
}
// ============================ 我的发起 ============================
/**
* 获取我发起的审批实例列表(移动端「我的发起」页面)。
* 入参:page / pageSize / keyword / status / biz_type
* 返回:{ list, total, page, pageSize }
*/
export async function fetchApprovalList(params = {}) {
const data = await request({
url: '/api/oa/approval/list',
data: {
page: params.page || 1,
pageSize: params.pageSize || 20,
keyword: params.keyword || '',
status: params.status === '' || params.status === undefined ? '' : Number(params.status),
biz_type: params.bizType || ''
}
})
return {
list: (data && data.list) || [],
total: (data && data.total) || 0,
page: (data && data.page) || 1,
pageSize: (data && data.pageSize) || 20
}
}
// ============================ 待我审批 ============================
/**
* 获取我作为审批人的待办列表(移动端「待我审批」)。
* 每条 task 包含当前实例的基本信息(task.instance 字段)。
*/
export async function fetchApprovalTodoList(params = {}) {
const data = await request({
url: '/api/oa/approval/todo',
data: {
page: params.page || 1,
pageSize: params.pageSize || 20
}
})
return {
list: (data && data.list) || [],
total: (data && data.total) || 0,
page: (data && data.page) || 1,
pageSize: (data && data.pageSize) || 20
}
}
// ============================ 详情 ============================
/**
* 获取审批详情(含实例 + 任务时间线 + 权限标志)。
* 返回结构:{ item, timeline, can_approve, can_withdraw, current_task_id }
*/
export async function fetchApprovalDetail(id) {
if (!id) {
throw new Error('缺少审批ID')
}
const data = await request({ url: `/api/oa/approval/detail/${id}` })
if (!data) return null
return {
item: data.item || {},
timeline: data.timeline || [],
canApprove: !!data.can_approve,
canWithdraw: !!data.can_withdraw,
currentTaskID: data.current_task_id || 0
}
}
// ============================ 审批 / 撤回 ============================
// 说明:审批不允许在此处「自由发起」,统一由具体业务模块提交
// (如报销单在「报销管理」提交后自动进入审批流),本模块只负责查询与处理。
/**
* 审批人通过 / 驳回任务。
* payload: { task_id, pass, comment }
*/
export async function approveTask(payload) {
return request({
url: '/api/oa/approval/approve',
method: 'POST',
data: {
task_id: Number(payload.taskId) || 0,
pass: !!payload.pass,
comment: payload.comment || ''
}
})
}
/**
* 发起人撤回审批(仅审批中可撤回)。
*/
export async function withdrawApproval(id) {
if (!id) throw new Error('缺少审批ID')
return request({
url: `/api/oa/approval/withdraw/${id}`,
method: 'POST'
})
}