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