feat(HRM): 新增HRM办公审批模块及相关功能组件

新增HRM办公审批模块,包括审批中心、抄送我的、我的申请等功能页面和组件。主要变更包括:

1. 添加审批相关API接口文件
2. 新增审批详情展示组件
3. 实现审批流程操作功能
4. 添加Vuex状态管理
5. 新增相关静态资源图片
6. 配置页面路由
7. 实现审批列表展示和筛选功能
8. 添加审批操作弹窗和状态管理
This commit is contained in:
砂糖
2026-02-05 10:42:50 +08:00
parent 8ebdb221c0
commit 955d20413b
32 changed files with 4576 additions and 7 deletions

127
api/hrm/attendance.js Normal file
View File

@@ -0,0 +1,127 @@
import request from "@/util/oaRequest"
// 班次
export function listShift(query) {
return request({
url: '/hrm/shift/list',
method: 'get',
params: query
})
}
export function addShift(data) {
return request({
url: '/hrm/shift',
method: 'post',
data
})
}
export function updateShift(data) {
return request({
url: '/hrm/shift',
method: 'put',
data
})
}
export function delShift(shiftIds) {
return request({
url: `/hrm/shift/${shiftIds}`,
method: 'delete'
})
}
// 排班
export function listSchedule(query) {
return request({
url: '/hrm/schedule/list',
method: 'get',
params: query
})
}
export function addSchedule(data) {
return request({
url: '/hrm/schedule',
method: 'post',
data
})
}
export function updateSchedule(data) {
return request({
url: '/hrm/schedule',
method: 'put',
data
})
}
export function delSchedule(scheduleIds) {
return request({
url: `/hrm/schedule/${scheduleIds}`,
method: 'delete'
})
}
// 打卡
export function listPunch(query) {
return request({
url: '/hrm/punch/list',
method: 'get',
params: query
})
}
export function addPunch(data) {
return request({
url: '/hrm/punch',
method: 'post',
data
})
}
export function updatePunch(data) {
return request({
url: '/hrm/punch',
method: 'put',
data
})
}
export function delPunch(punchIds) {
return request({
url: `/hrm/punch/${punchIds}`,
method: 'delete'
})
}
// 考勤结果
export function listAttendCalc(query) {
return request({
url: '/hrm/attend/list',
method: 'get',
params: query
})
}
// 假期余额
export function listLeaveBalance(query) {
return request({
url: '/hrm/leave/balance/list',
method: 'get',
params: query
})
}
export function addLeaveBalance(data) {
return request({
url: '/hrm/leave/balance',
method: 'post',
data
})
}
export function updateLeaveBalance(data) {
return request({
url: '/hrm/leave/balance',
method: 'put',
data
})
}
export function delLeaveBalance(balIds) {
return request({
url: `/hrm/leave/balance/${balIds}`,
method: 'delete'
})
}

35
api/hrm/cc.js Normal file
View File

@@ -0,0 +1,35 @@
import request from "@/util/oaRequest"
// 查询抄送记录列表
export function listCc(query) {
return request({
url: '/hrm/flow/cc/my',
method: 'get',
params: query
})
}
// 标记抄送为已读
export function readCc(ccId) {
return request({
url: `/hrm/flow/cc/${ccId}/read`,
method: 'post'
})
}
// 手动抄送
export function addCc(data) {
return request({
url: '/hrm/flow/cc',
method: 'post',
data: data
})
}
// 查询抄送记录详细
export function getCc(ccId) {
return request({
url: `/hrm/flow/cc/${ccId}`,
method: 'get'
})
}

66
api/hrm/certContract.js Normal file
View File

@@ -0,0 +1,66 @@
import request from "@/util/oaRequest"
// 证书
export function listCertificate(query) {
return request({
url: '/hrm/certificate/list',
method: 'get',
params: query
})
}
export function addCertificate(data) {
return request({
url: '/hrm/certificate',
method: 'post',
data
})
}
export function updateCertificate(data) {
return request({
url: '/hrm/certificate',
method: 'put',
data
})
}
export function delCertificate(certIds) {
return request({
url: `/hrm/certificate/${certIds}`,
method: 'delete'
})
}
// 合同
export function listContract(query) {
return request({
url: '/hrm/contract/list',
method: 'get',
params: query
})
}
export function addContract(data) {
return request({
url: '/hrm/contract',
method: 'post',
data
})
}
export function updateContract(data) {
return request({
url: '/hrm/contract',
method: 'put',
data
})
}
export function delContract(contractIds) {
return request({
url: `/hrm/contract/${contractIds}`,
method: 'delete'
})
}

33
api/hrm/empOrgPosition.js Normal file
View File

@@ -0,0 +1,33 @@
import request from "@/util/oaRequest"
// 员工组织岗位关系
export function listEmpOrgPosition(query) {
return request({
url: '/hrm/empOrg/list',
method: 'get',
params: query
})
}
export function addEmpOrgPosition(data) {
return request({
url: '/hrm/empOrg',
method: 'post',
data
})
}
export function updateEmpOrgPosition(data) {
return request({
url: '/hrm/empOrg',
method: 'put',
data
})
}
export function delEmpOrgPosition(relIds) {
return request({
url: `/hrm/empOrg/${relIds}`,
method: 'delete'
})
}

56
api/hrm/employee.js Normal file
View File

@@ -0,0 +1,56 @@
import request from "@/util/oaRequest"
// 员工
export function listEmployee(query) {
return request({
url: '/hrm/employee/list',
method: 'get',
params: query
})
}
export function allEmployee(query) {
return request({
url: '/hrm/employee/all',
method: 'get',
params: query
})
}
export function addEmployee(data) {
return request({
url: '/hrm/employee',
method: 'post',
data
})
}
export function updateEmployee(data) {
return request({
url: '/hrm/employee',
method: 'put',
data
})
}
export function delEmployee(empIds) {
return request({
url: `/hrm/employee/${empIds}`,
method: 'delete'
})
}
export function getEmployee(empId) {
return request({
url: `/hrm/employee/${empId}`,
method: 'get'
})
}
// 根据用户ID获取员工信息
export function getEmployeeByUserId(userId) {
return request({
url: `/hrm/employee/byUserId/${userId}`,
method: 'get'
})
}

220
api/hrm/flow.js Normal file
View File

@@ -0,0 +1,220 @@
import request from "@/util/oaRequest"
// 流程任务
export function listFlowTask(query) {
return request({
url: '/hrm/flow/task/list',
method: 'get',
params: query
})
}
export function updateFlowInstance(data) {
return request({
url: '/hrm/flow/instance',
method: 'put',
data
})
}
export function listTodoFlowTask(assigneeUserId) {
return request({
url: '/hrm/flow/task/todo',
method: 'get',
params: { assigneeUserId }
})
}
// 业务维度:按 bizType + bizId 查询当前待办任务(后端需提供)
export function getTodoTaskByBiz(bizType, bizId, assigneeUserId) {
return request({
url: '/hrm/flow/task/todoByBiz',
method: 'get',
params: { bizType, bizId, assigneeUserId }
})
}
export function approveFlowTask(taskId, data) {
return request({
url: `/hrm/flow/task/${taskId}/approve`,
method: 'post',
data
})
}
export function rejectFlowTask(taskId, data) {
return request({
url: `/hrm/flow/task/${taskId}/reject`,
method: 'post',
data
})
}
export function withdrawFlowTask(taskId, data) {
return request({
url: `/hrm/flow/task/${taskId}/withdraw`,
method: 'post',
data
})
}
export function transferFlowTask(taskId, data) {
return request({
url: `/hrm/flow/task/${taskId}/transfer`,
method: 'post',
params: data
})
}
export function ccFlowTask(data) {
return request({
url: '/hrm/flow/cc',
method: 'post',
data
})
}
// 流程动作/表单
export function listFlowAction(query) {
return request({
url: '/hrm/flow/action/list',
method: 'get',
params: query
})
}
export function listFlowFormData(query) {
return request({
// 后端 Controller: HrmFlowFormDataController
// @RequestMapping("/hrm/flow/form") + @GetMapping("/list")
url: '/hrm/flow/form/list',
method: 'get',
params: query
})
}
// 流程实例
export function listFlowInstance(query) {
return request({
url: '/hrm/flow/instance/list',
method: 'get',
params: query
})
}
// 我的申请(我发起的流程实例)
export function listMyFlowInstance(query) {
return request({
url: '/hrm/flow/instance/myList',
method: 'get',
params: query
})
}
export function getFlowInstance(instId) {
return request({
url: `/hrm/flow/instance/${instId}`,
method: 'get'
})
}
export function queryInstanceByBiz(bizType, bizId) {
return request({
url: '/hrm/flow/instance/all',
method: 'get',
params: { bizType, bizId }
})
}
export function listFlowForm(query) {
return request({
url: '/hrm/flow/form/list',
method: 'get',
params: query
})
}
export function getFlowForm(formId) {
return request({
url: `/hrm/flow/form/${formId}`,
method: 'get'
})
}
// 流程模板
export function listFlowTemplate(query) {
return request({
url: '/hrm/flow/template/list',
method: 'get',
params: query
})
}
export function getFlowTemplate(tplId) {
return request({
url: `/hrm/flow/template/${tplId}`,
method: 'get'
})
}
export function addFlowTemplate(data) {
return request({
url: '/hrm/flow/template',
method: 'post',
data
})
}
export function updateFlowTemplate(data) {
return request({
url: '/hrm/flow/template',
method: 'put',
data
})
}
export function delFlowTemplate(tplIds) {
return request({
url: `/hrm/flow/template/${tplIds}`,
method: 'delete'
})
}
// 流程节点
export function listFlowNode(query) {
return request({
url: '/hrm/flow/node/list',
method: 'get',
params: query
})
}
export function getFlowNode(nodeId) {
return request({
url: `/hrm/flow/node/${nodeId}`,
method: 'get'
})
}
export function addFlowNode(data) {
return request({
url: '/hrm/flow/node',
method: 'post',
data
})
}
export function updateFlowNode(data) {
return request({
url: '/hrm/flow/node',
method: 'put',
data
})
}
export function delFlowNode(nodeIds) {
return request({
url: `/hrm/flow/node/${nodeIds}`,
method: 'delete'
})
}

66
api/hrm/gradePosition.js Normal file
View File

@@ -0,0 +1,66 @@
import request from "@/util/oaRequest"
// 职级
export function listGrade(query) {
return request({
url: '/hrm/grade/list',
method: 'get',
params: query
})
}
export function addGrade(data) {
return request({
url: '/hrm/grade',
method: 'post',
data
})
}
export function updateGrade(data) {
return request({
url: '/hrm/grade',
method: 'put',
data
})
}
export function delGrade(gradeIds) {
return request({
url: `/hrm/grade/${gradeIds}`,
method: 'delete'
})
}
// 岗位
export function listPosition(query) {
return request({
url: '/hrm/position/list',
method: 'get',
params: query
})
}
export function addPosition(data) {
return request({
url: '/hrm/position',
method: 'post',
data
})
}
export function updatePosition(data) {
return request({
url: '/hrm/position',
method: 'put',
data
})
}
export function delPosition(positionIds) {
return request({
url: `/hrm/position/${positionIds}`,
method: 'delete'
})
}

12
api/hrm/index.js Normal file
View File

@@ -0,0 +1,12 @@
// 导出所有 HRM 模块 API
export * from './employee'
export * from './org'
export * from './certContract'
export * from './empOrgPosition'
export * from './gradePosition'
export * from './attendance'
export * from './leave'
export * from './travel'
export * from './seal'
export * from './reimburse'
export * from './flow'

48
api/hrm/leave.js Normal file
View File

@@ -0,0 +1,48 @@
import request from "@/util/oaRequest"
// 请假单
export function listLeaveReq(query) {
return request({
url: '/hrm/leave/req/list',
method: 'get',
params: query
})
}
export function getLeaveReq(bizId) {
return request({
url: `/hrm/leave/req/${bizId}`,
method: 'get'
})
}
export function addLeaveReq(data) {
return request({
url: '/hrm/leave/req',
method: 'post',
data
})
}
export function editLeaveReq(data) {
return request({
url: '/hrm/leave/req',
method: 'put',
data
})
}
export function delLeaveReq(bizIds) {
return request({
url: `/hrm/leave/req/${bizIds}`,
method: 'delete'
})
}
export function allLeaveReq(query) {
return request({
url: '/hrm/leave/req/all',
method: 'get',
params: query
})
}

49
api/hrm/org.js Normal file
View File

@@ -0,0 +1,49 @@
import request from "@/util/oaRequest"
// 组织
export function listOrg(query) {
return request({
url: '/hrm/org/list',
method: 'get',
params: query
})
}
export function allOrg(query) {
return request({
url: '/hrm/org/all',
method: 'get',
params: query
})
}
export function addOrg(data) {
return request({
url: '/hrm/org',
method: 'post',
data
})
}
export function updateOrg(data) {
return request({
url: '/hrm/org',
method: 'put',
data
})
}
export function delOrg(orgIds) {
return request({
url: `/hrm/org/${orgIds}`,
method: 'delete'
})
}
export function getOrg(orgId) {
return request({
url: `/hrm/org/${orgId}`,
method: 'get'
})
}

49
api/hrm/reimburse.js Normal file
View File

@@ -0,0 +1,49 @@
import request from "@/util/oaRequest"
// 日常报销单
export function listReimburseReq(query) {
return request({
url: '/hrm/reimburse/list',
method: 'get',
params: query
})
}
export function getReimburseReq(bizId) {
return request({
url: `/hrm/reimburse/${bizId}`,
method: 'get'
})
}
export function addReimburseReq(data) {
return request({
url: '/hrm/reimburse',
method: 'post',
data
})
}
export function editReimburseReq(data) {
return request({
url: '/hrm/reimburse',
method: 'put',
data
})
}
export function delReimburseReq(bizIds) {
return request({
url: `/hrm/reimburse/${bizIds}`,
method: 'delete'
})
}
export function allReimburseReq(query) {
return request({
url: '/hrm/reimburse/all',
method: 'get',
params: query
})
}

99
api/hrm/seal.js Normal file
View File

@@ -0,0 +1,99 @@
import request from "@/util/oaRequest"
// 用印申请
export function listSealReq(query) {
return request({
url: '/hrm/seal/list',
method: 'get',
params: query
})
}
export function getSealReq(bizId) {
return request({
url: `/hrm/seal/${bizId}`,
method: 'get'
})
}
export function addSealReq(data) {
return request({
url: '/hrm/seal',
method: 'post',
data
})
}
export function editSealReq(data) {
return request({
url: '/hrm/seal',
method: 'put',
data
})
}
export function delSealReq(bizIds) {
return request({
url: `/hrm/seal/${bizIds}`,
method: 'delete'
})
}
export function approveSealReq(bizId) {
return request({
url: `/hrm/seal/${bizId}/approve`,
method: 'post'
})
}
export function rejectSealReq(bizId) {
return request({
url: `/hrm/seal/${bizId}/reject`,
method: 'post'
})
}
export function cancelSealReq(bizId) {
return request({
url: `/hrm/seal/${bizId}/cancel`,
method: 'post'
})
}
export function stampSealJava(bizId, data) {
// 确保数据正确序列化,特别是 0 值
const payload = {
targetFileUrl: String(data.targetFileUrl || ''),
stampImageUrl: String(data.stampImageUrl || ''),
pageNo: Number(data.pageNo) || 1,
xPx: Number(data.xPx) || 0,
yPx: Number(data.yPx) || 0,
viewportWidth: data.viewportWidth !== undefined && data.viewportWidth !== null ? Number(data.viewportWidth) : undefined,
viewportHeight: data.viewportHeight !== undefined && data.viewportHeight !== null ? Number(data.viewportHeight) : undefined
}
// 可选字段
if (data.widthPx !== undefined && data.widthPx !== null) {
payload.widthPx = Number(data.widthPx)
}
if (data.heightPx !== undefined && data.heightPx !== null) {
payload.heightPx = Number(data.heightPx)
}
// viewportWidth/Height如果是 undefined 则不传(兼容后端校验)
if (payload.viewportWidth === undefined) delete payload.viewportWidth
if (payload.viewportHeight === undefined) delete payload.viewportHeight
console.log('stampSealJava API call, payload:', JSON.stringify(payload, null, 2))
console.log('yPx in API:', typeof payload.yPx, payload.yPx)
return request({
url: `/hrm/seal/${bizId}/stamp/java`,
method: 'post',
data: payload
})
}
export function stampSealPython(bizId, data) {
return request({
url: `/hrm/seal/${bizId}/stamp/python`,
method: 'post',
data
})
}

48
api/hrm/travel.js Normal file
View File

@@ -0,0 +1,48 @@
import request from "@/util/oaRequest"
// 出差单
export function listTravelReq(query) {
return request({
url: '/hrm/travel/list',
method: 'get',
params: query
})
}
export function getTravelReq(bizId) {
return request({
url: `/hrm/travel/${bizId}`,
method: 'get'
})
}
export function addTravelReq(data) {
return request({
url: '/hrm/travel',
method: 'post',
data
})
}
export function editTravelReq(data) {
return request({
url: '/hrm/travel',
method: 'put',
data
})
}
export function delTravelReq(bizIds) {
return request({
url: `/hrm/travel/${bizIds}`,
method: 'delete'
})
}
export function allTravelReq(query) {
return request({
url: '/hrm/travel/all',
method: 'get',
params: query
})
}