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