From 8550c7090368487be0a9f13ff5ff955b1ae9d028 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 11 十一月 2025 16:45:11 +0800
Subject: [PATCH] Merge branch 'dev-1.3.0.2' of http://120.26.58.240:8888/r/flexJobUndertake into dev-1.3.0.2

---
 src/views/EmploymentManage/EmploymentSignList.vue      |   52 +-
 src/views/FlexJobManage/FlexJobManage.vue              |   31 +
 src/views/FlexJobManage/constants/columns.ts           |   96 +++++
 src/views/FlexJobManage/FlexJobContractManage.vue      |  618 ++++++++++++++++++++++++++++++++++++++
 src/views/FlexJobManage/components/StaffInfoDialog.vue |   51 +-
 src/views/EmploymentManage/TaskManageList.vue          |  110 +++---
 6 files changed, 838 insertions(+), 120 deletions(-)

diff --git a/src/views/EmploymentManage/EmploymentSignList.vue b/src/views/EmploymentManage/EmploymentSignList.vue
index 985ca43..cbd0382 100644
--- a/src/views/EmploymentManage/EmploymentSignList.vue
+++ b/src/views/EmploymentManage/EmploymentSignList.vue
@@ -71,32 +71,32 @@
       onClick: (role) => openDialog(role),
     },
   },
-  // {
-  //   data: {
-  //     enCode: 'recruitBtn',
-  //     name: '褰曠敤',
-  //   },
-  //   emits: {
-  //     onClick: (role) => setTaskUserHire(role, EnumTaskUserHireStatus.Pass),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskUsersQueryResultItem) =>
-  //       row.hireStatus === EnumTaskUserHireStatus.Pass,
-  //   },
-  // },
-  // {
-  //   data: {
-  //     enCode: 'refuseBtn',
-  //     name: '璋㈢粷',
-  //   },
-  //   emits: {
-  //     onClick: (role) => setTaskUserHire(role, EnumTaskUserHireStatus.Refuse),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskUsersQueryResultItem) =>
-  //       row.hireStatus !== EnumTaskUserHireStatus.Wait,
-  //   },
-  // },
+  {
+    data: {
+      enCode: 'recruitBtn',
+      name: '褰曠敤',
+    },
+    emits: {
+      onClick: (role) => setTaskUserHire(role, EnumTaskUserHireStatus.Pass),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskUsersQueryResultItem) =>
+        row.hireStatus === EnumTaskUserHireStatus.Pass,
+    },
+  },
+  {
+    data: {
+      enCode: 'refuseBtn',
+      name: '璋㈢粷',
+    },
+    emits: {
+      onClick: (role) => setTaskUserHire(role, EnumTaskUserHireStatus.Refuse),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskUsersQueryResultItem) =>
+        row.hireStatus !== EnumTaskUserHireStatus.Wait,
+    },
+  },
 ]);
 
 const router = useRouter();
diff --git a/src/views/EmploymentManage/TaskManageList.vue b/src/views/EmploymentManage/TaskManageList.vue
index e3a9b20..929134e 100644
--- a/src/views/EmploymentManage/TaskManageList.vue
+++ b/src/views/EmploymentManage/TaskManageList.vue
@@ -36,14 +36,14 @@
             <SearchInput
               v-model="extraParamState.keywords"
               style="width: 260px"
-              placeholder="浠诲姟鍚嶇О"
+              placeholder="浠诲姟鍚嶇О/瀹㈡埛"
               @on-click-search="getList"
             >
             </SearchInput>
           </QueryFilterItem>
         </template>
         <template #btn>
-          <!-- <el-button @click="goAddOrEdit()" type="primary">鍙戝竷</el-button> -->
+          <el-button @click="goAddOrEdit()" type="primary">鍙戝竷</el-button>
         </template>
       </ProTableQueryFilterBar>
       <ProTableV2
@@ -124,18 +124,18 @@
 };
 
 const operationBtns = defineOperationBtns([
-  // {
-  //   data: {
-  //     enCode: 'editBtn',
-  //     name: '缂栬緫',
-  //   },
-  //   emits: {
-  //     onClick: (role) => goAddOrEdit(role),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskInfosQueryResultItem) => row.status === EnumTaskStatus.Complete,
-  //   },
-  // },
+  {
+    data: {
+      enCode: 'editBtn',
+      name: '缂栬緫',
+    },
+    emits: {
+      onClick: (role) => goAddOrEdit(role),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskInfosQueryResultItem) => row.status === EnumTaskStatus.Complete,
+    },
+  },
   {
     data: {
       enCode: 'detailBtn',
@@ -145,47 +145,47 @@
       onClick: (row: API.GetTaskInfosQueryResultItem) => goDetail(row),
     },
   },
-  // {
-  //   data: {
-  //     enCode: 'publishBtn',
-  //     name: '鍙戝竷',
-  //   },
-  //   emits: {
-  //     onClick: (row: API.GetTaskInfosQueryResultItem) =>
-  //       setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.InProcess),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskInfosQueryResultItem) =>
-  //       row.releaseStatus === EnumTaskReleaseStatus.InProcess,
-  //   },
-  // },
-  // {
-  //   data: {
-  //     enCode: 'unPublishBtn',
-  //     name: '鍋滄鍙戝竷',
-  //   },
-  //   emits: {
-  //     onClick: (row: API.GetTaskInfosQueryResultItem) =>
-  //       setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.Stopped),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskInfosQueryResultItem) =>
-  //       row.releaseStatus === EnumTaskReleaseStatus.Stopped,
-  //   },
-  // },
-  // {
-  //   data: {
-  //     enCode: 'arrangeBtn',
-  //     name: '瀹夋帓',
-  //   },
-  //   emits: {
-  //     onClick: (row: API.GetTaskInfosQueryResultItem) => handleArrange(row),
-  //   },
-  //   extraProps: {
-  //     hide: (row: API.GetTaskInfosQueryResultItem) =>
-  //       row.releaseStatus === EnumTaskReleaseStatus.Stopped,
-  //   },
-  // },
+  {
+    data: {
+      enCode: 'publishBtn',
+      name: '鍙戝竷',
+    },
+    emits: {
+      onClick: (row: API.GetTaskInfosQueryResultItem) =>
+        setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.InProcess),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskInfosQueryResultItem) =>
+        row.releaseStatus === EnumTaskReleaseStatus.InProcess,
+    },
+  },
+  {
+    data: {
+      enCode: 'unPublishBtn',
+      name: '鍋滄鍙戝竷',
+    },
+    emits: {
+      onClick: (row: API.GetTaskInfosQueryResultItem) =>
+        setTaskInfoReleaseStatus(row, EnumTaskReleaseStatus.Stopped),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskInfosQueryResultItem) =>
+        row.releaseStatus === EnumTaskReleaseStatus.Stopped,
+    },
+  },
+  {
+    data: {
+      enCode: 'arrangeBtn',
+      name: '瀹夋帓',
+    },
+    emits: {
+      onClick: (row: API.GetTaskInfosQueryResultItem) => handleArrange(row),
+    },
+    extraProps: {
+      hide: (row: API.GetTaskInfosQueryResultItem) =>
+        row.releaseStatus === EnumTaskReleaseStatus.Stopped,
+    },
+  },
 ]);
 
 const router = useRouter();
diff --git a/src/views/FlexJobManage/FlexJobContractManage.vue b/src/views/FlexJobManage/FlexJobContractManage.vue
new file mode 100644
index 0000000..f12bbf1
--- /dev/null
+++ b/src/views/FlexJobManage/FlexJobContractManage.vue
@@ -0,0 +1,618 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="鐏靛伐绛剧害鐘舵��">
+            <FieldSelect
+              v-model="extraParamState.userSignContractStatus"
+              :value-enum="EnumTaskUserSignContractStatusText"
+              placeholder="璇烽�夋嫨鐏靛伐绛剧害鐘舵��"
+              clearable
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="浼佷笟绛剧害鐘舵��">
+            <FieldSelect
+              v-model="extraParamState.enterpriseSignContractStatus"
+              :value-enum="EnumTaskUserSignContractStatusText"
+              placeholder="璇烽�夋嫨浼佷笟绛剧害鐘舵��"
+              clearable
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.signContractTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="鐏靛伐绛剧害鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.signContractTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="浼佷笟绛剧害鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchWord"
+              style="width: 300px"
+              placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+        <template #btn>
+          <!-- <el-button @click="handleDownloadTemplate()" type="primary" link>妯℃澘涓嬭浇</el-button> -->
+          <!-- <el-button @click="handleBatchImportAdd()" type="primary">鎵归噺瀵煎叆</el-button> -->
+          <!-- <el-button @click="handleStaffInfoAdd()" 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> -->
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="FlexJobContractManageColumns"
+        :operationBtns="operationBtns"
+        show-column-check
+        ref="proTable"
+        :table-props="{
+          rowKey: 'id',
+        }"
+      >
+      </ProTableV2>
+    </AppContainer>
+    <StaffInfoDialog v-bind="dialogStaffInfoProps" />
+    <StaffDetailInfoDialog v-bind="dialogStaffDetailProps" />
+    <BatchImportDialog
+      v-bind="dialogBatchImportProps"
+      @onDownloadTemplate="handleDownloadTemplate"
+    />
+    <SendShotMessageDialog v-bind="dialogShotMessageProps" />
+    <SignDialog v-bind="dialogSignProps" />
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldRadio,
+  FieldSelect,
+  defineOperationBtns,
+  useFormDialog,
+  UploadUserFile,
+  XLSXUtils,
+} from '@bole-core/components';
+import { FlexJobContractManageColumns } from './constants';
+import { EnumTaskUserHireStatusText, EnumTaskUserSignContractStatusText } from '@/constants';
+import { Message } from '@bole-core/core';
+import { convertApi2FormUrlOnlyOne, downloadFileByUrl, format } from '@/utils';
+import StaffInfoDialog from './components/StaffInfoDialog.vue';
+import BatchImportDialog from './components/BatchImportDialog.vue';
+import SendShotMessageDialog from './components/SendShotMessageDialog.vue';
+import StaffDetailInfoDialog from './components/StaffDetailInfoDialog.vue';
+import SignDialog from './components/SignDialog.vue';
+import * as enterpriseEmployeeServices from '@/services/api/enterpriseEmployee';
+import { ModelValueType } from 'element-plus';
+import _ from 'lodash';
+
+defineOptions({
+  name: 'FlexJobContractManage',
+});
+
+const operationBtns = defineOperationBtns([
+  // {
+  //   data: {
+  //     enCode: 'editBtn',
+  //     name: '缂栬緫',
+  //   },
+  //   emits: {
+  //     onClick: (role) => openDialog(role),
+  //   },
+  // },
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    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' },
+  //   emits: {
+  //     onClick: (role) => handleDelete(role),
+  //   },
+  // },
+]);
+
+const router = useRouter();
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+onMounted(async () => {
+  await getList();
+  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 proTable = ref<InstanceType<typeof ProTableV2>>();
+
+function getSelectionRows() {
+  if (proTableProps.value.tableData.length) {
+    const res = proTable.value.innerTableRef.getSelectionRows();
+    if (res.length > 0) {
+      return res;
+    } else {
+      Message.errorMessage('鏈�夋嫨鏁版嵁');
+    }
+  } else {
+    Message.errorMessage('鏆傛棤鏁版嵁');
+  }
+}
+
+const {
+  dialogProps: dialogStaffInfoProps,
+  handleEdit: handleStaffInfoEdit,
+  handleAdd: handleStaffInfoAdd,
+  editForm: staffInfoEditForm,
+} = useFormDialog({
+  onConfirm: handleAddOrEdit,
+  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: '',
+    isDetail: false,
+  },
+});
+
+async function openDialog(row: API.GetEnterpriseEmployeesQueryResultItem, isDetail = false) {
+  try {
+    let detail = await enterpriseEmployeeServices.getEnterpriseEmployee({ id: row.id });
+    handleStaffInfoEdit({
+      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 ?? '',
+      isDetail: isDetail,
+    });
+  } catch (error) {}
+}
+
+async function handleAddOrEdit() {
+  try {
+    let params: API.EditEnterpriseEmployeeCommand = {
+      name: staffInfoEditForm.name,
+      identity: staffInfoEditForm.identity,
+      contactPhoneNumber: staffInfoEditForm.contactPhoneNumber,
+      gender: staffInfoEditForm.gender,
+      age: staffInfoEditForm.age,
+      identityImg: staffInfoEditForm.identityImg[0]?.path ?? '',
+      identityBackImg: staffInfoEditForm.identityBackImg[0]?.path ?? '',
+      id: staffInfoEditForm.id,
+    };
+    let res = await enterpriseEmployeeServices.editEnterpriseEmployee(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
+
+const {
+  dialogProps: dialogBatchImportProps,
+  handleAdd: handleBatchImportAdd,
+  editForm: batchImportForm,
+} = useFormDialog({
+  onConfirm: handleBatchImport,
+  defaultFormParams: {
+    url: [] as UploadUserFile[],
+  },
+});
+
+async function handleBatchImport() {
+  try {
+    let params: API.ImportEnterpriseEmployeesCommand = {
+      excelUrl: batchImportForm.url[0]?.path ?? '',
+    };
+    let res = await enterpriseEmployeeServices.importEnterpriseEmployees(params);
+    if (res.failCount > 0) {
+      await Message.tipMessage('瀛樺湪閿欒鏁版嵁锛屾槸鍚﹀鍑猴紵');
+      XLSXUtils.exportToXLSX({
+        workbookDataList: res.errors,
+        fileName: '鐏靛伐鎵归噺瀵煎叆-閿欒鏁版嵁',
+        workbookHeaderMap: {
+          name: '濮撳悕',
+          identity: '韬唤璇佸彿',
+          contactPhoneNumber: '鎵嬫満鍙�',
+          errorMessage: '澶囨敞',
+        },
+      });
+    } else {
+      Message.successMessage('瀵煎叆鎴愬姛');
+      getList();
+    }
+  } catch (error) {}
+}
+
+const {
+  dialogProps: dialogShotMessageProps,
+  handleAdd: handleShotMessageAdd,
+  editForm: editShotMessageForm,
+} = useFormDialog({
+  onConfirm: sendMessageForSign,
+  defaultFormParams: {
+    ids: [] as string[],
+    customerId: '',
+    name: '',
+    contractTemplateId: '',
+  },
+});
+
+async function handleSendShotMessage() {
+  try {
+    const selectionRows = getSelectionRows();
+    if (selectionRows) {
+      if (
+        selectionRows.some((x) => x.userSignContractStatus === EnumTaskUserSignContractStatus.Pass)
+      ) {
+        await Message.tipMessage('鍕鹃�変汉鍛樹腑鍖呭惈宸茬绾﹀畬鎴愪汉鍛橈紝纭瑕佺户缁彂閫佺煭淇¢�氱煡鍚楋紵');
+      }
+      handleShotMessageAdd({
+        ids: selectionRows.map((x) => x.id),
+        name: '浜哄憳绛剧害閫氶亾鐭俊',
+      });
+    }
+  } catch (error) {}
+}
+
+async function sendMessageForSign() {
+  try {
+    let params: API.SendInviteElectronSignSmsCommand = {
+      ids: editShotMessageForm.ids,
+      contractTemplateId: editShotMessageForm.contractTemplateId,
+    };
+    let res = await enterpriseEmployeeServices.sendInviteElectronSignSms(params);
+    if (res) {
+      Message.successMessage('鐭俊宸插彂閫�');
+    }
+  } catch (error) {}
+}
+
+function handleDownloadTemplate() {
+  downloadFileByUrl(ImportEnterpriseEmployeesTempPath, '鎵归噺瀵煎叆妯℃澘');
+}
+
+const {
+  dialogProps: dialogSignProps,
+  handleAdd: handleSignAdd,
+  handleEdit: handleSignEdit,
+  editForm: signEditForm,
+} = useFormDialog({
+  onConfirm: signContract,
+  defaultFormParams: {
+    ids: [] as string[],
+    contractTemplateId: '',
+  },
+});
+
+function handleInviteSign(row: API.GetEnterpriseEmployeesQueryResultItem) {
+  if (row) {
+    handleSignEdit({
+      ids: [row.id],
+      contractTemplateId: '',
+    });
+  }
+}
+function handleBatchSign() {
+  const selectionRows = getSelectionRows();
+  if (selectionRows) {
+    const hasSigned = selectionRows?.some(
+      (x) =>
+        x.userSignContractStatus === EnumTaskUserSignContractStatus.Pass ||
+        x.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Pass ||
+        x.hireStatus === EnumTaskUserHireStatus.Wait
+    );
+    if (hasSigned) {
+      Message.warnMessage('鍕鹃�変汉鍛樹腑鍖呭惈宸茬绾﹀畬鎴愭垨鏈綍鐢ㄤ汉鍛�');
+      return;
+    }
+    handleSignAdd({
+      ids: selectionRows.map((x) => x.id),
+      contractTemplateId: '',
+    });
+  }
+}
+
+const handleEnterpriseBatchSign = _.debounce(
+  () => {
+    const selectionRows = getSelectionRows();
+    if (selectionRows) {
+      const hasSigned = selectionRows?.some(
+        (x) =>
+          !(
+            x.userSignContractStatus === EnumTaskUserSignContractStatus.Pass &&
+            x.enterpriseSignContractStatus === EnumTaskUserSignContractStatus.Wait
+          )
+      );
+      if (hasSigned) {
+        Message.warnMessage('鍕鹃�変汉鍛樹腑鍖呭惈宸蹭紒涓氱绾︺�佹湭褰曠敤浜哄憳鎴栨湭绛剧害瀹屾垚浜哄憳');
+        return;
+      }
+      const ids = selectionRows.map((x) => x.id);
+      handleBatchEnterpriseSign(ids);
+    }
+  },
+  1000,
+  { leading: true, trailing: false }
+);
+
+async function handleBatchEnterpriseSign(ids: string[]) {
+  try {
+    state.loading = true;
+    let res = await enterpriseEmployeeServices.batchEnterpriseSignContract({ ids: ids });
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+      if (res?.errors?.length > 0) {
+        Message.tipMessage('瀛樺湪绛剧害澶辫触鐨勭伒宸ヤ俊鎭暟鎹紝鏄惁瀵煎嚭锛�').then(() => {
+          XLSXUtils.exportToXLSX({
+            workbookDataList: res.errors,
+            fileName: '绛剧害澶辫触鐏靛伐淇℃伅',
+            workbookHeaderMap: {
+              name: '濮撳悕',
+              contactPhoneNumber: '鎵嬫満鍙�',
+              identity: '韬唤璇佸彿',
+              errorMessages: '閿欒淇℃伅',
+            },
+          });
+        });
+      }
+    }
+  } catch (error) {
+  } finally {
+    state.loading = false;
+  }
+}
+
+async function signContract() {
+  try {
+    let params: API.InviteElectronSignCommand = {
+      ids: signEditForm.ids,
+      contractTemplateId: signEditForm.contractTemplateId,
+    };
+    let res = await enterpriseEmployeeServices.inviteElectronSign(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
+
+async function handleEnterpriseSign(row: API.GetEnterpriseEmployeesQueryResultItem) {
+  try {
+    let res = await enterpriseEmployeeServices.enterpriseUserElectronSign({ id: row.id });
+    if (res) {
+      window.open(res?.signContractLongUrl, '_blank');
+    }
+  } catch (error) {}
+}
+
+function handleUnSign(row: API.GetEnterpriseEmployeesQueryResultItem) {
+  stopElectronSign([row.id]);
+}
+
+function handleBatchUnSign() {
+  try {
+    const selectionRows = getSelectionRows();
+    if (selectionRows) {
+      const hasUnSigned = selectionRows?.some(
+        (x) => x.enterpriseSignContractStatus !== EnumTaskUserSignContractStatus.Pass
+      );
+      if (hasUnSigned) {
+        Message.warnMessage('鍕鹃�夋暟鎹腑鍖呭惈浼佷笟鏈绾︽垨宸茶В绾︽暟鎹�');
+        return;
+      }
+      stopElectronSign(selectionRows.map((x) => x.id));
+    }
+  } catch (error) {}
+}
+
+async function stopElectronSign(ids: string[]) {
+  try {
+    await Message.tipMessage('纭畾瑙g害鐢ㄦ埛锛�');
+    let res = await enterpriseEmployeeServices.stopElectronSign({ ids: ids });
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
+
+const {
+  dialogProps: dialogStaffDetailProps,
+  handleEdit: handleStaffDetailEdit,
+  editForm: staffDetailEditForm,
+} = useFormDialog({
+  defaultFormParams: {
+    id: '',
+    tabType: 'info',
+  },
+});
+
+async function handleDelete(row: API.GetEnterpriseEmployeesQueryResultItem) {
+  try {
+    await Message.deleteMessage();
+  } catch (error) {}
+}
+</script>
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
index 67a3486..75e4801 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()"
             >
@@ -329,6 +351,7 @@
 const {
   dialogProps: dialogStaffInfoProps,
   handleEdit: handleStaffInfoEdit,
+  handleAdd: handleStaffInfoAdd,
   editForm: staffInfoEditForm,
 } = useFormDialog({
   onConfirm: handleAddOrEdit,
diff --git a/src/views/FlexJobManage/components/StaffInfoDialog.vue b/src/views/FlexJobManage/components/StaffInfoDialog.vue
index 0dd52d5..c9024f8 100644
--- a/src/views/FlexJobManage/components/StaffInfoDialog.vue
+++ b/src/views/FlexJobManage/components/StaffInfoDialog.vue
@@ -15,8 +15,13 @@
           </ProFormItemV2>
         </ProFormColItem>
         <ProFormColItem :span="12">
-          <ProFormItemV2 v-if="form.isDetail" label="鎶ュ悕鏃堕棿锛�" prop="regiterTime">
-            <div>{{ format(form.regiterTime, 'YYYY-MM-DD HH:mm') }}</div>
+          <ProFormItemV2 label="鏈嶅姟鍗忚锛�" prop="contractUrl">
+            <ProFormUpload
+              v-model:file-url="form.contractUrl"
+              :limit="1"
+              :limitFileSize="10"
+              accept="jpg/jpeg,png,pdf"
+            ></ProFormUpload>
           </ProFormItemV2>
         </ProFormColItem>
         <ProFormColItem :span="12">
@@ -33,8 +38,18 @@
           </ProFormItemV2>
         </ProFormColItem>
         <ProFormColItem :span="12">
-          <ProFormItemV2 v-if="form.isDetail" label="瀹炲悕鏃堕棿锛�" prop="userRealTime">
-            <div>{{ format(form.userRealTime, 'YYYY-MM-DD HH:mm') }}</div>
+          <ProFormItemV2
+            label="鍗忚鏃堕棿:"
+            prop="regiterTime"
+            :check-rules="[{ message: '璇烽�夋嫨鍗忚鏃堕棿', type: 'array' }]"
+          >
+            <ProFormDatePicker
+              v-model="form.regiterTime"
+              type="daterange"
+              range-separator="鑷�"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="缁堟鏃ユ湡"
+            ></ProFormDatePicker>
           </ProFormItemV2>
         </ProFormColItem>
         <ProFormColItem :span="12">
@@ -49,11 +64,7 @@
             ></ProFormText>
           </ProFormItemV2>
         </ProFormColItem>
-        <ProFormColItem :span="12">
-          <ProFormItemV2 v-if="form.isDetail" label="绛剧害鏃堕棿锛�" prop="userSignContractTime">
-            <div>{{ format(form.userSignContractTime, 'YYYY-MM-DD HH:mm') }}</div>
-          </ProFormItemV2>
-        </ProFormColItem>
+        <ProFormColItem :span="12"> </ProFormColItem>
         <ProFormColItem :span="12">
           <ProFormItemV2
             label="鎬у埆锛�"
@@ -68,16 +79,7 @@
             ></ProFormRadio>
           </ProFormItemV2>
         </ProFormColItem>
-        <ProFormColItem :span="12">
-          <ProFormItemV2 v-if="form.isDetail" label="鐢靛瓙鍚堝悓锛�" prop="contractUrl">
-            <ProFormUpload
-              v-model:file-url="form.contractUrl"
-              :limit="1"
-              :limitFileSize="10"
-              accept="jpg/jpeg,png,pdf"
-            ></ProFormUpload>
-          </ProFormItemV2>
-        </ProFormColItem>
+        <ProFormColItem :span="12"> </ProFormColItem>
         <ProFormColItem :span="12">
           <ProFormItemV2
             label="骞撮緞锛�"
@@ -90,12 +92,8 @@
               :min="0"
               :max="9999"
               placeholder="璇疯緭鍏ュ勾榫�"
-            >
-              <template #readContent>
-                <span v-if="form.age">{{ form.age }}宀�</span>
-                <span v-else></span>
-              </template>
-            </ProFormInputNumber>
+              unit="宀�"
+            />
           </ProFormItemV2>
         </ProFormColItem>
       </ProFormCol>
@@ -129,7 +127,7 @@
         <el-button v-if="form.isDetail" @click="emit('onCancel')">鍏抽棴</el-button>
         <template v-else>
           <el-button type="primary" @click="handleConfirm">鎻愪氦</el-button>
-          <el-button @click="handleReset">閲嶇疆</el-button>
+          <!-- <el-button @click="handleReset">閲嶇疆</el-button> -->
           <el-button @click="emit('onCancel')">鍙栨秷</el-button>
         </template>
       </span>
@@ -151,6 +149,7 @@
   ProFormRadio,
   ProFormUpload,
   ProFormInputNumber,
+  ProFormDatePicker,
 } from '@bole-core/components';
 import { calculateAge, deepClone, format } from '@/utils';
 import { EnumUserGender, EnumUserGenderTextForPerson } from '@/constants';
diff --git a/src/views/FlexJobManage/constants/columns.ts b/src/views/FlexJobManage/constants/columns.ts
index 888e286..2076546 100644
--- a/src/views/FlexJobManage/constants/columns.ts
+++ b/src/views/FlexJobManage/constants/columns.ts
@@ -26,11 +26,11 @@
     enCode: 'contactPhoneNumber',
     name: '鎵嬫満鍙�',
   },
-  {
-    id: '8',
-    enCode: 'hireStatus',
-    name: '褰曠敤鐘舵��',
-  },
+  // {
+  //   id: '8',
+  //   enCode: 'hireStatus',
+  //   name: '褰曠敤鐘舵��',
+  // },
   {
     id: '9',
     enCode: 'userIsReal',
@@ -41,15 +41,93 @@
     enCode: 'userSignContractStatus',
     name: '鐏靛伐绛剧害鐘舵��',
   },
+  // {
+  //   id: '11',
+  //   enCode: 'hireTime',
+  //   name: '褰曠敤鏃堕棿',
+  // },
+  // {
+  //   id: '12',
+  //   enCode: 'userRealTime',
+  //   name: '瀹炲悕鏃堕棿',
+  // },
+  // {
+  //   id: '13',
+  //   enCode: 'userSignContractTime',
+  //   name: '绛剧害鏃堕棿',
+  // },
+  {
+    id: '14',
+    enCode: 'enterpriseSignContractStatus',
+    name: '浼佷笟绛剧害鐘舵��',
+  },
+  // {
+  //   id: '15',
+  //   enCode: 'enterpriseSignContractTime',
+  //   name: '浼佷笟绛剧害鏃堕棿',
+  // },
+  {
+    id: '16',
+    enCode: 'a',
+    name: '鍗忚璧峰',
+  },
+  {
+    id: '17',
+    enCode: 'a',
+    name: '鍗忚缁堟',
+  },
+  {
+    id: '18',
+    enCode: 'a',
+    name: '鐏靛伐鏉ユ簮',
+  },
+]);
+
+export const FlexJobContractManageColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'name',
+    name: '濮撳悕',
+  },
+  {
+    id: '2',
+    enCode: 'identity',
+    name: '韬唤璇佸彿',
+  },
+  {
+    id: '3',
+    enCode: 'gender',
+    name: '鎬у埆',
+  },
+  {
+    id: '5',
+    enCode: 'age',
+    name: '骞撮緞',
+  },
+  {
+    id: '6',
+    enCode: 'contactPhoneNumber',
+    name: '鎵嬫満鍙�',
+  },
+  {
+    id: '9',
+    enCode: 'userIsReal',
+    name: '瀹炲悕鐘舵��',
+  },
+  {
+    id: '10',
+    enCode: 'userRealTime',
+    name: '瀹炲悕鏃堕棿',
+  },
   {
     id: '11',
-    enCode: 'hireTime',
-    name: '褰曠敤鏃堕棿',
+    enCode: 'a',
+    name: '鐏靛伐鏉ユ簮',
   },
   {
     id: '12',
-    enCode: 'userRealTime',
-    name: '瀹炲悕鏃堕棿',
+    enCode: 'userSignContractStatus',
+    name: '鐏靛伐绛剧害鐘舵��',
   },
   {
     id: '13',

--
Gitblit v1.9.1