wupengfei
2025-09-16 715d5d9675a524648b0aea2b961fe5a4430ea4fa
src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -47,28 +47,6 @@
          </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="结算名单" style="flex: 1" class="settlement-user-list-chunk">
        <ProTableQueryFilterBar @on-reset="reset">
          <template #query>
@@ -82,7 +60,7 @@
              </SearchInput>
            </QueryFilterItem>
          </template>
          <template #btn>
          <template #btn v-if="isSettlement">
            <BlFileUpload
              v-model:file-url="form.settlementUrl"
              ref="uploadRef"
@@ -94,9 +72,9 @@
              :limit="1"
              accept="xlsx,xls"
            >
              <el-button text type="primary" class="pro-table-operation-btn">上传</el-button>
              <el-button text type="primary" class="pro-table-operation-btn">导入</el-button>
            </BlFileUpload>
            <el-button type="primary" link @click="handleAdd()">导出</el-button>
            <el-button type="primary" link @click="handleExport()">导出</el-button>
          </template>
        </ProTableQueryFilterBar>
        <ProTableV2
@@ -116,13 +94,14 @@
            v-if="isSettlement"
            class="chuck-add-or-edit-actions"
            type="primary"
            @click="handleSubmit"
            @click="handleSubmit()"
            >结算</el-button
          >
        </div>
      </ChunkCell>
    </AppContainer>
    <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog>
    <SettleDetailDialog v-bind="dialogSettleProps" />
  </LoadingLayout>
</template>
<script setup lang="ts">
@@ -153,8 +132,10 @@
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';
import { downloadFile, paginateList, setOssFileName, toThousand } from '@/utils';
import _ from 'lodash';
defineOptions({
  name: 'ServiceChargeDetail',
@@ -173,13 +154,11 @@
    },
  },
]);
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 isSettlement = computed(() => !!settlement);
const form = reactive({
  name: '',
@@ -200,10 +179,10 @@
const state = reactive({ ...BaseState });
const { isLoading } = useQuery({
  queryKey: ['taskUserServices/getSettlementTaskUsers', id, url],
  queryKey: ['taskUserServices/getSettlementTaskUsers', id],
  queryFn: async () => {
    return await taskUserServices.getSettlementTaskUsers(
      { taskInfoId: id, settlementOrderUrl: url },
      { id: id },
      {
        showLoading: false,
      }
@@ -220,25 +199,25 @@
      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: '错误信息',
          },
        });
      });
    }
    // 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,
@@ -294,34 +273,100 @@
  onConfirm: handleAddOrEdit,
  defaultFormParams: {
    id: '',
    name: '',
    settlementAmount: null as number,
    actualSettlementAmount: null as number,
    receiveAccount: '',
    bank: '',
    bankBranch: '',
  },
});
function openDialog(row?) {
function openDialog(row?: API.GetSettlementTaskUsersQueryResultItem) {
  if (row) {
    handleEdit({
      id: row?.id,
      name: row?.name,
      settlementAmount: row?.settlementAmount ?? null,
      actualSettlementAmount: row?.actualSettlementAmount ?? null,
      receiveAccount: row?.receiveAccount ?? '',
      bank: row?.bank ?? '',
      bankBranch: row?.bankBranch ?? '',
    });
  }
}
async function handleAddOrEdit() {}
async function handleSubmit() {
async function handleAddOrEdit() {
  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 params: API.EditTaskSettlementOrderRosterCommand = {
      id: editForm.id,
      settlementAmount: editForm.settlementAmount,
      actualSettlementAmount: editForm.actualSettlementAmount,
      receiveAccount: editForm.receiveAccount,
      bank: editForm.bank,
      bankBranch: editForm.bankBranch,
    };
    let res = await taskServices.sureTaskSettlementOrder(params);
    let res = await taskServices.editTaskSettlementOrderRoster(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
  if (response.path) {
    importTaskSettlementOrderRosters(response.path);
  }
}
async function importTaskSettlementOrderRosters(url: string) {
  try {
    let params: API.ImportTaskSettlementOrderRostersCommand = {
      id: id,
      url: url,
    };
    let res = await taskServices.importTaskSettlementOrderRosters(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
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() {
  sureTaskSettlementOrder();
}
async function sureTaskSettlementOrder() {
  try {
    let params: API.SureTaskSettlementCommand = {
      taskInfoId: id,
    };
    let res = await taskServices.sureTaskSettlement(params);
    if (res) {
      Message.successMessage('操作成功');
      eventContext.emit('sureTaskSettlementOrder');
@@ -330,11 +375,28 @@
  } catch (error) {}
}
function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
  if (response.path) {
    //
  }
}
const handleExport = _.debounce(
  async () => {
    if (paginationState.total === 0) {
      Message.warnMessage('没有数据可以导出哦~');
      return;
    }
    try {
      let params: API.ExportTaskSettlementOrderRostersCommand = {
        id: id,
      };
      let res = await taskServices.exportTaskSettlementOrderRosters(params, {
        responseType: 'blob',
        getResponse: true,
      });
      if (res) {
        downloadFile(res, `${form.name}-${form.code}`, 'xlsx');
      }
    } catch (error) {}
  },
  1000,
  { leading: true, trailing: false }
);
function handleBack() {
  closeViewPush(route, {