Commit 3905e5fc authored by 刘斌's avatar 刘斌

fix: 完善入职离职

parent bf1ac72a
import type { BaseModel, PageQuery } from '#/api/baseModel';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
export namespace EmployeeDeptApi {
export interface EmployeeDept extends BaseModel {
/**
* 父级部门
*/
parentId?: number;
/**
* 部门名称
*/
name?: string;
/**
* 祖级关系
*/
nodePath?: string;
/**
* 显示顺序
*/
orderNum?: number;
/**
* 状态
*/
status?: number;
}
}
/**
* 查询员工部门列表
* @param params
* @returns {*} page
*/
export function apiPage(params: PageQuery) {
return requestClient.get('/employee/dept/page', { params });
}
/**
* 查询员工部门详细
* @param id
*/
export function apiDetail(id: number) {
return requestClient.get(`/employee/dept/${id}`);
}
/**
* 新增员工部门
* @param data
*/
export function apiAdd(data: EmployeeDeptApi.EmployeeDept) {
return requestClient.post('/employee/dept', data);
}
/**
* 修改员工部门
* @param data
*/
export function apiUpdate(data: EmployeeDeptApi.EmployeeDept) {
return requestClient.put('/employee/dept', data);
}
/**
* 删除员工部门
* @param id
*/
export function apiDelete(id: Array<number> | number) {
return requestClient.delete(`/employee/dept/${id}`);
}
/**
* 导出员工部门
* @param params
*/
export function apiExport(params: PageQuery) {
return commonExport('/employee/dept/export', params);
}
/**
* 根据部门等级查询部门名称
* @param level
*/
export function selectDeptNamesByLevel(level: number) {
return requestClient.get(`/employee/dept/deptNames/${level}`);
}
/**
* 根据父级部门名称查询部门名称
* @param name
*/
export function selectDeptNamesByParent(name: string) {
return requestClient.get(`/employee/dept/deptNamesByParentName/${name}`);
}
...@@ -248,6 +248,14 @@ export function apiExport(id: number) { ...@@ -248,6 +248,14 @@ export function apiExport(id: number) {
return commonExport(`/employee/info/export/${id}`, {}); return commonExport(`/employee/info/export/${id}`, {});
} }
/**
* 申请员工离职
* @param id
*/
export function applyResign(id: number) {
return requestClient.put(`/employee/info/applyResign/${id}`);
}
/** /**
* 下载用户导入模板 * 下载用户导入模板
* @returns blob * @returns blob
......
...@@ -81,3 +81,13 @@ export function apiExport(params?: PageQuery) { ...@@ -81,3 +81,13 @@ export function apiExport(params?: PageQuery) {
export function apiOptionselect() { export function apiOptionselect() {
return requestClient.get('/system/dict/type/optionselect'); return requestClient.get('/system/dict/type/optionselect');
} }
/**
* 刷新字典缓存
* @returns void
*/
export function refreshDictTypeCache() {
return requestClient.delete('/system/dict/type/refreshCache', {
successMessageMode: 'message',
});
}
...@@ -5,11 +5,16 @@ import type { EmployeeInfoApi } from '#/api/hr/employeeInfo'; ...@@ -5,11 +5,16 @@ import type { EmployeeInfoApi } from '#/api/hr/employeeInfo';
import { computed, ref } from 'vue'; import { computed, ref } from 'vue';
import { useVbenDrawer } from '@vben/common-ui'; import { useVbenDrawer } from '@vben/common-ui';
import { getVxePopupContainer } from '@vben/utils';
import { Skeleton } from 'ant-design-vue'; import { Skeleton } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { apiAdd, apiUpdate } from '#/api/hr/employeeInfo'; import {
selectDeptNamesByLevel,
selectDeptNamesByParent,
} from '#/api/hr/employeeDept';
import { apiAdd, apiDetail, apiUpdate } from '#/api/hr/employeeInfo';
import { getDictOptions } from '#/utils/dict'; import { getDictOptions } from '#/utils/dict';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
...@@ -20,6 +25,7 @@ const emit = defineEmits<{ ...@@ -20,6 +25,7 @@ const emit = defineEmits<{
}>(); }>();
const formData = ref<EmployeeInfoApi.Employee>(); const formData = ref<EmployeeInfoApi.Employee>();
const loading = ref(false); const loading = ref(false);
const isUpdate = ref(false);
const formSchema: VbenFormSchema[] = [ const formSchema: VbenFormSchema[] = [
{ {
...@@ -47,13 +53,33 @@ const formSchema: VbenFormSchema[] = [ ...@@ -47,13 +53,33 @@ const formSchema: VbenFormSchema[] = [
rules: 'required', rules: 'required',
}, },
{ {
component: 'Input', component: 'ApiSelect',
componentProps: (formModel) => ({
api: async () => {
const data: string[] = await selectDeptNamesByLevel(1);
return data.map((item) => ({
label: item,
value: item,
}));
},
async onSelect(name: string) {
/** 根据部门ID加载岗位 */
await setupDeptLevel2Options(name);
/** 变化后需要重新选择岗位 */
formModel.secondLevelDepartment = [];
},
getVxePopupContainer,
}),
fieldName: 'firstLevelDepartment', fieldName: 'firstLevelDepartment',
label: '一级部门', label: '一级部门',
rules: 'required', rules: 'required',
}, },
{ {
component: 'Input', component: 'Select',
componentProps: {
getVxePopupContainer,
placeholder: '请先选择一级部门',
},
fieldName: 'secondLevelDepartment', fieldName: 'secondLevelDepartment',
label: '二级部门', label: '二级部门',
rules: 'required', rules: 'required',
...@@ -120,6 +146,11 @@ const formSchema: VbenFormSchema[] = [ ...@@ -120,6 +146,11 @@ const formSchema: VbenFormSchema[] = [
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'birthDate', fieldName: 'birthDate',
label: '出生日期', label: '出生日期',
rules: 'required', rules: 'required',
...@@ -222,6 +253,11 @@ const formSchema: VbenFormSchema[] = [ ...@@ -222,6 +253,11 @@ const formSchema: VbenFormSchema[] = [
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'graduationDate', fieldName: 'graduationDate',
label: '毕业时间', label: '毕业时间',
rules: 'required', rules: 'required',
...@@ -252,18 +288,33 @@ const formSchema: VbenFormSchema[] = [ ...@@ -252,18 +288,33 @@ const formSchema: VbenFormSchema[] = [
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'workStartDate', fieldName: 'workStartDate',
label: '参加工作时间', label: '参加工作时间',
rules: 'required', rules: 'required',
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'entryDate', fieldName: 'entryDate',
label: '入职时间', label: '入职时间',
rules: 'required', rules: 'required',
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'regularizationDate', fieldName: 'regularizationDate',
label: '转正时间', label: '转正时间',
rules: 'required', rules: 'required',
...@@ -330,21 +381,36 @@ const formSchema: VbenFormSchema[] = [ ...@@ -330,21 +381,36 @@ const formSchema: VbenFormSchema[] = [
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractStartDate', fieldName: 'contractStartDate',
label: '劳动合同开始时间', label: '劳动合同开始时间',
rules: 'required', rules: 'required',
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractEndDate', fieldName: 'contractEndDate',
label: '劳动合同截止时间', label: '劳动合同截止时间',
rules: 'required', rules: 'required',
}, },
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractExpirationReminder', fieldName: 'contractExpirationReminder',
label: '合同到期提醒', label: '合同到期提醒',
rules: 'required', // rules: 'required',
}, },
{ {
component: 'Input', component: 'Input',
...@@ -447,17 +513,40 @@ const [Drawer, drawerApi] = useVbenDrawer({ ...@@ -447,17 +513,40 @@ const [Drawer, drawerApi] = useVbenDrawer({
if (!isOpen) { if (!isOpen) {
return null; return null;
} }
const data = drawerApi.getData<EmployeeInfoApi.Employee>(); drawerApi.drawerLoading(true);
if (data) { loading.value = true;
const { id } = drawerApi.getData() as { id?: number };
isUpdate.value = !!id;
console.log('[id]', id);
if (id) {
const data = await apiDetail(id);
formData.value = data; formData.value = data;
await formApi.setValues(formData.value); await formApi.setValues(formData.value!);
await setupDeptLevel2Options(data.firstLevelDepartment);
} else { } else {
formApi.resetForm(); formApi.resetForm();
} }
await markInitialized(); await markInitialized();
drawerApi.drawerLoading(false);
loading.value = false;
}, },
}); });
async function setupDeptLevel2Options(name: string) {
const deptNameList: string[] = await selectDeptNamesByParent(name);
const options = deptNameList.map((item) => ({
label: item,
value: item,
}));
const placeholder = options.length > 0 ? '请选择' : '该部门下暂无岗位';
formApi.updateSchema([
{
componentProps: { options, placeholder },
fieldName: 'secondLevelDepartment',
},
]);
}
async function onSubmit() { async function onSubmit() {
const { valid } = await formApi.validate(); const { valid } = await formApi.validate();
if (valid) { if (valid) {
......
...@@ -11,7 +11,7 @@ import { getVxePopupContainer } from '@vben/utils'; ...@@ -11,7 +11,7 @@ import { getVxePopupContainer } from '@vben/utils';
import { Button, message, Popconfirm, Space } from 'ant-design-vue'; import { Button, message, Popconfirm, Space } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { apiDelete, apiExport, apiPage } from '#/api/hr/employeeInfo'; import { apiExport, apiPage, applyResign } from '#/api/hr/employeeInfo';
import { GhostButton } from '#/components/global/button'; import { GhostButton } from '#/components/global/button';
import { commonDownloadExcel } from '#/utils/file/download'; import { commonDownloadExcel } from '#/utils/file/download';
...@@ -107,7 +107,7 @@ function onRefresh() { ...@@ -107,7 +107,7 @@ function onRefresh() {
gridApi.query(); gridApi.query();
} }
function onEdit(row: EmployeeInfoApi.Employee) { function onEdit(row: EmployeeInfoApi.Employee) {
formDrawerApi.setData(row).open(); formDrawerApi.setData({ id: row.id }).open();
} }
function onCreate() { function onCreate() {
formDrawerApi.setData({}).open(); formDrawerApi.setData({}).open();
...@@ -118,7 +118,7 @@ function onResign(row: EmployeeInfoApi.Employee) { ...@@ -118,7 +118,7 @@ function onResign(row: EmployeeInfoApi.Employee) {
duration: 0, duration: 0,
key: 'action_process_msg', key: 'action_process_msg',
}); });
apiDelete(row.id || 0) applyResign(row.id || 0)
.then(() => { .then(() => {
message.success({ message.success({
content: `${row.name}离职申请成功`, content: `${row.name}离职申请成功`,
...@@ -191,7 +191,7 @@ function handleDownloadExcel(row: EmployeeInfoApi.Employee) { ...@@ -191,7 +191,7 @@ function handleDownloadExcel(row: EmployeeInfoApi.Employee) {
<Popconfirm <Popconfirm
:get-popup-container="getVxePopupContainer" :get-popup-container="getVxePopupContainer"
placement="left" placement="left"
:title="`确认离职【${row.name}】?`" :title="`确认申请离职【${row.name}】?`"
@confirm="onResign(row)" @confirm="onResign(row)"
> >
<GhostButton <GhostButton
...@@ -199,7 +199,7 @@ function handleDownloadExcel(row: EmployeeInfoApi.Employee) { ...@@ -199,7 +199,7 @@ function handleDownloadExcel(row: EmployeeInfoApi.Employee) {
v-access:code="['employee:info:resign']" v-access:code="['employee:info:resign']"
@click.stop="" @click.stop=""
> >
离职 申请离职
</GhostButton> </GhostButton>
</Popconfirm> </Popconfirm>
</Space> </Space>
......
...@@ -16,7 +16,11 @@ import { Plus } from '@vben/icons'; ...@@ -16,7 +16,11 @@ import { Plus } from '@vben/icons';
import { Button, message } from 'ant-design-vue'; import { Button, message } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { apiDelete, apiPage } from '#/api/system/dict/dictType'; import {
apiDelete,
apiPage,
refreshDictTypeCache,
} from '#/api/system/dict/dictType';
import { emitter } from '../mitt'; import { emitter } from '../mitt';
import { querySchema, useColumns } from './data'; import { querySchema, useColumns } from './data';
...@@ -83,7 +87,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ ...@@ -83,7 +87,10 @@ const [Grid, gridApi] = useVbenVxeGrid({
gridEvents, gridEvents,
}); });
function onActionClick({ code, row }: OnActionClickParams<DictTypeApi.DictType>) { function onActionClick({
code,
row,
}: OnActionClickParams<DictTypeApi.DictType>) {
switch (code) { switch (code) {
case 'delete': { case 'delete': {
onDelete(row); onDelete(row);
...@@ -127,12 +134,23 @@ function onDelete(row: DictTypeApi.DictType) { ...@@ -127,12 +134,23 @@ function onDelete(row: DictTypeApi.DictType) {
hideLoading(); hideLoading();
}); });
} }
async function handleRefreshCache() {
await refreshDictTypeCache();
await tableApi.query();
}
</script> </script>
<template> <template>
<div> <div>
<DictTypeModal @success="onRefresh" /> <DictTypeModal @success="onRefresh" />
<Grid table-title="字典类型列表"> <Grid table-title="字典类型列表">
<template #toolbar-tools> <template #toolbar-tools>
<a-button
v-access:code="['system:dict:edit']"
@click="handleRefreshCache"
>
刷新缓存
</a-button>
<Button <Button
type="primary" type="primary"
v-access:code="['system:dict:add']" v-access:code="['system:dict:add']"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment