From 8cef2483dcfc4c40d861caaf58d618387f5ab80c Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期四, 13 十一月 2025 13:11:36 +0800
Subject: [PATCH] feat: 1.3.0.2
---
src/views/FlexJobManage/FlexJobManage.vue | 402 +++++++++++++++++++++++++++++++++++---------------------
1 files changed, 250 insertions(+), 152 deletions(-)
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
index b4522c1..0766984 100644
--- a/src/views/FlexJobManage/FlexJobManage.vue
+++ b/src/views/FlexJobManage/FlexJobManage.vue
@@ -3,7 +3,7 @@
<AppContainer>
<ProTableQueryFilterBar @on-reset="reset">
<template #query>
- <QueryFilterItem tip-content="褰曠敤鐘舵��">
+ <!-- <QueryFilterItem tip-content="褰曠敤鐘舵��">
<FieldRadio
v-model="extraParamState.hireStatus"
:value-enum="EnumTaskUserHireStatusText"
@@ -11,7 +11,7 @@
showAllBtn
@change="getList()"
/>
- </QueryFilterItem>
+ </QueryFilterItem> -->
<QueryFilterItem tip-content="瀹炲悕鐘舵��">
<FieldRadio
v-model="extraParamState.isReal"
@@ -19,6 +19,16 @@
{ label: '宸插疄鍚�', value: true },
{ label: '鏈疄鍚�', value: false },
]"
+ buttonStyle
+ showAllBtn
+ :all-btn-value="null"
+ @change="getList()"
+ />
+ </QueryFilterItem>
+ <QueryFilterItem tip-content="鐏靛伐鏉ユ簮">
+ <FieldRadio
+ v-model="extraParamState.isReal"
+ :value-enum="[]"
buttonStyle
showAllBtn
:all-btn-value="null"
@@ -43,7 +53,7 @@
@change="getList()"
/>
</QueryFilterItem>
- <QueryFilterItem>
+ <!-- <QueryFilterItem>
<FieldDatePicker
v-model="extraParamState.createdTime"
type="daterange"
@@ -66,12 +76,24 @@
@change="getList()"
tooltipContent="绛剧害鏃堕棿"
></FieldDatePicker>
+ </QueryFilterItem> -->
+ <QueryFilterItem>
+ <FieldDatePicker
+ v-model="extraParamState.createdTime"
+ type="daterange"
+ range-separator="~"
+ start-placeholder="璧峰鏃ユ湡"
+ end-placeholder="鎴鏃ユ湡"
+ clearable
+ @change="getList()"
+ tooltipContent="瀹炲悕鏃堕棿"
+ ></FieldDatePicker>
</QueryFilterItem>
<QueryFilterItem>
<SearchInput
v-model="extraParamState.searchWord"
style="width: 300px"
- placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛"
+ placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿"
@on-click-search="getList"
@keyup.enter="getList()"
>
@@ -79,17 +101,62 @@
</QueryFilterItem>
</template>
<template #btn>
- <el-button @click="handleDownloadTemplate()" type="primary" link>妯℃澘涓嬭浇</el-button>
- <el-button @click="handleBatchImportAdd()" type="primary">鎵归噺瀵煎叆</el-button>
- <el-button @click="handleBatchUnSign()" type="primary">鎵归噺瑙g害</el-button>
- <el-button @click="handleSendShotMessage()" type="primary">鐭俊鍙戦��</el-button>
- <el-button @click="handleBatchSign()" type="primary">鎵归噺绛剧害</el-button>
- <el-button @click="handleEnterpriseBatchSign()" type="primary">鎵归噺浼佷笟绛剧害</el-button>
+ <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'importBtn')"
+ @click="handleDownloadFlexJobTemplate()"
+ type="primary"
+ link
+ >妯℃澘涓嬭浇</el-button
+ >
+ <BlFileUpload
+ v-if="checkSubModuleItemShow('pageButton', 'importBtn')"
+ v-model:file-url="state.flexjobUrl"
+ ref="uploadRef"
+ :showTip="false"
+ :show-file-list="false"
+ class="pro-table-operation-btn upload-style-btn"
+ :on-success="(event) => handleUploadSuccess(event)"
+ :limitFileSize="null"
+ :limit="1"
+ accept="xlsx,xls"
+ >
+ <el-button type="primary" class="pro-table-operation-btn">鎵归噺瀵煎叆</el-button>
+ </BlFileUpload>
+ <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'addBtn')"
+ @click="handleInternalStaffAdd()"
+ type="primary"
+ >鏂板缓</el-button
+ >
+ <!-- <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'batchUnSignBtn')"
+ @click="handleBatchUnSign()"
+ type="primary"
+ >鎵归噺瑙g害</el-button
+ >
+ <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'sendShotBtn')"
+ @click="handleSendShotMessage()"
+ type="primary"
+ >鐭俊鍙戦��</el-button
+ >
+ <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'batchSignBtn')"
+ @click="handleBatchSign()"
+ type="primary"
+ >鎵归噺绛剧害</el-button
+ >
+ <el-button
+ v-if="checkSubModuleItemShow('pageButton', 'enterpriseBatchSignBtn')"
+ @click="handleEnterpriseBatchSign()"
+ type="primary"
+ >鎵归噺浼佷笟绛剧害</el-button
+ > -->
</template>
</ProTableQueryFilterBar>
<ProTableV2
v-bind="proTableProps"
- :columns="FlexJobManageColumns"
+ :columns="column"
:operationBtns="operationBtns"
show-column-check
ref="proTable"
@@ -107,6 +174,7 @@
/>
<SendShotMessageDialog v-bind="dialogShotMessageProps" />
<SignDialog v-bind="dialogSignProps" />
+ <AddInternalStaffDialog v-bind="dialogAddInternalStaffProps" />
</LoadingLayout>
</template>
@@ -123,12 +191,11 @@
FieldDatePicker,
FieldRadio,
FieldSelect,
- defineOperationBtns,
useFormDialog,
UploadUserFile,
XLSXUtils,
+ BlFileUpload,
} from '@bole-core/components';
-import { FlexJobManageColumns } from './constants';
import { EnumTaskUserHireStatusText, EnumTaskUserSignContractStatusText } from '@/constants';
import { Message } from '@bole-core/core';
import { convertApi2FormUrlOnlyOne, downloadFileByUrl, format } from '@/utils';
@@ -136,99 +203,80 @@
import BatchImportDialog from './components/BatchImportDialog.vue';
import SendShotMessageDialog from './components/SendShotMessageDialog.vue';
import StaffDetailInfoDialog from './components/StaffDetailInfoDialog.vue';
+import AddInternalStaffDialog from './components/AddInternalStaffDialog.vue';
import SignDialog from './components/SignDialog.vue';
import * as enterpriseEmployeeServices from '@/services/api/enterpriseEmployee';
import { ModelValueType } from 'element-plus';
import _ from 'lodash';
+import { getEnterpriseEmployeesHooks } from './hooks';
defineOptions({
name: 'FlexJobManageList',
});
-const operationBtns = defineOperationBtns([
- {
- data: {
- enCode: 'editBtn',
- name: '缂栬緫',
- },
+const operationBtnMap: Record<string, OperationBtnType> = {
+ editBtn: {
emits: {
- onClick: (role) => openDialog(role),
+ onClick: (role) => openInternalDialog(role),
+ },
+ extraProps: {
+ hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
+ row.source === EnumEnterpriseEmployeeSource.External,
},
},
- {
- data: {
- enCode: 'detailBtn',
- name: '璇︽儏',
- },
+ detailBtn: {
emits: {
onClick: (role: API.GetEnterpriseEmployeesQueryResultItem) =>
handleStaffDetailEdit({ id: role.id, tabType: 'info' }),
},
},
- {
- data: {
- enCode: 'enterpriseSignBtn',
- name: '浼佷笟绛剧害',
- },
- emits: {
- onClick: (role) => handleEnterpriseSign(role),
- },
- extraProps: {
- hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
- !(
- row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
- row.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Wait
- ),
- },
- },
- {
- data: {
- enCode: 'inviteSignBtn',
- name: '閭�璇风绾�',
- },
- emits: {
- onClick: (role) => handleInviteSign(role),
- },
- extraProps: {
- hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
- !(
- row.userSignContractStatus !== EnumTaskUserSignContractStatus.Pass &&
- row.hireStatus === EnumTaskUserHireStatus.Pass
- ),
- },
- },
- {
- data: {
- enCode: 'unSignBtn',
- name: '瑙g害',
- },
- emits: {
- onClick: (role) => handleUnSign(role),
- },
- extraProps: {
- hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
- !(
- row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
- row.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Pass
- ),
- },
- },
- // {
- // data: {
- // enCode: 'delBtn',
- // name: '鍒犻櫎',
- // },
- // props: { type: 'danger' },
+ // enterpriseSignBtn: {
// emits: {
- // onClick: (role) => handleDelete(role),
+ // onClick: (role) => handleEnterpriseSign(role),
+ // },
+ // extraProps: {
+ // hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
+ // !(
+ // row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
+ // row.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Wait
+ // ),
// },
// },
-]);
+ // inviteSignBtn: {
+ // emits: {
+ // onClick: (role) => handleInviteSign(role),
+ // },
+ // extraProps: {
+ // hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
+ // !(
+ // row.userSignContractStatus !== EnumTaskUserSignContractStatus.Pass &&
+ // row.hireStatus === EnumTaskUserHireStatus.Pass
+ // ),
+ // },
+ // },
+ // unSignBtn: {
+ // emits: {
+ // onClick: (role) => handleUnSign(role),
+ // },
+ // extraProps: {
+ // hide: (row: API.GetEnterpriseEmployeesQueryResultItem) =>
+ // !(
+ // row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
+ // row.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Pass
+ // ),
+ // },
+ // },
+};
+
+const { checkSubModuleItemShow, column, operationBtns } = useAccess({
+ operationBtnMap,
+});
const router = useRouter();
const BaseState = {
loading: true,
+ flexjobUrl: [] as UploadUserFile[],
};
const state = reactive({ ...BaseState });
@@ -238,75 +286,8 @@
state.loading = false;
});
-const {
- getDataSource: getList,
- proTableProps,
- paginationState,
- extraParamState,
- reset,
-} = useTable(
- async ({ pageIndex, pageSize }, extraParamState) => {
- try {
- let params: API.GetEnterpriseEmployeesQuery = {
- pageModel: {
- rows: pageSize,
- page: pageIndex,
- orderInput: extraParamState.orderInput,
- },
- keywords: extraParamState.searchWord,
- createdTimeStart: format(extraParamState.createdTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
- createdTimeEnd: format(extraParamState.createdTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
- signContractTimeStart: format(
- extraParamState.signContractTime?.[0] ?? '',
- 'YYYY-MM-DD 00:00:00'
- ),
- signContractTimeEnd: format(
- extraParamState.signContractTime?.[1] ?? '',
- 'YYYY-MM-DD 23:59:59'
- ),
- hireStatus: extraParamState.hireStatus,
- isReal: extraParamState.isReal,
- userSignContractStatus: extraParamState.userSignContractStatus,
- enterpriseSignContractStatus: extraParamState.enterpriseSignContractStatus,
- };
-
- let res = await enterpriseEmployeeServices.getEnterpriseEmployees(params, {
- showLoading: !state.loading,
- });
- return res;
- } catch (error) {
- console.log('error: ', error);
- }
- },
- {
- defaultExtraParams: {
- searchWord: '',
- orderInput: [{ property: 'createdTime', order: EnumPagedListOrder.Desc }],
- createdTime: [] as unknown as ModelValueType,
- signContractTime: [] as unknown as ModelValueType,
- hireStatus: '' as any as EnumTaskUserHireStatus,
- isReal: null as any as boolean,
- userSignContractStatus: '' as any as EnumTaskUserSignContractStatus,
- enterpriseSignContractStatus: '' as any as EnumTaskUserSignContractStatus,
- },
- queryKey: ['enterpriseEmployeeServices/getEnterpriseEmployees'],
- columnsRenderProps: {
- gender: { type: 'enum', valueEnum: EnumUserGenderTextForPerson },
- hireStatus: { type: 'enum', valueEnum: EnumTaskUserHireStatusText },
- userIsReal: {
- formatter: (row: API.GetEnterpriseEmployeesQueryResultItem) => {
- return row.userIsReal ? '宸插疄鍚�' : '鏈疄鍚�';
- },
- },
- userSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
- hireTime: { type: 'date' },
- userRealTime: { type: 'date' },
- userSignContractTime: { type: 'date' },
- enterpriseSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
- enterpriseSignContractTime: { type: 'date' },
- },
- }
-);
+const { getList, proTableProps, paginationState, extraParamState, reset } =
+ getEnterpriseEmployeesHooks();
const proTable = ref<InstanceType<typeof ProTableV2>>();
@@ -326,9 +307,10 @@
const {
dialogProps: dialogStaffInfoProps,
handleEdit: handleStaffInfoEdit,
+ handleAdd: handleStaffInfoAdd,
editForm: staffInfoEditForm,
} = useFormDialog({
- onConfirm: handleAddOrEdit,
+ onConfirm: editEnterpriseEmployee,
defaultFormParams: {
id: '',
name: '',
@@ -369,7 +351,7 @@
} catch (error) {}
}
-async function handleAddOrEdit() {
+async function editEnterpriseEmployee() {
try {
let params: API.EditEnterpriseEmployeeCommand = {
name: staffInfoEditForm.name,
@@ -471,6 +453,10 @@
function handleDownloadTemplate() {
downloadFileByUrl(ImportEnterpriseEmployeesTempPath, '鎵归噺瀵煎叆妯℃澘');
+}
+
+function handleDownloadFlexJobTemplate() {
+ downloadFileByUrl(ImportFlexJobTempPath, '鎵归噺瀵煎叆妯℃澘');
}
const {
@@ -635,4 +621,116 @@
await Message.deleteMessage();
} catch (error) {}
}
+
+function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
+ if (response.path) {
+ importEnterpriseEmployees(response.path);
+ }
+}
+
+async function importEnterpriseEmployees(excelUrl: string) {
+ try {
+ let params: API.ImportEnterpriseEmployeesCommand = {
+ excelUrl: excelUrl,
+ };
+ let res = await enterpriseEmployeeServices.importEnterpriseEmployees(params);
+ if (res.failCount > 0) {
+ await Message.tipMessage('瀛樺湪閿欒鏁版嵁锛屾槸鍚﹀鍑猴紵');
+ XLSXUtils.exportToXLSX({
+ workbookDataList: res.errors,
+ fileName: '鐏靛伐鎵归噺瀵煎叆-閿欒鏁版嵁',
+ workbookHeaderMap: {
+ name: '濮撳悕',
+ contactPhoneNumber: '鎵嬫満鍙�',
+ identity: '韬唤璇佸彿',
+ contractBegin: '鍗忚璧峰鏃堕棿',
+ contractEnd: '鍗忚缁堟鏃堕棿',
+ errorMessage: '閿欒淇℃伅',
+ },
+ });
+ } else {
+ Message.successMessage('瀵煎叆鎴愬姛');
+ getList();
+ }
+ } catch (error) {
+ } finally {
+ state.flexjobUrl = [] as UploadUserFile[];
+ }
+}
+
+const {
+ dialogProps: dialogAddInternalStaffProps,
+ handleAdd: handleInternalStaffAdd,
+ handleEdit: handleInternalStaffEdit,
+ editForm: internalStaffEditForm,
+} = useFormDialog({
+ onConfirm: addEnterpriseEmployee,
+ defaultFormParams: {
+ id: '',
+ name: '',
+ identity: '',
+ contactPhoneNumber: '',
+ gender: EnumUserGender.Male,
+ age: null as any as number,
+ identityImg: [] as UploadUserFile[],
+ identityBackImg: [] as UploadUserFile[],
+ contractUrl: [] as UploadUserFile[],
+ regiterTime: '',
+ userRealTime: '',
+ userSignContractTime: '',
+ contractTime: [] as unknown as ModelValueType,
+ },
+});
+
+async function openInternalDialog(row: API.GetEnterpriseEmployeesQueryResultItem) {
+ try {
+ let detail = await enterpriseEmployeeServices.getEnterpriseEmployee({ id: row.id });
+ handleInternalStaffEdit({
+ id: row.id,
+ name: row.name,
+ identity: row.identity,
+ contactPhoneNumber: row.contactPhoneNumber,
+ gender: detail.gender,
+ age: detail.age ?? null,
+ identityImg: convertApi2FormUrlOnlyOne(detail.identityImg),
+ identityBackImg: convertApi2FormUrlOnlyOne(detail.identityBackImg),
+ contractUrl: convertApi2FormUrlOnlyOne(detail.contractUrl, {
+ fileName: detail.contractUrl ? detail.contractUrl.split('/').pop() : '鍚堝悓',
+ }),
+ regiterTime: detail.applyTime ?? '',
+ userRealTime: row.userRealTime ?? '',
+ userSignContractTime: row.userSignContractTime ?? '',
+ contractTime: [row.contractBegin, row.contractEnd],
+ });
+ } catch (error) {}
+}
+
+async function addEnterpriseEmployee() {
+ try {
+ const isEdit = !!internalStaffEditForm.id;
+ let params: API.AddEnterpriseEmployeeCommand = {
+ name: internalStaffEditForm.name,
+ identity: internalStaffEditForm.identity,
+ contactPhoneNumber: internalStaffEditForm.contactPhoneNumber,
+ gender: internalStaffEditForm.gender,
+ age: internalStaffEditForm.age,
+ identityImg: internalStaffEditForm.identityImg[0]?.path ?? '',
+ identityBackImg: internalStaffEditForm.identityBackImg[0]?.path ?? '',
+ contractUrl: internalStaffEditForm.contractUrl[0]?.path ?? '',
+ contractBegin: format(internalStaffEditForm.contractTime[0], 'YYYY-MM-DD 00:00:00'),
+ contractEnd: format(internalStaffEditForm.contractTime[1], 'YYYY-MM-DD 23:59:59'),
+ };
+ let res;
+ if (isEdit) {
+ (params as API.EditEnterpriseEmployeeCommand).id = internalStaffEditForm.id;
+ res = await enterpriseEmployeeServices.editEnterpriseEmployee(params);
+ } else {
+ res = await enterpriseEmployeeServices.addEnterpriseEmployee(params);
+ }
+ if (res) {
+ Message.successMessage('鎿嶄綔鎴愬姛');
+ getList(paginationState.pageIndex);
+ }
+ } catch (error) {}
+}
</script>
--
Gitblit v1.9.1