From 1d922e2cd32532fc149fac86cd63e318431d22a4 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期五, 05 九月 2025 14:39:33 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/flexJobAdminBClient

---
 src/views/ServiceChargeManage/constants/columns.ts                 |   65 ++----
 src/hooks/useEvent.ts                                              |    1 
 src/views/ServiceChargeManage/ServiceChargeDetail.vue              |  130 ++++++++++---
 src/constants/task.ts                                              |   11 +
 .eslintrc-auto-import.json                                         |    3 
 src/views/ServiceChargeManage/ServiceChargeManage.vue              |  206 ++++++++++++++++------
 src/views/ServiceChargeManage/components/SettleDetailDialog.vue    |   16 +
 src/hooks/index.ts                                                 |    1 
 src/views/FlexJobManage/FlexJobManage.vue                          |    7 
 src/constants/oss.ts                                               |    2 
 auto-imports.d.ts                                                  |    6 
 src/views/ServiceChargeManage/components/UploadStatementDialog.vue |   25 ++
 src/hooks/settlement.ts                                            |   23 ++
 13 files changed, 355 insertions(+), 141 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index b651d98..76dc90d 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -63,7 +63,9 @@
     "EnumTaskReleaseStatusText": true,
     "EnumTaskReleaseStatusTextForTip": true,
     "EnumTaskSettlementOrderStatus": true,
+    "EnumTaskSettlementOrderStatusText": true,
     "EnumTaskSettlementStatus": true,
+    "EnumTaskSettlementStatusText": true,
     "EnumTaskStatus": true,
     "EnumTaskStatusText": true,
     "EnumTaskUserArrangeStatus": true,
@@ -227,6 +229,7 @@
     "useRouter": true,
     "useSetReactive": true,
     "useSlots": true,
+    "useTaskSelect": true,
     "useTemplateRef": true,
     "useUser": true,
     "useVModel": true,
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index 0d3f4f7..89831f3 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -68,7 +68,9 @@
   const EnumTaskReleaseStatusText: typeof import('./src/constants/task')['EnumTaskReleaseStatusText']
   const EnumTaskReleaseStatusTextForTip: typeof import('./src/constants/task')['EnumTaskReleaseStatusTextForTip']
   const EnumTaskSettlementOrderStatus: typeof import('./src/constants/apiEnum')['EnumTaskSettlementOrderStatus']
+  const EnumTaskSettlementOrderStatusText: typeof import('./src/constants/task')['EnumTaskSettlementOrderStatusText']
   const EnumTaskSettlementStatus: typeof import('./src/constants/apiEnum')['EnumTaskSettlementStatus']
+  const EnumTaskSettlementStatusText: typeof import('./src/constants/task')['EnumTaskSettlementStatusText']
   const EnumTaskStatus: typeof import('./src/constants/apiEnum')['EnumTaskStatus']
   const EnumTaskStatusText: typeof import('./src/constants/task')['EnumTaskStatusText']
   const EnumTaskUserArrangeStatus: typeof import('./src/constants/apiEnum')['EnumTaskUserArrangeStatus']
@@ -220,6 +222,7 @@
   const useSetReactive: typeof import('./src/hooks/global/helper')['useSetReactive']
   const useSign: typeof import('./src/hooks/sign')['useSign']
   const useSlots: typeof import('vue')['useSlots']
+  const useTaskSelect: typeof import('./src/hooks/settlement')['useTaskSelect']
   const useTemplateRef: typeof import('vue')['useTemplateRef']
   const useUser: typeof import('./src/hooks/useUser')['useUser']
   const useVModel: typeof import('./src/hooks/help')['useVModel']
@@ -327,7 +330,9 @@
     readonly EnumTaskReleaseStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskReleaseStatusText']>
     readonly EnumTaskReleaseStatusTextForTip: UnwrapRef<typeof import('./src/constants/task')['EnumTaskReleaseStatusTextForTip']>
     readonly EnumTaskSettlementOrderStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskSettlementOrderStatus']>
+    readonly EnumTaskSettlementOrderStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskSettlementOrderStatusText']>
     readonly EnumTaskSettlementStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskSettlementStatus']>
+    readonly EnumTaskSettlementStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskSettlementStatusText']>
     readonly EnumTaskStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskStatus']>
     readonly EnumTaskStatusText: UnwrapRef<typeof import('./src/constants/task')['EnumTaskStatusText']>
     readonly EnumTaskUserArrangeStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumTaskUserArrangeStatus']>
@@ -471,6 +476,7 @@
     readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
     readonly useSetReactive: UnwrapRef<typeof import('./src/hooks/global/helper')['useSetReactive']>
     readonly useSlots: UnwrapRef<typeof import('vue')['useSlots']>
+    readonly useTaskSelect: UnwrapRef<typeof import('./src/hooks/settlement')['useTaskSelect']>
     readonly useTemplateRef: UnwrapRef<typeof import('vue')['useTemplateRef']>
     readonly useUser: UnwrapRef<typeof import('./src/hooks/useUser')['useUser']>
     readonly useVModel: UnwrapRef<typeof import('./src/hooks/help')['useVModel']>
diff --git a/src/constants/oss.ts b/src/constants/oss.ts
index 91a3a78..5b0b1f0 100644
--- a/src/constants/oss.ts
+++ b/src/constants/oss.ts
@@ -4,7 +4,7 @@
 
 export const OSSBaseURL = VITE_OSS_URL;
 
-const _basicPath = '12333/YeXing/';
+const _basicPath = 'FlexJob/';
 
 export const OssHRSIE = _basicPath + 'HRSIE/';
 
diff --git a/src/constants/task.ts b/src/constants/task.ts
index 79bf326..6cf4a5e 100644
--- a/src/constants/task.ts
+++ b/src/constants/task.ts
@@ -73,3 +73,14 @@
   [EnumTaskUserSubmitCheckReceiveStatus.Success]: '楠屾敹閫氳繃',
   [EnumTaskUserSubmitCheckReceiveStatus.Fail]: '楠屾敹鏈�氳繃',
 };
+
+export const EnumTaskSettlementOrderStatusText = {
+  [EnumTaskSettlementOrderStatus.Wait]: '寰呬笂浼�',
+  [EnumTaskSettlementOrderStatus.Completed]: '宸蹭笂浼�',
+};
+
+export const EnumTaskSettlementStatusText = {
+  [EnumTaskSettlementStatus.Wait]: '寰呯粨绠�',
+  [EnumTaskSettlementStatus.InProcess]: '缁撶畻涓�',
+  [EnumTaskSettlementStatus.Completed]: '宸茬粨绠�',
+};
diff --git a/src/hooks/index.ts b/src/hooks/index.ts
index e79975f..bf536bc 100644
--- a/src/hooks/index.ts
+++ b/src/hooks/index.ts
@@ -9,3 +9,4 @@
 export * from './menu';
 export * from './dic';
 export * from './sign';
+export * from './settlement';
diff --git a/src/hooks/settlement.ts b/src/hooks/settlement.ts
new file mode 100644
index 0000000..afc6f9c
--- /dev/null
+++ b/src/hooks/settlement.ts
@@ -0,0 +1,23 @@
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
+import * as taskServices from '@/services/api/task';
+
+export function useTaskSelect() {
+  const queryClient = useQueryClient();
+
+  const { data } = useQuery({
+    queryKey: ['taskServices/getTaskSelect'],
+    queryFn: () => {
+      return taskServices.getTaskSelect(
+        {},
+        {
+          showLoading: false,
+        }
+      );
+    },
+    placeholderData: () => [] as API.SelectOptionGuidGetTaskSelectQueryOption[],
+  });
+
+  const taskSelect = computed(() => data.value?.map((x) => x.data));
+
+  return { taskSelect };
+}
diff --git a/src/hooks/useEvent.ts b/src/hooks/useEvent.ts
index f897656..3d01572 100644
--- a/src/hooks/useEvent.ts
+++ b/src/hooks/useEvent.ts
@@ -5,6 +5,7 @@
   'home:add': any;
   'taskManage:add': any;
   'taskManage:edit': any;
+  sureTaskSettlementOrder: any;
   checkReceiveTask: any;
 };
 
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
index 5cb7a19..60d3901 100644
--- a/src/views/FlexJobManage/FlexJobManage.vue
+++ b/src/views/FlexJobManage/FlexJobManage.vue
@@ -538,6 +538,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 0f4c891..f10c238 100644
--- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -1,6 +1,6 @@
 <template>
   <LoadingLayout :loading="isLoading">
-    <AppScrollContainer>
+    <AppContainer>
       <ChunkCell title="缁撶畻鍗曡鎯�">
         <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true">
           <ProFormCol>
@@ -10,22 +10,21 @@
               </ProFormItemV2>
             </ProFormColItem>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="浠诲姟缂栧彿:" prop="name">
-                <ProFormText v-model="form.name"> </ProFormText>
+              <ProFormItemV2 label="浠诲姟缂栧彿:" prop="code">
+                <ProFormText v-model="form.code"> </ProFormText>
               </ProFormItemV2>
             </ProFormColItem>
-            <ProFormColItem :span="8"></ProFormColItem>
           </ProFormCol>
           <ProFormCol>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="name">
-                <ProFormText v-model="form.name"> </ProFormText>
+              <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="settlementOrderName">
+                <ProFormText v-model="form.settlementOrderName"> </ProFormText>
               </ProFormItemV2>
             </ProFormColItem>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="涓婁紶鏃堕棿:" prop="name">
+              <ProFormItemV2 label="涓婁紶鏃堕棿:" prop="settlementOrderTime">
                 <ProFormDatePicker
-                  v-model="form.name"
+                  v-model="form.settlementOrderTime"
                   type="date"
                   format="YYYY-MM-DD HH:mm"
                 ></ProFormDatePicker>
@@ -34,13 +33,13 @@
           </ProFormCol>
           <ProFormCol>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="缁撶畻閲戦:" prop="money">
-                <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
+              <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount">
+                <ProFormText v-model="form.settlementAmount"> </ProFormText>
               </ProFormItemV2>
             </ProFormColItem>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="瀹炲彂閲戦:" prop="money">
-                <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
+              <ProFormItemV2 label="瀹炲彂閲戦:" prop="actualSettlementAmount">
+                <ProFormText v-model="form.actualSettlementAmount"> </ProFormText>
               </ProFormItemV2>
             </ProFormColItem>
           </ProFormCol>
@@ -68,7 +67,7 @@
           </el-steps>
         </div>
       </ChunkCell> -->
-      <ChunkCell title="缁撶畻鍚嶅崟">
+      <ChunkCell title="缁撶畻鍚嶅崟" style="flex: 1">
         <ProTableQueryFilterBar @on-reset="reset">
           <template #query>
             <QueryFilterItem>
@@ -85,7 +84,7 @@
         <ProTableV2
           v-bind="proTableProps"
           :columns="SettlementListColumns"
-          :operationBtns="operationBtns"
+          :show-operation-column="false"
           :auto-height="false"
           ref="proTable"
           :tableProps="{
@@ -93,14 +92,25 @@
           }"
         >
         </ProTableV2>
+        <div class="chuck-add-or-edit-actions">
+          <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button>
+          <el-button
+            v-if="!isDetail"
+            class="chuck-add-or-edit-actions"
+            type="primary"
+            @click="handleSubmit"
+            >纭</el-button
+          >
+        </div>
       </ChunkCell>
-    </AppScrollContainer>
+    </AppContainer>
     <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog>
   </LoadingLayout>
 </template>
 <script setup lang="ts">
 import {
   LoadingLayout,
+  AppContainer,
   AppScrollContainer,
   ChunkCell,
   ProForm,
@@ -110,27 +120,28 @@
   ProFormColItem,
   ProFormDatePicker,
   ProFormInputNumber,
-  ProFormRadio,
   useTable,
   ProTableV2,
   defineOperationBtns,
   SearchInput,
   QueryFilterItem,
   ProTableQueryFilterBar,
-  TextOverTooltip,
   useFormDialog,
 } from '@bole-core/components';
-import { Edit, Upload } from '@element-plus/icons-vue';
 import { SettlementListColumns } from './constants';
 import { useQuery } from '@tanstack/vue-query';
-import { downloadFileByUrl } from '@bole-core/core';
 import * as taskServices from '@/services/api/task';
+import * as taskUserServices from '@/services/api/taskUser';
 import EditAccountInfoDialog from './components/EditAccountInfoDialog.vue';
+import { Message } from '@bole-core/core';
+import { paginateList, setOssFileName, toThousand } from '@/utils';
 
 defineOptions({
   name: 'ServiceChargeDetail',
 });
 
+const { closeViewPush } = useRouteView();
+const eventContext = useGlobalEventContext();
 const operationBtns = defineOperationBtns([
   {
     data: {
@@ -145,26 +156,37 @@
 
 const route = useRoute();
 const id = (route.params.id as string) ?? '';
+const url = (route.query.url as string) ?? '';
+
+const isDetail = computed(() => !url);
 
 const form = reactive({
   name: '',
-  money: 0,
-  status: 1,
+  settlementAmount: '',
+  actualSettlementAmount: '',
+  code: '',
+  settlementOrderName: '',
+  settlementOrderTime: '',
 });
 
 const { isLoading } = useQuery({
-  queryKey: ['taskServices/getTaskInfo', id],
+  queryKey: ['taskServices/getSettlementTask', id],
   queryFn: async () => {
-    return await taskServices.getTaskInfo(
+    return await taskServices.getSettlementTask(
       { id: id },
       {
         showLoading: false,
       }
     );
   },
-  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
+  placeholderData: () => ({} as API.GetSettlementTaskQueryResult),
   onSuccess(data) {
     form.name = data.name;
+    form.settlementAmount = toThousand(data.settlementAmount);
+    form.actualSettlementAmount = toThousand(data.actualSettlementAmount);
+    form.code = data.code;
+    form.settlementOrderName = setOssFileName(data.settlementOrderName);
+    form.settlementOrderTime = data.settlementOrderTime ?? '';
   },
   enabled: !!id,
 });
@@ -178,17 +200,28 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetOpenTaskInfosQuery = {
+      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,
         },
-        keywords: extraParamState.keywords,
-      };
-
-      let res = await taskServices.getOpenTaskInfos(params);
-      return res;
+        data: paginateList(res.data, pageIndex, pageSize),
+      });
     } catch (error) {
       console.log('error: ', error);
     }
@@ -198,8 +231,12 @@
       keywords: '',
       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
     },
-    queryKey: ['taskServices/getOpenTaskInfos'],
-    columnsRenderProps: {},
+    queryKey: ['taskUserServices/getSettlementTaskUsers'],
+    columnsRenderProps: {
+      settlementTime: { type: 'date' },
+      settlementAmount: { type: 'money' },
+      actualSettlementAmount: { type: 'money' },
+    },
   }
 );
 
@@ -222,6 +259,33 @@
 
 async function handleAddOrEdit() {}
 
+async function handleSubmit() {
+  try {
+    let params: API.SureTaskSettlementOrderCommand = {
+      taskInfoId: id,
+      settlementOrderUrl: url,
+      taskInfoUsers:
+        proTableProps.value.tableData?.length > 0
+          ? proTableProps.value.tableData.map(
+              (x) => ({ ...x } as API.SureTaskSettlementOrderCommandUser)
+            )
+          : [],
+    };
+    let res = await taskServices.sureTaskSettlementOrder(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      eventContext.emit('sureTaskSettlementOrder');
+      handleBack();
+    }
+  } catch (error) {}
+}
+
+function handleBack() {
+  closeViewPush(route, {
+    name: 'ServiceChargeManageList',
+  });
+}
+
 onMounted(() => {
   getList();
 });
diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue
index 47361e8..8c76c8c 100644
--- a/src/views/ServiceChargeManage/ServiceChargeManage.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -5,11 +5,8 @@
         <template #query>
           <QueryFilterItem tip-content="缁撶畻鍗曠姸鎬�">
             <FieldRadio
-              v-model="extraParamState.status"
-              :value-enum="[
-                { label: '宸插畨鎺�', value: 1 },
-                { label: '寰呭畨鎺�', value: 0 },
-              ]"
+              v-model="extraParamState.settlementOrderStatus"
+              :value-enum="EnumTaskSettlementOrderStatusText"
               buttonStyle
               showAllBtn
               @change="getList()"
@@ -17,17 +14,14 @@
           </QueryFilterItem>
           <QueryFilterItem tip-content="缁撶畻鐘舵��">
             <FieldRadio
-              v-model="extraParamState.status"
-              :value-enum="[
-                { label: '宸插畨鎺�', value: 1 },
-                { label: '寰呭畨鎺�', value: 0 },
-              ]"
+              v-model="extraParamState.settlementStatus"
+              :value-enum="EnumTaskSettlementStatusText"
               buttonStyle
               showAllBtn
               @change="getList()"
             />
           </QueryFilterItem>
-          <QueryFilterItem>
+          <!-- <QueryFilterItem>
             <FieldDatePicker
               v-model="extraParamState.time"
               type="daterange"
@@ -38,10 +32,10 @@
               @change="getList()"
               tooltipContent="鍒涘缓鏃堕棿"
             ></FieldDatePicker>
-          </QueryFilterItem>
+          </QueryFilterItem> -->
           <QueryFilterItem>
             <SearchInput
-              v-model="extraParamState.searchWord"
+              v-model="extraParamState.keywords"
               style="width: 250px"
               placeholder="浠诲姟鍚嶇О"
               @on-click-search="getList"
@@ -52,9 +46,8 @@
         </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="handleDownloadTemplate()">瀵煎嚭</el-button>
+          <el-button type="primary" @click="handleAdd()">涓婁紶缁撶畻鍗�</el-button>
+          <!-- <el-button type="primary" @click="handleDownloadTemplate()">瀵煎嚭</el-button> -->
         </template>
       </ProTableQueryFilterBar>
       <ProTableV2
@@ -62,6 +55,36 @@
         :columns="ServiceChargeManageColumns"
         :operationBtns="operationBtns"
       >
+        <template #operationBtn-uploadBtn="{ row }">
+          <BlFileUpload
+            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-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>
     </AppContainer>
     <UploadStatementDialog v-bind="dialogProps" />
@@ -83,13 +106,21 @@
   defineOperationBtns,
   useFormDialog,
   UploadUserFile,
+  BlFileUpload,
 } from '@bole-core/components';
 import { ServiceChargeManageColumns } from './constants';
-import { downloadFileByUrl } from '@/utils';
+import {
+  EnumTaskSettlementStatusText,
+  EnumTaskSettlementOrderStatusText,
+  EnumTaskSettlementOrderStatus,
+  EnumTaskSettlementStatus,
+} from '@/constants';
+import { downloadFileByUrl, setOssFileName } from '@/utils';
 import * as taskServices from '@/services/api/task';
 import { ModelValueType } from 'element-plus';
 import UploadStatementDialog from './components/UploadStatementDialog.vue';
 import SettleDetailDialog from './components/SettleDetailDialog.vue';
+import { Message } from '@bole-core/core';
 
 defineOptions({
   name: 'ServiceChargeManageList',
@@ -101,11 +132,9 @@
       enCode: 'uploadBtn',
       name: '涓婁紶',
     },
-    emits: {
-      onClick: (role) => openDialog(role),
-    },
     extraProps: {
-      hide: () => false,
+      hide: (row: API.GetSettlementTasksQueryResultItem) =>
+        row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait,
     },
   },
   {
@@ -113,11 +142,12 @@
       enCode: 'reUploadBtn',
       name: '閲嶆柊涓婁紶',
     },
-    emits: {
-      onClick: (role) => openDialog(role),
-    },
     extraProps: {
-      hide: () => false,
+      hide: (row: API.GetSettlementTasksQueryResultItem) =>
+        !(
+          row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
+          row.settlementStatus === EnumTaskSettlementStatus.Wait
+        ),
     },
   },
   {
@@ -126,10 +156,14 @@
       name: '缁撶畻',
     },
     emits: {
-      onClick: (role) => openSettleDialog(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => openSettleDialog(role),
     },
     extraProps: {
-      hide: () => false,
+      hide: (role: API.GetSettlementTasksQueryResultItem) =>
+        !(
+          role.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
+          role.settlementStatus === EnumTaskSettlementStatus.Wait
+        ),
     },
   },
   {
@@ -141,7 +175,8 @@
       onClick: (role) => handleRecall(role),
     },
     extraProps: {
-      hide: () => false,
+      hide: (role: API.GetSettlementTasksQueryResultItem) =>
+        role.settlementStatus !== EnumTaskSettlementStatus.InProcess,
     },
   },
   {
@@ -150,7 +185,11 @@
       name: '璇︽儏',
     },
     emits: {
-      onClick: (role) => goDetail(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id),
+    },
+    extraProps: {
+      hide: (role: API.GetSettlementTasksQueryResultItem) =>
+        role.settlementOrderStatus === EnumTaskSettlementOrderStatus.Wait,
     },
   },
   {
@@ -168,6 +207,12 @@
 ]);
 
 const router = useRouter();
+
+const eventContext = useGlobalEventContext();
+
+eventContext.addEvent('sureTaskSettlementOrder', () => {
+  getList(paginationState.pageIndex);
+});
 
 const BaseState = {
   loading: true,
@@ -189,15 +234,18 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetTaskInfosQuery = {
+      let params: API.GetSettlementTasksQuery = {
         pageModel: {
           rows: pageSize,
           page: pageIndex,
           orderInput: extraParamState.orderInput,
         },
+        keywords: extraParamState.keywords,
+        settlementOrderStatus: extraParamState.settlementOrderStatus,
+        settlementStatus: extraParamState.settlementStatus,
       };
 
-      let res = await taskServices.getTaskInfos(params, {
+      let res = await taskServices.getSettlementTasks(params, {
         showLoading: !state.loading,
       });
       return res;
@@ -207,38 +255,42 @@
   },
   {
     defaultExtraParams: {
-      searchWord: '',
-      status: 0,
+      keywords: '',
+      settlementOrderStatus: '' as any as EnumTaskSettlementOrderStatus,
+      settlementStatus: '' as any as EnumTaskSettlementStatus,
       time: [] as unknown as ModelValueType,
       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
     },
-    queryKey: ['taskServices/getTaskInfos'],
-    columnsRenderProps: {},
+    queryKey: ['taskServices/getSettlementTasks'],
+    columnsRenderProps: {
+      settlementOrderStatus: { type: 'enum', valueEnum: EnumTaskSettlementOrderStatusText },
+      settlementStatus: { type: 'enum', valueEnum: EnumTaskSettlementStatusText },
+      actualSettlementAmount: { type: 'money' },
+      settlementAmount: { type: 'money' },
+      settlementTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      settlementOrderTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      settlementOrderName: {
+        formatter: (row: API.GetSettlementTasksQueryResultItem) =>
+          row.settlementOrderName && setOssFileName(row.settlementOrderName),
+      },
+    },
   }
 );
 
-const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
+const { dialogProps, handleAdd, editForm } = useFormDialog({
   onConfirm: handleAddOrEdit,
   defaultFormParams: {
+    code: '',
     id: '',
     name: '',
     settlementUrl: [] as UploadUserFile[],
   },
 });
 
-function openDialog(row?) {
-  if (row) {
-    handleEdit({
-      id: row?.id,
-      name: row?.name,
-      settlementUrl: [] as UploadUserFile[],
-    });
-  } else {
-    handleAdd();
-  }
+async function handleAddOrEdit() {
+  console.log('editForm: ', editForm);
+  goDetail(editForm.id, editForm.settlementUrl[0]?.path);
 }
-
-async function handleAddOrEdit() {}
 
 const {
   dialogProps: dialogSettleProps,
@@ -249,27 +301,66 @@
   defaultFormParams: {
     id: '',
     name: '',
-    count: 0,
+    code: '',
+    settlementUserCount: 0,
+    settlementAmount: 0,
   },
 });
 
-async function handleSettle() {}
+async function handleSettle() {
+  try {
+    let params: API.SureTaskSettlementCommand = {
+      taskInfoId: settleEditForm.id,
+    };
+    let res = await taskServices.sureTaskSettlement(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
 
-function openSettleDialog(row?) {
+function openSettleDialog(row: API.GetSettlementTasksQueryResultItem) {
   handleSettleEdit({
     id: row.id,
     name: row.name,
-    count: row.count,
+    code: row.code,
+    settlementUserCount: row.settlementUserCount ?? 0,
+    settlementAmount: row.settlementAmount ?? 0,
   });
 }
 
-function handleRecall(row) {}
+async function handleRecall(row: API.GetSettlementTasksQueryResultItem) {
+  try {
+    Message.tipMessage('纭瑕佹挙鍥炲悧锛�');
+    let params: API.RevokeTaskSettlementOrderCommand = {
+      taskInfoId: row.id,
+    };
+    let res = await taskServices.revokeTaskSettlementOrder(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
 
-function goDetail(row) {
+function handleUploadSuccess(
+  response: UploadUserFile & { file: File & { uid: number } },
+  row: API.GetSettlementTasksQueryResultItem
+) {
+  if (response.path) {
+    goDetail(row.id, response.path);
+  }
+}
+
+function goDetail(id: string, url?: string) {
   router.push({
     name: 'ServiceChargeDetail',
     params: {
-      id: row.id,
+      id: id,
+    },
+    query: {
+      url: url ? url : '',
     },
   });
 }
@@ -279,6 +370,9 @@
 }
 
 function handleDownloadTemplate() {
-  downloadFileByUrl('', '缁撶畻鍗曟ā鏉�');
+  downloadFileByUrl(
+    'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/FlexJob/temp/%E7%BB%93%E7%AE%97%E5%8D%95%E6%A8%A1%E6%9D%BF.xlsx',
+    '缁撶畻鍗曟ā鏉�'
+  );
 }
 </script>
diff --git a/src/views/ServiceChargeManage/components/SettleDetailDialog.vue b/src/views/ServiceChargeManage/components/SettleDetailDialog.vue
index 189905a..181b6bf 100644
--- a/src/views/ServiceChargeManage/components/SettleDetailDialog.vue
+++ b/src/views/ServiceChargeManage/components/SettleDetailDialog.vue
@@ -8,17 +8,17 @@
     :width="700"
   >
     <ProForm :model="form" ref="dialogForm" label-width="120px" is-read>
-      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="name">
-        <ProFormSelect v-model="form.name" :valueEnum="[]"> </ProFormSelect>
+      <ProFormItemV2 label="浠诲姟鍗曞彿锛�" prop="code">
+        <ProFormSelect v-model="form.code" :valueEnum="[]"> </ProFormSelect>
       </ProFormItemV2>
       <ProFormItemV2 label="浠诲姟鍚嶇О锛�" prop="name">
         <ProFormText v-model.trim="form.name"></ProFormText>
       </ProFormItemV2>
-      <ProFormItemV2 label="缁撶畻浜烘暟锛�" prop="count">
-        <ProFormInputNumber v-model="form.count" unit="浜�"> </ProFormInputNumber>
+      <ProFormItemV2 label="缁撶畻浜烘暟锛�" prop="settlementUserCount">
+        <ProFormInputNumber v-model="form.settlementUserCount" unit="浜�"> </ProFormInputNumber>
       </ProFormItemV2>
-      <ProFormItemV2 label="缁撶畻閲戦锛�" prop="count">
-        <ProFormInputNumber v-model="form.count" unit="鍏�"> </ProFormInputNumber>
+      <ProFormItemV2 label="缁撶畻閲戦锛�" prop="settlementAmount">
+        <ProFormInputNumber v-model="form.settlementAmount" unit="鍏�"> </ProFormInputNumber>
       </ProFormItemV2>
     </ProForm>
     <template #footer>
@@ -49,7 +49,9 @@
   title?: string;
   id: string;
   name: string;
-  count: number;
+  code: string;
+  settlementUserCount: number;
+  settlementAmount: number;
 };
 
 const visible = defineModel({ type: Boolean });
diff --git a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
index 451b4fc..46e8393 100644
--- a/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
+++ b/src/views/ServiceChargeManage/components/UploadStatementDialog.vue
@@ -8,13 +8,16 @@
     :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"
-          :valueEnum="[]"
+          v-model="form.code"
+          :valueEnum="taskSelect"
           placeholder="璇烽�夋嫨浠诲姟鍗曞彿"
+          enum-value-key="id"
+          enum-label-key="code"
           filterable
           clearable
+          @change="handleCodeChange"
         >
         </ProFormSelect>
       </ProFormItemV2>
@@ -23,6 +26,7 @@
           style="width: 50%"
           placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
           v-model.trim="form.name"
+          disabled
         ></ProFormText>
       </ProFormItemV2>
       <ProFormItemV2
@@ -34,7 +38,7 @@
           v-model:file-url="form.settlementUrl"
           :limit="1"
           :limitFileSize="10"
-          accept="jpg/jpeg,png,pdf"
+          accept="xlsx,xls"
         ></ProFormUpload>
       </ProFormItemV2>
     </ProForm>
@@ -58,6 +62,7 @@
   ProFormSelect,
   UploadUserFile,
 } from '@bole-core/components';
+import { Message } from '@bole-core/core';
 
 defineOptions({
   name: 'UploadStatementDialog',
@@ -66,9 +71,12 @@
 type Form = {
   title?: string;
   id: string;
+  code: string;
   name: string;
   settlementUrl: UploadUserFile[];
 };
+
+const { taskSelect } = useTaskSelect();
 
 const visible = defineModel({ type: Boolean });
 
@@ -81,6 +89,15 @@
 
 const dialogForm = ref<FormInstance>();
 
+function handleCodeChange(value: string) {
+  if (value) {
+    form.value.name = taskSelect.value?.find((item) => item.id === value)?.name ?? '';
+    form.value.id = value;
+  } else {
+    Message.errorMessage('璇烽�夋嫨浠诲姟鍗曞彿');
+  }
+}
+
 function onDialogClose() {
   if (!dialogForm.value) return;
   dialogForm.value.resetFields();
diff --git a/src/views/ServiceChargeManage/constants/columns.ts b/src/views/ServiceChargeManage/constants/columns.ts
index f9bb4a0..aecda4a 100644
--- a/src/views/ServiceChargeManage/constants/columns.ts
+++ b/src/views/ServiceChargeManage/constants/columns.ts
@@ -8,62 +8,47 @@
   },
   {
     id: '2',
-    enCode: 'name',
+    enCode: 'code',
     name: '浠诲姟鍗曞彿',
   },
   {
     id: '3',
-    enCode: 'name',
-    name: '鍙戞斁鏂瑰紡',
-  },
-  {
-    id: '4',
-    enCode: 'name',
+    enCode: 'settlementOrderStatus',
     name: '缁撶畻鍗曠姸鎬�',
   },
   {
-    id: '5',
-    enCode: 'name',
+    id: '4',
+    enCode: 'settlementOrderName',
     name: '缁撶畻鍗曞悕绉�',
   },
   {
-    id: '6',
-    enCode: 'name',
+    id: '5',
+    enCode: 'settlementOrderTime',
     name: '涓婁紶鏃堕棿',
   },
   {
-    id: '7',
-    enCode: 'name',
-    name: '缁撶畻鐘舵��',
-  },
-  {
-    id: '8',
-    enCode: 'name',
+    id: '6',
+    enCode: 'actualSettlementAmount',
     name: '瀹炲彂閲戦',
   },
   {
-    id: '9',
-    enCode: 'name',
+    id: '7',
+    enCode: 'settlementAmount',
     name: '缁撶畻閲戦',
   },
   {
-    id: '10',
-    enCode: 'name',
-    name: '澶辫触閲戦',
+    id: '8',
+    enCode: 'settlementStatus',
+    name: '缁撶畻鐘舵��',
   },
   {
-    id: '11',
-    enCode: 'name',
-    name: '閫�娆鹃噾棰�',
-  },
-  {
-    id: '12',
-    enCode: 'name',
+    id: '9',
+    enCode: 'settlementTime',
     name: '缁撶畻鏃堕棿',
   },
   {
-    id: '13',
-    enCode: 'name',
+    id: '10',
+    enCode: 'settlementRemark',
     name: '澶囨敞',
   },
 ]);
@@ -76,42 +61,42 @@
   },
   {
     id: '2',
-    enCode: 'name',
+    enCode: 'identity',
     name: '韬唤璇佸彿',
   },
   {
     id: '3',
-    enCode: 'name',
+    enCode: 'contactPhoneNumber',
     name: '鎵嬫満鍙�',
   },
   {
     id: '4',
-    enCode: 'name',
+    enCode: 'bank',
     name: '鎵�灞為摱琛�',
   },
   {
     id: '5',
-    enCode: 'name',
+    enCode: 'bankBranch',
     name: '鎵�灞炴敮琛�',
   },
   {
     id: '6',
-    enCode: 'name',
+    enCode: 'receiveAccount',
     name: '鏀舵甯愭埛',
   },
   {
     id: '7',
-    enCode: 'signNum',
+    enCode: 'settlementAmount',
     name: '缁撶畻閲戦',
   },
   {
     id: '8',
-    enCode: 'name',
+    enCode: 'actualSettlementAmount',
     name: '瀹炲彂閲戦',
   },
   {
     id: '9',
-    enCode: 'name',
+    enCode: 'settlementTime',
     name: '缁撶畻鏃堕棿',
   },
 ]);

--
Gitblit v1.9.1