sen
1 天以前 5abcde36961125cbf436f91b8c17610a6b5f8308
ui/admin-ui3/src/views/tms/generationCost/index.vue
@@ -1,139 +1,95 @@
<template>
  <basicContainer>
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form" v-model:search="queryParams"
        ref="crudRef"
        @row-update="rowUpdate"
        @row-save="rowSave"
        @refresh-change="refreshChange"
        @row-del="rowDel"
        @search-change="searchChange"
        @search-reset="searchReset"
        @selection-change="selectionChange"
        @current-change="currentChange"
        @size-change="sizeChange"
        @on-load="onLoad"
    >
    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" ref="crudRef"
      @row-update="rowUpdate" @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @on-load="onLoad">
      <template #menu-left>
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['tms:tmsDispatchOrder:export']"
        >导出
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['tms:tmsDispatchOrder:export']">导出
        </el-button>
          <el-button
              type="primary"
              icon="Promotion"
              :disabled="pageF.multiple"
              @click="handleYSGenerate"
              v-hasPermi="['tms:tmsDispatchOrder:generate']"
          >生成应收费用
          </el-button>
          <el-button
              type="success"
              icon="Promotion"
              :disabled="pageF.multiple"
              @click="handleYFGenerate"
              v-hasPermi="['tms:tmsDispatchOrder:generate']"
          >生成应付费用
          </el-button>
        <el-button type="primary" icon="Promotion" :disabled="pageF.multiple" @click="handleYSGenerate"
          v-hasPermi="['tms:tmsDispatchOrder:generate']">生成应收费用
        </el-button>
        <el-button type="success" icon="Promotion" :disabled="pageF.multiple" @click="handleYFGenerate"
          v-hasPermi="['tms:tmsDispatchOrder:generate']">生成应付费用
        </el-button>
      </template>
      <template #menu-before="{row}">
        <el-link size="small" type="primary" v-if="[0,1,2,3].includes(row.status)" @click="handleClose(row)" class="link-btn"
                 v-hasPermi="['tms:tmsDispatchOrder:closeOrder']"
                 :underline="false" icon="el-icon-close">作废
      <template #menu-before="{ row }">
        <el-link size="small" type="primary" v-if="[0, 1, 2, 3].includes(row.status)" @click="handleClose(row)"
          class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" :underline="false" icon="el-icon-close">作废
        </el-link>
        <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)"
                 v-hasPermi="['tms:tmsTrip:list']"
                 class="link-btn" :underline="false" icon="el-icon-view">查看行程
        <el-link size="small" type="primary" v-if="![0, 1].includes(row.status)" @click="handleLogItinerary(row)"
          v-hasPermi="['tms:tmsTrip:list']" class="link-btn" :underline="false" icon="el-icon-view">查看行程
        </el-link>
        <el-link size="small" type="primary" v-if="row.accountsReceivableStatus == 0" @click="handleAddFinance(row)"
                 class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']"
                 :underline="false" icon="el-icon-edit-pen">费用登记
          class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']" :underline="false" icon="el-icon-edit-pen">费用登记
        </el-link>
      </template>
      <template #menu="{row}">
      <template #menu="{ row }">
        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
                 icon="el-icon-tickets">日志
          icon="el-icon-tickets">日志
        </el-link>
      </template>
      <template #body>
        <avue-tabs :option="tabsOption"
                   @change="handleChange"></avue-tabs>
        <avue-tabs :option="tabsOption" @change="handleChange"></avue-tabs>
      </template>
    </avue-crud>
    <el-dialog title="费用登记" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
      <el-descriptions :column="3" border>
        <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item>
        <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item>
        <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item>
      </el-descriptions>
      <avue-tabs :option="tabsOption2" ref="tabsOption2Ref"
                 @change="handleChange2"></avue-tabs>
      <avue-tabs :option="tabsOption2" ref="tabsOption2Ref" @change="handleChange2"></avue-tabs>
      <div v-if="active === 'tab1'">
        <avue-crud
                   :option="itemsTableOption" ref="itemsTableRef"
                   :data="itemsTableData"
                   @selection-change="selectionChange2"
        >
          <template #count="{row}">
        <avue-crud :option="itemsTableOption" ref="itemsTableRef" :data="itemsTableData"
          @selection-change="selectionChange2">
          <template #count="{ row }">
            <el-input-number v-model="row.count" @change="countChange(row)" placeholder="请输入计费数量"
                             :min="0"></el-input-number>
              :min="0"></el-input-number>
          </template>
          <template #isYF="{row}">
            <el-checkbox v-model="row.isYF"
                         :true-value="1"
                         :false-value="0"
                         @change="(e:number) =>isYFChange(e, row)" ></el-checkbox>
          <template #isYF="{ row }">
            <el-checkbox v-model="row.isYF" :true-value="1" :false-value="0"
              @change="(e: number) => isYFChange(e, row)"></el-checkbox>
          </template>
          <template #remark="{row}">
            <el-input v-model="row.remark" placeholder="备注" ></el-input>
          <template #remark="{ row }">
            <el-input v-model="row.remark" placeholder="备注"></el-input>
          </template>
          <template #expand="{row}">
          <template #expand="{ row }">
            <el-descriptions :column="3" border v-if="row.isYF == 1">
              <el-descriptions-item label="服务商">
                <el-select v-model="row.serviceProviderId"  placeholder="请选择服务商"
                           @change="serviceProviderChange(row)"
                           :filterable="true">
                  <el-option v-for="item in row.serviceProviderData"
                             :key="item.id" :label="item.serviceShortName"
                              :value="item.id"></el-option>
                <el-select v-model="row.serviceProviderId" placeholder="请选择服务商" @change="serviceProviderChange(row)"
                  :filterable="true">
                  <el-option v-for="item in row.serviceProviderData" :key="item.id" :label="item.serviceShortName"
                    :value="item.id"></el-option>
                </el-select>
              </el-descriptions-item>
              <el-descriptions-item label="是否存在应付报价">
                <span :style="{color: row.isCZYF == 0? 'red': ''}">{{row.isCZYF == 0? '否': row.isCZYF == 1? '是': ''}}</span>
                <span :style="{ color: row.isCZYF == 0 ? 'red' : '' }">{{ row.isCZYF == 0 ? '否' : row.isCZYF == 1 ? '是'
                  :
                  '' }}</span>
              </el-descriptions-item>
              <el-descriptions-item label="计费金额">
                <el-input v-model="row.yfPrice" :min="1"
                          @change="yfPriceChange(row)"
                          type="number" placeholder="请输入金额"></el-input>
                <el-input v-model="row.yfPrice" :min="1" @change="yfPriceChange(row)" type="number"
                  placeholder="请输入金额"></el-input>
              </el-descriptions-item>
              <el-descriptions-item label="币制">
                <el-radio-group v-model="row.yfCurrency" >
                  <el-radio
                      v-for="dict in sys_currency"
                      :key="dict.value"
                      :label="dict.value"
                  >{{ dict.label }}</el-radio>
                <el-radio-group v-model="row.yfCurrency">
                  <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label
                  }}</el-radio>
                </el-radio-group>
              </el-descriptions-item>
              <el-descriptions-item label="计费数量">
                <el-input-number v-model="row.yfCount" @change="yfPriceChange(row)" placeholder="请输入计费数量"
                                 :min="0"></el-input-number>
                  :min="0"></el-input-number>
              </el-descriptions-item>
              <el-descriptions-item label="总金额">{{ row.yfSum }}</el-descriptions-item>
@@ -143,48 +99,53 @@
      </div>
      <div v-if="active === 'tab2'">
        <h2>实报实销费用</h2>
        <avue-form  v-model="boxForm" ref="boxFormRef"
                   :option="boxFormOption">
        <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
          <template #voucherUrl="{ row }">
            <el-upload class="upload-demo" ref="uploadRef" :limit="1" drag :action="urlApi + '/common/upload2'" multiple
              :show-file-list="true" :on-success="(res) => handleUploadAfter(res, row)"
              :on-exceed="(files) => handleExceed(files, row)">
              <el-icon class="el-icon--upload"><upload-filled /></el-icon>
              <div class="el-upload__text">
                点击或将图片拖拽到此区域上传
              </div>
        </avue-form>
        <avue-crud
            :option="boxTableOption"
            :data="boxTableData"
        >
          <template #isYF="{row}">
            <el-checkbox v-model="row.isYF"
                         :true-value="1"
                         :false-value="0"
                         @change="(e:number) =>isYFChange(e, row)" ></el-checkbox>
            </el-upload>
          </template>
          <template #yfServiceProviderId="{row}">
            <el-select v-model="row.yfServiceProviderIdType"  placeholder="请选择服务商"
                      @change="(e:any)=>ysServiceProviderChange(e,row)"
                      :filterable="true">
        </avue-form>
        <avue-crud :option="boxTableOption" :data="boxTableData" @selection-change="boxSelectionChange">
          <template #menu-left>
            <el-button type="danger" plain icon="Delete"
              :disabled="!(boxSelectionList.length === 1 && boxSelectionList[0]?.status === 0)"
              @click="handleBatchBoxDel">
              作废
            </el-button>
          </template>
          <template #isYF="{ row }">
            <el-checkbox v-model="row.isYF" :disabled="row.status == 1" :true-value="1" :false-value="0"
              @change="(e: number) => isYFChange(e, row)"></el-checkbox>
          </template>
          <template #yfServiceProviderId="{ row }">
            <el-select :disabled="row.status == 1" v-model="row.yfServiceProviderIdType" placeholder="请选择服务商"
              @change="(e: any) => ysServiceProviderChange(e, row)" :filterable="true">
              <el-option v-for="item in serviceProviderList"
                         :key="item.serviceProviderId + '_'+ item.serviceProviderType" :label="item.serviceProviderName"
                         :value="item.serviceProviderId + '_'+ item.serviceProviderType"></el-option>
                :key="item.serviceProviderId + '_' + item.serviceProviderType" :label="item.serviceProviderName"
                :value="item.serviceProviderId + '_' + item.serviceProviderType"></el-option>
            </el-select>
          </template>
          <template #yfPrice="{row}">
            <el-input v-model="row.yfPrice" :min="1"
                      type="number" placeholder="请输入金额"></el-input>
          <template #yfPrice="{ row }">
            <el-input :disabled="row.status == 1" v-model="row.yfPrice" :min="1" type="number"
              placeholder="请输入金额"></el-input>
          </template>
          <template #yfCurrency="{row}">
              <el-radio-group v-model="row.yfCurrency" >
                <el-radio
                    v-for="dict in sys_currency"
                    :key="dict.value"
                    :label="dict.value"
                >{{ dict.label }}</el-radio>
              </el-radio-group>
          <template #yfCurrency="{ row }">
            <el-radio-group v-model="row.yfCurrency" :disabled="row.status == 1">
              <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
            </el-radio-group>
          </template>
        </avue-crud>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitForm">
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
@@ -197,29 +158,31 @@
    <el-dialog :title="pageF.title" v-model="open" class="avue-dialog avue-dialog--top" width="80%">
      <avue-crud
          :option="boxTableOption" ref="itemsTableRef"
          :data="boxTableData"
      >
        <template #expand="{row}">
          <avue-crud
              :option="boxItemTableOption" ref="itemsTableRef2"
              :data="row.tmsReceivableFeeItems"
          >
      <avue-crud :option="boxTableOption" ref="itemsTableRef" :data="boxTableData">
        <template #expand="{ row }">
          <avue-crud v-if="optionType === 'ysGenerate'" :option="boxItemTableOption" ref="itemsTableRef2"
            :data="row.tmsReceivableFeeItems">
          </avue-crud>
        </template>
        <template #receivableAmount="{row}">
          <div v-if="row.receivableAmountRMB > 0">{{row.receivableAmountRMB}}人民币</div>
          <div v-if="row.receivableAmountHKD > 0">{{row.receivableAmountHKD}}港币</div>
          <avue-crud v-else :option="boxItemTableOption" ref="itemsTableRef2" :data="row.payableFeeItems">
          </avue-crud>
        </template>
        <template #receivableAmount="{ row }">
          <div v-if="row.receivableAmountRMB > 0">{{ row.receivableAmountRMB }}人民币</div>
          <div v-if="row.receivableAmountHKD > 0">{{ row.receivableAmountHKD }}港币</div>
        </template>
        <template #payableAmount="{ row }">
          <div v-if="row.payableRmbAmount > 0">{{ row.payableRmbAmount }}人民币</div>
          <div v-if="row.payableHkbAmount > 0">{{ row.payableHkbAmount }}港币</div>
        </template>
      </avue-crud>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitGenerate">
          <el-button type="primary" v-if="optionType != 'view'" :loading="pageF.isUploading" @click="submitGenerate">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
@@ -230,22 +193,20 @@
    <el-dialog title="调度单作废" v-model="open5" class="avue-dialog avue-dialog--top" width="80%">
      <el-descriptions :column="3" border>
        <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item>
        <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item>
        <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item>
      </el-descriptions>
      <avue-form  v-model="boxForm" ref="boxFormRef"
                  :option="boxFormOption">
      <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
      </avue-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitForm5">
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm5">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
@@ -268,34 +229,35 @@
  updateTmsDispatchOrder,
  generateTmsDispatchOrder, initGenerate, initYSGenerate,
  ysGenerateTmsDispatchOrder, initYFGenerate, yfGenerateTmsDispatchOrder,
  getServiceProvider, checkCloseOrder, closeOrder
  getServiceProvider, checkCloseOrder, closeOrder, tmsFinanceDetail
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue";
import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
import {usePagePlus} from "@/hooks/usePagePlus";
import {hasPermission} from "@/utils/permissionUtils";
import {ElMessage, ElMessageBox} from "element-plus";
import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
import {saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail";
import {listTmsQuoteItem} from "@/api/tms/tmsQuotePlanItem";
import {getDicts} from "@/api/system/dict/data";
import {listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
import {listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider";
import {listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider";
import {selectPaymentTmsQuotePlan} from "@/api/tms/tmsQuotePlan";
import {addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee} from "@/api/tms/tmsQuoteFee";
import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
import { ElMessage, ElMessageBox } from "element-plus";
import { addTmsTrip, listTmsTrip } from "@/api/tms/tmsTrip";
import { saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail } from "@/api/tms/tmsFinanceDetail";
import { listTmsQuoteItem } from "@/api/tms/tmsQuotePlanItem";
import { getDicts } from "@/api/system/dict/data";
import { listTmsServiceProvider } from "@/api/tms/tmsServiceProvider";
import { listTmsCustomsServiceProvider } from "@/api/tms/tmsCustomsServiceProvider";
import { listTmsLoadingServiceProvider } from "@/api/tms/tmsLoadingServiceProvider";
import { selectPaymentTmsQuotePlan } from "@/api/tms/tmsQuotePlan";
import { addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee";
import { status } from "nprogress";
const {appContext} = getCurrentInstance();
const { appContext } = getCurrentInstance();
const {proxy} = useCurrentInstance();
const { proxy } = useCurrentInstance();
const crudRef = ref();
const boxFormRef = ref();
const {sys_quotation_items,sys_unit,sys_currency} =
    proxy.useDict("sys_quotation_items","sys_unit","sys_currency");
const { sys_quotation_items, sys_unit, sys_currency } =
  proxy.useDict("sys_quotation_items", "sys_unit", "sys_currency");
const permissionList = (key: any, row: any, index: any) => {
  if (key == 'addBtn') {
    return hasPermission(["tms:tmsDispatchOrder:add"])
@@ -311,6 +273,8 @@
};
const data = reactive({
  form: <TmsDispatchOrderI>{},
  selectionList2: <any>[],
  boxSelectionList: <any>[],
  queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 10,
@@ -328,21 +292,20 @@
  open: false,
  open2: false,
  goodsTableData: <any>[],
  selectionList2: <any>[],
  goodsForm: <any>{},
  open3: false,
  actualForm: <any>{},
  isCustoms:<any> -1,
  isCustoms: <any>-1,
  isLoad: -1,
  active: 'tab1',
  quotationItems:[],
  quotationItems: [],
  serviceProviderList: <any>[],
  open5:false,
  open5: false,
})
const {
  queryParams, form, page, selectionList,
  boxTableData, optionType,open,open5,
  boxFormOption, boxForm, boxTableOption,boxItemTableOption,selectionList2,isCustoms,isLoad,active,quotationItems,serviceProviderList
  boxTableData, optionType, open, open5, boxSelectionList,
  boxFormOption, boxForm, boxTableOption, boxItemTableOption, selectionList2, isCustoms, isLoad, active, quotationItems, serviceProviderList
} = toRefs(data);
const option = ref({
  pageKey: 'TmsDispatchOrder',
@@ -426,7 +389,7 @@
          ],
        },
        isUrgent: {
          label: '是否紧急',value: '1',
          label: '是否紧急', value: '1',
          display: true,
          type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
          rules: [
@@ -487,7 +450,7 @@
              message: "是否是自营车队不能为空", trigger: "change"
            }
          ],
          change: ({value}: any) => {
          change: ({ value }: any) => {
            console.log(value)
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
@@ -503,7 +466,7 @@
          },
        },
        commissionModel:{
        commissionModel: {
          label: '提成模式',
          display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
          rules: [
@@ -602,25 +565,28 @@
  column: {
    dispatchNo: {
      label: '调度单号', minWidth: 120,
      label: '调度单号', minWidth: 140,
      display: false,
      search: true,
    },
    customerName: {
      label: '客户',
      display: false, minWidth: 120,
      display: false, minWidth: 200,
      search: true,
      overHidden: true
    },
    projectName: {
      label: '项目名称',
      display: false, minWidth: 120,
      display: false, minWidth: 150,
      search: true,
      overHidden: true
    },
    contractName: {
      label: '关联合同名称', minWidth: 120,
      label: '关联合同名称', minWidth: 160,
      display: false,
      search: true,
      overHidden: true
    },
    orderType: {
      label: '订单类型',
@@ -693,13 +659,15 @@
    shipperName: {
      label: '装货点名称',
      display: false, minWidth: 120,
      display: false, minWidth: 160,
      search: true,
      overHidden: true
    },
    receiverName: {
      label: '卸货点名称', minWidth: 120,
      label: '卸货点名称', minWidth: 160,
      display: false,
      search: true,
      overHidden: true
    },
    // accountsReceivableStatus: {
    //   label: '应收费用生成状态', minWidth: 160,
@@ -734,7 +702,7 @@
    inStatusList: {
      label: '状态', minWidth: 150,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
      display: false,multiple:true,
      display: false, multiple: true,
      hide: true,
      search: true,
@@ -769,22 +737,22 @@
    },
    updateTimeRange: {
      label: '更新时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    confirmTimeRange: {
      label: '确认时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    okTimeRange: {
      label: '完成时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    orderTimeRange: {
      label: '下单时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
@@ -808,17 +776,17 @@
})
const tabsOption2 = ref({
  column: [
      {
    {
      label: '报价费用登记',
      prop: 'tab1',
        name: 'tab1',
      name: 'tab1',
    },
    {
    label: '实报实销费用登记',
    prop: 'tab2',
      label: '实报实销费用登记',
      prop: 'tab2',
      name: 'tab2',
  }]
    }]
})
const itineraryTableOption = ref({
  menu: false,
@@ -861,7 +829,7 @@
      display: true,
    },
    voucherUrl: {
      label: '行程凭证',
      label: '行程凭证3',
      display: true,
      span: 24, dataType: 'string',
      type: 'upload',
@@ -914,11 +882,11 @@
      display: true,
      accept: 'string', dataType: 'string',
      type: 'upload',
      action: '/common/upload2',
      // action: '/common/upload2',
      slot: true,
    },
    remark: {
      label: '备注',span:24,
      label: '备注', span: 24,
      display: true,
      type: 'textarea',
@@ -934,7 +902,8 @@
const financeTableOption = ref({
  menu: false,
  addBtn: false,
  header: false, selection: false,
  header: true,
  selection: true,
  title: '历史垫付费用',
  column: {
    dataSource: {
@@ -962,6 +931,17 @@
      label: '金额',
      display: true,
    },
    currency: {
      label: '币制',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
      rules: [
        {
          required: true,
          message: "币制不能为空", trigger: "change"
        }
      ],
    },
    feeVoucherUrl: {
      label: '费用凭证',
      display: true,
@@ -975,35 +955,38 @@
      label: '备注',
      display: true,
    },
    isYF:{
    isYF: {
      label: '是否应付费用',
      display: true,
      type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
    },
    yfServiceProviderId:{
    yfServiceProviderId: {
      label: '服务商',
      display: true,
      type: 'select',
    },
    yfPrice:{
    yfPrice: {
      label: '应付金额',
      display: true,
    },
    yfCurrency:{
    yfCurrency: {
      label: '应付币制',
      display: true,
    }
    },
    status: {
      label: '状态',
      display: true,
      type: 'select', dicUrl: '/system/dict/data/type/sys_cancel_word', dataType: 'string',
    },
  }
})
const itemsTableOption = ref({
  pageKey: 'itemsTable',
  rowKey: 'rowKey',
  header: false,expand:true,
  header: false, expand: true,
  addBtn: false, menu: false,
  column: {
    feeType: {
@@ -1037,35 +1020,35 @@
const YSGenerateTableOption = ref({
  menu: false,
  add: false,
  header:false,
  header: false,
  selection: false,
  expand:true,
  defaultExpandAll:true,
  rowKey:'id',
  column:{
    dispatchNo:{
  expand: true,
  defaultExpandAll: true,
  rowKey: 'id',
  column: {
    dispatchNo: {
      label: '调度单号',
    },
    customerName:{
    customerName: {
      label: '客户名称',
    },
    shipperName:{
    shipperName: {
      label: '装货地',
    },
    receiverName:{
    receiverName: {
      label: '卸货地',
    },
    transportLine:{
    transportLine: {
      label: '运输路线',
    },
    actualVehicleType:{
    actualVehicleType: {
      label: '车型',
      display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    },licensePlate:{
    }, licensePlate: {
      label: '车牌',
    },
    receivableAmount:{
    receivableAmount: {
      label: '应收费用',
    }
  }
@@ -1073,26 +1056,26 @@
const YSGenerateItemTableOption = ref({
  menu: false,
  add: false,
  header:false,
  header: false,
  selection: false,
  rowKey:'rowKey',
  rowKey: 'rowKey',
  column:{
    feeType:{
  column: {
    feeType: {
      label: '费用类型',
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
    },
    feeName:{
    feeName: {
      label: '费用名称',
    },
    registerTime:{
    registerTime: {
      label: '登记时间',
    },
    registerAmount:{
    registerAmount: {
      label: '登记金额',
    },
    currency:{
    currency: {
      label: '币制',
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -1104,27 +1087,33 @@
const YFGenerateTableOption = ref({
  menu: false,
  add: false,
  header:false,
  header: false,
  selection: false,
  expand:true,
  defaultExpandAll:true,
  rowKey:'id',
  column:{
    dispatchNo:{
  expand: true,
  defaultExpandAll: true,
  rowKey: 'id',
  column: {
    dispatchNo: {
      label: '调度单号',
    },
    transportLine:{
      label: '运输路线',
    serviceProviderType: {
      label: '服务商类型',
      type: 'radio', dicUrl: '/system/dict/data/type/provider_type', dataType: 'string',
    },
    actualVehicleType:{
      label: '车型',
      display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    },licensePlate:{
      label: '车牌',
    serviceProviderName: {
      label: '服务商名稱',
    },
    receivableAmount:{
    // transportLine:{
    //   label: '运输路线',
    // },
    // actualVehicleType:{
    //   label: '车型',
    //   display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    //
    // },licensePlate:{
    //   label: '车牌',
    // },
    payableAmount: {
      label: '应付费用',
    }
  }
@@ -1132,26 +1121,26 @@
const YFGenerateItemTableOption = ref({
  menu: false,
  add: false,
  header:false,
  header: false,
  selection: false,
  rowKey:'rowKey',
  rowKey: 'rowKey',
  column:{
    feeType:{
  column: {
    feeType: {
      label: '费用类型',
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
    },
    feeName:{
    feeName: {
      label: '费用名称',
    },
    registerTime:{
    registerTime: {
      label: '登记时间',
    },
    registerAmount:{
    registerAmount: {
      label: '登记金额',
    },
    currency:{
    currency: {
      label: '币制',
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -1164,8 +1153,8 @@
  menuBtn: false,
  labelWidth: 120,
  column: {
    closeWhy:{
      label: '作废原因',span:24,
    closeWhy: {
      label: '作废原因', span: 24,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/close_why',
      rules: [
        {
@@ -1174,10 +1163,10 @@
        }
      ],
    },
    closeWhyRemark:{
    closeWhyRemark: {
      label: '作废原因说明',
      type: 'textarea',
      span:24,
      span: 24,
    },
  }
})
@@ -1222,10 +1211,10 @@
  },
  handleSelectionChangeFunc: (selection: any) => {
    selectionList.value = selection;
    if (selection.length > 0){
    if (selection.length > 0) {
      isCustoms.value = selection[0].isCustoms;
      isLoad.value = selection[0].isLoad ;
    }else{
      isLoad.value = selection[0].isLoad;
    } else {
      isCustoms.value = -1;
      isLoad.value = -1;
    }
@@ -1233,13 +1222,50 @@
    isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
    console.log(pageF.single)
  },
  getBeginListFunc: (params = {}) => {
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRange, 'updateTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRange, 'confirmTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRange, 'okTime') || {};
    return params;
    },
    // 1. 使用浅拷贝,不影响原始查询对象
    // 关键点:从原始 queryParams.value 取值,确保分页时依然能拿到数组
    let newParams = { ...queryParams.value, ...params };
    // 2. 定义日期字段映射 (数组名 : 接口需要的前缀)
    const dateMap = {
      createTimeRange: 'createTime',
      updateTimeRange: 'updateTime',
      confirmTimeRange: 'confirmTime',
      okTimeRange: 'okTime',
    };
    // 3. 遍历处理日期
    Object.keys(dateMap).forEach(arrayKey => {
      const prefix = dateMap[arrayKey];
      const range = newParams[arrayKey];
      if (Array.isArray(range) && range.length === 2) {
        // 赋值接口需要的 Begin 和 End
        newParams[`${prefix}Begin`] = range[0];
        newParams[`${prefix}End`] = range[1];
      }
      // 只在给接口的参数中删除数组,不影响页面显示的 queryParams
      delete newParams[arrayKey];
    });
    // 4. 清洗参数:过滤空值
    const finalParams = {};
    Object.keys(newParams).forEach(key => {
      const val = newParams[key];
      if (val !== '' && val !== null && val !== undefined) {
        finalParams[key] = val;
      }
    });
    console.log('发送给接口的最终参数:', finalParams);
    // 【核心修改】:直接返回,不要赋值给 queryParams.value
    return finalParams;
  },
})
@@ -1258,11 +1284,10 @@
const submitForm = () => {
  if (active.value === 'tab1') {
    console.log()
    pushTmsQuoteFee({
      ...form.value,
      quoteFeeItems: selectionList2.value
    }).then(res=>{
    }).then(res => {
      ElMessage({
        message: "操作成功!",
        type: 'success'
@@ -1271,10 +1296,11 @@
    })
  }else{
  } else {
    if (Array.isArray(boxForm.value.feeVoucherUrl)) {
      boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
    }
    boxForm.value.rowItems = boxTableData.value;
    saveTmsFinanceDetail(boxForm.value).then(res => {
      ElMessage({
@@ -1282,6 +1308,7 @@
        type: 'success'
      })
      boxFormRef.value?.resetFields();
      uploadRef.value?.clearFiles();
      getTab2Data();
    })
  }
@@ -1296,9 +1323,9 @@
const handleLogItinerary = (row: any) => {
  optionType.value = 'view';
  boxTableOption.value = itineraryTableOption.value;
  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
    boxTableData.value = res.rows || [];
    open.value =  true;
    open.value = true;
    pageF.title = '查看行程';
    boxFormOption.value.title = '';
  })
@@ -1315,24 +1342,23 @@
  boxTableOption.value = financeTableOption.value;
  form.value = row;
  handleChange2(tabsOption2.value.column[0]);
  nextTick(()=>{
  nextTick(() => {
    tabsOption2Ref.value.active = "0";
  })
}
const getTab1Data = async () =>{
  const quotePlanItemRes2 = await listTmsQuoteItem({quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999});
const getTab1Data = async () => {
  const quotePlanItemRes2 = await listTmsQuoteItem({ quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999 });
  let list = quotePlanItemRes2.rows || [];
  let quotePlanItemRes = await  getDicts("sys_quotation_items");
  console.log(quotePlanItemRes)
  let quotePlanItemRes = await getDicts("sys_quotation_items");
  let items = quotePlanItemRes.data || [];
  let res =  await listTmsQuoteFee({dispatchId: form.value.id,  pageNum: 1, pageSize: 999});
    let rowsData = res.rows || [];
  let res = await listTmsQuoteFee({ dispatchId: form.value.id, pageNum: 1, pageSize: 999 });
  let rowsData = res.rows || [];
  selectionList2.value = []
  itemsTableRef.value?.clearSelection();
  itemsTableData.value = items.map( (item: any) => {
  itemsTableData.value = items.map((item: any) => {
    let find2 = list.find((ele: any) => {
      return item.dictValue == ele.free
    });
@@ -1345,22 +1371,22 @@
        unit: '次',
        ...item,
        freeName:item.dictLabel,
        freeName: item.dictLabel,
        feeType: item.dictLabel,
        rowKey: item.dictCode,
        free: item.dictValue,
        ...find,
        ...find2,
        price: find.price||0,
        currency: find.currency|| 'RMB',
        sum: find.sum|| 0,
        price: find.price || 0,
        currency: find.currency || 'RMB',
        sum: find.sum || 0,
      };
      selectionList2.value.push(aRow);
      return aRow
    } else {
      return {
        ...item,
        freeName:item.dictLabel,
        freeName: item.dictLabel,
        rowKey: item.dictCode,
        feeType: item.dictLabel,
        price: 0,
@@ -1384,7 +1410,7 @@
}
const getTab2Data = async () =>{
const getTab2Data = async () => {
  let serviceProvider = await getServiceProvider(form.value.id);
  serviceProviderList.value = serviceProvider.data || [];
  listTmsFinanceDetail({
@@ -1408,7 +1434,7 @@
const getQuotationItems = async () => {
  let res = await  getDicts("sys_quotation_items");
  let res = await getDicts("sys_quotation_items");
  quotationItems.value = res.data || [];
}
getQuotationItems();
@@ -1424,15 +1450,15 @@
const handleChange = (column:any) => {
  let accountsReceivableStatus :number | undefined= undefined;
  let accountsPayableStatus :number | undefined= undefined;
  if (column.prop === 'tab1'){
const handleChange = (column: any) => {
  let accountsReceivableStatus: number | undefined = undefined;
  let accountsPayableStatus: number | undefined = undefined;
  if (column.prop === 'tab1') {
    accountsReceivableStatus = 0
  }else if (column.prop === 'tab2'){
  } else if (column.prop === 'tab2') {
    accountsPayableStatus = 0;
  }else if (column.prop === 'tab3'){
  } else if (column.prop === 'tab3') {
    queryParams.value.inStatusList = [5];
  }
  page.value.currentPage = 1;
@@ -1441,58 +1467,57 @@
  onLoad(page.value)
}
const handleChange2 = (column:any)=>{
    active.value = column.prop;
    if (column.prop === 'tab1'){
      getTab1Data()
    }else if (column.prop === 'tab2'){
      getTab2Data()
    }
const handleChange2 = (column: any) => {
  active.value = column.prop;
  if (column.prop === 'tab1') {
    getTab1Data()
  } else if (column.prop === 'tab2') {
    getTab2Data()
  }
}
const isYFChange =async (value:number,row:any)  =>   {
  if (value == 1){
    let find:any = quotationItems.value.find((item:any) => item.dictLabel === row.feeType);
    if (find){
      console.log(find,"find")
      let opt =  find.remark;
const isYFChange = async (value: number, row: any) => {
  if (value == 1) {
    let find: any = quotationItems.value.find((item: any) => item.dictLabel === row.feeType);
    if (find) {
      let opt = find.remark;
      row.serviceProviderType = opt;
      if (opt == 0){
        let res = await listTmsServiceProvider({pageSize:999,pageNum:1})
        row.serviceProviderData = res.rows|| [];
      if (opt == 0) {
        let res = await listTmsServiceProvider({ pageSize: 999, pageNum: 1 })
        row.serviceProviderData = res.rows || [];
        // 车辆运营商
        let serviceProviderId = form.value.vehicleProviderId || row.serviceProviderId;
        if (!serviceProviderId){
        if (!serviceProviderId) {
          ElMessage.warning("找不到该费用的车辆服务商");
        }else{
        } else {
          row.serviceProviderId = serviceProviderId;
        }
      }else if (opt == 1){
        let res = await listTmsCustomsServiceProvider({pageSize:999,pageNum:1})
        row.serviceProviderData = res.rows|| [];
      } else if (opt == 1) {
        let res = await listTmsCustomsServiceProvider({ pageSize: 999, pageNum: 1 })
        row.serviceProviderData = res.rows || [];
        let serviceProviderId = form.value.customsServiceProviderId || row.serviceProviderId;
        if (!serviceProviderId){
        if (!serviceProviderId) {
          ElMessage.warning("找不到该费用的报关服务商");
        }else{
        } else {
          row.serviceProviderId = serviceProviderId;
        }
      }else if (opt == 2){
        let res = await listTmsLoadingServiceProvider({pageSize:999,pageNum:1})
        row.serviceProviderData = res.rows|| [];
      } else if (opt == 2) {
        let res = await listTmsLoadingServiceProvider({ pageSize: 999, pageNum: 1 })
        row.serviceProviderData = res.rows || [];
        let serviceProviderId = form.value.loadingServiceProviderId || row.serviceProviderId;
        if (!serviceProviderId){
        if (!serviceProviderId) {
          ElMessage.warning("找不到该费用的装货服务商");
        }else{
        } else {
          row.serviceProviderId = serviceProviderId;
        }
      }
      if (row.serviceProviderType){
      if (row.serviceProviderType) {
        serviceProviderChange(row);
      }
@@ -1500,7 +1525,7 @@
    }
  }
  itemsTableRef.value?.toggleRowExpansion(row,value == 1)
  itemsTableRef.value?.toggleRowExpansion(row, value == 1)
@@ -1509,23 +1534,23 @@
}
const serviceProviderChange = (row:any) => {
  selectPaymentTmsQuotePlan({providerId:row.serviceProviderId,providerType:row.serviceProviderType,free:row.free}).then(res=>{
    let resData =  res.data || {};
    if (Object.keys(resData).length > 0){
      row.yfCurrency =resData.currency ;
      row.yfId =resData.id ;
      row.yfPrice =resData.price ;
      row.yfCurrency =resData.currency ;
      row.yfCurrency =resData.currency ;
      row.isCZYF = 1 ;
    }else{
      row.isCZYF = 0 ;
const serviceProviderChange = (row: any) => {
  selectPaymentTmsQuotePlan({ providerId: row.serviceProviderId, providerType: row.serviceProviderType, free: row.free }).then(res => {
    let resData = res.data || {};
    if (Object.keys(resData).length > 0) {
      row.yfCurrency = resData.currency;
      row.yfId = resData.id;
      row.yfPrice = resData.price;
      row.yfCurrency = resData.currency;
      row.yfCurrency = resData.currency;
      row.isCZYF = 1;
    } else {
      row.isCZYF = 0;
    }
  })
}
const yfPriceChange = (row:any)=>{
const yfPriceChange = (row: any) => {
  let yfCount = row.yfCount || 0;
  let yfPrice = row.yfPrice || 0;
  row.yfSum = Number(yfPrice) * Number(yfCount);
@@ -1537,15 +1562,14 @@
  let ids = selectionList.value.map((item: any) => item.id);
  initYSGenerate(ids).then(res => {
    boxTableData.value = res.data || [];
    boxTableData.value.forEach((item:any) => {
    boxTableData.value.forEach((item: any) => {
      let items = item.tmsReceivableFeeItems || [];
      let receivableAmountRMB = items.filter( (cItem:any) => cItem.currency == 'RMB').reduce( (pre:any,cur:any) => {
      let receivableAmountRMB = items.filter((cItem: any) => cItem.currency == 'RMB').reduce((pre: any, cur: any) => {
        return pre + Number(cur.registerAmount)
      },0);
      let receivableAmountHKD = items.filter( (cItem:any) => cItem.currency == 'HKD').reduce( (pre:any,cur:any) => {
      }, 0);
      let receivableAmountHKD = items.filter((cItem: any) => cItem.currency == 'HKD').reduce((pre: any, cur: any) => {
        return pre + Number(cur.registerAmount)
      },0);
      console.log(receivableAmountRMB,receivableAmountHKD)
      }, 0);
      item.receivableAmountRMB = receivableAmountRMB;
      item.receivableAmountHKD = receivableAmountHKD;
@@ -1560,23 +1584,10 @@
/**
 * 生成应付费用
 */
const handleYFGenerate = () =>{
const handleYFGenerate = () => {
  let ids = selectionList.value.map((item: any) => item.id);
  initYFGenerate(ids).then(res => {
    boxTableData.value = res.data || [];
    boxTableData.value.forEach((item:any) => {
      let items = item.tmsReceivableFeeItems || [];
      let receivableAmountRMB = items.filter( (cItem:any) => cItem.currency == 'RMB').reduce( (pre:any,cur:any) => {
        return pre + Number(cur.registerAmount)
      },0);
      let receivableAmountHKD = items.filter( (cItem:any) => cItem.currency == 'HKD').reduce( (pre:any,cur:any) => {
        return pre + Number(cur.registerAmount)
      },0);
      console.log(receivableAmountRMB,receivableAmountHKD)
      item.receivableAmountRMB = receivableAmountRMB;
      item.receivableAmountHKD = receivableAmountHKD;
    })
    optionType.value = 'yfGenerate';
    open.value = true;
    pageF.title = '生成应付费用';
@@ -1588,7 +1599,7 @@
const submitGenerate = () => {
  pageF.isUploading = true;
  let ids = selectionList.value.map((item: any) => item.id);
  if (optionType.value == 'ysGenerate'){
  if (optionType.value == 'ysGenerate') {
    ysGenerateTmsDispatchOrder(ids).then(res => {
      pageF.isUploading = false;
      ElMessage({
@@ -1600,7 +1611,7 @@
    }).finally(() => {
      pageF.isUploading = false;
    })
  }else  if (optionType.value == 'yfGenerate'){
  } else if (optionType.value == 'yfGenerate') {
    yfGenerateTmsDispatchOrder(ids).then(res => {
      pageF.isUploading = false;
      ElMessage({
@@ -1617,41 +1628,105 @@
}
const ysServiceProviderChange = (e:any,row:any) => {
  let  active = serviceProviderList.value.find((item:any) => item.serviceProviderId + '_'+ item.serviceProviderType == e)
const ysServiceProviderChange = (e: any, row: any) => {
  let active = serviceProviderList.value.find((item: any) => item.serviceProviderId + '_' + item.serviceProviderType == e)
  row.yfServiceProviderId = active.serviceProviderId;
  row.yfServiceProviderName = active.serviceProviderName;
  row.yfServiceProviderType = active.serviceProviderType;
}
const handleClose = (row:any) => {
const handleClose = (row: any) => {
  if (row.status == 2 && row.isfk == 1){
    checkCloseOrder(row.id).then(res=>{
  if (row.status == 2 && row.isfk == 1) {
    checkCloseOrder(row.id).then(res => {
      open5.value = true;
      form.value = row;
      boxFormOption.value = closeOption.value;
    });
  }else{
  } else {
    open5.value = true;
    form.value = row;
    boxFormOption.value = closeOption.value;
  }
}
const submitForm5 = () =>{
  boxFormRef.value.validate((valid: boolean,done:any) => {
    console.log(valid)
    if(valid){
const submitForm5 = () => {
  boxFormRef.value.validate((valid: boolean, done: any) => {
    if (valid) {
      boxForm.value.id = form.value.id;
      closeOrder(boxForm.value).then(res=>{
      closeOrder(boxForm.value).then(res => {
        ElMessage.success('操作成功');
        open5.value = false;
        done();
        onLoad(page.value)
      }).catch(err=>{
      }).catch(err => {
        done();
      })
    }
  })
}
const uploadRef = ref<any>()
const urlApi = ref(import.meta.env.VITE_APP_BASE_API)
// 在 script 部分修改 handleUploadAfter 函数
const handleUploadAfter = (res: any, row: any) => {
  if (res.code === 200) {
    // 确保 res.data.url 存在
    const url = res.data?.url || res.url;
    if (url) {
      boxForm.value.feeVoucherUrl = url
    } else {
      ElMessage.error('未获取到上传文件 URL');
    }
  } else {
    ElMessage.error(res.msg || '上传失败');
  }
};
// 同时修改 handleExceed 函数
const handleExceed = (files: any, row: any) => {
  if (!row) {
    ElMessage.error('行数据为空');
    return;
  }
  uploadRef.value?.clearFiles();
  const file = files[0];
  uploadRef.value?.handleStart(file);
  uploadRef.value?.submit();
};
const boxSelectionChange = (selection: any[]) => {
  boxSelectionList.value = selection;
}
/**
 * 批量作废费用明细
 */
const handleBatchBoxDel = () => {
  if (boxSelectionList.value.length === 0) {
    ElMessage.warning('请选择要作废的费用明细');
    return;
  }
  ElMessageBox.confirm(`确认要作废选中的 ${boxSelectionList.value.length} 条费用明细吗?`, '警告', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    // 从 boxTableData 中移除选中的项
    // const ids = boxSelectionList.value.map((item: any) => item.id).join(',');
    let data = {
      id: boxSelectionList.value[0].id,
      status: 1
    }
    tmsFinanceDetail(data).then(res => {
      ElMessage.success('作废成功');
      getTab2Data(); // 刷新数据
    }).catch(err => {
      ElMessage.error('作废失败');
    });
    // ElMessage.success('作废成功');
    // boxSelectionList.value = []; // 清空选择
  }).catch(() => {
    // 取消操作
  });
}
</script>