From b331f884097a2dc5086c8cf043c8c8f52e7640fe Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 12 九月 2025 17:34:39 +0800
Subject: [PATCH] Merge branch 'master' into dev-v1.1

---
 src/views/ServiceChargeManage/ServiceChargeDetail.vue |  275 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 210 insertions(+), 65 deletions(-)

diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
index 0f4c891..72b74e5 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,65 +10,44 @@
               </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>
+          <!-- <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>
               </ProFormItemV2>
             </ProFormColItem>
-          </ProFormCol>
+          </ProFormCol> -->
           <ProFormCol>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="缁撶畻閲戦:" prop="money">
-                <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
+              <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount">
+                <ProFormInputNumber v-model="form.settlementAmount" format-value="money">
+                </ProFormInputNumber>
               </ProFormItemV2>
             </ProFormColItem>
             <ProFormColItem :span="8">
-              <ProFormItemV2 label="瀹炲彂閲戦:" prop="money">
-                <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
+              <ProFormItemV2 label="瀹炲彂閲戦:" prop="actualSettlementAmount">
+                <ProFormInputNumber v-model="form.actualSettlementAmount" format-value="money">
+                </ProFormInputNumber>
               </ProFormItemV2>
             </ProFormColItem>
           </ProFormCol>
         </ProForm>
       </ChunkCell>
-      <!-- <ChunkCell title="缁撶畻娴佺▼">
-        <div class="step-wrapper">
-          <el-steps :active="1" align-center finish-status="process">
-            <el-step title="缁撶畻鍗曚笂浼�" :icon="Edit">
-              <template #description>
-                <div>鍒涘缓浜�:{{ form.name }}</div>
-                <div>鏃堕棿:{{ form.name }}</div>
-                <TextOverTooltip>澶囨敞:{{ form.name }}</TextOverTooltip>
-              </template>
-            </el-step>
-            <el-step title="缁撶畻浠樻" :icon="Upload">
-              <template #description>
-                <div>鍒涘缓浜�:{{ form.name }}</div>
-                <div>鏃堕棿:{{ form.name }}</div>
-                <TextOverTooltip
-                  >澶囨敞:{{ 'form.nameform.nameform.eform.nameform.nameform.name' }}</TextOverTooltip
-                >
-              </template>
-            </el-step>
-          </el-steps>
-        </div>
-      </ChunkCell> -->
-      <ChunkCell title="缁撶畻鍚嶅崟">
+      <ChunkCell title="缁撶畻鍚嶅崟" style="flex: 1" class="settlement-user-list-chunk">
         <ProTableQueryFilterBar @on-reset="reset">
           <template #query>
             <QueryFilterItem>
@@ -81,27 +60,54 @@
               </SearchInput>
             </QueryFilterItem>
           </template>
+          <template #btn v-if="isSettlement">
+            <BlFileUpload
+              v-model:file-url="form.settlementUrl"
+              ref="uploadRef"
+              :showTip="false"
+              :show-file-list="false"
+              class="pro-table-operation-btn upload-style-btn"
+              :on-success="(event) => handleUploadSuccess(event)"
+              :limitFileSize="null"
+              :limit="1"
+              accept="xlsx,xls"
+            >
+              <el-button text type="primary" class="pro-table-operation-btn">瀵煎叆</el-button>
+            </BlFileUpload>
+            <el-button type="primary" link @click="handleDownload()">瀵煎嚭</el-button>
+          </template>
         </ProTableQueryFilterBar>
         <ProTableV2
           v-bind="proTableProps"
           :columns="SettlementListColumns"
-          :operationBtns="operationBtns"
+          :show-operation-column="false"
           :auto-height="false"
           ref="proTable"
           :tableProps="{
-            maxHeight: '400px',
+            maxHeight: '250px',
           }"
         >
         </ProTableV2>
+        <div class="chuck-add-or-edit-actions">
+          <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button>
+          <el-button
+            v-if="isSettlement"
+            class="chuck-add-or-edit-actions"
+            type="primary"
+            @click="handleSubmit"
+            >缁撶畻</el-button
+          >
+        </div>
       </ChunkCell>
-    </AppScrollContainer>
+    </AppContainer>
     <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog>
+    <SettleDetailDialog v-bind="dialogSettleProps" />
   </LoadingLayout>
 </template>
 <script setup lang="ts">
 import {
   LoadingLayout,
-  AppScrollContainer,
+  AppContainer,
   ChunkCell,
   ProForm,
   ProFormItemV2,
@@ -110,27 +116,32 @@
   ProFormColItem,
   ProFormDatePicker,
   ProFormInputNumber,
-  ProFormRadio,
   useTable,
   ProTableV2,
   defineOperationBtns,
   SearchInput,
   QueryFilterItem,
   ProTableQueryFilterBar,
-  TextOverTooltip,
   useFormDialog,
+  XLSXUtils,
+  BlFileUpload,
+  UploadUserFile,
 } 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 SettleDetailDialog from './components/SettleDetailDialog.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: {
@@ -142,29 +153,72 @@
     },
   },
 ]);
-
 const route = useRoute();
 const id = (route.params.id as string) ?? '';
+const url = (route.query.url as string) ?? '';
+const settlement = (route.query.settlement as string) ?? '';
+
+const isSettlement = computed(() => !!url || !!settlement);
 
 const form = reactive({
   name: '',
-  money: 0,
-  status: 1,
+  settlementAmount: 0,
+  actualSettlementAmount: 0,
+  code: '',
+  settlementOrderName: '',
+  settlementOrderTime: '',
+  settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[],
+
+  settlementUrl: [] as UploadUserFile[],
 });
 
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
 const { isLoading } = useQuery({
-  queryKey: ['taskServices/getTaskInfo', id],
+  queryKey: ['taskUserServices/getSettlementTaskUsers', id, url],
   queryFn: async () => {
-    return await taskServices.getTaskInfo(
-      { id: id },
+    return await taskUserServices.getSettlementTaskUsers(
+      { taskInfoId: id, settlementOrderUrl: url },
       {
         showLoading: false,
       }
     );
   },
-  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
-  onSuccess(data) {
-    form.name = data.name;
+  placeholderData: () => ({} as API.GetSettlementTaskUsersQueryResult),
+  onSuccess(res) {
+    form.settlementTaskUsers = res?.data ?? [];
+    if (res?.detail) {
+      form.name = res?.detail?.name;
+      form.settlementAmount = res?.detail?.settlementAmount ?? 0;
+      form.actualSettlementAmount = res?.detail?.actualSettlementAmount ?? 0;
+      form.code = res?.detail?.code;
+      form.settlementOrderName = setOssFileName(res?.detail?.settlementOrderName);
+      form.settlementOrderTime = res?.detail?.settlementOrderTime ?? '';
+    }
+    if (res?.errors?.length > 0) {
+      Message.tipMessage('瀛樺湪瀵煎叆閿欒鐨勬暟鎹紝鏄惁瀵煎嚭锛�').then(() => {
+        XLSXUtils.exportToXLSX({
+          workbookDataList: res.errors,
+          fileName: '缁撶畻瀵煎叆-閿欒鏁版嵁',
+          workbookHeaderMap: {
+            name: '濮撳悕',
+            identity: '韬唤璇佸彿',
+            taskName: '浠诲姟鍚嶇О',
+            settlementAmount: '缁撶畻閲戦',
+            actualSettlementAmount: '瀹炲彂閲戦',
+            receiveAccount: '鏀舵璐︽埛',
+            bank: '鎵�灞為摱琛�',
+            bankBranch: '寮�鎴锋敮琛屽悕绉�',
+            errorMessage: '閿欒淇℃伅',
+          },
+        });
+      });
+    }
+    getList();
   },
   enabled: !!id,
 });
@@ -178,17 +232,25 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetOpenTaskInfosQuery = {
+      let list = [...form.settlementTaskUsers];
+      if (extraParamState.keywords) {
+        list = list?.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: list.length,
         },
-        keywords: extraParamState.keywords,
-      };
-
-      let res = await taskServices.getOpenTaskInfos(params);
-      return res;
+        data: paginateList(list, pageIndex, pageSize),
+      });
     } catch (error) {
       console.log('error: ', error);
     }
@@ -198,8 +260,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,9 +288,80 @@
 
 async function handleAddOrEdit() {}
 
-onMounted(() => {
-  getList();
+async function sureTaskSettlementOrder() {
+  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 handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
+  if (response.path) {
+    // sureTaskSettlementOrder();
+  }
+}
+
+function handleSubmit() {
+  handleSettleEdit({
+    id: id,
+    name: form.name,
+    code: form.code,
+    settlementUserCount: form.settlementTaskUsers.length,
+    actualSettlementAmount: form.actualSettlementAmount,
+  });
+}
+
+const {
+  dialogProps: dialogSettleProps,
+  handleEdit: handleSettleEdit,
+  editForm: settleEditForm,
+} = useFormDialog({
+  onConfirm: handleSettle,
+  defaultFormParams: {
+    id: '',
+    name: '',
+    code: '',
+    settlementUserCount: 0,
+    actualSettlementAmount: 0,
+  },
 });
+
+async function handleSettle() {
+  try {
+    let params: API.SureTaskSettlementCommand = {
+      taskInfoId: settleEditForm.id,
+    };
+    console.log('params: ', params);
+    // let res = await taskServices.sureTaskSettlement(params);
+    // if (res) {
+    //   Message.successMessage('鎿嶄綔鎴愬姛');
+    //   eventContext.emit('sureTaskSettlementOrder');
+    //   handleBack();
+    // }
+  } catch (error) {}
+}
+
+function handleDownload() {}
+
+function handleBack() {
+  closeViewPush(route, {
+    name: 'ServiceChargeManageList',
+  });
+}
 </script>
 
 <style lang="scss" scoped>
@@ -234,6 +371,14 @@
   margin: 0 auto;
   padding: 24px 0;
 }
+
+.settlement-user-list-chunk {
+  :deep() {
+    .no-data img {
+      width: 280px;
+    }
+  }
+}
 </style>
 <style lang="scss">
 .text-over-tooltip-content {

--
Gitblit v1.9.1