feat(我的绩效): 开发我的绩效功能。

fix(加班申请、工作报告): 重构加班申请在审批时的样式,工作报告在新增时的对话框、报告详情页的样式。
This commit is contained in:
dk
2026-06-21 18:22:44 +08:00
parent cd64cf42cc
commit 9a5845708d
35 changed files with 4211 additions and 924 deletions

View File

@@ -29,7 +29,6 @@ import TaskWorklogDialog from '@/views/project/project/execution/modules/task-wo
import PersonalItemDetailDialog from '@/views/personal-center/my-item/modules/personal-item-detail-dialog.vue';
import PersonalItemOperateDialog from '@/views/personal-center/my-item/modules/personal-item-operate-dialog.vue';
import PersonalItemStatusActionDialog from '@/views/personal-center/my-item/modules/personal-item-status-action-dialog.vue';
import OvertimeApplicationActionDialog from '@/views/personal-center/overtime-application/modules/overtime-application-action-dialog.vue';
import OvertimeApplicationBatchDetailDialog from '@/views/personal-center/overtime-application/modules/overtime-application-batch-detail-dialog.vue';
import OvertimeApplicationDetailDialog from '@/views/personal-center/overtime-application/modules/overtime-application-detail-dialog.vue';
import WorkReportPrototypePageDialog from '@/views/personal-center/work-report/shared/components/prototype-page-dialog.vue';
@@ -169,12 +168,9 @@ const taskStatusAction = ref<Api.Project.LifecycleAction<Api.Project.ProjectTask
const taskWorklogVisible = ref(false);
const taskWorklogTask = ref<Api.Project.ProjectTask | null>(null);
const overtimeDetailVisible = ref(false);
const overtimeActionVisible = ref(false);
const overtimeActionSubmitting = ref(false);
const currentOvertimeApplication = ref<Api.OvertimeApplication.OvertimeApplication | null>(null);
const currentOvertimeActionType = ref<OvertimeApprovalActionType>('approve');
const batchDetailVisible = ref(false);
const batchActionVisible = ref(false);
const batchSubmitting = ref(false);
const workReportDetailVisible = ref(false);
const currentWorkReport = ref<WorkReportRow | null>(null);
@@ -183,9 +179,6 @@ const currentWorkReportType = ref<WorkReportType>('weekly');
// 批量审批选中状态(存原始加班申请 id避免映射转换
const selectedOvertimeIds = ref<Set<string>>(new Set());
// 批量审批是否为当前操作来源(区分单条审批和批量审批的 submit 回调)
const isBatchActionMode = ref(false);
const OVERTIME_APPROVAL_ACTION_ICONS = {
detail: markRaw(IconMdiEyeOutline)
};
@@ -569,13 +562,6 @@ function openOvertimeDetail(item: WorkbenchTodoItem) {
overtimeDetailVisible.value = true;
}
function openCurrentOvertimeAction(actionType: OvertimeApprovalActionType) {
if (!currentOvertimeApplication.value) return;
currentOvertimeActionType.value = actionType;
overtimeActionVisible.value = true;
}
function findWorkReportApprovalRow(item: WorkbenchTodoItem) {
if (!item.approvalBizId || !isWorkReportApprovalBizType(item.approvalBizType)) {
return null;
@@ -601,25 +587,24 @@ function openWorkReportDetail(item: WorkbenchTodoItem) {
workReportDetailVisible.value = true;
}
async function handleOvertimeActionSubmit(reason: string | null) {
async function handleOvertimeActionSubmit(payload: { actionType: OvertimeApprovalActionType; reason: string | null }) {
if (!currentOvertimeApplication.value) {
return;
}
overtimeActionSubmitting.value = true;
const result =
currentOvertimeActionType.value === 'approve'
? await fetchApproveOvertimeApplication(currentOvertimeApplication.value.id, { reason })
: await fetchRejectOvertimeApplication(currentOvertimeApplication.value.id, { reason });
payload.actionType === 'approve'
? await fetchApproveOvertimeApplication(currentOvertimeApplication.value.id, { reason: payload.reason })
: await fetchRejectOvertimeApplication(currentOvertimeApplication.value.id, { reason: payload.reason });
overtimeActionSubmitting.value = false;
if (result.error) {
return;
}
overtimeActionVisible.value = false;
overtimeDetailVisible.value = false;
window.$message?.success(currentOvertimeActionType.value === 'approve' ? '加班申请已通过' : '加班申请已退回');
window.$message?.success(payload.actionType === 'approve' ? '加班申请已通过' : '加班申请已退回');
await loadOvertimeApprovalItems();
}
@@ -748,30 +733,20 @@ function handleBatchReview() {
batchDetailVisible.value = true;
}
// 批量详情弹窗中点击"通过"或"退回"
function openBatchActionDialog(actionType: OvertimeApprovalActionType) {
currentOvertimeActionType.value = actionType;
isBatchActionMode.value = true;
batchActionVisible.value = true;
}
// 批量审批提交(对所有选中项执行批量 API
async function handleBatchActionSubmit(reason: string | null) {
async function handleBatchActionSubmit(payload: { actionType: OvertimeApprovalActionType; reason: string | null }) {
const ids = Array.from(selectedOvertimeIds.value);
if (ids.length === 0) return;
const fn =
currentOvertimeActionType.value === 'approve'
? fetchBatchApproveOvertimeApplication
: fetchBatchRejectOvertimeApplication;
payload.actionType === 'approve' ? fetchBatchApproveOvertimeApplication : fetchBatchRejectOvertimeApplication;
batchSubmitting.value = true;
const { error, data } = await fn({ ids, reason });
const { error, data } = await fn({ ids, reason: payload.reason });
batchSubmitting.value = false;
if (error || !data) return;
batchActionVisible.value = false;
batchDetailVisible.value = false;
clearOvertimeSelection();
@@ -1206,34 +1181,16 @@ onMounted(async () => {
show-approval-actions
:action-loading="overtimeActionSubmitting"
append-to-body
@approve="openCurrentOvertimeAction('approve')"
@reject="openCurrentOvertimeAction('reject')"
/>
<OvertimeApplicationActionDialog
v-model:visible="overtimeActionVisible"
:action-type="currentOvertimeActionType"
:loading="overtimeActionSubmitting"
append-to-body
@submit="handleOvertimeActionSubmit"
/>
<!-- 批量审批详情弹窗(左右箭头切换 + 通过/退回按钮) -->
<!-- 批量审批详情弹窗(左右箭头切换 + 通过/退回按钮 + 意见输入 -->
<OvertimeApplicationBatchDetailDialog
v-model:visible="batchDetailVisible"
:selected-ids="batchSelectedIds"
:rows="overtimeApprovalRows"
:action-loading="batchSubmitting"
append-to-body
@approve="openBatchActionDialog('approve')"
@reject="openBatchActionDialog('reject')"
/>
<!-- 批量审批意见/退回原因对话框 -->
<OvertimeApplicationActionDialog
v-model:visible="batchActionVisible"
:action-type="currentOvertimeActionType"
:loading="batchSubmitting"
append-to-body
@submit="handleBatchActionSubmit"
/>