From 42ff9c53a3db88eb0b311767d45452be27a5d544 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期二, 23 九月 2025 14:32:42 +0800
Subject: [PATCH] feat: 结算

---
 src/views/ServiceChargeManage/ServiceChargeManage.vue |  184 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 132 insertions(+), 52 deletions(-)

diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue
index 868fbbf..3b2dee5 100644
--- a/src/views/ServiceChargeManage/ServiceChargeManage.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -3,10 +3,10 @@
     <AppContainer>
       <ProTableQueryFilterBar @on-reset="reset">
         <template #query>
-          <QueryFilterItem tip-content="缁撶畻鍗曠姸鎬�">
+          <QueryFilterItem tip-content="楠屾敹鐘舵��">
             <FieldRadio
-              v-model="extraParamState.settlementOrderStatus"
-              :value-enum="EnumTaskSettlementOrderStatusText"
+              v-model="extraParamState.checkReceiveStatus"
+              :value-enum="EnumTaskCheckReceiveStatusTextForFilter"
               buttonStyle
               showAllBtn
               @change="getList()"
@@ -30,7 +30,7 @@
               end-placeholder="鎴鏃ユ湡"
               clearable
               @change="getList()"
-              tooltipContent="鍒涘缓鏃堕棿"
+              tooltipContent="缁撶畻鏃堕棿"
             ></FieldDatePicker>
           </QueryFilterItem>
           <QueryFilterItem>
@@ -38,16 +38,16 @@
               v-model="extraParamState.keywords"
               style="width: 250px"
               placeholder="浠诲姟鍚嶇О"
-              @on-click-search="getList"
+              @on-click-search="getList()"
               @keyup.enter="getList()"
             >
             </SearchInput>
           </QueryFilterItem>
         </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" link @click="handleDownloadTemplate()">缁撶畻鍗曟ā鏉�</el-button> -->
+          <!-- <el-button type="primary" @click="handleAdd()">涓婁紶缁撶畻鍗�</el-button> -->
+          <!-- <el-button type="primary" @click="handleDownloadTemplate()">瀵煎嚭</el-button> -->
         </template>
       </ProTableQueryFilterBar>
       <ProTableV2
@@ -55,24 +55,41 @@
         :columns="ServiceChargeManageColumns"
         :operationBtns="operationBtns"
       >
-        <template #operationBtn-uploadBtn="{ data, row }">
+        <!-- <template #operationBtn-uploadBtn="{ row }">
           <BlFileUpload
-            v-model:file-url="row.listFiles"
-            multiple
+            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" />
     <SettleDetailDialog v-bind="dialogSettleProps" />
+    <RechargeEnterpriseWalletDialog v-bind="dialogRechargeProps" />
   </LoadingLayout>
 </template>
 
@@ -93,12 +110,21 @@
   BlFileUpload,
 } from '@bole-core/components';
 import { ServiceChargeManageColumns } from './constants';
-import { EnumTaskSettlementStatusText, EnumTaskSettlementOrderStatusText } from '@/constants';
-import { downloadFileByUrl } from '@/utils';
+import {
+  EnumTaskSettlementStatusText,
+  EnumTaskSettlementOrderStatusText,
+  EnumTaskSettlementOrderStatus,
+  EnumTaskSettlementStatus,
+  EnumTaskCheckReceiveStatusText,
+  EnumTaskCheckReceiveStatusTextForFilter,
+  EnumTaskCheckReceiveStatus,
+} from '@/constants';
+import { downloadFileByUrl, format, 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 RechargeEnterpriseWalletDialog from './components/RechargeEnterpriseWalletDialog.vue';
 import { Message } from '@bole-core/core';
 
 defineOptions({
@@ -111,11 +137,9 @@
   //     enCode: 'uploadBtn',
   //     name: '涓婁紶',
   //   },
-  //   emits: {
-  //     onClick: (role) => openDialog(role),
-  //   },
   //   extraProps: {
-  //     hide: () => false,
+  //     hide: (row: API.GetSettlementTasksQueryResultItem) =>
+  //       row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait,
   //   },
   // },
   // {
@@ -123,11 +147,12 @@
   //     enCode: 'reUploadBtn',
   //     name: '閲嶆柊涓婁紶',
   //   },
-  //   emits: {
-  //     onClick: (role) => openDialog(role),
-  //   },
   //   extraProps: {
-  //     hide: () => false,
+  //     hide: (row: API.GetSettlementTasksQueryResultItem) =>
+  //       !(
+  //         row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed &&
+  //         row.settlementStatus === EnumTaskSettlementStatus.Wait
+  //       ),
   //   },
   // },
   {
@@ -136,10 +161,14 @@
       name: '缁撶畻',
     },
     emits: {
-      onClick: (role) => openSettleDialog(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role, 'settlement'),
     },
     extraProps: {
-      hide: () => false,
+      hide: (role: API.GetSettlementTasksQueryResultItem) =>
+        !(
+          role.settlementStatus === EnumTaskSettlementStatus.Wait &&
+          role.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed
+        ),
     },
   },
   {
@@ -152,7 +181,10 @@
     },
     extraProps: {
       hide: (role: API.GetSettlementTasksQueryResultItem) =>
-        role.settlementStatus !== EnumTaskSettlementStatus.InProcess,
+        !(
+          role.settlementStatus === EnumTaskSettlementStatus.InProcess &&
+          role.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed
+        ),
     },
   },
   {
@@ -161,8 +193,12 @@
       name: '璇︽儏',
     },
     emits: {
-      onClick: (role) => goDetail(role),
+      onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role),
     },
+    // extraProps: {
+    //   hide: (role: API.GetSettlementTasksQueryResultItem) =>
+    //     role.settlementOrderStatus === EnumTaskSettlementOrderStatus.Wait,
+    // },
   },
   {
     data: {
@@ -173,12 +209,14 @@
       onClick: (role) => handleExport(role),
     },
     extraProps: {
-      hide: () => false,
+      hide: () => true,
     },
   },
 ]);
 
 const router = useRouter();
+
+const { userDetail } = useUser();
 
 const eventContext = useGlobalEventContext();
 
@@ -213,8 +251,10 @@
           orderInput: extraParamState.orderInput,
         },
         keywords: extraParamState.keywords,
-        settlementOrderStatus: extraParamState.settlementOrderStatus,
+        checkReceiveStatus: extraParamState.checkReceiveStatus,
         settlementStatus: extraParamState.settlementStatus,
+        settlementTimeBegin: format(extraParamState.time?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        settlementTimeEnd: format(extraParamState.time?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
       };
 
       let res = await taskServices.getSettlementTasks(params, {
@@ -229,6 +269,7 @@
     defaultExtraParams: {
       keywords: '',
       settlementOrderStatus: '' as any as EnumTaskSettlementOrderStatus,
+      checkReceiveStatus: '' as any as EnumTaskCheckReceiveStatus,
       settlementStatus: '' as any as EnumTaskSettlementStatus,
       time: [] as unknown as ModelValueType,
       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
@@ -237,36 +278,42 @@
     columnsRenderProps: {
       settlementOrderStatus: { type: 'enum', valueEnum: EnumTaskSettlementOrderStatusText },
       settlementStatus: { type: 'enum', valueEnum: EnumTaskSettlementStatusText },
+      checkReceiveStatus: { type: 'enum', valueEnum: EnumTaskCheckReceiveStatusText },
       actualSettlementAmount: { type: 'money' },
       settlementAmount: { type: 'money' },
       settlementTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      createdTime: { 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?: API.GetSettlementTasksQueryResultItem) {
-  if (row) {
-    handleEdit({
-      id: row?.id,
-      name: row?.name,
-      settlementUrl: [] as UploadUserFile[],
-    });
-  } else {
-    handleAdd();
-  }
+async function handleAddOrEdit() {
+  try {
+    let params: API.ImportTaskSettlementOrderRostersCommand = {
+      id: editForm.id,
+      url: editForm.settlementUrl[0]?.path,
+    };
+    let res = await taskServices.importTaskSettlementOrderRosters(params);
+    if (res) {
+      goSettlementDetail(editForm.id, editForm.settlementUrl[0]?.path);
+    }
+  } catch (error) {}
 }
-
-async function handleAddOrEdit() {}
 
 const {
   dialogProps: dialogSettleProps,
@@ -279,7 +326,7 @@
     name: '',
     code: '',
     settlementUserCount: 0,
-    settlementAmount: 0,
+    actualSettlementAmount: 0,
   },
 });
 
@@ -288,27 +335,45 @@
     let params: API.SureTaskSettlementCommand = {
       taskInfoId: settleEditForm.id,
     };
-    let res = await taskServices.sureTaskSettlement(params);
+    let res = await taskServices.sureTaskSettlement(params, {
+      skipErrorHandler: true,
+    });
     if (res) {
       Message.successMessage('鎿嶄綔鎴愬姛');
       getList(paginationState.pageIndex);
     }
-  } catch (error) {}
+  } catch (error) {
+    if (error?.info?.errorCode == 's510') {
+      handleRechargeAdd();
+    }
+  }
 }
+
+const {
+  dialogProps: dialogRechargeProps,
+  handleAdd: handleRechargeAdd,
+  editForm: rechargeEditForm,
+} = useFormDialog({
+  defaultFormParams: {
+    access: EnumEnterpriseWalletAccess.Alipay,
+    amount: null as number,
+    remark: '',
+  },
+});
 
 function openSettleDialog(row: API.GetSettlementTasksQueryResultItem) {
   handleSettleEdit({
     id: row.id,
     name: row.name,
     code: row.code,
-    settlementUserCount: row.settlementUserCount,
-    settlementAmount: row.settlementAmount,
+    settlementUserCount: row.settlementUserCount ?? 0,
+    actualSettlementAmount: row.actualSettlementAmount ?? 0,
   });
 }
 
 async function handleRecall(row: API.GetSettlementTasksQueryResultItem) {
   try {
-    Message.tipMessage('纭瑕佹挙鍥炲悧锛�');
+    await Message.tipMessage('纭瑕佹挙鍥炲悧锛�');
     let params: API.RevokeTaskSettlementOrderCommand = {
       taskInfoId: row.id,
     };
@@ -324,17 +389,29 @@
   response: UploadUserFile & { file: File & { uid: number } },
   row: API.GetSettlementTasksQueryResultItem
 ) {
-  if (response.url) {
-    goDetail(row, response.url);
+  if (response.path) {
+    goSettlementDetail(row.id, response.path);
   }
 }
 
-function goDetail(row: API.GetSettlementTasksQueryResultItem, url?: string) {
+async function goSettlementDetail(id: string, url?: string) {
+  await router.push({
+    name: 'ServiceChargeDetail',
+    params: {
+      id: id,
+    },
+  });
+  editForm.settlementUrl = [] as UploadUserFile[];
+}
+
+function goDetail(row: API.GetSettlementTasksQueryResultItem, settlement?: string) {
   router.push({
     name: 'ServiceChargeDetail',
+    params: {
+      id: row?.id ?? '',
+    },
     query: {
-      id: row.id,
-      url: url ? url : '',
+      settlement: settlement ? settlement : '',
     },
   });
 }
@@ -344,6 +421,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>

--
Gitblit v1.9.1