From 18c1c2833377e85b6042c0622ddf67becaf3bacb Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 05 九月 2025 11:04:08 +0800
Subject: [PATCH] feat: 页面

---
 src/views/FlexJobManage/FlexJobManage.vue                          |    7 +
 src/services/api/enterpriseEmployee.ts                             |   15 +++
 src/views/ServiceChargeManage/ServiceChargeDetail.vue              |   30 +++++--
 src/services/api/typings.d.ts                                      |   42 +++++++---
 src/views/ServiceChargeManage/ServiceChargeManage.vue              |   85 +++++++++-----------
 src/views/ServiceChargeManage/components/UploadStatementDialog.vue |    9 +
 src/constants/apiEnum.ts                                           |    6 +
 src/services/api/taskUser.ts                                       |   12 +-
 8 files changed, 127 insertions(+), 79 deletions(-)

diff --git a/src/constants/apiEnum.ts b/src/constants/apiEnum.ts
index 1045c37..281da50 100644
--- a/src/constants/apiEnum.ts
+++ b/src/constants/apiEnum.ts
@@ -133,9 +133,11 @@
 
 /** 浼佷笟閽卞寘浠h繘浠跺崟鐘舵�� */
 export enum EnumEnterpriseWalletExpandindirectOrderStatus {
+  /**鏈繘浠� */
+  Wait = 1,
   /**瀹℃壒涓� */
   PROCESSING = 10,
-  /**宸茬敓鏁� */
+  /**宸茶繘浠� */
   VALID = 20,
   /**瀹℃壒涓嶉�氳繃 */
   INVALID = 30,
@@ -147,6 +149,8 @@
 
 /** 浼佷笟閽卞寘绛剧害鐘舵�� */
 export enum EnumEnterpriseWalletSignStatus {
+  /**鏈绾� */
+  Wait = 1,
   /**鐢宠涓� */
   Apply = 10,
   /**宸茬绾� */
diff --git a/src/services/api/enterpriseEmployee.ts b/src/services/api/enterpriseEmployee.ts
index 874d511..286ed8a 100644
--- a/src/services/api/enterpriseEmployee.ts
+++ b/src/services/api/enterpriseEmployee.ts
@@ -158,6 +158,21 @@
   );
 }
 
+/** 鍙戦�侀個璇风绾︾煭淇� POST /api/user/enterpriseEmployee/sendInviteElectronSignSms */
+export async function sendInviteElectronSignSms(
+  body: API.SendInviteElectronSignSmsCommand,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/user/enterpriseEmployee/sendInviteElectronSignSms', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鐏靛伐瑙g害 POST /api/user/enterpriseEmployee/stopElectronSign */
 export async function stopElectronSign(
   body: API.StopElectronSignCommand,
diff --git a/src/services/api/taskUser.ts b/src/services/api/taskUser.ts
index 85e1c78..a66d30a 100644
--- a/src/services/api/taskUser.ts
+++ b/src/services/api/taskUser.ts
@@ -56,19 +56,19 @@
   });
 }
 
-/** 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 POST /api/flexjob/taskUser/getSettlementTaskUsers */
+/** 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 GET /api/flexjob/taskUser/getSettlementTaskUsers */
 export async function getSettlementTaskUsers(
-  body: API.GetSettlementTaskUsersQuery,
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetSettlementTaskUsersParams,
   options?: API.RequestConfig
 ) {
   return request<API.GetSettlementTaskUsersQueryResult>(
     '/api/flexjob/taskUser/getSettlementTaskUsers',
     {
-      method: 'POST',
-      headers: {
-        'Content-Type': 'application/json-patch+json',
+      method: 'GET',
+      params: {
+        ...params,
       },
-      data: body,
       ...(options || {}),
     }
   );
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 5aa46b1..a904276 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -187,6 +187,13 @@
     id?: string;
   }
 
+  interface APIgetSettlementTaskUsersParams {
+    /** 浠诲姟Id */
+    taskInfoId?: string;
+    /** 缁撶畻鍗曞湴鍧� */
+    settlementOrderUrl?: string;
+  }
+
   interface APIgetTaskEnterpriseParams {
     /** 浼佷笟Id */
     id?: string;
@@ -585,9 +592,11 @@
   }
 
   enum EnumEnterpriseWalletExpandindirectOrderStatus {
+    /**鏈繘浠� */
+    Wait = 1,
     /**瀹℃壒涓� */
     PROCESSING = 10,
-    /**宸茬敓鏁� */
+    /**宸茶繘浠� */
     VALID = 20,
     /**瀹℃壒涓嶉�氳繃 */
     INVALID = 30,
@@ -598,6 +607,8 @@
   }
 
   enum EnumEnterpriseWalletSignStatus {
+    /**鏈绾� */
+    Wait = 1,
     /**鐢宠涓� */
     Apply = 10,
     /**宸茬绾� */
@@ -3179,6 +3190,10 @@
     /** 閽卞寘Id */
     id?: string;
     access?: EnumEnterpriseWalletAccess;
+    /** 璐﹀彿 */
+    account?: string;
+    /** 鍟嗘埛Id */
+    merchantId?: string;
     /** 鍗忚鍙� */
     code?: string;
     /** 閫氶亾鍗忚鍙� */
@@ -3190,6 +3205,7 @@
     /** 鍗忚澶辨晥鏃堕棿 */
     invalidTime?: string;
     signStatus?: EnumEnterpriseWalletSignStatus;
+    expandindirectOrderStatus?: EnumEnterpriseWalletExpandindirectOrderStatus;
   }
 
   interface GetEnterpriseWalletTransactionQueryResult {
@@ -3995,22 +4011,11 @@
     settlementUserCount?: number;
   }
 
-  interface GetSettlementTaskUsersQuery {
-    /** 浠诲姟Id */
-    taskInfoId?: string;
-    /** 鍏抽敭瀛� */
-    keywords?: string;
-    /** 缁撶畻鍗曞湴鍧� */
-    settlementOrderUrl?: string;
-    pageModel?: PagedListQueryPageModel;
-  }
-
   interface GetSettlementTaskUsersQueryResult {
+    /** 缁撶畻鍚嶅崟 */
+    data?: GetSettlementTaskUsersQueryResultItem[];
     /** 閿欒淇℃伅 */
     errors?: GetSettlementTaskUsersQueryResultError[];
-    pageModel?: PagedListQueryResultPageModel;
-    /** 鏁版嵁 */
-    data?: GetSettlementTaskUsersQueryResultItem[];
   }
 
   interface GetSettlementTaskUsersQueryResultError {
@@ -4660,6 +4665,10 @@
     /** 浼佷笟Id */
     enterpriseId?: string;
     access?: EnumEnterpriseWalletAccess;
+    /** 璐﹀彿 */
+    account?: string;
+    /** 鍟嗘埛Id */
+    merchantId?: string;
   }
 
   interface OpenEnterpriseWalletCommandResult {
@@ -5193,6 +5202,11 @@
     data?: GetDictionaryDataSelectQueryResultOption;
   }
 
+  interface SendInviteElectronSignSmsCommand {
+    /** Id */
+    ids?: string[];
+  }
+
   interface SendLoginOrRegisterVerifyCodeCommand {
     /** 鎵嬫満鍙风爜 */
     phoneNumber: string;
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
index 55741d4..af9b798 100644
--- a/src/views/FlexJobManage/FlexJobManage.vue
+++ b/src/views/FlexJobManage/FlexJobManage.vue
@@ -531,6 +531,13 @@
   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) {}
diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
index 756a31a..8c10aa8 100644
--- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -129,6 +129,7 @@
 import * as taskUserServices from '@/services/api/taskUser';
 import EditAccountInfoDialog from './components/EditAccountInfoDialog.vue';
 import { Message } from '@bole-core/core';
+import { paginateList } from '@/utils';
 
 defineOptions({
   name: 'ServiceChargeDetail',
@@ -192,19 +193,28 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetSettlementTaskUsersQuery = {
+      let params: API.APIgetSettlementTaskUsersParams = {
+        taskInfoId: id,
+        settlementOrderUrl: url,
+      };
+      let res = await taskUserServices.getSettlementTaskUsers(params);
+      if (extraParamState.keywords) {
+        res.data = res.data.filter((item) => {
+          return (
+            item.name.includes(extraParamState.keywords) ||
+            item.contactPhoneNumber.includes(extraParamState.keywords) ||
+            item.identity.includes(extraParamState.keywords)
+          );
+        });
+      }
+      return Promise.resolve({
         pageModel: {
           rows: pageSize,
           page: pageIndex,
-          orderInput: extraParamState.orderInput,
+          totalCount: res.data.length,
         },
-        taskInfoId: id,
-        // settlementOrderUrl:form.
-        keywords: extraParamState.keywords,
-      };
-
-      let res = await taskUserServices.getSettlementTaskUsers(params);
-      return res;
+        data: paginateList(res.data, pageIndex, pageSize),
+      });
     } catch (error) {
       console.log('error: ', error);
     }
@@ -214,7 +224,7 @@
       keywords: '',
       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
     },
-    queryKey: ['taskUserServices/getOpenTaskInfos'],
+    queryKey: ['taskUserServices/getSettlementTaskUsers'],
     columnsRenderProps: {},
   }
 );
diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue
index 868fbbf..f60c590 100644
--- a/src/views/ServiceChargeManage/ServiceChargeManage.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -46,7 +46,7 @@
         </template>
         <template #btn>
           <el-button type="primary" link @click="handleDownloadTemplate()">缁撶畻鍗曟ā鏉�</el-button>
-          <el-button type="primary" @click="openDialog()">涓婁紶缁撶畻鍗�</el-button>
+          <el-button type="primary" @click="handleAdd()">涓婁紶缁撶畻鍗�</el-button>
           <el-button type="primary" @click="handleDownloadTemplate()">瀵煎嚭</el-button>
         </template>
       </ProTableQueryFilterBar>
@@ -55,18 +55,39 @@
         :columns="ServiceChargeManageColumns"
         :operationBtns="operationBtns"
       >
-        <template #operationBtn-uploadBtn="{ data, row }">
+        <template #operationBtn-uploadBtn="{ row }">
           <BlFileUpload
-            v-model:file-url="row.listFiles"
-            multiple
+            v-if="row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Wait"
+            v-model:file-url="editForm.settlementUrl"
             ref="uploadRef"
             :showTip="false"
             :show-file-list="false"
             class="pro-table-operation-btn upload-style-btn"
             :on-success="(event) => handleUploadSuccess(event, row)"
             :limitFileSize="null"
+            :limit="1"
+            accept="xlsx,xls"
           >
             <el-button text type="primary" class="pro-table-operation-btn">涓婁紶</el-button>
+          </BlFileUpload>
+        </template>
+        <template #operationBtn-reUploadBtn="{ data, row }">
+          <BlFileUpload
+            v-if="
+              row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
+              row.settlementStatus === EnumTaskSettlementStatus.Wait
+            "
+            v-model:file-url="editForm.settlementUrl"
+            ref="uploadRef"
+            :showTip="false"
+            :show-file-list="false"
+            class="pro-table-operation-btn upload-style-btn"
+            :on-success="(event) => handleUploadSuccess(event, row)"
+            :limitFileSize="null"
+            :limit="1"
+            accept="xlsx,xls"
+          >
+            <el-button text type="primary" class="pro-table-operation-btn">閲嶆柊涓婁紶</el-button>
           </BlFileUpload>
         </template>
       </ProTableV2>
@@ -93,7 +114,12 @@
   BlFileUpload,
 } from '@bole-core/components';
 import { ServiceChargeManageColumns } from './constants';
-import { EnumTaskSettlementStatusText, EnumTaskSettlementOrderStatusText } from '@/constants';
+import {
+  EnumTaskSettlementStatusText,
+  EnumTaskSettlementOrderStatusText,
+  EnumTaskSettlementOrderStatus,
+  EnumTaskSettlementStatus,
+} from '@/constants';
 import { downloadFileByUrl } from '@/utils';
 import * as taskServices from '@/services/api/task';
 import { ModelValueType } from 'element-plus';
@@ -106,30 +132,6 @@
 });
 
 const operationBtns = defineOperationBtns([
-  // {
-  //   data: {
-  //     enCode: 'uploadBtn',
-  //     name: '涓婁紶',
-  //   },
-  //   emits: {
-  //     onClick: (role) => openDialog(role),
-  //   },
-  //   extraProps: {
-  //     hide: () => false,
-  //   },
-  // },
-  // {
-  //   data: {
-  //     enCode: 'reUploadBtn',
-  //     name: '閲嶆柊涓婁紶',
-  //   },
-  //   emits: {
-  //     onClick: (role) => openDialog(role),
-  //   },
-  //   extraProps: {
-  //     hide: () => false,
-  //   },
-  // },
   {
     data: {
       enCode: 'settleBtn',
@@ -161,7 +163,7 @@
       name: '璇︽儏',
     },
     emits: {
-      onClick: (role) => goDetail(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id),
     },
   },
   {
@@ -245,28 +247,19 @@
   }
 );
 
-const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
+const { dialogProps, handleAdd, editForm } = useFormDialog({
   onConfirm: handleAddOrEdit,
   defaultFormParams: {
+    code: '',
     id: '',
     name: '',
     settlementUrl: [] as UploadUserFile[],
   },
 });
 
-function openDialog(row?: API.GetSettlementTasksQueryResultItem) {
-  if (row) {
-    handleEdit({
-      id: row?.id,
-      name: row?.name,
-      settlementUrl: [] as UploadUserFile[],
-    });
-  } else {
-    handleAdd();
-  }
+async function handleAddOrEdit() {
+  goDetail(editForm.id, editForm.settlementUrl[0]?.url);
 }
-
-async function handleAddOrEdit() {}
 
 const {
   dialogProps: dialogSettleProps,
@@ -325,15 +318,15 @@
   row: API.GetSettlementTasksQueryResultItem
 ) {
   if (response.url) {
-    goDetail(row, response.url);
+    goDetail(row.id, response.url);
   }
 }
 
-function goDetail(row: API.GetSettlementTasksQueryResultItem, url?: string) {
+function goDetail(id: string, url?: string) {
   router.push({
     name: 'ServiceChargeDetail',
     query: {
-      id: row.id,
+      id: id,
       url: url ? url : '',
     },
   });
diff --git a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
index 451b4fc..7cd652e 100644
--- a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
+++ b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
@@ -8,13 +8,14 @@
     :width="700"
   >
     <ProForm :model="form" ref="dialogForm" label-width="120px">
-      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="name" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]">
+      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code" :check-rules="[{ message: '璇烽�夋嫨浠诲姟鍗曞彿' }]">
         <ProFormSelect
-          v-model="form.name"
+          v-model="form.code"
           :valueEnum="[]"
           placeholder="璇烽�夋嫨浠诲姟鍗曞彿"
           filterable
           clearable
+          @change="handleCodeChange"
         >
         </ProFormSelect>
       </ProFormItemV2>
@@ -23,6 +24,7 @@
           style="width: 50%"
           placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
           v-model.trim="form.name"
+          disabled
         ></ProFormText>
       </ProFormItemV2>
       <ProFormItemV2
@@ -66,6 +68,7 @@
 type Form = {
   title?: string;
   id: string;
+  code: string;
   name: string;
   settlementUrl: UploadUserFile[];
 };
@@ -81,6 +84,8 @@
 
 const dialogForm = ref<FormInstance>();
 
+function handleCodeChange() {}
+
 function onDialogClose() {
   if (!dialogForm.value) return;
   dialogForm.value.resetFields();

--
Gitblit v1.9.1