From 65c7175a1d7d448f91ee61a8a9aa935263939d37 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期四, 17 四月 2025 10:10:22 +0800
Subject: [PATCH] feat: 接口对接

---
 src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue     |   45 +
 src/views/CPersonManage/CPersonManageList.vue                         |  228 ++++++++++
 src/views/CPersonManage/components/CPersonDetailDialog.vue            |  197 +++++++++
 src/views/EnterpriseManage/components/ConfigureDialog.vue             |   15 
 src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue |  181 ++++++++
 src/constants/enum.ts                                                 |   16 
 src/constants/cPerson.ts                                              |   51 ++
 src/views/OperationManage/OperationManageList.vue                     |  209 +++++++++
 src/views/TaskManage/components/TaskDetailView.vue                    |   75 +++
 src/constants/index.ts                                                |    1 
 src/views/TaskManage/TaskManageDetail.vue                             |   32 +
 src/views/EnterpriseManage/EnterpriseManageList.vue                   |   30 
 src/views/TaskManage/TaskManageList.vue                               |  163 +++++++
 13 files changed, 1,204 insertions(+), 39 deletions(-)

diff --git a/src/constants/cPerson.ts b/src/constants/cPerson.ts
new file mode 100644
index 0000000..f2ebe7e
--- /dev/null
+++ b/src/constants/cPerson.ts
@@ -0,0 +1,51 @@
+export enum FlexWorkerEleSignEnum {
+  /**
+   * 鏈绾�
+   */
+  WaitSign = 10,
+  /**
+   * 宸茬绾�
+   */
+  HasSign = 20,
+  /**
+   * 宸茶В绾�
+   */
+  CancelSign = 30,
+}
+
+export const FlexWorkerEleSignEnumText = {
+  [FlexWorkerEleSignEnum.WaitSign]: '鏈绾�',
+  [FlexWorkerEleSignEnum.HasSign]: '宸茬绾�',
+  [FlexWorkerEleSignEnum.CancelSign]: '宸茶В绾�',
+};
+
+export enum FlexTaskWorkerHireEnum {
+  /**
+   * 寰呯绾�
+   */
+  WaitForSign = 1,
+  /**
+   * 寰呭鐞�
+   */
+  Wait = 10,
+  /**
+   * 宸插綍鐢�
+   */
+  Hired = 20,
+  /**
+   * 宸茶阿缁�
+   */
+  Refused = 30,
+  /**
+   * 宸茶В绾�
+   */
+  CancelSign = 40,
+}
+
+export const FlexTaskWorkerHireEnumText = {
+  [FlexTaskWorkerHireEnum.WaitForSign]: '寰呯绾�',
+  [FlexTaskWorkerHireEnum.Wait]: '寰呭鐞�',
+  [FlexTaskWorkerHireEnum.Hired]: '宸插綍鐢�',
+  [FlexTaskWorkerHireEnum.Refused]: '宸茶阿缁�',
+  [FlexTaskWorkerHireEnum.CancelSign]: '宸茶В绾�',
+};
diff --git a/src/constants/enum.ts b/src/constants/enum.ts
index e403f0e..6cc4c11 100644
--- a/src/constants/enum.ts
+++ b/src/constants/enum.ts
@@ -43,3 +43,19 @@
   { label: '鏄�', value: true },
   { label: '鍚�', value: false },
 ];
+
+export enum Gender {
+  /**
+   * 鐢�
+   */
+  Male = 1,
+  /**
+   * 濂�
+   */
+  Female = 2,
+}
+
+export const GenderText = {
+  [Gender.Male]: '鐢�',
+  [Gender.Female]: '濂�',
+};
diff --git a/src/constants/index.ts b/src/constants/index.ts
index 8f98d65..5dd6368 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -11,3 +11,4 @@
 export * from './app';
 export * from './dic';
 export * from './enterprise';
+export * from './cPerson';
diff --git a/src/views/CPersonManage/CPersonManageList.vue b/src/views/CPersonManage/CPersonManageList.vue
new file mode 100644
index 0000000..6a801c6
--- /dev/null
+++ b/src/views/CPersonManage/CPersonManageList.vue
@@ -0,0 +1,228 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="瀹炲悕鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.realVerifyStatus"
+              :value-enum="[
+                {
+                  value: false,
+                  label: '鏈疄鍚�',
+                },
+                {
+                  value: true,
+                  label: '宸插疄鍚�',
+                },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鏈�杩戝綍鐢ㄦ椂闂�">
+            <FieldDatePicker
+              v-model="extraParamState.nearlyHireDateTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鏈�杩戠绾︽椂闂�">
+            <FieldDatePicker
+              v-model="extraParamState.nearlySignDateTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchKeys"
+              style="width: 300px"
+              placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+      </ProTableV2>
+    </AppContainer>
+    <CPersonDetailDialog v-bind="dialogProps"></CPersonDetailDialog>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  useFormDialog,
+  FieldRadio,
+  FieldDatePicker,
+  UploadUserFile,
+} from '@bole-core/components';
+import { useAccess, useGlobalEventContext } from '@/hooks';
+import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker';
+import { Gender } from '@/constants';
+import CPersonDetailDialog from './components/CPersonDetailDialog.vue';
+import { OrderInputType } from '@bole-core/core';
+import { convertApi2FormUrlOnlyOne, format } from '@/utils';
+import { ModelValueType } from 'element-plus';
+
+defineOptions({
+  name: 'CPersonManageList',
+});
+
+const operationBtnMap: Record<string, OperationBtnType> = {
+  detailBtn: { emits: { onClick: (role) => openDialog(role) } },
+};
+
+const { checkSubModuleItemShow, column, operationBtns } = useAccess({
+  operationBtnMap,
+});
+
+const eventContext = useGlobalEventContext();
+
+eventContext.addEvent('enterprise:add', () => {
+  getList();
+});
+
+eventContext.addEvent('enterprise:edit', () => {
+  getList(paginationState.pageIndex);
+});
+
+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.GetUserClientForBackInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        searchKeys: extraParamState.searchKeys,
+        nearlyHireDateTimeBegin: format(
+          extraParamState.nearlyHireDateTime?.[0] ?? '',
+          'YYYY-MM-DD 00:00:00'
+        ),
+        nearlyHireDateTimeEnd: format(
+          extraParamState.nearlyHireDateTime?.[1] ?? '',
+          'YYYY-MM-DD 23:59:59'
+        ),
+        nearlySignDateTimeBegin: format(
+          extraParamState.nearlySignDateTime?.[0] ?? '',
+          'YYYY-MM-DD 00:00:00'
+        ),
+        nearlySignDateTimeEnd: format(
+          extraParamState.nearlySignDateTime?.[1] ?? '',
+          'YYYY-MM-DD 23:59:59'
+        ),
+        realVerifyStatus: extraParamState.realVerifyStatus,
+      };
+
+      let res = await flexEnterpriseWokerServices.getUserClientList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
+  },
+  {
+    defaultExtraParams: {
+      searchKeys: '',
+      realVerifyStatus: '' as any as boolean,
+      nearlyHireDateTime: [] as unknown as ModelValueType,
+      nearlySignDateTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'userId', order: OrderInputType.Desc }],
+    },
+    queryKey: ['flexEnterpriseWokerServices/getUserClientList'],
+    columnsRenderProps: {
+      realVerifyStatus: {
+        type: 'enum',
+        valueEnum: [
+          { label: '宸插疄鍚�', value: true },
+          { label: '鏈疄鍚�', value: false },
+        ],
+      },
+      realVerifyTime: { type: 'date' },
+    },
+  }
+);
+
+async function openDialog(row?: API.GetUserClientForBackOutput) {
+  const res = await getUserDetailForBack('98ac4c01-3598-ebf3-fa7d-3a189bb6b587');
+  handleEdit({
+    userId: row.userId ?? '98ac4c01-3598-ebf3-fa7d-3a189bb6b587',
+    name: res.name,
+    idNumber: res.idNumber,
+    contactPhone: res.contactPhone,
+    age: res.age,
+    certificateFrontImgUrl: res.certificateFrontImgUrl
+      ? convertApi2FormUrlOnlyOne(res.certificateFrontImgUrl)
+      : [],
+    certificateBackImgUrl: res.certificateBackImgUrl
+      ? convertApi2FormUrlOnlyOne(res.certificateBackImgUrl)
+      : [],
+
+    genderType: Gender.Female,
+    tabType: 'user',
+  });
+}
+
+const { dialogProps, handleEdit } = useFormDialog({
+  defaultFormParams: {
+    userId: '',
+    name: '',
+    idNumber: '',
+    contactPhone: '',
+    age: 0,
+    genderType: '' as any as Gender,
+    certificateFrontImgUrl: [] as UploadUserFile[],
+    certificateBackImgUrl: [] as UploadUserFile[],
+
+    tabType: '',
+  },
+});
+
+async function getUserDetailForBack(userId: string) {
+  try {
+    return await flexEnterpriseWokerServices.getUserDetailForBack({ userId: userId });
+  } catch (error) {}
+}
+</script>
diff --git a/src/views/CPersonManage/components/CPersonDetailDialog.vue b/src/views/CPersonManage/components/CPersonDetailDialog.vue
new file mode 100644
index 0000000..e6d9e99
--- /dev/null
+++ b/src/views/CPersonManage/components/CPersonDetailDialog.vue
@@ -0,0 +1,197 @@
+<template>
+  <ProDialog title="鐢宠璇︽儏" v-model="innerVisible" width="1200px" destroy-on-close>
+    <ProTabs v-model="innerForm.tabType" hasBorder>
+      <ProTabPane lazy label="浜哄憳璇︽儏" name="user">
+        <ProForm :model="form" ref="dialogForm" label-width="120px" is-read>
+          <ProFormItemV2 label="濮撳悕:" prop="name">
+            <ProFormText v-model.trim="innerForm.name" />
+          </ProFormItemV2>
+          <ProFormItemV2 label="韬唤璇佸彿:" prop="idNumber">
+            <ProFormText v-model.trim="innerForm.idNumber" />
+          </ProFormItemV2>
+          <ProFormItemV2 label="鎵嬫満鍙�:" prop="contactPhone">
+            <ProFormText v-model.trim="innerForm.contactPhone" />
+          </ProFormItemV2>
+          <ProFormItemV2 label="鎬у埆:" prop="age">
+            <ProFormRadio v-model="innerForm.genderType" :value-enum="GenderText"></ProFormRadio>
+          </ProFormItemV2>
+          <ProFormItemV2 label="骞撮緞:" prop="age">
+            <ProFormInputNumber v-model="innerForm.age" unit="宀�"></ProFormInputNumber>
+          </ProFormItemV2>
+          <ProFormItemV2 label="韬唤璇佹闈�:" prop="certificateFrontImgUrl">
+            <ProFormImageUpload v-model:file-url="innerForm.certificateFrontImgUrl" />
+          </ProFormItemV2>
+          <ProFormItemV2 label="韬唤璇佸弽闈�:" prop="certificateBackImgUrl">
+            <ProFormImageUpload v-model:file-url="innerForm.certificateBackImgUrl" />
+          </ProFormItemV2>
+        </ProForm>
+      </ProTabPane>
+      <ProTabPane lazy label="绛剧害璇︽儏" name="sign">
+        <ProDialogTableWrapper :height="400">
+          <ProTableV2 v-bind="proTableProps" :columns="column" :show-operation-column="false">
+          </ProTableV2>
+        </ProDialogTableWrapper>
+      </ProTabPane>
+    </ProTabs>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import {
+  ProDialog,
+  ProTableV2,
+  ProDialogTableWrapper,
+  ProTabs,
+  ProTabPane,
+  useTable,
+  ProForm,
+  ProFormItemV2,
+  ProFormText,
+  UploadUserFile,
+  ProFormImageUpload,
+  ProFormRadio,
+  ProFormInputNumber,
+} from '@bole-core/components';
+import { OrderInputType } from '@bole-core/core';
+import _ from 'lodash';
+import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker';
+import { setOSSLink } from '@/utils';
+import { FlexTaskWorkerHireEnumText, FlexWorkerEleSignEnumText, Gender, GenderText } from '@/constants';
+
+defineOptions({
+  name: 'CPersonDetailDialog',
+});
+
+type Props = {
+  modelValue: boolean;
+  form: {
+    tabType: string;
+    userId: string;
+    name: string;
+    idNumber: string;
+    contactPhone: string;
+    age: number;
+    genderType:Gender;
+    certificateFrontImgUrl: UploadUserFile[];
+    certificateBackImgUrl: UploadUserFile[];
+  };
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  modelValue: false,
+});
+
+const emit = defineEmits<{
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'update:form', value: Props['form']): void;
+  (e: 'onCancel'): void;
+}>();
+
+const column: API.CustomModuleColumnDto[] = [
+  {
+    id: '1',
+    enCode: 'enterpirseName',
+    name: '鎵�灞炲鎴�',
+  },
+  {
+    id: '2',
+    enCode: 'applyTime',
+    name: '鎶ュ悕鏃堕棿',
+  },
+  {
+    id: '3',
+    enCode: 'hireStatus',
+    name: '褰曠敤鐘舵��',
+  },
+  {
+    id: '4',
+    enCode: 'hireDateTime',
+    name: '褰曠敤鏃堕棿',
+  },
+  {
+    id: '5',
+    enCode: 'userSignStatus',
+    name: '绛剧害鐘舵��',
+  },
+  {
+    id: '6',
+    enCode: 'enterSignStatus',
+    name: '浼佷笟绛剧害鐘舵��',
+  },
+  {
+    id: '7',
+    enCode: 'enterSignTime',
+    name: '浼佷笟绛剧害鏃堕棿',
+  },
+  {
+    id: '8',
+    enCode: 'contractUrl',
+    name: '鐢靛瓙鍚堝悓',
+  },
+];
+
+const innerVisible = computed({
+  get() {
+    return props.modelValue;
+  },
+  set(val) {
+    emit('update:modelValue', val);
+  },
+});
+const innerForm = computed({
+  get() {
+    return props.form;
+  },
+  set(val) {
+    emit('update:form', val);
+  },
+});
+
+watch(
+  () => innerVisible.value,
+  (val) => {
+    if (val) {
+      getList();
+    }
+  }
+);
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetUserClientSignListInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        userId: props.form.userId,
+      };
+      let res = await flexEnterpriseWokerServices.getUserClientSignList(params);
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      orderInput: [{ property: 'applyTime', order: OrderInputType.Desc }],
+    },
+    columnsRenderProps: {
+      applyTime: { type: 'date' },
+      hireDateTime: { type: 'date' },
+      userSignTime: { type: 'date' },
+      hireStatus: { type: 'enum', valueEnum: FlexTaskWorkerHireEnumText },
+      userSignStatus: { type: 'enum', valueEnum: FlexWorkerEleSignEnumText },
+      enterSignStatus: { type: 'enum', valueEnum: FlexWorkerEleSignEnumText },
+    },
+  }
+);
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/EnterpriseManage/EnterpriseManageList.vue b/src/views/EnterpriseManage/EnterpriseManageList.vue
index 28e00da..2df6ee6 100644
--- a/src/views/EnterpriseManage/EnterpriseManageList.vue
+++ b/src/views/EnterpriseManage/EnterpriseManageList.vue
@@ -144,7 +144,7 @@
   {
     defaultExtraParams: {
       searchWord: '',
-      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
+      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
       flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
     },
     queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
@@ -159,21 +159,24 @@
   if (row) {
     handleEdit({
       id: row.id,
+      enterpriseConfigureType: EnterpriseConfigureType.Bank,
       flexEnterpirseId: row.id,
-      openBank: row.cityName,
-      openBranchBank: row.cityName,
-      bankAccount: row.cityName,
-      verifyStatus: VerifyStatus.NotVerify,
-      signChannel: SignChannelEnum.Alipay,
-      chargeType: ChargeTypeEnum.Group,
-      realVerifyCost: 0,
-      signCost: 0,
-      mergeSignCost: 0,
-      messageCost: 0,
-      messageChannel: MessageChannelEnum.Alipay,
+      openBank: row.flexEnterpriseBankDto?.openBank,
+      openBranchBank: row.flexEnterpriseBankDto?.openBranchBank,
+      bankAccount: row.flexEnterpriseBankDto?.bankAccount,
+      verifyStatus: row.flexEnterpriseBankDto?.verifyStatus,
+      signChannel: row.enterpriseSignSettingDto?.signChannel,
+      chargeType: row.enterpriseSignSettingDto?.chargeType,
+      realVerifyCost: row.enterpriseSignSettingDto?.realVerifyCost ?? 0,
+      signCost: row.enterpriseSignSettingDto?.signCost ?? 0,
+      mergeSignCost: row.enterpriseSignSettingDto?.mergeSignCost ?? 0,
+      messageCost: row.flexEnterpriseMessageSettingDto?.messageCost ?? 0,
+      messageChannel: row.flexEnterpriseMessageSettingDto?.messageChannel,
     });
   } else {
-    handleAdd({});
+    handleAdd({
+      enterpriseConfigureType: EnterpriseConfigureType.Bank,
+    });
   }
 }
 
@@ -182,6 +185,7 @@
   defaultFormParams: {
     id: '',
     flexEnterpirseId: '',
+    enterpriseConfigureType: '' as any as EnterpriseConfigureType,
     openBank: '',
     openBranchBank: '',
     bankAccount: '',
diff --git a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
index bdc92b9..b5a01b5 100644
--- a/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
+++ b/src/views/EnterpriseManage/components/AddOrEditEnterpriseView.vue
@@ -2,14 +2,18 @@
   <LoadingLayout :loading="isEdit && isLoading">
     <AppScrollContainer>
       <ChunkCell title="浼佷笟鍩烘湰淇℃伅">
-        <ProForm :model="form" :rules="rules" ref="formRef" label-width="120px" :is-read="isDetail">
+        <ProForm :model="form" ref="formRef" label-width="140px" :is-read="isDetail">
           <ProFormCol>
             <ProFormColItem :span="12">
-              <ProFormItemV2 label="浼佷笟鍚嶇О:" prop="enterpriseName">
+              <ProFormItemV2
+                label="浼佷笟鍚嶇О:"
+                prop="enterpriseName"
+                :check-rules="[{ message: '璇疯緭鍏ヤ紒涓氬悕绉�' }]"
+              >
                 <ProFormText
                   v-model.trim="form.enterpriseName"
                   :maxlength="30"
-                  placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О"
+                  placeholder="璇疯緭鍏ヤ紒涓氬悕绉�"
                 />
               </ProFormItemV2>
             </ProFormColItem>
@@ -38,7 +42,11 @@
           </ProFormCol>
           <ProFormCol>
             <ProFormColItem :span="12">
-              <ProFormItemV2 label="缁熶竴绀句細淇$敤浠g爜:" prop="societyCreditCode">
+              <ProFormItemV2
+                label="缁熶竴绀句細淇$敤浠g爜:"
+                prop="societyCreditCode"
+                :check-rules="[{ message: '璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜', type: 'societyCreditCode' }]"
+              >
                 <ProFormText
                   v-model.trim="form.societyCreditCode"
                   placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜"
@@ -100,7 +108,6 @@
       <ChunkCell title="鑱旂郴淇℃伅">
         <ProForm
           :model="form"
-          :rules="rules"
           ref="settingFormRef"
           label-width="140px"
           :scroll-to-error="false"
@@ -108,7 +115,11 @@
         >
           <ProFormCol>
             <ProFormColItem :span="12">
-              <ProFormItemV2 label="鑱旂郴浜�:" prop="contact">
+              <ProFormItemV2
+                label="鑱旂郴浜�:"
+                prop="contact"
+                :check-rules="[{ message: '璇疯緭鍏ヨ仈绯讳汉' }]"
+              >
                 <ProFormText
                   v-model.trim="form.contact"
                   :maxlength="30"
@@ -119,7 +130,11 @@
           </ProFormCol>
           <ProFormCol>
             <ProFormColItem :span="12">
-              <ProFormItemV2 label="鑱旂郴鐢佃瘽:" prop="contactPhone">
+              <ProFormItemV2
+                label="鑱旂郴鐢佃瘽:"
+                prop="contactPhone"
+                :check-rules="[{ message: '璇疯緭鍏ヨ仈绯荤數璇�', type: 'phone' }]"
+              >
                 <ProFormText v-model.trim="form.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" />
               </ProFormItemV2>
             </ProFormColItem>
@@ -141,7 +156,6 @@
       <ChunkCell title="璐﹀彿淇℃伅">
         <ProForm
           :model="form"
-          :rules="rules"
           ref="accountFormRef"
           label-width="140px"
           :scroll-to-error="false"
@@ -149,7 +163,11 @@
         >
           <ProFormCol>
             <ProFormColItem :span="12">
-              <ProFormItemV2 label="璐﹀彿:" prop="contact">
+              <ProFormItemV2
+                label="璐﹀彿:"
+                prop="contact"
+                :check-rules="[{ message: '璇疯緭鍏ヨ处鍙�' }]"
+              >
                 <ProFormText v-model.trim="form.contact" :maxlength="30" placeholder="璇疯緭鍏ヨ处鍙�" />
               </ProFormItemV2>
             </ProFormColItem>
@@ -244,15 +262,6 @@
 const formRef = ref<FormInstance>();
 const settingFormRef = ref<FormInstance>();
 const accountFormRef = ref<FormInstance>();
-
-const rules = reactive<FormRules>({
-  enterpriseName: [{ required: true, message: '璇疯緭鍏ヤ紒涓氬悕绉�', trigger: 'blur' }],
-  contact: [{ required: true, message: '璇疯緭鍏ヨ仈绯讳汉', trigger: 'blur' }],
-  contactPhone: [
-    { required: true, message: '璇疯緭鍏ヨ仈绯荤數璇�', trigger: 'blur' },
-    { message: '璇疯緭鍏ユ纭殑鑱旂郴鐢佃瘽', trigger: 'blur', pattern: BoleRegExp.RegPhoneNumber },
-  ],
-});
 
 async function handleSubmit() {
   try {
diff --git a/src/views/EnterpriseManage/components/ConfigureDialog.vue b/src/views/EnterpriseManage/components/ConfigureDialog.vue
index c91035b..0224cb3 100644
--- a/src/views/EnterpriseManage/components/ConfigureDialog.vue
+++ b/src/views/EnterpriseManage/components/ConfigureDialog.vue
@@ -3,12 +3,12 @@
     <ProForm :model="innerForm" ref="dialogForm" label-width="100px">
       <ProFormItemV2 label="" prop="enterpriseConfigureType" label-width="0">
         <ProFormRadio
-          v-model="enterpriseConfigureType"
+          v-model="innerForm.enterpriseConfigureType"
           :value-enum="EnterpriseConfigureTypeText"
           buttonStyle
         />
       </ProFormItemV2>
-      <template v-if="enterpriseConfigureType === EnterpriseConfigureType.Bank">
+      <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.Bank">
         <ProFormItemV2 label="寮�鎴锋�昏:" prop="openBank">
           <ProFormText
             v-model.trim="innerForm.openBank"
@@ -40,7 +40,7 @@
           >
         </ProFormItemV2>
       </template>
-      <template v-if="enterpriseConfigureType === EnterpriseConfigureType.Electronic">
+      <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.Electronic">
         <div class="configure-dialog-form-title">閫氶亾閰嶇疆</div>
         <ProFormItemV2
           label="鍚嶇О:"
@@ -95,7 +95,7 @@
           </ProFormItemV2>
         </template>
       </template>
-      <template v-if="enterpriseConfigureType === EnterpriseConfigureType.ShortMessage">
+      <template v-if="innerForm.enterpriseConfigureType === EnterpriseConfigureType.ShortMessage">
         <div class="configure-dialog-form-title">閫氶亾閰嶇疆</div>
         <ProFormItemV2
           label="鍚嶇О:"
@@ -162,6 +162,7 @@
 type Props = {
   modelValue: boolean;
   form?: {
+    enterpriseConfigureType: EnterpriseConfigureType;
     openBank: string;
     openBranchBank: string;
     bankAccount: string;
@@ -180,12 +181,10 @@
   modelValue: false,
 });
 
-const enterpriseConfigureType = ref<EnterpriseConfigureType>(EnterpriseConfigureType.Bank);
-
 const emit = defineEmits<{
   (e: 'update:modelValue', value: boolean): void;
   (e: 'update:form', value: Props['form']): void;
-  (e: 'onConfirm', value: EnterpriseConfigureType): void;
+  (e: 'onConfirm'): void;
   (e: 'onCancel'): void;
 }>();
 
@@ -220,7 +219,7 @@
   if (!dialogForm.value) return;
   dialogForm.value.validate((valid) => {
     if (valid) {
-      emit('onConfirm', enterpriseConfigureType.value);
+      emit('onConfirm');
     } else {
       return;
     }
diff --git a/src/views/OperationManage/OperationManageList.vue b/src/views/OperationManage/OperationManageList.vue
new file mode 100644
index 0000000..4771789
--- /dev/null
+++ b/src/views/OperationManage/OperationManageList.vue
@@ -0,0 +1,209 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem>
+            <FieldSelect
+              v-model="extraParamState.pageType"
+              placeholder="骞垮憡椤甸潰"
+              :value-enum="FlexWorkerEleSignEnumText"
+              clearable
+              @change="getAdvertiseOnShowList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.status"
+              :value-enum="FlexWorkerEleSignEnumText"
+              buttonStyle
+              showAllBtn
+              @change="getAdvertiseOnShowList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="骞垮憡寮�濮嬫椂闂�">
+            <FieldDatePicker
+              v-model="extraParamState.beginDate"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getAdvertiseOnShowList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="骞垮憡缁撴潫鏃堕棿">
+            <FieldDatePicker
+              v-model="extraParamState.endDate"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getAdvertiseOnShowList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.keyword"
+              style="width: 260px"
+              placeholder="骞垮憡鍚嶇О"
+              @on-click-search="getAdvertiseOnShowList"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+        <template #btn>
+          <el-button
+            v-if="checkSubModuleItemShow('pageButton', 'addBtn')"
+            @click="openDialog()"
+            icon="Plus"
+            type="primary"
+            >鏂板</el-button
+          >
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  useFormDialog,
+  FieldDatePicker,
+  FieldSelect,
+  FieldRadio,
+  UploadUserFile,
+} from '@bole-core/components';
+import { useAccess } from '@/hooks';
+import { FlexWorkerEleSignEnumText } from '@/constants';
+import { ModelValueType } from 'element-plus';
+import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker';
+import { format, setOSSLink, convertApi2FormUrl, convertFormUrl2Api } from '@/utils';
+import { OrderInputType, Message } from '@bole-core/core';
+
+defineOptions({
+  name: 'OperationManageList',
+});
+
+const operationBtnMap: Record<string, OperationBtnType> = {
+  editBtn: { emits: { onClick: (role) => openDialog(role) } },
+  takeOnBtn: {
+    emits: { onClick: (role) => setAdvertiseOnShowStatus(role) },
+    extraProps: {
+      hide: (row) => row.status,
+    },
+  },
+  takeDownBtn: {
+    emits: { onClick: (role) => setAdvertiseOnShowStatus(role) },
+    props: { type: 'danger' },
+    extraProps: {
+      hide: (row) => !row.status,
+    },
+  },
+  logBtn: { emits: { onClick: (role) => openDialog(role) } },
+};
+
+const { checkSubModuleItemShow, column, operationBtns } = useAccess({
+  operationBtnMap,
+});
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+onMounted(async () => {
+  await getAdvertiseOnShowList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getAdvertiseOnShowList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetUserClientForBackInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        searchKeys: extraParamState.keyword,
+      };
+      let res = await flexEnterpriseWokerServices.getUserClientList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      keyword: '',
+      pageType: '' as any as number,
+      status: '' as any as boolean,
+      beginDate: [] as unknown as ModelValueType,
+      endDate: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'sort', order: OrderInputType.Asc }],
+    },
+    columnsRenderProps: {},
+    columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'],
+  }
+);
+
+function openDialog(row?) {
+  if (row) {
+    handleEdit({
+      id: row.id,
+      pageType: row.pageType,
+      advertiseName: row.advertiseName,
+      advertiseLink: row.advertiseLink,
+      imgInfo: row.imgInfo.map((x) => convertApi2FormUrl(x.imgUrl)),
+      date: [format(row.advertiseBeginDate), format(row.advertiseEndDate)],
+      sort: row.sort,
+    });
+  } else {
+    handleAdd();
+  }
+}
+
+const { dialogProps, handleAdd, handleEdit, editForm, dialogState } = useFormDialog({
+  onConfirm: handleAddOrEdit,
+  defaultFormParams: {
+    title: '鏂板骞垮憡',
+    id: '',
+    pageType: '' as any as number,
+    advertiseName: '',
+    advertiseLink: '',
+    imgInfo: [] as UploadUserFile[],
+    date: [] as unknown as ModelValueType,
+    sort: 0,
+  },
+  editTitle: '缂栬緫骞垮憡',
+});
+
+async function handleAddOrEdit() {
+  try {
+  } catch (error) {}
+}
+
+async function setAdvertiseOnShowStatus(row) {
+  try {
+  } catch (error) {}
+}
+</script>
diff --git a/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue b/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue
new file mode 100644
index 0000000..8983528
--- /dev/null
+++ b/src/views/OperationManage/components/AddOrEditAdvertisementDialog.vue
@@ -0,0 +1,181 @@
+<template>
+  <ProDialog
+    :title="innerForm.title"
+    v-model="innerVisible"
+    @close="onDialogClose"
+    destroy-on-close
+  >
+    <ProForm :rules="rules" :model="innerForm" ref="dialogForm" label-width="120px">
+      <ProFormItemV2
+        label="骞垮憡椤甸潰:"
+        prop="pageType"
+        :check-rules="[{ message: '璇烽�夋嫨骞垮憡椤甸潰' }]"
+      >
+        <ProFormSelect
+          placeholder="璇烽�夋嫨骞垮憡椤甸潰"
+          :value-enum="FlexWorkerEleSignEnumText"
+          clearable
+          v-model="innerForm.pageType"
+        ></ProFormSelect>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="骞垮憡鍚嶇О:"
+        prop="advertiseName"
+        :check-rules="[{ message: '璇疯緭鍏ュ箍鍛婂悕绉�' }, { max: 20, message: '涓嶈兘瓒呰繃20涓瓧绗�' }]"
+      >
+        <ProFormText
+          placeholder="璇疯緭鍏ュ箍鍛婂悕绉�"
+          v-model.trim="innerForm.advertiseName"
+          :maxlength="20"
+        ></ProFormText>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="骞垮憡浜у搧閾炬帴:"
+        prop="advertiseLink"
+        :check-rules="[
+          { type: 'urlWithParams', message: '璇疯緭鍏ュ箍鍛婁骇鍝侀摼鎺�' },
+          { message: '璇疯緭鍏ユ纭殑骞垮憡浜у搧閾炬帴' },
+        ]"
+      >
+        <ProFormText
+          placeholder="璇疯緭鍏ュ箍鍛婁骇鍝侀摼鎺�"
+          v-model.trim="innerForm.advertiseLink"
+          :maxlength="150"
+        ></ProFormText>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="骞垮憡鍥剧墖:"
+        prop="imgInfo"
+        :check-rules="[{ type: 'array', message: '璇烽�夋嫨骞垮憡鍥剧墖' }]"
+      >
+        <ProFormImageUpload
+          :fileDirectory="OssAdvertise"
+          v-model:file-url="innerForm.imgInfo"
+          :limitFileCount="1"
+        ></ProFormImageUpload>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="骞垮憡鏃ユ湡:"
+        prop="date"
+        :check-rules="[{ type: 'array', message: '璇烽�夋嫨骞垮憡鏃ユ湡' }]"
+      >
+        <ProFormDatePicker
+          v-model="innerForm.date"
+          type="daterange"
+          range-separator="~"
+          start-placeholder="骞垮憡璧峰鏃ユ湡"
+          end-placeholder="骞垮憡鍒版湡鏃ユ湡"
+          clearable
+        ></ProFormDatePicker>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="骞垮憡浣嶆帓搴�:"
+        prop="sort"
+        required
+        :check-rules="[{ message: '璇疯緭鍏ユ帓搴�' }]"
+      >
+        <ProFormInputNumber
+          v-model="innerForm.sort"
+          :controls="false"
+          :min="0"
+          :max="99"
+        ></ProFormInputNumber>
+      </ProFormItemV2>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="emit('onCancel')">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormRules, FormInstance } from 'element-plus';
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  UploadUserFile,
+  ProFormText,
+  ProFormDatePicker,
+  ProFormInputNumber,
+  ProFormSelect,
+  ProFormImageUpload,
+} from '@bole-core/components';
+import { ModelValueType } from 'element-plus';
+import { OssAdvertise, FlexWorkerEleSignEnumText } from '@/constants';
+import { BoleRegExp } from '@bole-core/core';
+
+defineOptions({
+  name: 'AddOrEditAdvertisementDialog',
+});
+
+type Props = {
+  modelValue: boolean;
+  form?: {
+    title?: string;
+    id: string;
+    pageType: number;
+    advertiseName: string;
+    advertiseLink: string;
+    imgInfo: UploadUserFile[];
+    date: ModelValueType;
+    sort: number;
+  };
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  modelValue: false,
+});
+
+const emit = defineEmits<{
+  (e: 'update:modelValue', value: boolean): void;
+  (e: 'update:form', value: Props['form']): void;
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const dialogForm = ref<FormInstance>();
+
+const innerVisible = computed({
+  get() {
+    return props.modelValue;
+  },
+  set(val) {
+    emit('update:modelValue', val);
+  },
+});
+
+const innerForm = computed({
+  get() {
+    return props.form;
+  },
+  set(val) {
+    emit('update:form', val);
+  },
+});
+
+const rules = reactive<FormRules>({
+  contacterPhone: [
+    { message: '璇疯緭鍏ユ纭殑鑱旂郴鐢佃瘽', trigger: 'blur', pattern: BoleRegExp.RegTelNumber },
+  ],
+});
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+</script>
diff --git a/src/views/TaskManage/TaskManageDetail.vue b/src/views/TaskManage/TaskManageDetail.vue
new file mode 100644
index 0000000..f664309
--- /dev/null
+++ b/src/views/TaskManage/TaskManageDetail.vue
@@ -0,0 +1,32 @@
+<template>
+  <LoadingLayout>
+    <AppContainer>
+      <ProTabs v-model="state.tabType" hasBorder>
+        <ProTabPane lazy label="浠诲姟璇︽儏" name="task">
+          <TaskDetailView></TaskDetailView>
+        </ProTabPane>
+        <ProTabPane lazy label="鎶ュ悕璇︽儏" name="sign">
+          <SignDetailView></SignDetailView>
+        </ProTabPane>
+      </ProTabs>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import { AppContainer, ProTabs, ProTabPane } from '@bole-core/components';
+import TaskDetailView from './components/TaskDetailView.vue';
+import SignDetailView from './components/SignDetailView.vue';
+
+defineOptions({
+  name: 'TaskManageDetail',
+});
+
+const state = reactive({
+  tabType: 'task',
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/TaskManage/TaskManageList.vue b/src/views/TaskManage/TaskManageList.vue
new file mode 100644
index 0000000..c0ee5aa
--- /dev/null
+++ b/src/views/TaskManage/TaskManageList.vue
@@ -0,0 +1,163 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem>
+            <FieldSelect
+              v-model="extraParamState.pageType"
+              placeholder="骞垮憡椤甸潰"
+              :value-enum="FlexWorkerEleSignEnumText"
+              clearable
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鍙戝竷鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.status"
+              :value-enum="FlexWorkerEleSignEnumText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鎺ㄨ崘鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.status"
+              :value-enum="FlexWorkerEleSignEnumText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鍙戝竷鏃堕棿">
+            <FieldDatePicker
+              v-model="extraParamState.beginDate"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.keyword"
+              style="width: 260px"
+              placeholder="浠诲姟鍚嶇О"
+              @on-click-search="getList"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldSelect,
+  FieldRadio,
+} from '@bole-core/components';
+import { useAccess } from '@/hooks';
+import { FlexWorkerEleSignEnumText } from '@/constants';
+import { ModelValueType } from 'element-plus';
+import * as flexEnterpriseWokerServices from '@/services/api/FlexEnterpriseWoker';
+import { OrderInputType } from '@bole-core/core';
+
+defineOptions({
+  name: 'OperationManageList',
+});
+
+const operationBtnMap: Record<string, OperationBtnType> = {
+  detailBtn: { emits: { onClick: (role) => goDetail(role) } },
+  takeOnBtn: {
+    emits: { onClick: (role) => setAdvertiseOnShowStatus(role) },
+    extraProps: {
+      hide: (row) => row.status,
+    },
+  },
+  takeDownBtn: {
+    emits: { onClick: (role) => setAdvertiseOnShowStatus(role) },
+    props: { type: 'danger' },
+    extraProps: {
+      hide: (row) => !row.status,
+    },
+  },
+};
+
+const { checkSubModuleItemShow, column, operationBtns } = useAccess({
+  operationBtnMap,
+});
+
+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.GetUserClientForBackInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        searchKeys: extraParamState.keyword,
+      };
+      let res = await flexEnterpriseWokerServices.getUserClientList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      keyword: '',
+      pageType: '' as any as number,
+      status: '' as any as boolean,
+      beginDate: [] as unknown as ModelValueType,
+      endDate: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'sort', order: OrderInputType.Asc }],
+    },
+    columnsRenderProps: {},
+    columnPropsMap: ['advertiseBeginDate', 'advertiseEndDate'],
+  }
+);
+
+async function setAdvertiseOnShowStatus(row) {
+  try {
+  } catch (error) {}
+}
+
+function goDetail(row) {
+  router.push({ name: 'TaskDetail', params: { id: row?.id ?? '' } });
+}
+</script>
diff --git a/src/views/TaskManage/components/TaskDetailView.vue b/src/views/TaskManage/components/TaskDetailView.vue
new file mode 100644
index 0000000..fe82639
--- /dev/null
+++ b/src/views/TaskManage/components/TaskDetailView.vue
@@ -0,0 +1,75 @@
+<template>
+  <LoadingLayout :loading="isLoading">
+    <AppContainer>
+      <PageFormLayout>
+        <ProForm :model="detail" ref="formRef" label-width="140px" is-read>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name">
+                <ProFormText v-model.trim="detail.name" />
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name">
+                <RadioWithExtra
+                  v-model="detail"
+                  :value-enum="TrainSalaryTypeTextList"
+                  enumLabelKey="text"
+                  enum-value-key="value"
+                  :showExtra="state.consultForm.salaryType === ConsultSalaryType.Input"
+                >
+                  <template #extra>
+                    <ProFormInputNumber
+                      :controls="false"
+                      :min="0"
+                      :max="999"
+                      v-model="state.consultForm.startMonthlySalary"
+                      placeholder="璇疯緭鍏�"
+                    ></ProFormInputNumber>
+                  </template>
+                </RadioWithExtra>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+        </ProForm>
+      </PageFormLayout>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  LoadingLayout,
+  AppContainer,
+  PageFormLayout,
+  ProForm,
+  ProFormCol,
+  ProFormColItem,
+  ProFormItemV2,
+  ProFormText,
+  ProFormInputNumber,
+} from '@bole-core/components';
+import { useQuery } from '@tanstack/vue-query';
+
+defineOptions({
+  name: 'TaskDetailView',
+});
+
+const route = useRoute();
+const id = route.params?.id as string;
+
+const { data: detail, isLoading } = useQuery({
+  //   queryKey: ['customerServices/getParkCustomerManageBaseDetail', id],
+  //   queryFn: async () => {
+  //     return await customerServices.getParkCustomerManageBaseDetail({ id: id });
+  //   },
+  placeholderData: () => ({} as API.GetUserClientForBackOutput),
+  //   enabled: !!id,
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>

--
Gitblit v1.9.1