feat(wms): 新增部门管理模块并重构审批流程

- 新增部门管理模块,包括部门树形结构的增删改查功能
- 重构审批流程,使用任务审批模式替代原有简单审批
- 调整请假和外出申请页面,适配新的审批流程
- 移除不必要的审批部门显示和申请类型筛选
- 更新状态显示逻辑,支持多级审批状态展示
This commit is contained in:
砂糖
2026-03-02 15:58:15 +08:00
parent 584839ec67
commit dabcc61174
6 changed files with 521 additions and 55 deletions

View File

@@ -8,10 +8,10 @@
</template>
<!-- 左侧是新增表单 -->
<el-form ref="form" :model="form" :rules="rules" label-width="80px" v-loading="loading">
<el-form-item label="审批部门" prop="applicantDeptName">
<el-select v-model="form.applicantDeptName" placeholder="请选择审批部门" filterable @change="getDeptLeader">
<el-form-item label="审批部门" prop="deptId">
<el-select v-model="form.deptId" placeholder="请选择审批部门" filterable @change="getDeptLeader">
<el-option v-for="item in deptOptions" :key="item.deptId"
:label="item.deptName + '(' + (item.leader || '无负责人') + ')'" :value="item.deptName"></el-option>
:label="item.deptName + '(' + (item.leaderNickName || '无负责人') + ')'" :value="item.deptId"></el-option>
</el-select>
</el-form-item>
<el-form-item label="请假类型" prop="leaveType">
@@ -109,7 +109,15 @@
<dict-tag :options="dict.type.hrm_leave_employee" :value="scope.row.applicantName" />
</template>
</el-table-column>
<el-table-column label="审批" align="center" prop="approverName"></el-table-column>
<el-table-column label="审批情况" align="center" prop="approverName">
<template slot-scope="scope">
<!-- 每行一个不要出现换行将英文映射成中文 -->
<el-tag v-for="task in scope.row.tasks" :key="task.taskId" :type="getTaskStatusTagType(task.taskStatus)" style="margin-right: 8px;">
<!-- taskStatus包括pending, approved, rejected, 根据状态设置不同的标签类型 -->
{{ task.approverName }} {{ getTaskStatusText(task.taskStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="开始时间" align="center" prop="startTime" width="120">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}') }}</span>
@@ -130,7 +138,7 @@
<el-table-column label="操作" align="center" width="160">
<template slot-scope="scope" v-if="scope.row.approvalStatus === '待审批'">
<el-button icon="el-icon-edit" size="mini" @click="handleEdit(scope.row)">修改</el-button>
<el-button icon="el-icon-delete" size="mini" @click="handleWithdraw(scope.row)">撤回</el-button>
<!-- <el-button icon="el-icon-delete" size="mini" @click="handleWithdraw(scope.row)">撤回</el-button> -->
</template>
</el-table-column>
</el-table>
@@ -145,7 +153,7 @@
<script>
import { getLeaveRequest, addLeaveRequest, updateLeaveRequest } from "@/api/wms/leaveRequest";
import { listApproval, updateApproval } from "@/api/wms/approval"
import { listDeptWithChildren } from "@/api/system/dept"
import { listDept } from "@/api/wms/dept"
import FileUpload from '@/components/FileUpload'
import DictSelect from '@/components/DictSelect'
@@ -183,7 +191,7 @@ export default {
rules: {
leaveType: [{ required: true, message: '请假类型不能为空', trigger: 'change' }],
applicantName: [{ required: true, message: '请假人姓名不能为空', trigger: 'change' }],
applicantDeptName: [{ required: true, message: '审批部门不能为空', trigger: 'change' }],
deptId: [{ required: true, message: '审批部门不能为空', trigger: 'change' }],
attachmentUrls: [{ required: false }],
remark: [{ required: false }],
// 数组项的校验规则
@@ -204,14 +212,14 @@ export default {
},
methods: {
getDeptList() {
listDeptWithChildren("2009923867307630594").then(response => {
listDept().then(response => {
this.deptOptions = response.data
})
},
// 获取部门负责人
getDeptLeader() {
const selectedDept = this.deptOptions.find(item => item.deptName === this.form.applicantDeptName)
const approverName = selectedDept.leader;
const selectedDept = this.deptOptions.find(item => item.deptId === this.form.deptId)
const approverName = selectedDept.leaderNickName;
if (!approverName) {
this.$message.warning('该部门无负责人,申请将无人审批');
return;
@@ -229,6 +237,7 @@ export default {
approvalId: item.approval.approvalId,
approvalType: item.approval.approvalType,
approverName: item.approval.approverName,
tasks: item.tasks,
...item.detail,
}
});
@@ -263,7 +272,7 @@ export default {
leaveId: undefined,
leaveType: undefined,
applicantName: undefined,
applicantDeptName: undefined,
deptId: undefined,
approverName: undefined,
attachmentUrls: undefined,
remark: undefined,
@@ -329,7 +338,7 @@ export default {
// 2. 循环处理每个时段,逐个发送请求
for (let i = 0; i < list.length; i++) {
const item = list[i];
// 组装单个请求的数据(公共字段 + 当前时段字段)
const approvalType = parseInt(item.leaveDays) > 3 ? 'multi' : 'single';
const singleRequestData = {
...commonFields,
startTime: item.startTime,
@@ -338,7 +347,8 @@ export default {
leaveDays: item.leaveDays,
leaveReason: item.leaveReason,
// 生成单条记录的标题
leaveTitle: `${commonFields.applicantName}-${commonFields.leaveType}-时段${i+1}-${item.startTime}-${item.leaveReason || ''}`
leaveTitle: `${commonFields.applicantName}-${commonFields.leaveType}-时段${i+1}-${item.startTime}-${item.leaveReason || ''}`,
approvalType: approvalType,
};
try {
@@ -418,6 +428,24 @@ export default {
}
return textMap[status] || '未知状态'
},
// 获取任务状态的中文文本
getTaskStatusText(status) {
const textMap = {
'pending': '待审批',
'approved': '已同意',
'rejected': '已驳回'
}
return textMap[status] || status
},
// 获取任务状态的标签类型
getTaskStatusTagType(status) {
const typeMap = {
'pending': 'warning',
'approved': 'success',
'rejected': 'danger'
}
return typeMap[status] || 'info'
},
// 计算指定行的请假天数
calculateLeaveDays(index) {
const item = this.form.list[index];