zhengyiming
3 天以前 cbcc6a8eecfc19e93da08500dcc898efdabf7836
src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -1,6 +1,6 @@
<template>
  <LoadingLayout :loading="isLoading">
    <AppContainer>
    <AppScrollContainer>
      <ChunkCell title="结算单详情">
        <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true">
          <ProFormCol>
@@ -74,32 +74,42 @@
            >
              <el-button text type="primary" class="pro-table-operation-btn">导入</el-button>
            </BlFileUpload>
            <el-button type="primary" link @click="handleDownload()">导出</el-button>
            <el-button type="primary" link @click="handleExport()">导出</el-button>
          </template>
        </ProTableQueryFilterBar>
        <ProTableV2
          v-bind="proTableProps"
          :columns="SettlementListColumns"
          :show-operation-column="false"
          :operationBtns="operationBtns"
          :auto-height="false"
          ref="proTable"
          :tableProps="{
            maxHeight: '250px',
            maxHeight: '400px',
          }"
        >
        </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"
            v-if="
              isSettlement &&
              (!form.auditStatus || form.auditStatus !== EnumTaskSettlementAuditStatus.Pass)
            "
            class="chuck-add-or-edit-actions"
            type="primary"
            @click="handleSubmit"
            >结算</el-button
            @click="handleSubmit()"
            >结算申请</el-button
          >
          <el-button
            v-if="isSettlement && form.auditStatus === EnumTaskSettlementAuditStatus.Pass"
            class="chuck-add-or-edit-actions"
            type="primary"
            @click="handleSubmit()"
            >提交结算</el-button
          >
        </div>
      </ChunkCell>
    </AppContainer>
    </AppScrollContainer>
    <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog>
    <SettleDetailDialog v-bind="dialogSettleProps" />
  </LoadingLayout>
@@ -108,6 +118,7 @@
import {
  LoadingLayout,
  AppContainer,
  AppScrollContainer,
  ChunkCell,
  ProForm,
  ProFormItemV2,
@@ -134,7 +145,16 @@
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 { SettlementReceiveStatusText, EnumTaskSettlementAuditStatus } from '@/constants';
import {
  downloadFile,
  downloadFileByUrl,
  paginateList,
  setOssFileName,
  setOSSLink,
  toThousand,
} from '@/utils';
import _ from 'lodash';
defineOptions({
  name: 'ServiceChargeDetail',
@@ -151,14 +171,16 @@
    emits: {
      onClick: (role) => openDialog(role),
    },
    extraProps: {
      hide: () => !isSettlement.value,
    },
  },
]);
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 settlementAccess = route.query.settlementAccess ?? '';
const isSettlement = computed(() => !!settlement);
const form = reactive({
  name: '',
@@ -170,6 +192,13 @@
  settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[],
  settlementUrl: [] as UploadUserFile[],
  settlementAccess: '' as any as EnumEnterpriseWalletAccess,
  isSettlement: isSettlement.value,
  auditStatus: '' as any as EnumTaskSettlementAuditStatus,
  timeoutServiceFee: 0,
});
const BaseState = {
@@ -178,15 +207,21 @@
const state = reactive({ ...BaseState });
const { isLoading } = useQuery({
  queryKey: ['taskUserServices/getSettlementTaskUsers', id, url],
const { isLoading, refetch } = useQuery({
  queryKey: ['taskUserServices/getSettlementTaskUsers', id, toRef(form, 'isSettlement')],
  queryFn: async () => {
    return await taskUserServices.getSettlementTaskUsers(
      { taskInfoId: id, settlementOrderUrl: url },
      {
        showLoading: false,
      }
    );
    let params: API.APIgetSettlementTaskUsersParams = {
      id: id,
    };
    // if (form.settlementAccess) {
    //   params.settlementAccess = Number(form.settlementAccess);
    // }
    if (form.isSettlement) {
      params.isImport = true;
    }
    return await taskUserServices.getSettlementTaskUsers(params, {
      showLoading: false,
    });
  },
  placeholderData: () => ({} as API.GetSettlementTaskUsersQueryResult),
  onSuccess(res) {
@@ -196,28 +231,31 @@
      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 ?? '';
      form.settlementAccess = res?.detail?.settlementAccess;
      form.auditStatus = res?.detail?.auditStatus;
      form.timeoutServiceFee = res?.detail?.timeoutServiceFee ?? 0;
      // 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,
@@ -265,6 +303,14 @@
      settlementTime: { type: 'date' },
      settlementAmount: { type: 'money' },
      actualSettlementAmount: { type: 'money' },
      settlementReceiveStatus: { type: 'enum', valueEnum: SettlementReceiveStatusText },
      serviceFee: { type: 'money' },
      timeoutHours: {
        formatter: (row: API.GetSettlementTaskUsersQueryResultItem) =>
          row.timeoutHours ? `${row.timeoutHours}小时` : '',
      },
      timeoutFee: { type: 'money' },
      otherFee: { type: 'money' },
    },
  }
);
@@ -273,45 +319,112 @@
  onConfirm: handleAddOrEdit,
  defaultFormParams: {
    id: '',
    name: '',
    settlementAmount: null as number,
    actualSettlementAmount: null as number,
    receiveAccount: '',
    bank: '',
    // totalWorkHours: null as number,
    settlementAccess: form.settlementAccess,
    // bankBranch: '',
    timeoutServiceFee: 0,
    serviceFee: null as number,
    timeoutHours: null as number,
    timeoutFee: null as number,
    otherFee: null as number,
    remark: '',
  },
});
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 ?? '',
      // totalWorkHours: row?.totalWorkHours ?? null,
      settlementAccess: form.settlementAccess,
      // bankBranch: row?.bankBranch ?? '',
      timeoutServiceFee: form.timeoutServiceFee,
      serviceFee: row?.serviceFee ?? 0,
      timeoutHours: row?.timeoutHours ?? null,
      timeoutFee: row?.timeoutFee ?? null,
      otherFee: row?.otherFee ?? null,
      remark: row?.remark ?? '',
    });
  }
}
async function handleAddOrEdit() {}
async function sureTaskSettlementOrder() {
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)
            )
          : [],
    const settlementAmount =
      (editForm.timeoutFee ?? 0) + (editForm.serviceFee ?? 0) + (editForm.otherFee ?? 0);
    let params: API.EditTaskSettlementOrderRosterCommand = {
      id: editForm.id,
      settlementAmount: settlementAmount,
      actualSettlementAmount: editForm.actualSettlementAmount,
      receiveAccount: editForm.receiveAccount,
      bank: editForm.bank,
      // totalWorkHours: editForm.totalWorkHours,
      // bankBranch: editForm.bankBranch,
      serviceFee: editForm.serviceFee,
      timeoutHours: editForm.timeoutHours,
      timeoutFee: editForm.timeoutFee,
      otherFee: editForm.otherFee,
      remark: editForm.remark,
    };
    let res = await taskServices.sureTaskSettlementOrder(params);
    let res = await taskServices.editTaskSettlementOrderRoster(params);
    if (res) {
      Message.successMessage('操作成功');
      eventContext.emit('sureTaskSettlementOrder');
      handleBack();
      form.isSettlement = false;
      refetch();
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) {
  if (response.path) {
    // sureTaskSettlementOrder();
    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('操作成功');
      form.isSettlement = false;
      refetch();
      getList(paginationState.pageIndex);
      if (res?.errors?.length > 0) {
        Message.tipMessage('存在导入错误的数据,是否导出?').then(() => {
          XLSXUtils.exportToXLSX({
            workbookDataList: res.errors,
            fileName: '结算导入-错误数据',
            workbookHeaderMap: {
              name: '姓名',
              identity: '身份证号',
              contactPhoneNumber: '手机号',
              bank: '所属银行',
              bankBranch: '所属支行',
              receiveAccount: '收款账户',
              settlementAmount: '结算金额',
              actualSettlementAmount: '实发金额',
              errorMessage: '错误信息',
            },
          });
        });
      }
    }
  } catch (error) {
  } finally {
    form.settlementUrl = [] as UploadUserFile[];
  }
}
@@ -322,6 +435,7 @@
    code: form.code,
    settlementUserCount: form.settlementTaskUsers.length,
    actualSettlementAmount: form.actualSettlementAmount,
    settlementAccess: form.settlementAccess,
  });
}
@@ -337,25 +451,47 @@
    code: '',
    settlementUserCount: 0,
    actualSettlementAmount: 0,
    settlementAccess: '' as any as EnumEnterpriseWalletAccess,
  },
});
async function handleSettle() {
  sureTaskSettlementOrder();
}
async function sureTaskSettlementOrder() {
  try {
    let params: API.SureTaskSettlementCommand = {
      taskInfoId: settleEditForm.id,
      taskInfoId: id,
    };
    console.log('params: ', params);
    // let res = await taskServices.sureTaskSettlement(params);
    // if (res) {
    //   Message.successMessage('操作成功');
    //   eventContext.emit('sureTaskSettlementOrder');
    //   handleBack();
    // }
    let res = await taskServices.sureTaskSettlement(params);
    if (res) {
      Message.successMessage('操作成功');
      eventContext.emit('sureTaskSettlementOrder');
      handleBack();
    }
  } catch (error) {}
}
function handleDownload() {}
const handleExport = _.debounce(
  async () => {
    if (paginationState.total === 0) {
      Message.warnMessage('没有数据可以导出哦~');
      return;
    }
    try {
      let params: API.ExportTaskSettlementOrderRostersCommand = {
        id: id,
      };
      let res = await taskServices.exportTaskSettlementOrderRosters(params);
      if (res) {
        downloadFileByUrl(setOSSLink(res), `${form.name}-${form.code}`);
      }
    } catch (error) {}
  },
  1000,
  { leading: true, trailing: false }
);
function handleBack() {
  closeViewPush(route, {
@@ -379,6 +515,10 @@
    }
  }
}
.chuck-add-or-edit-actions {
  margin-bottom: 20px;
}
</style>
<style lang="scss">
.text-over-tooltip-content {