8 分钟以前 0c221f3e96cc6aae6b6bcf67e984cb446dcfac87
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<script lang="ts" setup>
import type { FormType } from '../data';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { HrmEmployeeApi } from '#/api/hrm/employee';
 
import { computed, nextTick, watch } from 'vue';
 
import { IconifyIcon } from '#/packages/icons/src';
 
import { Button, DatePicker, Input } from 'ant-design-vue';
 
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { getWorkHistoryListByEmployeeId } from '#/api/hrm/employee/work-history';
import { $t } from '#/locales';
 
const props = defineProps<{
  employeeId?: number;
  formType: FormType;
}>();
 
const isReadOnly = computed(() => props.formType === 'detail');
 
const [Grid, gridApi] = useVbenVxeGrid({
  gridOptions: {
    columns: [
      { field: 'companyName', title: '公司名称', minWidth: 150, slots: { default: 'companyName' } },
      { field: 'position', title: '职位', minWidth: 120, slots: { default: 'position' } },
      {
        field: 'startDate',
        title: '开始时间',
        minWidth: 120,
        slots: { default: 'startDate' },
      },
      {
        field: 'endDate',
        title: '结束时间',
        minWidth: 120,
        slots: { default: 'endDate' },
      },
      { field: 'workContent', title: '工作内容', minWidth: 200, slots: { default: 'workContent' } },
      { field: 'leaveReason', title: '离职原因', minWidth: 150, slots: { default: 'leaveReason' } },
      {
        title: '操作',
        width: 80,
        fixed: 'right',
        slots: { default: 'actions' },
        visible: !isReadOnly.value,
      },
    ],
    border: true,
    showOverflow: true,
    autoResize: true,
    keepSource: true,
    rowConfig: {
      keyField: 'id',
      isHover: true,
    },
    pagerConfig: {
      enabled: false,
    },
    toolbarConfig: {
      enabled: false,
    },
  } as VxeTableGridOptions<HrmEmployeeApi.WorkHistory>,
});
 
/** 添加工作经历 */
async function handleAdd() {
  await gridApi.grid.insertAt({} as HrmEmployeeApi.WorkHistory, -1);
}
 
/** 删除工作经历 */
async function handleDelete(row: HrmEmployeeApi.WorkHistory) {
  await gridApi.grid.remove(row);
}
 
/** 提供获取表格数据的方法供父组件调用 */
defineExpose({
  getData: (): HrmEmployeeApi.WorkHistory[] => {
    const data = gridApi.grid.getData() as HrmEmployeeApi.WorkHistory[];
    const removeRecords = gridApi.grid.getRemoveRecords() as HrmEmployeeApi.WorkHistory[];
    const insertRecords = gridApi.grid.getInsertRecords() as HrmEmployeeApi.WorkHistory[];
    return [
      ...data.filter((row) => !removeRecords.some((removed) => removed.id === row.id)),
      ...insertRecords.map((row: any) => ({ ...row, id: undefined })),
    ];
  },
});
 
/** 监听员工ID变化,加载子表数据 */
watch(
  () => props.employeeId,
  async (val) => {
    if (!val) {
      return;
    }
    await nextTick();
    await gridApi.grid.loadData(await getWorkHistoryListByEmployeeId(props.employeeId!));
  },
  { immediate: true },
);
</script>
 
<template>
  <Grid class="w-full">
    <template #companyName="{ row }">
      <Input v-model:value="row.companyName" :disabled="isReadOnly" placeholder="请输入公司名称" />
    </template>
    <template #position="{ row }">
      <Input v-model:value="row.position" :disabled="isReadOnly" placeholder="请输入职位" />
    </template>
    <template #startDate="{ row }">
      <DatePicker
        v-model:value="row.startDate"
        :disabled="isReadOnly"
        placeholder="请选择开始时间"
        valueFormat="YYYY-MM-DD"
        style="width: 100%"
      />
    </template>
    <template #endDate="{ row }">
      <DatePicker
        v-model:value="row.endDate"
        :disabled="isReadOnly"
        placeholder="请选择结束时间"
        valueFormat="YYYY-MM-DD"
        style="width: 100%"
      />
    </template>
    <template #workContent="{ row }">
      <Input v-model:value="row.workContent" :disabled="isReadOnly" placeholder="请输入工作内容" />
    </template>
    <template #leaveReason="{ row }">
      <Input v-model:value="row.leaveReason" :disabled="isReadOnly" placeholder="请输入离职原因" />
    </template>
    <template #actions="{ row }">
      <TableAction
        :actions="[
          {
            label: $t('common.delete'),
            danger: true,
            type: 'link',
            icon: ACTION_ICON.DELETE,
            onClick: handleDelete.bind(null, row),
          },
        ]"
      />
    </template>
  </Grid>
  <div v-if="!isReadOnly" class="-mt-4 flex justify-center">
    <Button type="primary" ghost @click="handleAdd">
      <IconifyIcon icon="lucide:plus" />
      添加工作经历
    </Button>
  </div>
</template>