| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /**
- * 报销模块 API(REST,协议 code===0 / msg / data.rows)
- * 路径挂在 /api 下:/reimburses、/advances、/expense-items、/attachments
- */
- import { request, parseResponseJson } from '@/utils/request'
- function unwrap(res) {
- const body = parseResponseJson(res)
- if (!body || typeof body !== 'object') {
- throw new Error('接口响应异常')
- }
- if (body.code != null && body.code !== 0) {
- throw new Error(body.msg || body.message || '请求失败')
- }
- return body.data != null ? body.data : body
- }
- async function get(url, params = {}) {
- const res = await request({ url, method: 'GET', data: params, params })
- return unwrap(res)
- }
- async function post(url, data = {}) {
- const res = await request({ url, method: 'POST', data })
- return unwrap(res)
- }
- async function put(url, data = {}, params = {}) {
- const res = await request({ url, method: 'PUT', data, params })
- return unwrap(res)
- }
- function pageParams(query = {}) {
- const { pageNum, page, pageSize, ...rest } = query
- const params = {
- page: pageNum ?? page ?? 1,
- pageSize: pageSize ?? 20
- }
- Object.keys(rest).forEach((k) => {
- if (rest[k] != null && rest[k] !== '') params[k] = rest[k]
- })
- return params
- }
- function normalizeList(data) {
- if (Array.isArray(data)) return { rows: data, total: data.length }
- const d = data || {}
- return {
- rows: d.rows || d.list || [],
- total: d.total ?? 0
- }
- }
- // ── 费用项目 ──
- export async function getExpenseItemTree() {
- const data = await get('/expense-items/tree')
- return Array.isArray(data) ? data : []
- }
- /** 展平可选叶子费用项目(供 picker) */
- export function flattenExpenseLeaves(tree, path = []) {
- const out = []
- ;(tree || []).forEach((node) => {
- const name = node.itemName || node.item_name || ''
- const nextPath = path.concat(name)
- const children = node.children || []
- if (children.length) {
- out.push(...flattenExpenseLeaves(children, nextPath))
- } else {
- out.push({
- id: String(node.id),
- name,
- pathLabel: nextPath.join(' / ')
- })
- }
- })
- return out
- }
- // ── 报销 ──
- export async function listMyReimburse(query = {}) {
- return normalizeList(await get('/reimburses/my', pageParams(query)))
- }
- export async function listPendingReimburse(query = {}) {
- return normalizeList(await get('/reimburses/pending-approval', pageParams(query)))
- }
- export async function listApprovedByMeReimburse(query = {}) {
- return normalizeList(await get('/reimburses/approved-by-me', pageParams(query)))
- }
- export async function getReimburse(id) {
- return get(`/reimburses/${String(id)}`)
- }
- export async function generateReimburseTitle(reimburseDate) {
- const params = {}
- if (reimburseDate) params.reimburseDate = reimburseDate
- return get('/reimburses/generate-title', params)
- }
- export function createReimburse(data) {
- return post('/reimburses/', data)
- }
- export function updateReimburse(id, data) {
- return put(`/reimburses/${String(id)}`, data)
- }
- export function submitReimburse(id) {
- return post(`/reimburses/${String(id)}/submit`)
- }
- export function approveReimburse(id, approvalOpinion = '') {
- return post(`/reimburses/${String(id)}/approve`, { approvalOpinion })
- }
- export function rejectReimburse(id, approvalOpinion = '') {
- return post(`/reimburses/${String(id)}/reject`, { approvalOpinion })
- }
- export async function getReimburseApprovalHistory(id) {
- const data = await get(`/reimburses/${String(id)}/approval-history`)
- return Array.isArray(data) ? data : []
- }
- // ── 借款(备用金) ──
- export async function listMyAdvance(query = {}) {
- return normalizeList(await get('/advances/my', pageParams(query)))
- }
- export async function listPendingAdvance(query = {}) {
- return normalizeList(await get('/advances/pending-approval', pageParams(query)))
- }
- export async function listApprovedByMeAdvance(query = {}) {
- return normalizeList(await get('/advances/approved-by-me', pageParams(query)))
- }
- export async function getAdvance(id) {
- return get(`/advances/${String(id)}`)
- }
- export function createAdvance(data) {
- return post('/advances/', data)
- }
- export function submitAdvance(id) {
- return post(`/advances/${String(id)}/submit`)
- }
- export function approveAdvance(id, approvalOpinion = '') {
- return post(`/advances/${String(id)}/approve`, { approvalOpinion })
- }
- export function rejectAdvance(id, approvalOpinion = '') {
- return post(`/advances/${String(id)}/reject`, { approvalOpinion })
- }
- export async function getAdvanceApprovalHistory(id) {
- const data = await get(`/advances/${String(id)}/approval-history`)
- return Array.isArray(data) ? data : []
- }
- // ── 附件 ──
- export async function listAttachments(bizType, bizId) {
- const data = await get('/attachments/list', {
- biz_type: bizType,
- biz_id: String(bizId)
- })
- return Array.isArray(data) ? data : []
- }
- export async function bindAttachments(ids, bizType, bizId) {
- if (!ids?.length) return 0
- const q = [
- `ids=${encodeURIComponent(ids.map(String).join(','))}`,
- `biz_type=${encodeURIComponent(bizType)}`,
- `biz_id=${encodeURIComponent(String(bizId))}`
- ].join('&')
- return put(`/attachments/bind-biz?${q}`, {})
- }
- export async function previewAttachment(id) {
- return get(`/attachments/preview/${String(id)}`)
- }
|