228 lines
6.2 KiB
JavaScript
228 lines
6.2 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, '或签')
|
|
}
|
|
|
|
// ============================ 单据类型 / 流程 ============================
|
|
|
|
/**
|
|
* 获取本租户可用的单据类型(biz_type)下拉项。
|
|
* 用于「发起审批」选择单据类型。
|
|
*/
|
|
export async function fetchApprovalCategories() {
|
|
const data = await request({ url: '/api/oa/approval/categories' })
|
|
const list = (data && data.list) || []
|
|
return list
|
|
}
|
|
|
|
/**
|
|
* 按 biz_type 获取本租户可发起的流程列表(含 flow_name + 节点名)。
|
|
*/
|
|
export async function fetchApprovalFlows(params = {}) {
|
|
const data = await request({
|
|
url: '/api/oa/approval/flows',
|
|
data: {
|
|
biz_type: params.bizType || ''
|
|
}
|
|
})
|
|
return { list: (data && data.list) || [], total: (data && data.total) || 0 }
|
|
}
|
|
|
|
// ============================ 我的发起 ============================
|
|
|
|
/**
|
|
* 获取我发起的审批实例列表(移动端「我的发起」页面)。
|
|
* 入参: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: { biz_type, flow_code?, flow_id?, biz_title, biz_id?, form_data? }
|
|
*/
|
|
export async function submitApproval(payload) {
|
|
return request({
|
|
url: '/api/oa/approval/submit',
|
|
method: 'POST',
|
|
data: {
|
|
biz_type: payload.bizType || '',
|
|
flow_code: payload.flowCode || '',
|
|
flow_id: payload.flowId || 0,
|
|
biz_title: payload.bizTitle || '',
|
|
biz_id: payload.bizId || 0,
|
|
form_data: payload.formData || {}
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 审批人通过 / 驳回任务。
|
|
* 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'
|
|
})
|
|
}
|