From a686faf1c2132f55e40119df28ce9f6e46206b74 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期四, 11 九月 2025 17:40:38 +0800
Subject: [PATCH] feat: 页面

---
 src/views/ServiceChargeManage/ServiceChargeDetail.vue              |   64 ++--
 src/constants/task.ts                                              |   19 +
 .eslintrc-auto-import.json                                         |    3 
 src/views/ServiceChargeManage/ServiceChargeManage.vue              |   72 +++--
 src/views/FlexJobManage/FlexJobManage.vue                          |   16 +
 src/views/FlexJobManage/components/StaffDetailInfoView.vue         |  112 ++++++++++
 src/views/FlexJobManage/components/SignDetailView.vue              |  127 +++++++++++
 src/views/FlexJobManage/components/StaffResumeView.vue             |  124 +++++++++++
 src/views/EmploymentManage/components/CheckManageDialog.vue        |    2 
 src/views/FlexJobManage/components/StaffDetailInfoDialog.vue       |   61 +++++
 auto-imports.d.ts                                                  |    6 
 src/views/EmploymentManage/components/AddOrEditEmploymentView.vue  |   35 +++
 src/views/ServiceChargeManage/components/UploadStatementDialog.vue |   18 
 13 files changed, 586 insertions(+), 73 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 4d85d94..0d2cd9f 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -42,7 +42,9 @@
     "EnumPagedListOrder": true,
     "EnumPayAccess": true,
     "EnumPersonalFreeTime": true,
+    "EnumPersonalFreeTimeText": true,
     "EnumPersonalJobSeekingStatus": true,
+    "EnumPersonalJobSeekingStatusText": true,
     "EnumPersonalRealMethod": true,
     "EnumPersonalUserRealStatus": true,
     "EnumRealAccess": true,
@@ -52,6 +54,7 @@
     "EnumRoleWebApiDataPowerText": true,
     "EnumRoleWebApiDataPowerTextForFilter": true,
     "EnumSettlementCycle": true,
+    "EnumSettlementCycleDateText": true,
     "EnumSettlementCycleText": true,
     "EnumSmsAccess": true,
     "EnumTaskCheckReceiveStatus": true,
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index 4d9adb0..3eab8bc 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -47,7 +47,9 @@
   const EnumPagedListOrder: typeof import('./src/constants/apiEnum')['EnumPagedListOrder']
   const EnumPayAccess: typeof import('./src/constants/apiEnum')['EnumPayAccess']
   const EnumPersonalFreeTime: typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']
+  const EnumPersonalFreeTimeText: typeof import('./src/constants/task')['EnumPersonalFreeTimeText']
   const EnumPersonalJobSeekingStatus: typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']
+  const EnumPersonalJobSeekingStatusText: typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText']
   const EnumPersonalRealMethod: typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']
   const EnumPersonalUserRealStatus: typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']
   const EnumRealAccess: typeof import('./src/constants/apiEnum')['EnumRealAccess']
@@ -57,6 +59,7 @@
   const EnumRoleWebApiDataPowerText: typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerText']
   const EnumRoleWebApiDataPowerTextForFilter: typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerTextForFilter']
   const EnumSettlementCycle: typeof import('./src/constants/apiEnum')['EnumSettlementCycle']
+  const EnumSettlementCycleDateText: typeof import('./src/constants/task')['EnumSettlementCycleDateText']
   const EnumSettlementCycleText: typeof import('./src/constants/task')['EnumSettlementCycleText']
   const EnumSmsAccess: typeof import('./src/constants/apiEnum')['EnumSmsAccess']
   const EnumSmsTemplateType: typeof import('./src/constants/apiEnum')['EnumSmsTemplateType']
@@ -311,7 +314,9 @@
     readonly EnumPagedListOrder: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPagedListOrder']>
     readonly EnumPayAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPayAccess']>
     readonly EnumPersonalFreeTime: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']>
+    readonly EnumPersonalFreeTimeText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalFreeTimeText']>
     readonly EnumPersonalJobSeekingStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']>
+    readonly EnumPersonalJobSeekingStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumPersonalJobSeekingStatusText']>
     readonly EnumPersonalRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']>
     readonly EnumPersonalUserRealStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']>
     readonly EnumRealAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumRealAccess']>
@@ -321,6 +326,7 @@
     readonly EnumRoleWebApiDataPowerText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerText']>
     readonly EnumRoleWebApiDataPowerTextForFilter: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumRoleWebApiDataPowerTextForFilter']>
     readonly EnumSettlementCycle: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSettlementCycle']>
+    readonly EnumSettlementCycleDateText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleDateText']>
     readonly EnumSettlementCycleText: UnwrapRef<typeof import('./src/constants/task')['EnumSettlementCycleText']>
     readonly EnumSmsAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumSmsAccess']>
     readonly EnumTaskCheckReceiveStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskCheckReceiveStatus']>
diff --git a/src/constants/task.ts b/src/constants/task.ts
index 6cf4a5e..ef00be6 100644
--- a/src/constants/task.ts
+++ b/src/constants/task.ts
@@ -11,6 +11,11 @@
   [EnumSettlementCycle.Day]: '鏃ョ粨',
 };
 
+export const EnumSettlementCycleDateText = {
+  [EnumSettlementCycle.Month]: '姣忔湀',
+  [EnumSettlementCycle.Week]: '姣忓懆',
+};
+
 export const EnumTaskReleaseStatusText = {
   [EnumTaskReleaseStatus.InProcess]: '鍙戝竷涓�',
   [EnumTaskReleaseStatus.Stopped]: '宸插仠姝�',
@@ -84,3 +89,17 @@
   [EnumTaskSettlementStatus.InProcess]: '缁撶畻涓�',
   [EnumTaskSettlementStatus.Completed]: '宸茬粨绠�',
 };
+
+export const EnumPersonalFreeTimeText = {
+  [EnumPersonalFreeTime.NoLimit]: '涓嶉檺',
+  [EnumPersonalFreeTime.WinterSummerVacations]: '瀵掓殤鍋�',
+  [EnumPersonalFreeTime.FestivalAndHoliday]: '鑺傚亣鏃�',
+  [EnumPersonalFreeTime.Weekend]: '鍛ㄥ叚鏃�',
+  [EnumPersonalFreeTime.Weekday]: '宸ヤ綔鏃�',
+};
+
+export const EnumPersonalJobSeekingStatusText = {
+  [EnumPersonalJobSeekingStatus.Active]: '绉瀬鎵句换鍔�',
+  [EnumPersonalJobSeekingStatus.Whatever]: '闅忎究鐪嬬湅',
+  [EnumPersonalJobSeekingStatus.Not]: '鏆傛椂涓嶆壘浠诲姟',
+};
diff --git a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
index b08731a..f251903 100644
--- a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
+++ b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
@@ -68,6 +68,24 @@
           </ProFormCol>
           <ProFormCol>
             <ProFormColItem :span="12">
+              <ProFormItemV2
+                label="缁撶畻鏃ユ湡:"
+                prop="settlementCycle"
+                :check-rules="[{ message: '璇烽�夋嫨缁撶畻鏃ユ湡' }]"
+                class="settlement-cycle-date-form-item"
+              >
+                {{ EnumSettlementCycleDateText[form.settlementCycle] }}
+                <ProFormSelect
+                  v-model="form.settlementCycle"
+                  :value-enum="[]"
+                  :button-style="false"
+                ></ProFormSelect>
+                {{ '鏃ョ粨绠�' }}
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
               <ProFormItemV2 label="绂忓埄:" prop="benefits">
                 <el-checkbox
                   v-if="!isDetail"
@@ -227,6 +245,7 @@
   ProFormRadio,
   ProFormDatePicker,
   ProFormCheckbox,
+  ProFormSelect,
 } from '@bole-core/components';
 import { FormInstance, ModelValueType } from 'element-plus';
 import { Message } from '@bole-core/core';
@@ -238,6 +257,7 @@
   EnumBillingMethodText,
   EnumBillingMethodUnitText,
   EnumSettlementCycleText,
+  EnumSettlementCycleDateText,
 } from '@/constants';
 import { format, FormValidator } from '@/utils';
 import dayjs from 'dayjs';
@@ -423,5 +443,20 @@
       width: auto;
     }
   }
+
+  .settlement-cycle-date-form-item {
+    color: inherit;
+
+    .el-form-item__content {
+      flex-wrap: nowrap;
+
+      .el-select {
+        margin: 0 20px;
+        width: auto;
+        min-width: 0;
+        flex: 1;
+      }
+    }
+  }
 }
 </style>
diff --git a/src/views/EmploymentManage/components/CheckManageDialog.vue b/src/views/EmploymentManage/components/CheckManageDialog.vue
index 592ff5c..6c82f86 100644
--- a/src/views/EmploymentManage/components/CheckManageDialog.vue
+++ b/src/views/EmploymentManage/components/CheckManageDialog.vue
@@ -161,7 +161,7 @@
     columnsRenderProps: {
       createdTime: { type: 'date' },
       checkReceiveTime: { type: 'date' },
-      date: { type: 'date' },
+      date: { type: 'date', format: 'YYYY-MM-DD' },
       checkReceiveStatus: { type: 'enum', valueEnum: EnumTaskUserSubmitCheckReceiveStatusText },
       files: {
         type: 'url',
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
index c12699f..ca81eac 100644
--- a/src/views/FlexJobManage/FlexJobManage.vue
+++ b/src/views/FlexJobManage/FlexJobManage.vue
@@ -99,6 +99,7 @@
       </ProTableV2>
     </AppContainer>
     <StaffInfoDialog v-bind="dialogStaffInfoProps" />
+    <StaffDetailInfoDialog v-bind="dialogStaffDetailProps" />
     <BatchImportDialog
       v-bind="dialogBatchImportProps"
       @onDownloadTemplate="handleDownloadTemplate"
@@ -133,6 +134,7 @@
 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';
@@ -157,7 +159,8 @@
       name: '璇︽儏',
     },
     emits: {
-      onClick: (role) => openDialog(role, true),
+      onClick: (role: API.GetEnterpriseEmployeesQueryResultItem) =>
+        handleStaffDetailEdit({ id: role.id, tabType: 'info' }),
     },
   },
   {
@@ -563,6 +566,17 @@
   } catch (error) {}
 }
 
+const {
+  dialogProps: dialogStaffDetailProps,
+  handleEdit: handleStaffDetailEdit,
+  editForm: staffDetailEditForm,
+} = useFormDialog({
+  defaultFormParams: {
+    id: '',
+    tabType: 'info',
+  },
+});
+
 async function handleDelete(row: API.GetEnterpriseEmployeesQueryResultItem) {
   try {
     await Message.deleteMessage();
diff --git a/src/views/FlexJobManage/components/SignDetailView.vue b/src/views/FlexJobManage/components/SignDetailView.vue
new file mode 100644
index 0000000..a4d2ddd
--- /dev/null
+++ b/src/views/FlexJobManage/components/SignDetailView.vue
@@ -0,0 +1,127 @@
+<template>
+  <ProTableV2
+    v-bind="proTableProps"
+    :columns="column"
+    :show-operation-column="false"
+    :auto-height="false"
+    :table-props="{
+      height: '400px',
+    }"
+  >
+    <template #contractUrl="{ row }">
+      <PreviewBtn
+        v-if="row.userSignContractStatus === EnumTaskUserSignContractStatus.Pass && row.contractUrl"
+        :show-download-btn="false"
+        :url="setOSSLink(row.contractUrl)"
+      >
+      </PreviewBtn>
+    </template>
+  </ProTableV2>
+</template>
+
+<script setup lang="ts">
+import { useTable, ProTableV2, defineColumns } from '@bole-core/components';
+import { setOSSLink } from '@/utils';
+import {
+  EnumTaskUserSignContractStatus,
+  EnumTaskUserHireStatusText,
+  EnumTaskUserSignContractStatusText,
+} from '@/constants';
+import * as userServices from '@/services/api/user';
+
+defineOptions({
+  name: 'SignDetailView',
+});
+
+type Form = {
+  id: string;
+};
+
+const form = defineModel<Form>('form');
+
+const isLoading = ref(false);
+
+const column = defineColumns([
+  {
+    id: '1',
+    enCode: 'enterpriseName',
+    name: '鎵�灞炲鎴�',
+  },
+  {
+    id: '2',
+    enCode: 'applyTime',
+    name: '鎶ュ悕鏃堕棿',
+  },
+  {
+    id: '3',
+    enCode: 'hireStatus',
+    name: '褰曠敤鐘舵��',
+  },
+  {
+    id: '4',
+    enCode: 'hireTime',
+    name: '褰曠敤鏃堕棿',
+  },
+  {
+    id: '5',
+    enCode: 'userSignContractStatus',
+    name: '绛剧害鐘舵��',
+  },
+  {
+    id: '6',
+    enCode: 'enterpriseSignContractStatus',
+    name: '浼佷笟绛剧害鐘舵��',
+  },
+  {
+    id: '7',
+    enCode: 'enterpriseSignContractTime',
+    name: '浼佷笟绛剧害鏃堕棿',
+  },
+  {
+    id: '8',
+    enCode: 'contractUrl',
+    name: '鐢靛瓙鍚堝悓',
+  },
+]);
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetPersonalUserInfoSignContractsQuery = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        id: form.value.id,
+      };
+      let res = await userServices.getPersonalUserInfoSignContracts(params);
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+    },
+    columnsRenderProps: {
+      applyTime: { type: 'date' },
+      hireTime: { type: 'date' },
+      enterpriseSignContractTime: { type: 'date' },
+      hireStatus: { type: 'enum', valueEnum: EnumTaskUserHireStatusText },
+      userSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
+      enterpriseSignContractStatus: { type: 'enum', valueEnum: EnumTaskUserSignContractStatusText },
+    },
+  }
+);
+
+onMounted(async () => {
+  isLoading.value = true;
+  await getList();
+  isLoading.value = false;
+});
+</script>
diff --git a/src/views/FlexJobManage/components/StaffDetailInfoDialog.vue b/src/views/FlexJobManage/components/StaffDetailInfoDialog.vue
new file mode 100644
index 0000000..debbb56
--- /dev/null
+++ b/src/views/FlexJobManage/components/StaffDetailInfoDialog.vue
@@ -0,0 +1,61 @@
+<template>
+  <ProDialog
+    title="浜哄憳璇︽儏"
+    v-model="visible"
+    @close="onDialogClose"
+    destroy-on-close
+    draggable
+    :width="900"
+  >
+    <ProTabs v-model="form.tabType" hasBorder>
+      <ProTabPane lazy label="浜哄憳淇℃伅" name="info">
+        <StaffDetailInfoView :form="form" />
+      </ProTabPane>
+      <ProTabPane lazy label="浜哄憳绠�鍘�" name="resume">
+        <StaffResumeView :form="form" />
+      </ProTabPane>
+      <ProTabPane lazy label="绛剧害璇︽儏" name="sign">
+        <SignDetailView :form="form" />
+      </ProTabPane>
+    </ProTabs>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="emit('onCancel')">鍏抽棴</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormInstance } from 'element-plus';
+import { ProDialog, ProTabs, ProTabPane } from '@bole-core/components';
+import StaffDetailInfoView from './StaffDetailInfoView.vue';
+import StaffResumeView from './StaffResumeView.vue';
+import SignDetailView from './SignDetailView.vue';
+
+defineOptions({
+  name: 'StaffDetailInfoDialog',
+});
+
+type Form = {
+  title?: string;
+  tabType: string;
+  id: string;
+};
+
+const visible = defineModel<boolean>('modelValue');
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const dialogForm = ref<FormInstance>();
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+</script>
diff --git a/src/views/FlexJobManage/components/StaffDetailInfoView.vue b/src/views/FlexJobManage/components/StaffDetailInfoView.vue
new file mode 100644
index 0000000..5dbe708
--- /dev/null
+++ b/src/views/FlexJobManage/components/StaffDetailInfoView.vue
@@ -0,0 +1,112 @@
+<template>
+  <ProForm :model="detail" ref="dialogForm" label-width="120px" is-read>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="濮撳悕锛�" prop="name">
+          <ProFormText v-model.trim="detail.name"></ProFormText>
+        </ProFormItemV2>
+      </ProFormColItem>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="瀹炲悕鏃堕棿锛�" prop="userRealTime">
+          <div>{{ format(detail.userRealTime, 'YYYY-MM-DD HH:mm') }}</div>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="韬唤璇佸彿锛�" prop="identity">
+          <ProFormText v-model.trim="detail.identity"></ProFormText>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="鎵嬫満鍙凤細" prop="contactPhoneNumber">
+          <ProFormText v-model.trim="detail.contactPhoneNumber"></ProFormText>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="鎬у埆锛�" prop="gender">
+          <ProFormRadio
+            v-model="detail.gender"
+            :value-enum="EnumUserGenderTextForPerson"
+          ></ProFormRadio>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="骞撮緞锛�" prop="age">
+          <ProFormInputNumber v-model="detail.age"> </ProFormInputNumber>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormItemV2 label="韬唤璇佹闈細" prop="identityImg">
+      <ProFormImageUpload v-model:file-url="detail.identityImg"> </ProFormImageUpload>
+    </ProFormItemV2>
+    <ProFormItemV2 label="韬唤璇佸弽闈細" prop="identityBackImg">
+      <ProFormImageUpload v-model:file-url="detail.identityBackImg"> </ProFormImageUpload>
+    </ProFormItemV2>
+  </ProForm>
+</template>
+
+<script setup lang="ts">
+import {
+  ProForm,
+  ProFormCol,
+  ProFormColItem,
+  ProFormItemV2,
+  ProFormText,
+  ProFormInputNumber,
+  ProFormImageUpload,
+  ProFormRadio,
+  UploadUserFile,
+} from '@bole-core/components';
+import { convertApi2FormUrlOnlyOne, format } from '@/utils';
+import { useQuery } from '@tanstack/vue-query';
+import { EnumUserGender, EnumUserGenderTextForPerson } from '@/constants';
+import * as enterpriseEmployeeServices from '@/services/api/enterpriseEmployee';
+
+defineOptions({
+  name: 'StaffDetailInfoView',
+});
+
+type Form = {
+  id: string;
+};
+
+const form = defineModel<Form>('form');
+
+const detail = reactive({
+  name: '',
+  identity: '',
+  contactPhoneNumber: '',
+  gender: EnumUserGender.Male,
+  age: 0,
+  identityImg: [] as UploadUserFile[],
+  identityBackImg: [] as UploadUserFile[],
+  userRealTime: '',
+});
+
+const { isLoading } = useQuery({
+  queryKey: ['enterpriseEmployeeServices/getEnterpriseEmployee', form.value.id],
+  queryFn: async () => {
+    return await enterpriseEmployeeServices.getEnterpriseEmployee({ id: form.value.id });
+  },
+  onSuccess(data) {
+    detail.name = data.name;
+    detail.identity = data.identity;
+    detail.contactPhoneNumber = data.contactPhoneNumber;
+    detail.gender = data.gender;
+    detail.age = data.age ?? 0;
+    detail.identityImg = data.identityImg ? convertApi2FormUrlOnlyOne(data.identityImg) : [];
+    detail.identityBackImg = data.identityBackImg
+      ? convertApi2FormUrlOnlyOne(data.identityBackImg)
+      : [];
+    detail.userRealTime = data.userRealTime ?? '';
+  },
+  enabled: computed(() => !!form.value.id),
+});
+</script>
diff --git a/src/views/FlexJobManage/components/StaffResumeView.vue b/src/views/FlexJobManage/components/StaffResumeView.vue
new file mode 100644
index 0000000..e5658c3
--- /dev/null
+++ b/src/views/FlexJobManage/components/StaffResumeView.vue
@@ -0,0 +1,124 @@
+<template>
+  <ProForm :model="detail" ref="dialogForm" label-width="120px" is-read>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="鏈熸湜宀椾綅锛�" prop="name">
+          <div>{{ detail.userExpectJobs }}</div>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="绌洪棽鏃堕棿锛�" prop="freeTime">
+          <ProFormRadio
+            v-model="detail.freeTime"
+            :value-enum="EnumPersonalFreeTimeText"
+          ></ProFormRadio>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="姹傝亴鐘舵�侊細" prop="jobSeekingStatus">
+          <ProFormRadio
+            v-model="detail.jobSeekingStatus"
+            :value-enum="EnumPersonalJobSeekingStatusText"
+          ></ProFormRadio>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="宸ヤ綔骞撮檺锛�" prop="workSeniority">
+          <ProFormText v-model="detail.workSeniority"></ProFormText>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="宸ヤ綔缁忛獙锛�" prop="workExperience">
+          <ProFormText v-model="detail.workExperience"></ProFormText>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="韬珮锛�" prop="height">
+          <ProFormInputNumber v-model="detail.height"></ProFormInputNumber>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormCol>
+      <ProFormColItem :span="12">
+        <ProFormItemV2 label="浣撻噸锛�" prop="weight">
+          <ProFormInputNumber v-model="detail.weight"></ProFormInputNumber>
+        </ProFormItemV2>
+      </ProFormColItem>
+    </ProFormCol>
+    <ProFormItemV2 label="涓汉鐓х墖锛�" prop="photos">
+      <ProFormImageUpload v-model:file-url="detail.photos"> </ProFormImageUpload>
+    </ProFormItemV2>
+  </ProForm>
+</template>
+
+<script setup lang="ts">
+import {
+  ProForm,
+  ProFormCol,
+  ProFormColItem,
+  ProFormItemV2,
+  ProFormText,
+  ProFormInputNumber,
+  ProFormRadio,
+  UploadUserFile,
+  ProFormImageUpload,
+} from '@bole-core/components';
+import { EnumPersonalFreeTimeText, EnumPersonalJobSeekingStatusText } from '@/constants';
+import { useQuery } from '@tanstack/vue-query';
+import * as userResumeServices from '@/services/api/userResume';
+import { convertApi2FormUrl } from '@/utils';
+
+defineOptions({
+  name: 'StaffResumeView',
+});
+
+type Form = {
+  id: string;
+};
+
+const form = defineModel<Form>('form');
+
+const detail = reactive({
+  userExpectJobs: '',
+  freeTime: '' as any as EnumPersonalFreeTime,
+  jobSeekingStatus: '' as any as EnumPersonalJobSeekingStatus,
+  workSeniority: '',
+  workExperience: '',
+  height: 0,
+  weight: 0,
+  photos: [] as UploadUserFile[],
+});
+
+const { isLoading } = useQuery({
+  queryKey: ['userResumeServices/getUserResume', form.value.id],
+  queryFn: async () => {
+    return await userResumeServices.getUserResume({ enterpriseEmployeeId: form.value.id });
+  },
+  onSuccess(data) {
+    detail.userExpectJobs =
+      data.userExpectJobs?.length > 0
+        ? data.userExpectJobs.map((x) => x.expectJobContent).join(',')
+        : '';
+    detail.freeTime = data.freeTime;
+    detail.jobSeekingStatus = data.jobSeekingStatus;
+    detail.workSeniority = data.workSeniority;
+    detail.workExperience = data.workExperience;
+    detail.height = data.height ?? 0;
+    detail.weight = data.weight ?? 0;
+    detail.photos = data.photos
+      ? data.photos.map((x) => convertApi2FormUrl(x))
+      : ([] as UploadUserFile[]);
+  },
+  enabled: computed(() => !!form.value.id),
+});
+</script>
diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
index de7d1ff..508adec 100644
--- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -15,7 +15,7 @@
               </ProFormItemV2>
             </ProFormColItem>
           </ProFormCol>
-          <ProFormCol>
+          <!-- <ProFormCol>
             <ProFormColItem :span="8">
               <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="settlementOrderName">
                 <ProFormText v-model="form.settlementOrderName"> </ProFormText>
@@ -30,7 +30,7 @@
                 ></ProFormDatePicker>
               </ProFormItemV2>
             </ProFormColItem>
-          </ProFormCol>
+          </ProFormCol> -->
           <ProFormCol>
             <ProFormColItem :span="8">
               <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount">
@@ -82,6 +82,22 @@
               </SearchInput>
             </QueryFilterItem>
           </template>
+          <template #btn>
+            <BlFileUpload
+              v-model:file-url="form.settlementUrl"
+              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 text type="primary" class="pro-table-operation-btn">涓婁紶</el-button>
+            </BlFileUpload>
+            <el-button type="primary" link @click="handleAdd()">瀵煎嚭</el-button>
+          </template>
         </ProTableQueryFilterBar>
         <ProTableV2
           v-bind="proTableProps"
@@ -97,11 +113,11 @@
         <div class="chuck-add-or-edit-actions">
           <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button>
           <el-button
-            v-if="!isDetail"
+            v-if="isSettlement"
             class="chuck-add-or-edit-actions"
             type="primary"
             @click="handleSubmit"
-            >纭</el-button
+            >缁撶畻</el-button
           >
         </div>
       </ChunkCell>
@@ -113,7 +129,6 @@
 import {
   LoadingLayout,
   AppContainer,
-  AppScrollContainer,
   ChunkCell,
   ProForm,
   ProFormItemV2,
@@ -130,6 +145,8 @@
   ProTableQueryFilterBar,
   useFormDialog,
   XLSXUtils,
+  BlFileUpload,
+  UploadUserFile,
 } from '@bole-core/components';
 import { SettlementListColumns } from './constants';
 import { useQuery } from '@tanstack/vue-query';
@@ -160,8 +177,9 @@
 const route = useRoute();
 const id = (route.params.id as string) ?? '';
 const url = (route.query.url as string) ?? '';
+const settlement = (route.query.settlement as string) ?? '';
 
-const isDetail = computed(() => !url);
+const isSettlement = computed(() => !!url || !!settlement);
 
 const form = reactive({
   name: '',
@@ -171,6 +189,8 @@
   settlementOrderName: '',
   settlementOrderTime: '',
   settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[],
+
+  settlementUrl: [] as UploadUserFile[],
 });
 
 const BaseState = {
@@ -179,32 +199,6 @@
 
 const state = reactive({ ...BaseState });
 
-// onMounted(async () => {
-//   await getList();
-//   state.loading = false;
-// });
-
-// const { isLoading } = useQuery({
-//   queryKey: ['taskServices/getSettlementTask', id],
-//   queryFn: async () => {
-//     return await taskServices.getSettlementTask(
-//       { id: id },
-//       {
-//         showLoading: false,
-//       }
-//     );
-//   },
-//   placeholderData: () => ({} as API.GetSettlementTaskQueryResult),
-//   onSuccess(data) {
-//     form.name = data.name;
-//     form.settlementAmount = data.settlementAmount ?? 0;
-//     form.actualSettlementAmount = data.actualSettlementAmount ?? 0;
-//     form.code = data.code;
-//     form.settlementOrderName = setOssFileName(data.settlementOrderName);
-//     form.settlementOrderTime = data.settlementOrderTime ?? '';
-//   },
-//   enabled: !!id,
-// });
 const { isLoading } = useQuery({
   queryKey: ['taskUserServices/getSettlementTaskUsers', id, url],
   queryFn: async () => {
@@ -336,6 +330,12 @@
   } catch (error) {}
 }
 
+function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
+  if (response.path) {
+    //
+  }
+}
+
 function handleBack() {
   closeViewPush(route, {
     name: 'ServiceChargeManageList',
diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue
index 8cbbe76..e72ac87 100644
--- a/src/views/ServiceChargeManage/ServiceChargeManage.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -55,7 +55,7 @@
         :columns="ServiceChargeManageColumns"
         :operationBtns="operationBtns"
       >
-        <template #operationBtn-uploadBtn="{ row }">
+        <!-- <template #operationBtn-uploadBtn="{ row }">
           <BlFileUpload
             v-model:file-url="editForm.settlementUrl"
             ref="uploadRef"
@@ -84,7 +84,7 @@
           >
             <el-button text type="primary" class="pro-table-operation-btn">閲嶆柊涓婁紶</el-button>
           </BlFileUpload>
-        </template>
+        </template> -->
       </ProTableV2>
     </AppContainer>
     <UploadStatementDialog v-bind="dialogProps" />
@@ -127,36 +127,36 @@
 });
 
 const operationBtns = defineOperationBtns([
-  {
-    data: {
-      enCode: 'uploadBtn',
-      name: '涓婁紶',
-    },
-    extraProps: {
-      hide: (row: API.GetSettlementTasksQueryResultItem) =>
-        row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait,
-    },
-  },
-  {
-    data: {
-      enCode: 'reUploadBtn',
-      name: '閲嶆柊涓婁紶',
-    },
-    extraProps: {
-      hide: (row: API.GetSettlementTasksQueryResultItem) =>
-        !(
-          row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
-          row.settlementStatus === EnumTaskSettlementStatus.Wait
-        ),
-    },
-  },
+  // {
+  //   data: {
+  //     enCode: 'uploadBtn',
+  //     name: '涓婁紶',
+  //   },
+  //   extraProps: {
+  //     hide: (row: API.GetSettlementTasksQueryResultItem) =>
+  //       row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait,
+  //   },
+  // },
+  // {
+  //   data: {
+  //     enCode: 'reUploadBtn',
+  //     name: '閲嶆柊涓婁紶',
+  //   },
+  //   extraProps: {
+  //     hide: (row: API.GetSettlementTasksQueryResultItem) =>
+  //       !(
+  //         row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
+  //         row.settlementStatus === EnumTaskSettlementStatus.Wait
+  //       ),
+  //   },
+  // },
   {
     data: {
       enCode: 'settleBtn',
       name: '缁撶畻',
     },
     emits: {
-      onClick: (role: API.GetSettlementTasksQueryResultItem) => openSettleDialog(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role, 'settlement'),
     },
     extraProps: {
       hide: (role: API.GetSettlementTasksQueryResultItem) =>
@@ -185,7 +185,7 @@
       name: '璇︽儏',
     },
     emits: {
-      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role),
     },
     extraProps: {
       hide: (role: API.GetSettlementTasksQueryResultItem) =>
@@ -288,7 +288,7 @@
 });
 
 async function handleAddOrEdit() {
-  goDetail(editForm.id, editForm.settlementUrl[0]?.path);
+  goSettlementDetail(editForm.id, editForm.settlementUrl[0]?.path);
 }
 
 const {
@@ -348,11 +348,11 @@
   row: API.GetSettlementTasksQueryResultItem
 ) {
   if (response.path) {
-    goDetail(row.id, response.path);
+    goSettlementDetail(row.id, response.path);
   }
 }
 
-async function goDetail(id: string, url?: string) {
+async function goSettlementDetail(id: string, url?: string) {
   await router.push({
     name: 'ServiceChargeDetail',
     params: {
@@ -365,6 +365,18 @@
   editForm.settlementUrl = [] as UploadUserFile[];
 }
 
+function goDetail(row: API.GetSettlementTasksQueryResultItem, settlement?: string) {
+  router.push({
+    name: 'ServiceChargeDetail',
+    params: {
+      id: row?.id ?? '',
+    },
+    query: {
+      settlement: settlement ? settlement : '',
+    },
+  });
+}
+
 function handleExport(val) {
   console.log('val: ', val);
 }
diff --git a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
index 46e8393..1bba11e 100644
--- a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
+++ b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
@@ -8,24 +8,24 @@
     :width="700"
   >
     <ProForm :model="form" ref="dialogForm" label-width="120px">
-      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]">
+      <ProFormItemV2 label="浠诲姟鍚嶇О锛�" prop="name" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]">
         <ProFormSelect
-          v-model="form.code"
+          v-model="form.name"
           :valueEnum="taskSelect"
-          placeholder="璇烽�夋嫨浠诲姟鍗曞彿"
+          placeholder="璇烽�夋嫨浠诲姟鍚嶇О"
           enum-value-key="id"
-          enum-label-key="code"
+          enum-label-key="name"
           filterable
           clearable
           @change="handleCodeChange"
         >
         </ProFormSelect>
       </ProFormItemV2>
-      <ProFormItemV2 label="浠诲姟鍚嶇О锛�" prop="name" :check-rules="[{ message: '璇疯緭鍏ヤ换鍔″悕绉�' }]">
+      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code" :check-rules="[{ message: '璇疯緭鍏ヤ换鍔″崟鍙�' }]">
         <ProFormText
           style="width: 50%"
-          placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
-          v-model.trim="form.name"
+          placeholder="璇疯緭鍏ヤ换鍔″崟鍙�"
+          v-model.trim="form.code"
           disabled
         ></ProFormText>
       </ProFormItemV2>
@@ -91,10 +91,10 @@
 
 function handleCodeChange(value: string) {
   if (value) {
-    form.value.name = taskSelect.value?.find((item) => item.id === value)?.name ?? '';
+    form.value.code = taskSelect.value?.find((item) => item.id === value)?.code ?? '';
     form.value.id = value;
   } else {
-    Message.errorMessage('璇烽�夋嫨浠诲姟鍗曞彿');
+    Message.errorMessage('璇烽�夋嫨浠诲姟鍚嶇О');
   }
 }
 

--
Gitblit v1.9.1