Commit a0af350f authored by 刘斌's avatar 刘斌

fix: 完善转正和合同续约流程

parent 8d635d57
import type { BaseModel, PageQuery } from '#/api/baseModel';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
export namespace ContractExpirationReminderApi {
export interface ContractExpirationReminder extends BaseModel {
/**
* 板块
*/
plate?: string;
/**
* 一级部门
*/
firstLevelDepartment?: string;
/**
* 二级部门
*/
secondLevelDepartment?: string;
/**
* 三级部门
*/
thirdLevelDepartment?: string;
/**
* 部门ID
*/
deptId?: number;
/**
* 主岗位
*/
position?: string;
/**
* 姓名
*/
name?: string;
/**
* 手机号码
*/
phoneNumber?: string;
/**
* 劳动合同开始时间
*/
contractStartDate?: string;
/**
* 劳动合同截止时间
*/
contractEndDate?: string;
/**
* 合同形式
*/
contractForm?: string;
/**
* 备注
*/
remarks?: string;
}
}
/**
* 查询员工合同续签提醒列表
* @param params
* @returns {*} page
*/
export function apiPage(params: PageQuery) {
return requestClient.get('/employee/contractExpiration/page', { params });
}
// /**
// * 查询员工合同续签提醒详细
// * @param id
// */
// export function apiDetail(id: number) {
// return requestClient.get(`/employee/contractExpirationReminder/${id}`);
// }
// /**
// * 新增员工合同续签提醒
// * @param data
// */
// export function apiAdd(data: ContractExpirationReminderApi.ContractExpirationReminder) {
// return requestClient.post('/employee/contractExpirationReminder', data);
// }
// /**
// * 修改员工合同续签提醒
// * @param data
// */
// export function apiUpdate(data: ContractExpirationReminderApi.ContractExpirationReminder) {
// return requestClient.put('/employee/contractExpirationReminder', data);
// }
// /**
// * 删除员工合同续签提醒
// * @param id
// */
// export function apiDelete(id: Array<number> | number) {
// return requestClient.delete(`/employee/contractExpirationReminder/${id}`);
// }
/**
* 导出员工合同续签提醒
* @param params
*/
export function apiExport(params: PageQuery) {
return commonExport('/employee/contractExpiration/export', params);
}
...@@ -84,7 +84,22 @@ export function applyResign(data: EmployeeInfoApi.EmployeeResignApplyBo) { ...@@ -84,7 +84,22 @@ export function applyResign(data: EmployeeInfoApi.EmployeeResignApplyBo) {
export function applyTransfer(data: EmployeeInfoApi.EmployeeTransferApplyBo) { export function applyTransfer(data: EmployeeInfoApi.EmployeeTransferApplyBo) {
return requestClient.post('/employee/info/applyTransfer', data); return requestClient.post('/employee/info/applyTransfer', data);
} }
/**
* 申请员工入职
* @param data
*/
export function applyRegular(data: EmployeeInfoApi.EmployeeRegularApplyBo) {
return requestClient.post('/employee/info/applyRegular', data);
}
/**
* 申请员工入职
* @param data
*/
export function applyRenewalContract(
data: EmployeeInfoApi.EmployeeRenewalContractApplyBo,
) {
return requestClient.post('/employee/info/applyRenewalContract', data);
}
/** /**
* 下载用户导入模板 * 下载用户导入模板
* @returns blob * @returns blob
......
...@@ -439,6 +439,62 @@ export namespace EmployeeInfoApi { ...@@ -439,6 +439,62 @@ export namespace EmployeeInfoApi {
*/ */
finalPayDate?: Date; finalPayDate?: Date;
} }
export interface EmployeeRegularApplyBo extends EmployeeApplyBaseBo {
/**
* 劳动合同开始时间
*/
contractStartDate?: Date;
/**
* 劳动合同截止时间
*/
contractEndDate?: Date;
/**
* 劳动合同签订情况
*/
contractSigningStatus?: string;
/**
* 合同主体
*/
contractEntity?: string;
/**
* 社保主体
*/
socialSecurityEntity?: string;
/**
* 是否缴纳社保
*/
hasSocialSecurityPaid?: string;
/**
* 公积金主体
*/
providentFundEntity?: string;
/**
* 是否缴纳公积金
*/
hasProvidentFundPaid?: string;
/**
* 转正时间
*/
regularizationDate?: Date;
}
export interface EmployeeRenewalContractApplyBo extends EmployeeApplyBaseBo {
/**
* 劳动合同开始时间
*/
contractStartDate?: Date;
/**
* 劳动合同截止时间
*/
contractEndDate?: Date;
/**
* 合同形式
*/
contractForm?: string;
/**
* 劳动合同签订情况
*/
contractSigningStatus?: string;
}
} }
// export interface EmployeeResign extends EmployeeInfoApi.Employee { // export interface EmployeeResign extends EmployeeInfoApi.Employee {
......
import type { BaseModel, PageQuery } from '#/api/baseModel';
import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request';
export namespace EmployeeRegularReminderApi {
export interface EmployeeRegularReminder extends BaseModel {
/**
* 板块
*/
plate?: string;
/**
* 一级部门
*/
firstLevelDepartment?: string;
/**
* 二级部门
*/
secondLevelDepartment?: string;
/**
* 三级部门
*/
thirdLevelDepartment?: string;
/**
* 部门ID
*/
deptId?: number;
/**
* 主岗位
*/
position?: string;
/**
* 姓名
*/
name?: string;
/**
* 手机号码
*/
phoneNumber?: string;
/**
* 入职时间
*/
entryDate?: string;
/**
* 转正时间
*/
expectedRegularDate?: string;
/**
* 备注
*/
remarks?: string;
}
}
/**
* 查询转正提醒列表
* @param params
* @returns {*} page
*/
export function apiPage(params: PageQuery) {
return requestClient.get('/employee/regularReminder/page', { params });
}
// /**
// * 查询转正提醒详细
// * @param id
// */
// export function apiDetail(id: number) {
// return requestClient.get(`/employee/employeeRegularReminder/${id}`);
// }
// /**
// * 新增转正提醒
// * @param data
// */
// export function apiAdd(data: EmployeeRegularReminderApi.EmployeeRegularReminder) {
// return requestClient.post('/employee/employeeRegularReminder', data);
// }
// /**
// * 修改转正提醒
// * @param data
// */
// export function apiUpdate(data: EmployeeRegularReminderApi.EmployeeRegularReminder) {
// return requestClient.put('/employee/employeeRegularReminder', data);
// }
// /**
// * 删除转正提醒
// * @param id
// */
// export function apiDelete(id: Array<number> | number) {
// return requestClient.delete(`/employee/employeeRegularReminder/${id}`);
// }
/**
* 导出转正提醒
* @param params
*/
export function apiExport(params: PageQuery) {
return commonExport('/employee/regularReminder/export', params);
}
...@@ -48,6 +48,31 @@ const routes: RouteRecordRaw[] = [ ...@@ -48,6 +48,31 @@ const routes: RouteRecordRaw[] = [
componentPath: '#/views/hr/phoneBook/list.vue', componentPath: '#/views/hr/phoneBook/list.vue',
}, },
}, },
{
path: '/hr/regularReminder/list',
name: 'RegularReminderList',
component: () => import('#/views/hr/regularReminder/list.vue'),
meta: {
title: '转正提醒管理',
icon: 'solar:monitor-smartphone-outline',
keepAlive: true,
permission: ['dashboard'],
componentPath: '#/views/hr/regularReminder/list.vue',
},
},
{
path: '/hr/contractExpiration/list',
name: 'ContractExpirationReminder',
component: () =>
import('#/views/hr/contractExpirationReminder/list.vue'),
meta: {
title: '合同续约提醒',
icon: 'solar:monitor-smartphone-outline',
keepAlive: true,
permission: ['dashboard'],
componentPath: '#/views/hr/contractExpirationReminder/list.vue',
},
},
{ {
name: 'EmployeeFlowList', name: 'EmployeeFlowList',
path: '/hr/employee/flow', path: '/hr/employee/flow',
......
<script lang="ts" setup>
import type { VbenFormSchema } from '#/adapter/form';
import type { EmployeeInfoApi } from '#/api/hr/employeeModel';
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { getVxePopupContainer } from '@vben/utils';
import { useVbenForm } from '#/adapter/form';
import { applyRenewalContract } from '#/api/hr/employeeInfo';
import { getDictOptions } from '#/utils/dict';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
import { HrDictEnum } from '../dict-enum';
const emit = defineEmits<{
success: [];
}>();
const formData = ref<EmployeeInfoApi.EmployeeRenewalContractApplyBo>();
const formSchema: VbenFormSchema[] = [
{
label: '主键',
fieldName: 'id',
component: 'Input',
dependencies: {
show: () => false,
triggerFields: [''],
},
},
{
component: 'Input',
fieldName: 'name',
label: '姓名',
disabled: true,
},
{
component: 'RadioGroup',
componentProps: {
buttonStyle: 'solid',
optionType: 'button',
options: getDictOptions(HrDictEnum.HR_CONTRACT_FORM),
},
fieldName: 'contractForm',
label: '合同形式',
rules: 'required',
},
{
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractStartDate',
label: '合同开始时间',
rules: 'required',
},
{
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractEndDate',
label: '合同截止时间',
rules: 'required',
},
// {
// component: 'Input',
// fieldName: 'contractEntity',
// label: '合同主体',
// rules: 'required',
// },
{
component: 'Textarea',
// componentProps: {
// buttonStyle: 'solid',
// optionType: 'button',
// },
fieldName: 'contractSigningStatus',
label: '合同签订情况',
rules: 'required',
},
// {
// component: 'Input',
// fieldName: 'dictType',
// label: '字典类型',
// rules: 'required',
// },
// {
// component: 'Input',
// fieldName: 'description',
// label: '描述',
// rules: 'required',
// },
{
component: 'Textarea',
fieldName: 'remark',
label: '申请备注',
formItemClass: 'items-start',
},
];
const [BasicForm, formApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
formItemClass: 'col-span-2',
labelWidth: 100,
},
schema: formSchema,
showDefaultActions: false,
wrapperClass: 'grid-cols-2',
});
const { onBeforeClose, markInitialized, resetInitialized } = useBeforeCloseDiff(
{
initializedGetter: defaultFormValueGetter(formApi),
currentGetter: defaultFormValueGetter(formApi),
},
);
const [BasicModal, modalApi] = useVbenModal({
fullscreenButton: false,
onBeforeClose,
onClosed: handleClosed,
onConfirm: onSubmit,
onOpenChange: async (isOpen) => {
if (!isOpen) {
return null;
}
modalApi.modalLoading(true);
const data = modalApi.getData() as { id?: number; name?: string };
if (data) {
formData.value = data;
await formApi.setValues(formData.value);
}
await markInitialized();
modalApi.modalLoading(false);
},
});
async function onSubmit() {
const { valid } = await formApi.validate();
if (valid) {
modalApi.lock();
const data =
await formApi.getValues<EmployeeInfoApi.EmployeeRenewalContractApplyBo>();
try {
await applyRenewalContract(data);
resetInitialized();
emit('success');
modalApi.close();
} finally {
modalApi.unlock();
}
}
}
async function handleClosed() {
await formApi.resetForm();
resetInitialized();
}
// const getModalTitle = computed(() =>
// formData.value?.id ? '修改字典类型' : '新增字典类型',
// );
</script>
<template>
<BasicModal title="合同续约申请">
<BasicForm class="mx-4" />
</BasicModal>
</template>
import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { ContractExpirationReminderApi } from '#/api/hr/contractExpirationReminder';
import { getDictOptions } from '#/utils/dict';
import { HrDictEnum } from '../dict-enum';
export const querySchema: VbenFormSchema[] = [
{
component: 'Input',
fieldName: 'plate',
label: '板块',
},
{
component: 'Input',
fieldName: 'firstLevelDepartment',
label: '一级部门',
},
{
component: 'Input',
fieldName: 'secondLevelDepartment',
label: '二级部门',
},
{
component: 'Input',
fieldName: 'thirdLevelDepartment',
label: '三级部门',
},
// {
// component: 'Input',
// fieldName: 'deptId',
// label: '部门ID',
// },
{
component: 'Input',
fieldName: 'position',
label: '主岗位',
},
{
component: 'Input',
fieldName: 'name',
label: '姓名',
},
{
component: 'Input',
fieldName: 'phoneNumber',
label: '手机号码',
},
{
component: 'RangePicker',
fieldName: 'contractStartDate',
label: '合同开始时间',
},
{
component: 'RangePicker',
fieldName: 'contractEndDate',
label: '合同截止时间',
},
{
component: 'Select',
componentProps: {
options: getDictOptions(HrDictEnum.HR_CONTRACT_FORM),
},
fieldName: 'contractForm',
label: '合同形式',
},
// {
// component: 'Input',
// fieldName: 'remarks',
// label: '备注',
// },
];
export function useColumns(): VxeTableGridOptions<ContractExpirationReminderApi.ContractExpirationReminder>['columns'] {
return [
{
title: '板块',
field: 'plate',
},
{
title: '一级部门',
field: 'firstLevelDepartment',
},
{
title: '二级部门',
field: 'secondLevelDepartment',
},
{
title: '三级部门',
field: 'thirdLevelDepartment',
},
// {
// title: '部门ID',
// field: 'deptId',
// },
{
title: '主岗位',
field: 'position',
},
{
title: '姓名',
field: 'name',
},
{
title: '手机',
field: 'phoneNumber',
},
{
title: '劳动合同开始时间',
field: 'contractStartDate',
formatter: 'formatDate',
},
{
title: '劳动合同截止时间',
field: 'contractEndDate',
formatter: 'formatDate',
},
{
title: '合同形式',
field: 'contractForm',
},
{
title: '备注',
field: 'remarks',
},
{
align: 'right',
slots: { default: 'action' },
// cellRender: {
// attrs: {
// nameField: 'name',
// nameTitle: '员工合同续签提醒',
// onClick: onActionClick,
// },
// name: 'CellOperation',
// options: [
// {
// code: 'edit',
// accessCode: ['employee:contractExpirationReminder:edit'],
// }, // 默认的编辑按钮
// {
// code: 'delete',
// accessCode: ['employee:contractExpirationReminder:remove'],
// }, // 默认的删除按钮
// ],
// },
field: 'action',
fixed: 'right',
headerAlign: 'center',
resizable: false,
showOverflow: false,
title: '操作',
width: 'auto',
},
];
}
<script lang="ts" setup>
import type { VbenFormProps } from '@vben/common-ui';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { ContractExpirationReminderApi } from '#/api/hr/contractExpirationReminder';
import { Page, useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { Button, Space } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { apiExport, apiPage } from '#/api/hr/contractExpirationReminder';
import { GhostButton } from '#/components/global/button';
import { commonDownloadExcel } from '#/utils/file/download';
import employeeDetailDrawer from '../employeeInfo/employee-detail-drawer.vue';
import applyRenewalContractModel from './apply-renewal_contract-model.vue';
import { querySchema, useColumns } from './data';
// import Form from './form.vue';
const formOptions: VbenFormProps = {
commonConfig: {
labelWidth: 80,
componentProps: {
allowClear: true,
},
},
schema: querySchema,
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
// 日期选择格式化
fieldMappingTime: [
[
'contractStartDate',
['params[contractStartBeginTime]', 'params[contractStartEndTime]'],
['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59'],
],
[
'contractEndDate',
['params[contractEndBeginTime]', 'params[contractEndEndTime]'],
['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59'],
],
],
};
const [EmployeeDetailDrawer, employeeDetailDrawerApi] = useVbenDrawer({
connectedComponent: employeeDetailDrawer,
});
const [ApplyRenewalContractModel, applyRenewalContractModelApi] = useVbenModal({
connectedComponent: applyRenewalContractModel,
});
const [Grid, gridApi] = useVbenVxeGrid({
formOptions,
gridOptions: {
columns: useColumns(),
height: 'auto',
keepSource: true,
pagerConfig: {
enabled: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
return await apiPage({
pageNo: page.currentPage,
pageSize: page.pageSize,
...formValues,
});
},
},
},
rowConfig: {
keyField: 'id',
// 高亮当前行
isCurrent: true,
},
} as VxeTableGridOptions,
});
// function onActionClick({ code, row }: OnActionClickParams<ContractExpirationReminderApi.ContractExpirationReminder>) {
// switch (code) {
// case 'delete': {
// onDelete(row);
// break;
// }
// case 'edit': {
// onEdit(row);
// break;
// }
// default: {
// break;
// }
// }
// }
// function onRefresh() {
// gridApi.query();
// }
function onEdit(row: ContractExpirationReminderApi.ContractExpirationReminder) {
employeeDetailDrawerApi.setData({ id: row.id }).open();
}
function onApplyRenewalContract(
row: ContractExpirationReminderApi.ContractExpirationReminder,
) {
applyRenewalContractModelApi.setData({ id: row.id, name: row.name }).open();
}
// function onCreate() {
// formDrawerApi.setData({}).open();
// }
// function onDelete(row: ContractExpirationReminderApi.ContractExpirationReminder) {
// const hideLoading = message.loading({
// content: `正在删除${row.name}...`,
// duration: 0,
// key: 'action_process_msg',
// });
// apiDelete(row.id || 0)
// .then(() => {
// message.success({
// content: `${row.name}删除成功`,
// key: 'action_process_msg',
// });
// onRefresh();
// })
// .catch(() => {
// hideLoading();
// });
// }
function handleDownloadExcel() {
commonDownloadExcel(
apiExport,
'员工合同续签提醒',
gridApi.formApi.form.values,
);
}
</script>
<template>
<Page auto-content-height>
<EmployeeDetailDrawer />
<Grid table-title="员工合同续签提醒列表">
<template #toolbar-tools>
<Space>
<Button
v-access:code="['employee:contractExpiration:export']"
@click="handleDownloadExcel"
>
导出
</Button>
<!-- <Button
v-access:code="['employee:contractExpirationReminder:add']"
type="primary"
@click="onCreate"
>
<Plus class="size-5" />
新增
</Button> -->
</Space>
</template>
<template #action="{ row }">
<!-- 租户管理员不可修改admin角色 防止误操作 -->
<!-- 超级管理员可通过租户切换来操作租户管理员角色 -->
<!-- -->
<!-- <template
v-if="!row.superAdmin && (row.roleKey !== 'admin' || isSuperAdmin)"
> -->
<Space>
<GhostButton
v-access:code="['employee:contractExpiration:query']"
@click.stop="onEdit(row)"
>
查看
</GhostButton>
<GhostButton
danger
v-access:code="['employee:info:contractRenewal']"
@click.stop="onApplyRenewalContract(row)"
>
申请合同续约
</GhostButton>
</Space>
<!-- </template> -->
</template>
</Grid>
<ApplyRenewalContractModel />
</Page>
</template>
...@@ -9,8 +9,11 @@ import { getVxePopupContainer } from '@vben/utils'; ...@@ -9,8 +9,11 @@ import { getVxePopupContainer } from '@vben/utils';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { applyResign } from '#/api/hr/employeeInfo'; import { applyResign } from '#/api/hr/employeeInfo';
import { getDictOptions } from '#/utils/dict';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
import { HrDictEnum } from '../dict-enum';
const emit = defineEmits<{ const emit = defineEmits<{
success: []; success: [];
}>(); }>();
...@@ -32,6 +35,17 @@ const formSchema: VbenFormSchema[] = [ ...@@ -32,6 +35,17 @@ const formSchema: VbenFormSchema[] = [
label: '姓名', label: '姓名',
disabled: true, disabled: true,
}, },
{
component: 'RadioGroup',
componentProps: {
buttonStyle: 'solid',
optionType: 'button',
options: getDictOptions(HrDictEnum.HR_RESIGNATION_TYPE),
},
fieldName: 'resignationType',
label: '离职类型',
rules: 'required',
},
{ {
component: 'DatePicker', component: 'DatePicker',
componentProps: { componentProps: {
......
data:image/png;base64,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
...@@ -826,7 +826,7 @@ async function onSubmit() { ...@@ -826,7 +826,7 @@ async function onSubmit() {
if (valid) { if (valid) {
drawerApi.lock(); drawerApi.lock();
const data = await formApi.getValues<EmployeeInfoApi.Employee>(); const data = await formApi.getValues<EmployeeInfoApi.Employee>();
console.log('[data]', data); // console.log('[data]', data);
try { try {
await (formData.value?.id await (formData.value?.id
? apiUpdate({ id: formData.value.id, ...data }) ? apiUpdate({ id: formData.value.id, ...data })
......
<script lang="ts" setup>
import type { VbenFormSchema } from '#/adapter/form';
import type { EmployeeInfoApi } from '#/api/hr/employeeModel';
import { ref } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { DictEnum } from '@vben/constants';
import { getVxePopupContainer } from '@vben/utils';
import { useVbenForm } from '#/adapter/form';
import { applyRegular } from '#/api/hr/employeeInfo';
import { getDictOptions } from '#/utils/dict';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
const emit = defineEmits<{
success: [];
}>();
const formData = ref<EmployeeInfoApi.EmployeeRegularApplyBo>();
const formSchema: VbenFormSchema[] = [
{
label: '主键',
fieldName: 'id',
component: 'Input',
dependencies: {
show: () => false,
triggerFields: [''],
},
},
{
component: 'Input',
fieldName: 'name',
label: '姓名',
disabled: true,
},
{
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractStartDate',
label: '合同开始时间',
rules: 'required',
},
{
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'contractEndDate',
label: '合同截止时间',
rules: 'required',
},
{
component: 'Input',
fieldName: 'contractEntity',
label: '合同主体',
rules: 'required',
},
{
component: 'Input',
// componentProps: {
// buttonStyle: 'solid',
// optionType: 'button',
// },
fieldName: 'contractSigningStatus',
label: '合同签订情况',
rules: 'required',
},
{
component: 'DatePicker',
componentProps: {
format: 'YYYY-MM-DD',
valueFormat: 'YYYY-MM-DD',
getVxePopupContainer,
},
fieldName: 'regularizationDate',
label: '转正时间',
rules: 'required',
},
{
component: 'Input',
fieldName: 'socialSecurityEntity',
label: '社保主体',
// rules: 'required',
},
{
component: 'RadioGroup',
componentProps: {
buttonStyle: 'solid',
optionType: 'button',
options: getDictOptions(DictEnum.SYS_YES_NO),
},
fieldName: 'hasSocialSecurityPaid',
label: '是否缴纳社保',
// rules: 'required',
},
{
component: 'Input',
fieldName: 'providentFundEntity',
label: '公积金主体',
// rules: 'required',
},
{
component: 'RadioGroup',
componentProps: {
buttonStyle: 'solid',
optionType: 'button',
options: getDictOptions(DictEnum.SYS_YES_NO),
},
fieldName: 'hasProvidentFundPaid',
label: '是否缴纳公积金',
// rules: 'required',
},
// {
// component: 'Input',
// fieldName: 'dictType',
// label: '字典类型',
// rules: 'required',
// },
// {
// component: 'Input',
// fieldName: 'description',
// label: '描述',
// rules: 'required',
// },
{
component: 'Textarea',
fieldName: 'remark',
label: '申请备注',
formItemClass: 'items-start',
},
];
const [BasicForm, formApi] = useVbenForm({
commonConfig: {
componentProps: {
class: 'w-full',
},
formItemClass: 'col-span-2',
labelWidth: 100,
},
schema: formSchema,
showDefaultActions: false,
wrapperClass: 'grid-cols-2',
});
const { onBeforeClose, markInitialized, resetInitialized } = useBeforeCloseDiff(
{
initializedGetter: defaultFormValueGetter(formApi),
currentGetter: defaultFormValueGetter(formApi),
},
);
const [BasicModal, modalApi] = useVbenModal({
fullscreenButton: false,
onBeforeClose,
onClosed: handleClosed,
onConfirm: onSubmit,
onOpenChange: async (isOpen) => {
if (!isOpen) {
return null;
}
modalApi.modalLoading(true);
const data = modalApi.getData() as { id?: number; name?: string };
if (data) {
formData.value = data;
await formApi.setValues(formData.value);
}
await markInitialized();
modalApi.modalLoading(false);
},
});
async function onSubmit() {
const { valid } = await formApi.validate();
if (valid) {
modalApi.lock();
const data =
await formApi.getValues<EmployeeInfoApi.EmployeeRegularApplyBo>();
try {
await applyRegular(data);
resetInitialized();
emit('success');
modalApi.close();
} finally {
modalApi.unlock();
}
}
}
async function handleClosed() {
await formApi.resetForm();
resetInitialized();
}
// const getModalTitle = computed(() =>
// formData.value?.id ? '修改字典类型' : '新增字典类型',
// );
</script>
<template>
<BasicModal title="转正申请">
<BasicForm class="mx-4" />
</BasicModal>
</template>
import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { EmployeeRegularReminderApi } from '#/api/hr/regularReminder';
export const querySchema: VbenFormSchema[] = [
{
component: 'Input',
fieldName: 'plate',
label: '板块',
},
{
component: 'Input',
fieldName: 'firstLevelDepartment',
label: '一级部门',
},
{
component: 'Input',
fieldName: 'secondLevelDepartment',
label: '二级部门',
},
{
component: 'Input',
fieldName: 'thirdLevelDepartment',
label: '三级部门',
},
// {
// component: 'Input',
// fieldName: 'deptId',
// label: '部门ID',
// },
{
component: 'Input',
fieldName: 'position',
label: '主岗位',
},
{
component: 'Input',
fieldName: 'name',
label: '姓名',
},
{
component: 'Input',
fieldName: 'phoneNumber',
label: '手机号码',
},
{
component: 'RangePicker',
fieldName: 'entryDate',
label: '入职时间',
},
{
component: 'RangePicker',
fieldName: 'expectedRegularDate',
label: '转正时间',
},
];
export function useColumns(): VxeTableGridOptions<EmployeeRegularReminderApi.EmployeeRegularReminder>['columns'] {
return [
{
title: '板块',
field: 'plate',
},
{
title: '一级部门',
field: 'firstLevelDepartment',
},
{
title: '二级部门',
field: 'secondLevelDepartment',
},
{
title: '三级部门',
field: 'thirdLevelDepartment',
},
// {
// title: '部门ID',
// field: 'deptId',
// },
{
title: '主岗位',
field: 'position',
},
{
title: '姓名',
field: 'name',
},
{
title: '手机号码',
field: 'phoneNumber',
},
{
title: '入职时间',
field: 'entryDate',
formatter: 'formatDate',
},
{
title: '转正时间',
field: 'expectedRegularDate',
formatter: 'formatDate',
},
{
title: '备注',
field: 'remarks',
},
{
align: 'right',
slots: { default: 'action' },
// cellRender: {
// attrs: {
// nameField: 'name',
// nameTitle: '转正提醒',
// onClick: onActionClick,
// },
// name: 'CellOperation',
// options: [
// {
// code: 'edit',
// accessCode: ['employee:employeeRegularReminder:edit'],
// }, // 默认的编辑按钮
// {
// code: 'delete',
// accessCode: ['employee:employeeRegularReminder:remove'],
// }, // 默认的删除按钮
// ],
// },
field: 'action',
fixed: 'right',
headerAlign: 'center',
resizable: false,
showOverflow: false,
title: '操作',
width: 'auto',
},
];
}
<script lang="ts" setup>
import type { VbenFormProps } from '@vben/common-ui';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { EmployeeRegularReminderApi } from '#/api/hr/regularReminder';
import { Page, useVbenDrawer, useVbenModal } from '@vben/common-ui';
import { Button, Space } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { apiExport, apiPage } from '#/api/hr/regularReminder';
import { GhostButton } from '#/components/global/button';
import { commonDownloadExcel } from '#/utils/file/download';
import employeeDetailDrawer from '../employeeInfo/employee-detail-drawer.vue';
import applyRegularModel from './apply-regular-model.vue';
import { querySchema, useColumns } from './data';
// import Form from './form.vue';
const formOptions: VbenFormProps = {
commonConfig: {
labelWidth: 80,
componentProps: {
allowClear: true,
},
},
schema: querySchema,
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',
// 日期选择格式化
fieldMappingTime: [
[
'entryDate',
['params[entryBeginTime]', 'params[entryEndTime]'],
['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59'],
],
[
'expectedRegularDate',
['params[expectedRegularBeginTime]', 'params[expectedRegularEndTime]'],
['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59'],
],
],
};
const [EmployeeDetailDrawer, employeeDetailDrawerApi] = useVbenDrawer({
connectedComponent: employeeDetailDrawer,
});
const [ApplyRegularModel, applyRegularModelApi] = useVbenModal({
connectedComponent: applyRegularModel,
});
const [Grid, gridApi] = useVbenVxeGrid({
formOptions,
gridOptions: {
columns: useColumns(),
height: 'auto',
keepSource: true,
pagerConfig: {
enabled: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues = {}) => {
return await apiPage({
pageNo: page.currentPage,
pageSize: page.pageSize,
...formValues,
});
},
},
},
rowConfig: {
keyField: 'id',
// 高亮当前行
isCurrent: true,
},
} as VxeTableGridOptions,
});
// function onActionClick({ code, row }: OnActionClickParams<EmployeeRegularReminderApi.EmployeeRegularReminder>) {
// switch (code) {
// case 'delete': {
// onDelete(row);
// break;
// }
// case 'edit': {
// onEdit(row);
// break;
// }
// default: {
// break;
// }
// }
// }
// function onRefresh() {
// gridApi.query();
// }
function onEdit(row: EmployeeRegularReminderApi.EmployeeRegularReminder) {
employeeDetailDrawerApi.setData({ id: row.id }).open();
}
function onApplyRegular(
row: EmployeeRegularReminderApi.EmployeeRegularReminder,
) {
applyRegularModelApi.setData({ id: row.id, name: row.name }).open();
}
// function onCreate() {
// formDrawerApi.setData({}).open();
// }
// function onDelete(row: EmployeeRegularReminderApi.EmployeeRegularReminder) {
// const hideLoading = message.loading({
// content: `正在删除${row.name}...`,
// duration: 0,
// key: 'action_process_msg',
// });
// apiDelete(row.id || 0)
// .then(() => {
// message.success({
// content: `${row.name}删除成功`,
// key: 'action_process_msg',
// });
// onRefresh();
// })
// .catch(() => {
// hideLoading();
// });
// }
function handleDownloadExcel() {
commonDownloadExcel(apiExport, '转正提醒', gridApi.formApi.form.values);
}
</script>
<template>
<Page auto-content-height>
<EmployeeDetailDrawer />
<Grid table-title="转正提醒列表">
<template #toolbar-tools>
<Space>
<Button
v-access:code="['employee:regularReminder:export']"
@click="handleDownloadExcel"
>
导出
</Button>
<!-- <Button
v-access:code="['employee:employeeRegularReminder:add']"
type="primary"
@click="onCreate"
>
<Plus class="size-5" />
新增
</Button> -->
</Space>
</template>
<template #action="{ row }">
<!-- 租户管理员不可修改admin角色 防止误操作 -->
<!-- 超级管理员可通过租户切换来操作租户管理员角色 -->
<!-- -->
<!-- <template
v-if="!row.superAdmin && (row.roleKey !== 'admin' || isSuperAdmin)"
> -->
<Space>
<GhostButton
v-access:code="['employee:regularReminder:query']"
@click.stop="onEdit(row)"
>
查看
</GhostButton>
<GhostButton
danger
v-access:code="['employee:info:regular']"
@click.stop="onApplyRegular(row)"
>
申请转正
</GhostButton>
</Space>
<!-- </template> -->
</template>
</Grid>
<ApplyRegularModel />
</Page>
</template>
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