From 602d3975198790f467d7c77d103902c7d3a218b7 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 24 八月 2026 10:10:08 +0800
Subject: [PATCH] 请假扣款配置新增/删除按钮权限控制,请假类型下拉选择
---
src/views/hrm/salary/leave-type-config/data.ts | 27 +++++++-
src/views/hrm/salary/leave-type-config/index.vue | 43 +++++++++++++
src/api/hrm/leave-type-config/index.ts | 10 +++
src/views/hrm/salary/leave-type-config/modules/form.vue | 59 ++++++++++++++++---
4 files changed, 123 insertions(+), 16 deletions(-)
diff --git a/src/api/hrm/leave-type-config/index.ts b/src/api/hrm/leave-type-config/index.ts
index 4c58a3f..bf2131a 100644
--- a/src/api/hrm/leave-type-config/index.ts
+++ b/src/api/hrm/leave-type-config/index.ts
@@ -22,7 +22,17 @@
);
}
+/** 鏂板璇峰亣绫诲瀷閰嶇疆 */
+export function createLeaveTypeConfig(data: HrmLeaveTypeConfigApi.LeaveTypeConfig) {
+ return requestClient.post<number>('/hrm/leave-type-config/create', data);
+}
+
/** 鏇存柊璇峰亣绫诲瀷閰嶇疆 */
export function updateLeaveTypeConfig(data: HrmLeaveTypeConfigApi.LeaveTypeConfig) {
return requestClient.put('/hrm/leave-type-config/update', data);
+}
+
+/** 鍒犻櫎璇峰亣绫诲瀷閰嶇疆 */
+export function deleteLeaveTypeConfig(id: number) {
+ return requestClient.delete(`/hrm/leave-type-config/delete?id=${id}`);
}
\ No newline at end of file
diff --git a/src/views/hrm/salary/leave-type-config/data.ts b/src/views/hrm/salary/leave-type-config/data.ts
index f8e53f1..14cb42d 100644
--- a/src/views/hrm/salary/leave-type-config/data.ts
+++ b/src/views/hrm/salary/leave-type-config/data.ts
@@ -3,7 +3,7 @@
import type { HrmLeaveTypeConfigApi } from '#/api/hrm/leave-type-config';
/** 琛ㄥ崟绫诲瀷 */
-export type FormType = 'update';
+export type FormType = 'create' | 'update';
/** 鏂板/淇敼璇峰亣鎵f閰嶇疆鐨勮〃鍗� */
export function useFormSchema(): VbenFormSchema[] {
@@ -17,13 +17,29 @@
},
},
{
- fieldName: 'name',
+ fieldName: 'leaveType',
label: '璇峰亣绫诲瀷',
- component: 'Input',
+ component: 'Select',
componentProps: {
- disabled: true,
- placeholder: '',
+ options: [
+ { label: '浜嬪亣', value: 1 },
+ { label: '鐥呭亣', value: 2 },
+ { label: '骞村亣', value: 3 },
+ { label: '濠氬亣', value: 4 },
+ { label: '浜у亣', value: 5 },
+ { label: '涓у亣', value: 6 },
+ ],
+ placeholder: '璇烽�夋嫨璇峰亣绫诲瀷',
+ style: { width: '100%' },
},
+ dependencies: {
+ triggerFields: ['id'],
+ // 缂栬緫鏃朵笉鍏佽淇敼璇峰亣绫诲瀷
+ componentProps: (values: Record<string, unknown>) => ({
+ disabled: Boolean(values.id),
+ }),
+ },
+ rules: 'required',
formItemClass: 'col-span-2',
},
{
@@ -47,6 +63,7 @@
fieldName: 'status',
label: '鐘舵��',
component: 'RadioGroup',
+ defaultValue: 0,
componentProps: {
options: [
{ label: '鍚敤', value: 0 },
diff --git a/src/views/hrm/salary/leave-type-config/index.vue b/src/views/hrm/salary/leave-type-config/index.vue
index a22d4c7..c92af92 100644
--- a/src/views/hrm/salary/leave-type-config/index.vue
+++ b/src/views/hrm/salary/leave-type-config/index.vue
@@ -7,7 +7,10 @@
import { message, Tag } from 'ant-design-vue';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
-import { getLeaveTypeConfigList } from '#/api/hrm/leave-type-config';
+import {
+ deleteLeaveTypeConfig,
+ getLeaveTypeConfigList,
+} from '#/api/hrm/leave-type-config';
import { $t } from '#/locales';
import { useGridColumns } from './data';
@@ -23,9 +26,21 @@
gridApi.query();
}
+/** 鏂板閰嶇疆 */
+function handleCreate() {
+ formModalApi.setData({ formType: 'create' }).open();
+}
+
/** 缂栬緫閰嶇疆 */
function handleEdit(row: HrmLeaveTypeConfigApi.LeaveTypeConfig) {
- formModalApi.setData({ id: row.id, row }).open();
+ formModalApi.setData({ formType: 'update', row }).open();
+}
+
+/** 鍒犻櫎閰嶇疆 */
+async function handleDelete(row: HrmLeaveTypeConfigApi.LeaveTypeConfig) {
+ await deleteLeaveTypeConfig(row.id!);
+ message.success($t('ui.actionMessage.deleteSuccess', ['璇峰亣鎵f閰嶇疆']));
+ handleRefresh();
}
const [Grid, gridApi] = useVbenVxeGrid({
@@ -56,6 +71,19 @@
<Page auto-content-height>
<FormModal @success="handleRefresh" />
<Grid table-title="璇峰亣鎵f閰嶇疆鍒楄〃">
+ <template #toolbar-tools>
+ <TableAction
+ :actions="[
+ {
+ label: $t('ui.actionTitle.create', ['璇峰亣鎵f閰嶇疆']),
+ type: 'primary',
+ icon: ACTION_ICON.ADD,
+ auth: ['hrm:leave-type-config:create'],
+ onClick: handleCreate,
+ },
+ ]"
+ />
+ </template>
<template #deductionRatio="{ row }">
<Tag :color="row.deductionRatio === 0 ? 'success' : row.deductionRatio === 1 ? 'error' : 'warning'">
{{ row.deductionRatio === 0 ? '涓嶆墸娆�' : `${(row.deductionRatio * 100).toFixed(0)}%` }}
@@ -76,6 +104,17 @@
auth: ['hrm:leave-type-config:update'],
onClick: handleEdit.bind(null, row),
},
+ {
+ label: $t('common.delete'),
+ type: 'link',
+ danger: true,
+ icon: ACTION_ICON.DELETE,
+ auth: ['hrm:leave-type-config:delete'],
+ popConfirm: {
+ title: $t('ui.actionMessage.deleteConfirm', ['璇峰亣鎵f閰嶇疆']),
+ confirm: handleDelete.bind(null, row),
+ },
+ },
]"
/>
</template>
diff --git a/src/views/hrm/salary/leave-type-config/modules/form.vue b/src/views/hrm/salary/leave-type-config/modules/form.vue
index f016033..dbe2aab 100644
--- a/src/views/hrm/salary/leave-type-config/modules/form.vue
+++ b/src/views/hrm/salary/leave-type-config/modules/form.vue
@@ -1,19 +1,28 @@
<script lang="ts" setup>
+import type { FormType } from '../data';
import type { HrmLeaveTypeConfigApi } from '#/api/hrm/leave-type-config';
-import { ref } from 'vue';
+import { computed, ref } from 'vue';
import { useVbenModal } from '#/packages/effects/common-ui/src';
import { message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
-import { updateLeaveTypeConfig } from '#/api/hrm/leave-type-config';
+import {
+ createLeaveTypeConfig,
+ updateLeaveTypeConfig,
+} from '#/api/hrm/leave-type-config';
import { $t } from '#/locales';
import { useFormSchema } from '../data';
const emit = defineEmits(['success']);
+const formType = ref<FormType>('create');
+
+const getTitle = computed(() =>
+ formType.value === 'update' ? '缂栬緫鎵f姣斾緥' : '鏂板璇峰亣鎵f閰嶇疆',
+);
const [Form, formApi] = useVbenForm({
commonConfig: {
@@ -36,11 +45,35 @@
return;
}
modalApi.lock();
- const data = await formApi.getValues();
+ const data = (await formApi.getValues()) as HrmLeaveTypeConfigApi.LeaveTypeConfig;
// 杞崲姣斾緥涓哄皬鏁�
- data.deductionRatio = data.deductionRatio / 100;
+ const deductionRatio = data.deductionRatio! / 100;
try {
- await updateLeaveTypeConfig(data);
+ if (formType.value === 'update') {
+ await updateLeaveTypeConfig({
+ id: data.id,
+ deductionRatio,
+ remark: data.remark,
+ status: data.status,
+ });
+ } else {
+ // 璇峰亣绫诲瀷鍚嶇О鐢辨墍閫夌被鍨嬭嚜鍔ㄥ甫鍑猴紝鏃犻渶鎵嬪姩濉啓
+ const NAME_MAP: Record<number, string> = {
+ 1: '浜嬪亣',
+ 2: '鐥呭亣',
+ 3: '骞村亣',
+ 4: '濠氬亣',
+ 5: '浜у亣',
+ 6: '涓у亣',
+ };
+ await createLeaveTypeConfig({
+ leaveType: data.leaveType,
+ name: NAME_MAP[data.leaveType!] ?? '',
+ deductionRatio,
+ remark: data.remark,
+ status: data.status,
+ });
+ }
await modalApi.close();
emit('success');
message.success($t('ui.actionMessage.operationSuccess'));
@@ -52,16 +85,24 @@
if (!isOpen) {
return;
}
- const data = modalApi.getData<{ id: number; row: HrmLeaveTypeConfigApi.LeaveTypeConfig }>();
+ const data = modalApi.getData<{ formType: FormType; row: HrmLeaveTypeConfigApi.LeaveTypeConfig }>();
+ formType.value = data.formType;
+ if (data.formType === 'create' || !data.row) {
+ await formApi.resetForm();
+ return;
+ }
// 杞崲姣斾緥涓虹櫨鍒嗘瘮鏄剧ず
- const row = { ...data.row, deductionRatio: (data.row.deductionRatio || 0) * 100 };
+ const row = {
+ ...data.row,
+ deductionRatio: (data.row.deductionRatio || 0) * 100,
+ };
await formApi.setValues(row);
},
});
</script>
<template>
- <Modal title="缂栬緫鎵f姣斾緥" class="w-[600px]">
+ <Modal :title="getTitle" class="w-[600px]">
<Form class="mx-4" />
</Modal>
-</template>
\ No newline at end of file
+</template>
--
Gitblit v1.9.3