sen
昨天 7ed2a032d0724e68aec8af940f2ce0023a9f0eb7
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -5,6 +5,51 @@
      @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 #licensePlate-form="{ row, disabled }">
        <el-input v-model="form.licensePlate" placeholder="请选择车牌号" readonly :disabled="disabled"
          @click="handleVehicleSelect">
          <template #append>
            <el-button icon="el-icon-search" @click="handleVehicleSelect" />
          </template>
        </el-input>
      </template>
      <!-- template 中 -->
      <template #requiredVehicleTypes-form="{ row, disabled }">
        <template v-if="disabled">
          <span>{{ dictFormat(vehicle_type, row?.requiredVehicleTypes || form?.requiredVehicleTypes) }}</span>
        </template>
        <template v-else>
          <el-select v-model="form.requiredVehicleTypes" placeholder="请选择车型" style="width: 100%">
            <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" />
          </el-select>
        </template>
      </template>
      <template #orderType-form="{ row, disabled }">
        <template v-if="disabled">
          <span>{{ dictFormat(order_type, row?.orderType || form?.orderType) }}</span>
        </template>
        <template v-else>
          <el-select v-model="form.orderType" placeholder="请选择订单类型" @change="(val) => handleOrderTypeChange(val)"
            style="width: 100%" clearable>
            <el-option v-for="item in order_type" :key="item.value" :label="item.label" :value="parseInt(item.value)" />
          </el-select>
        </template>
      </template>
      <template #actualVehicleType-form="{ row, disabled }">
        <template v-if="disabled">
          <span>{{ dictFormat(vehicle_type, row?.actualVehicleType || form?.actualVehicleType) }}</span>
        </template>
        <template v-else>
          <el-select v-model="form.actualVehicleType" placeholder="请选择实际车型" style="width: 100%">
            <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" />
          </el-select>
        </template>
      </template>
      <template #menu-left>
        <!--        <el-button-->
        <!--            type="success"-->
@@ -41,11 +86,10 @@
        <el-button type="primary" icon="Male" :disabled="pageF.single" @click="handleConnectHang"
          v-hasPermi="['tms:tmsDispatchOrder:connectHang']">接挂
        </el-button>
        <el-button type="warning" icon="Avatar" :disabled="!(isCustoms == 0)" @click="handleCustoms"
        <el-button type="warning" icon="Avatar" :disabled="selectionList.length === 0" @click="handleCustoms"
          v-hasPermi="['tms:tmsDispatchOrder:customs']">委托报关信息
        </el-button>
        <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading"
        <el-button type="primary" icon="UserFilled" :disabled="selectionList.length === 0" @click="handleLoading"
          v-hasPermi="['tms:tmsDispatchOrder:loading']">委托卸货信息
        </el-button>
        <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ"
@@ -155,7 +199,7 @@
        </el-tooltip>
        <el-tooltip content="查看行程" placement="top">
          <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="never" icon="el-icon-view">
            v-hasPermi="['tms:tmsTrip:list']" class="link-btn" underline="never" icon="Finished">
            &nbsp;
          </el-link>
        </el-tooltip>
@@ -165,13 +209,13 @@
            &nbsp;
          </el-link>
        </el-tooltip>
        <!--
        <el-tooltip content="完成行程" placement="top">
          <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check">
            &nbsp;
          </el-link>
        </el-tooltip>
        </el-tooltip> -->
        <el-tooltip content="日志" placement="top">
          <el-link size="small" type="primary" @click="handleFlow(row)" class="link-btn"
@@ -214,7 +258,7 @@
            min="0"></el-input-number>
        </template>
      </avue-crud>
      <h2 v-if="optionType == 'addFinance'">实报实销费用1</h2>
      <h2 v-if="optionType == 'addFinance'">实报实销费用</h2>
      <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
        :option="boxFormOption">
@@ -262,26 +306,40 @@
      </div>
      <div v-if="optionType == 'customs'">
        <el-descriptions style="margin-bottom: 20px" :column="2" border>
        <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" 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>
        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
          style="width: 100%; margin-bottom: 20px">
          <el-table-column prop="dispatchNo" label="调度单号" width="150" />
          <el-table-column prop="customerName" label="客户" min-width="120" show-overflow-tooltip />
          <el-table-column prop="projectName" label="项目名称" min-width="120" show-overflow-tooltip />
          <el-table-column prop="transportLine" label="运输路线" min-width="150" show-overflow-tooltip />
        </el-table>
        <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
        </avue-form>
      </div>
      <div v-if="optionType == 'loading'">
        <el-descriptions style="margin-bottom: 20px" :column="2" border>
        <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" 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>
        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
          style="width: 100%; margin-bottom: 20px">
          <el-table-column prop="dispatchNo" label="调度单号" width="150" />
          <el-table-column prop="customerName" label="客户" min-width="120" show-overflow-tooltip />
          <el-table-column prop="projectName" label="项目名称" min-width="120" show-overflow-tooltip />
          <el-table-column prop="transportLine" label="运输路线" min-width="150" show-overflow-tooltip />
        </el-table>
        <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
        </avue-form>
      </div>
      <template #footer>
@@ -357,7 +415,6 @@
            <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right"
              placeholder="输入金额" style="width: 100%" />
          </template>
          <template #currency="{ row }">
            <el-radio-group v-model="row.currency">
              <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value">
@@ -366,15 +423,32 @@
            </el-radio-group>
          </template>
          <template #voucherUrl="{ row }">
            <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload>
            <!-- <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload> -->
            <!-- 凭证图片 -->
            <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>
            </el-upload>
          </template>
          <template #remark="{ row }">
            <el-input v-model="row.remark" placeholder="填写备注" clearable />
          </template>
        </avue-crud>
        <avue-crud :option="boxTableOption" :data="boxTableData">
        <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>
        </avue-crud>
      </div>
      <template #footer>
@@ -503,7 +577,7 @@
        <div class="dialog-footer">
          <el-button @click="print = 0" v-if="print == 1">重新填写</el-button>
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6">
            {{ pageF.isUploading ? '提交中' : '确 定2' }}
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
          <el-button @click="open6 = false">取 消</el-button>
@@ -582,7 +656,17 @@
    <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
  </basicContainer>
  <el-dialog title="选择车辆" v-model="vehicleDialogVisible" width="70%" append-to-body :close-on-click-modal="false">
    <avue-crud ref="vehicleCrudRef" :option="vehicleOption" :data="vehicleData" :page="vehiclePage"
      @on-load="loadVehicleList" @search-change="vehicleSearchChange" @search-reset="vehicleSearchReset"
      @current-change="vehicleCurrentChange" @size-change="vehicleSizeChange" @row-click="handleVehicleRowClick">
    </avue-crud>
    <template #footer>
      <el-button @click="vehicleDialogVisible = false">取 消</el-button>
      <el-button type="primary" @click="confirmVehicleSelection">确 定</el-button>
    </template>
  </el-dialog>
</template>
@@ -611,10 +695,11 @@
  printDispatchOrder,
  importTemplateTmsDispatchOrder, ypdddjSumbit,
  tmsTmsDispatchOrderImportLog,
  saveTmsFinanceDetail2
  saveTmsFinanceDetail2,
  getLastLicensePlate,
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
@@ -648,17 +733,38 @@
import { $Print } from '@smallwei/avue'
import { getToken } from "@/utils/auth";
import { useAvueTableShowHide } from "@/hooks/useAvueTableShowHide";
const { appContext } = getCurrentInstance();
import {
  tmsFinanceDetail
} from "@/api/tms/tmsDispatchOrder";
const { appContext } = getCurrentInstance() as any;
const { proxy } = useCurrentInstance(
);
const { fee_type, sys_currency } = proxy.useDict('fee_type', 'sys_currency')
// 定义类型
interface VehicleRow {
  id?: string;
  licensePlate?: string;
  serviceProviderName?: string;
  vehicleType?: string;
  internalCode?: string;
  licenseHk?: string;
  licenseMo?: string;
  [key: string]: any;
}
const { fee_type, sys_currency, vehicle_type, order_type } = proxy.useDict('fee_type', 'sys_currency', 'vehicle_type', 'order_type')
const crudRef = ref();
const boxFormRef = ref();
const goodsCrudRef = ref();
const actualFormRef = ref();
const isAutoSettingVehicle = ref(false);
/**
 * 字典公共转换函数
 */
const dictFormat = (dict: any, value: any) => {
  const dictData = Array.isArray(dict) ? dict : (dict?.value || []);
  if (value === undefined || value === null || value === '') return '';
  return proxy.selectDictLabel(dictData, value);
};
const permissionList = (key: any, row: any, index: any) => {
  if (key == 'addBtn') {
@@ -694,6 +800,7 @@
};
const data = reactive({
  form: <TmsDispatchOrderI>{},
  boxSelectionList: <any>[],
  queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 30,
@@ -725,7 +832,7 @@
  queryParams, form, page, selectionList, open3,
  boxTableData, optionType,
  boxFormOption, boxForm, boxTableOption, title, open, open2,
  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle
  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle, boxSelectionList
} = toRefs(data);
const option = ref({
  menuType: 'icon',
@@ -743,7 +850,7 @@
  labelWidth: 130,
  searchSpan: 6,
  searchLabelWidth: 150,
  menuWidth: 300,
  menuWidth: 350,
  height: 530,
  group: [
    {
@@ -779,7 +886,7 @@
                customerCode: active.customerCode,
                contractId: active.contractId,
                contractName: active.contractName,
                requiredVehicleTypes: active.vehicleType,
                requiredVehicleTypes: active.vehicleType + '',
                quotePlanId: active.quotePlanId,
              });
              form.value.shipperId = undefined;
@@ -864,15 +971,16 @@
          display: true, disabled: true
        },
        requiredVehicleTypes: {
          label: '下单车型', disabled: true,
          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
          rules: [
            {
              required: true,
              message: "下单车型不能为空", trigger: "blur"
            }
          ],
          label: '下单车型',
          minWidth: 130,
          display: true,        // ✅ 改为 true 在表格显示
          type: 'select',
          search: true,
          dicUrl: '/system/dict/data/type/vehicle_type',
          dataType: 'string',
        },
        orderType: {
          label: '订单类型',
          display: true,
@@ -885,9 +993,13 @@
            }
          ],
          change: ({ value }: any) => {
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.shipperId.rules.forEach((cItem: any) => {
                  cItem.required = !(value == 1);
                });
                item.column.receiverId.rules.forEach((cItem: any) => {
@@ -1095,9 +1207,9 @@
        // },
        orderTime: {
          label: '下单时间',
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
          type: 'date',  // 改为 datetime 类型
          format: 'YYYY-MM-DD',
          valueFormat: 'YYYY-MM-DD',
          display: true,
          rules: [
            {
@@ -1152,7 +1264,6 @@
            }
          ],
          change: ({ value }: any) => {
            console.log(value)
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.commissionModel.display = value != 1;
@@ -1274,18 +1385,75 @@
              message: "主驾驶员不能为空", trigger: "change"
            }
          ],
          change: (val: any) => {
          // 在 mainDriverId 的 change 事件中
          change: async (val: any) => {
            if (data.isChanging) return;
            data.isChanging = true;
            isAutoSettingVehicle.value = true;
            const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
            if (!table) return;
            if (!table) {
              data.isChanging = false;
              isAutoSettingVehicle.value = false;
              return;
            }
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                mainDriverId: active.id,
                mainDriverName: active.driverName,
              });
            console.log('自动填充成功:', active);
            if (active && active.driverName) {
              try {
                await nextTick(); // 等待清空生效
                const res = await getLastLicensePlate(active.driverName);
                if (res.code === 200 && res.data) {
                  const vehicleData = res.data;
                  nextTick(() => {
                    Object.assign(form.value, {
                      licensePlate: vehicleData.licensePlate,
                      vehicleId: vehicleData.vehicleId,
                      actualVehicleType: vehicleData.actualVehicleType,
                      mainDriverName: active.driverName
                    });
                  })
                  await nextTick();
                  console.log('自动填充成功:', form.value);
                }
              } catch (e) {
                console.error("自动获取车牌失败", e);
              } finally {
                data.isChanging = false;
                setTimeout(() => {
                  // isAutoSettingVehicle.value = false;
                }, 500); // 稍微延长一点时间,防止 vehicleId 的 change 事件误触
              }
            } else {
              data.isChanging = false;
              // isAutoSettingVehicle.value = false;
            }
          },
          // change: (val: any) => {
          //   const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
          //   if (!table) return;
          //   let active = table.active;
          //   if (Array.isArray(active)) active = active[0];
          //   console.log(active,'888');
          //   if (active) {
          //     Object.assign(form.value, {
          //       mainDriverId: active.id,
          //       mainDriverName: active.driverName,
          //     });
          //     console.log(active.driverName,'44');
          //     getLastLicensePlate(active.driverName).then(res => {
          //       console.log(res);
          //     })
          //   }
          // },
          type: 'table', suffixIcon: 'search',
          children: {
            border: true,
@@ -1383,6 +1551,8 @@
              if (Array.isArray(value)) {
                id = value[0]
              }
              console.log(98521);
              getTmsDriver(id).then(res => {
                return callback(res.data || {})
              })
@@ -1402,92 +1572,117 @@
          }
        },
        vehicleId: {
        licensePlate: {
          label: '车牌号', dataType: 'string',
          display: true,
          readonly: true,
          rules: [
            {
              required: true,
              required: false,
              message: "车牌号不能为空", trigger: "change"
            }
          ],
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
            if (!table) return;
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                vehicleId: active.id,
                licensePlate: active.licensePlate,
                actualVehicleType: active.vehicleType,
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          children: {
            border: true,
            searchLabelWidth: 100,
            searchMenuSpan: 5,
            column: {
              serviceProviderName: {
                label: '车辆服务商', minWidth: 130,
                search: true,
              },
              vehicleType: {
                label: '车辆类型', minWidth: 120,
                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
                search: true,
              },
              internalCode: {
                label: '车辆内部编码', minWidth: 120,
                search: true,
              },
              licensePlate: {
                label: '车牌号', minWidth: 120,
                search: true,
              },
              licenseHk: {
                label: '香港牌照', minWidth: 120,
                search: true,
              },
              licenseMo: {
                label: '澳门牌照', minWidth: 120,
                search: true,
              },
            },
          },
          props: {
            label: 'licensePlate',
            value: 'id'
          },
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
                id = value[0]
              }
              getTmsVehicle(id).then(res => {
                return callback(res.data || {})
              })
            } else {
              listTmsVehicle({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
              }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
                })
              })
            }
          click: ({ value, column }) => {
            // 点击输入框时触发选择弹窗
            handleVehicleSelect();
          }
        },
        // vehicleId: {
        //   label: '车牌号', dataType: 'string',
        //   display: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "车牌号不能为空", trigger: "change"
        //     }
        //   ],
        //   change: (val: any) => {
        //     if (isAutoSettingVehicle.value) {
        //       return;
        //     }
        //     const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
        //     if (!table) return;
        //     let active = table.active;
        //     if (Array.isArray(active)) active = active[0];
        //     console.log(9852);
        //     if (active) {
        //       Object.assign(form.value, {
        //         vehicleId: active.id,
        //         licensePlate: active.licensePlate,
        //         actualVehicleType: active.vehicleType,
        //       });
        //     }
        //   },
        //   type: 'table', suffixIcon: 'search',
        //   children: {
        //     border: true,
        //     searchLabelWidth: 100,
        //     searchMenuSpan: 5,
        //     column: {
        //       serviceProviderName: {
        //         label: '车辆服务商', minWidth: 130,
        //         search: true,
        //       },
        //       vehicleType: {
        //         label: '车辆类型', minWidth: 120,
        //         type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
        //         search: true,
        //       },
        //       internalCode: {
        //         label: '车辆内部编码', minWidth: 120,
        //         search: true,
        //       },
        //       licensePlate: {
        //         label: '车牌号', minWidth: 120,
        //         search: true,
        //       },
        //       licenseHk: {
        //         label: '香港牌照', minWidth: 120,
        //         search: true,
        //       },
        //       licenseMo: {
        //         label: '澳门牌照', minWidth: 120,
        //         search: true,
        //       },
        //     },
        //   },
        //   props: {
        //     label: 'licensePlate',
        //     value: 'id'
        //   },
        //   onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        //     if (value) {
        //       let id = value;
        //       if (Array.isArray(value)) {
        //         id = value[0]
        //       }
        //       console.log(555, 'xq1');
        //       getTmsVehicle(id).then(res => {
        //         return callback(res.data || {})
        //       })
        //     } else {
        //       console.log(444, 'xq1');
        //       listTmsVehicle({
        //         pageSize: page.pageSize,
        //         pageNum: page.currentPage, ...data,
        //         carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
        //       }).then(res => {
        //         return callback({
        //           total: res.total,
        //           data: res.rows || [],
        //         })
        //       })
        //     }
        //   }
        // },
        actualVehicleType: {
          label: '派出车型',
          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
@@ -1796,12 +1991,12 @@
      dataType: 'string',
    },
    createTimeRange: {
      label: '创建时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
      overHidden: true
    },
    // createTimeRange: {
    //   label: '创建时间', display: false, searchRange: true, type: 'date',
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
    //   valueFormat: 'YYYY-MM-DD',
    //   overHidden: true
    // },
    createTimeRangeArray: {
      label: '创建时间',
      minWidth: 150,
@@ -1809,6 +2004,7 @@
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      viewDisplay: false,
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
@@ -1827,7 +2023,8 @@
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      editDisplay: false, //
      viewDisplay: false,
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
@@ -1929,7 +2126,6 @@
      display: false,
      search: true,
      type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    },
@@ -1984,20 +2180,8 @@
      search: true,
    },
    confirmTime: {
      label: '确认时间', minWidth: 200,
      display: false,
      hide: false,
      search: false,
      searchSpan: 6,
    },
    orderTime: {
      label: '下单时间', minWidth: 180,
      display: false,
      hide: false,
      search: false,
      searchSpan: 6,
    },
    createBy: {
      label: '创建人', minWidth: 150,
      addDisplay: false,
@@ -2010,7 +2194,7 @@
      label: '创建时间', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: false,
      viewDisplay: true,
      hide: false,
      search: false,
      overHidden: true,
@@ -2029,14 +2213,23 @@
      label: '更新时间', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: false,
      viewDisplay: true,
      hide: false,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    confirmTime: {
      label: '确认时间', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: true,
      hide: true,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    confirmTimeRange: {
      label: '确认时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
@@ -2049,17 +2242,29 @@
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      viewDisplay: false,
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    okTimeRange: {
      label: '完成时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    okTime: {
      label: '完成时间', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: true,
      hide: true,
      search: false,
      searchSpan: 6,
    },
    // okTimeRange: {
    //   label: '完成时间2', display: false, searchRange: true, type: 'date',
    //   viewDisplay: true,
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
    //   valueFormat: 'YYYY-MM-DD',
    // },
    okTimeRangeArray: {
      label: '完成时间',
      minWidth: 150,
@@ -2067,17 +2272,37 @@
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      viewDisplay: false,
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    orderTimeRange: {
      label: '下单时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    orderTime: {
      label: '下单时间', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: true,
      hide: true,
      search: false,
      searchSpan: 6,
    },
    loadingDate: {
      bind: 'orderTime',
      label: '装货日期', minWidth: 180,
      addDisplay: false,
      editDisplay: false,
      viewDisplay: true,
      hide: true,
      search: false,
      searchSpan: 6,
    },
    // orderTimeRange: {
    //   label: '下单时间', display: false, searchRange: true, type: 'date',
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
    //   valueFormat: 'YYYY-MM-DD',
    // },
    orderTimeRangeArray: {
      label: '下单时间',
      minWidth: 150,
@@ -2085,6 +2310,7 @@
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      viewDisplay: false,
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
@@ -2182,7 +2408,7 @@
    },
  }
})
const urlApi = ref(import.meta.env.VITE_APP_BASE_API)
const itineraryTableOption = ref({
  menu: false,
  addBtn: false,
@@ -2261,19 +2487,19 @@
      ],
    },
    currency: {
      label: '币种',
      label: '币制',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
      rules: [
        {
          required: true,
          message: "币种不能为空", trigger: "change"
          message: "币制不能为空", trigger: "change"
        }
      ],
    },
    voucherUrl: {
      label: '费用凭证',
      label: '费用凭证1',
      display: true,
      accept: 'string', dataType: 'string',
      type: 'upload',
@@ -2295,7 +2521,8 @@
const financeTableOption = ref({
  menu: false,
  addBtn: false,
  header: false, selection: false,
  selection: true,
  header: true,
  title: '历史垫付费用',
  column: {
    dataSource: {
@@ -2324,7 +2551,7 @@
      display: true,
    },
    currency: {
      label: '币种',
      label: '币制',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
    },
@@ -2339,7 +2566,11 @@
    remark: {
      label: '备注',
    },
    status: {
      label: '状态',
      display: true,
      type: 'select', dicUrl: '/system/dict/data/type/sys_cancel_word', dataType: 'string',
    },
  }
})
@@ -2456,10 +2687,14 @@
          if (Array.isArray(value)) {
            id = value[0]
          }
          console.log(998, 'xq1');
          getTmsVehicle(id).then(res => {
            return callback(res.data || {})
          })
        } else {
          console.log(669, 'xq2');
          listTmsVehicle({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
@@ -3055,9 +3290,9 @@
  }
});
const zzItemsTableData = ref();
/* 报关列表 */
const clearanceList = ref([]);
const optionNum = ref(''); // 用于区分是报关还是装卸
const {
  tableData,
@@ -3093,6 +3328,7 @@
  },
  handleSelectionChangeFunc: (selection: any) => {
    selectionList.value = selection;
    clearanceList.value = selection;
    if (selection.length > 0) {
      isCustoms.value = selection[0].isCustoms;
      isLoad.value = selection[0].isLoad;
@@ -3112,75 +3348,54 @@
  },
  getBeginListFunc: (params = {}) => {
    // 1. 日期转换
    let newParams = <any>{ ...params };
    console.log(newParams, '2');
   if (newParams) {
  // 1. 定义日期字段映射 (数组名 : 接口需要的前缀)
  // 这样写的好处是:如果你有多个日期,直接在这里添加一行即可
  const dateMap = {
    confirmTimeRangeArray: 'confirmTimeRange',
    createTimeRangeArray: 'createTime',
    updateTimeRangeArray: 'updateTimeRange',
    okTimeRangeArray: 'okTime',
    orderTimeRangeArray: 'orderTime'
  };
    // 1. 使用浅拷贝,不影响原始查询对象
    // 关键点:从原始 queryParams.value 取值,确保分页时依然能拿到数组
    let newParams = { ...queryParams.value, ...params };
  // 2. 遍历处理日期
  Object.keys(dateMap).forEach(arrayKey => {
    const prefix = dateMap[arrayKey];
    const range = newParams[arrayKey];
    // 2. 定义日期字段映射 (数组名 : 接口需要的前缀)
    const dateMap = {
      confirmTimeRangeArray: 'confirmTimeRange',
      createTimeRangeArray: 'createTime',
      updateTimeRangeArray: 'updateTimeRange',
      okTimeRangeArray: 'okTime',
      orderTimeRangeArray: 'orderTime'
    };
    if (Array.isArray(range) && range.length > 0) {
      // 赋值 Begin 和 End
      newParams[`${prefix}Begin`] = range[0];
      newParams[`${prefix}End`] = range[1];
    }
    // 【核心改动】:无论是否有值,处理完后都把原始的 Array 字段删掉
    // 这样请求里就不会出现 confirmTimeRangeArray: [...]
    delete newParams[arrayKey];
  });
    // 3. 遍历处理日期
    Object.keys(dateMap).forEach(arrayKey => {
      const prefix = dateMap[arrayKey];
      const range = newParams[arrayKey];
  // 3. 通用清洗:删除所有空字符串、null 或 undefined 的其他字段
  Object.keys(newParams).forEach(key => {
    const val = newParams[key];
    if (val === '' || val === null || val === undefined) {
      delete newParams[key];
    }
  });
      if (Array.isArray(range) && range.length === 2) {
        // 赋值接口需要的 Begin 和 End
        newParams[`${prefix}Begin`] = range[0];
        newParams[`${prefix}End`] = range[1];
      }
} else {
  newParams = {};
}
      // 只在给接口的参数中删除数组,不影响页面显示的 queryParams
      delete newParams[arrayKey];
    });
console.log('最终发送给接口的参数:', newParams);
return newParams;
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRangeArray, 'createTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRangeArray, 'updateTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRangeArray, 'confirmTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRangeArray, 'okTime');
    // newParams =  proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRangeArray, 'orderTime');
    // delete newParams.createTimeRangeArray;
    // delete newParams.updateTimeRangeArray;
    // delete newParams.confirmTimeRangeArray;
    // delete newParams.okTimeRangeArray;
    // delete newParams.orderTimeRangeArray;
    // 4. 清洗参数:过滤空值
    const finalParams = {};
    Object.keys(newParams).forEach(key => {
      const val = newParams[key];
      if (val !== '' && val !== null && val !== undefined) {
        finalParams[key] = val;
      }
    });
    // delete newParams.updateTimeArray;
    // delete newParams.businessTimeArray;
    // delete newParams.payableConfirmTimeArray;
    queryParams.value = newParams;
    return newParams;
    // 【核心修改】:直接返回,不要赋值给 queryParams.value
    return finalParams;
  },
  handleBeforeOpenFunc: (type: string) => {
    if (type == 'add') {
      form.value = {};
    } else if (type == 'edit') {
      // form.value = row;
    }
  }
@@ -3240,7 +3455,6 @@
const handleUploadItinerary = (row: any) => {
  optionType.value = 'addItinerary';
  boxFormOption.value = itineraryOption.value;
  console.log(itineraryOption.value);
  boxTableOption.value = itineraryTableOption.value;
  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
@@ -3256,7 +3470,6 @@
      vehicleNumber: row.licensePlate,
      vehicleId: row.vehicleId,
    }
    console.log(boxForm.value);
  })
}
@@ -3417,11 +3630,24 @@
      pageF.isUploading = false;
    })
  } else if (optionType.value === 'customs') {
    customsOrder({
      id: form.value.id,
      customsServiceProviderId: form.value.customsServiceProviderId,
      customsServiceProviderName: form.value.customsServiceProviderName,
    }).then(res => {
    let result = <any>[];
    if (optionNum.value == 'checkbox') {
      result = clearanceList.value.map(item => {
        return {
          id: item.id,
          customsServiceProviderId: form.value.customsServiceProviderId,
          customsServiceProviderName: form.value.customsServiceProviderName
        };
      });
    } else if (optionNum.value == 'radio') {
      result = [{
        id: form.value.id,
        customsServiceProviderId: form.value.customsServiceProviderId,
        customsServiceProviderName: form.value.customsServiceProviderName
      }]
    }
    customsOrder(result).then(res => {
      ElMessage({
        message: "提交成功!",
        type: 'success'
@@ -3432,11 +3658,25 @@
      pageF.isUploading = false;
    })
  } else if (optionType.value === 'loading') {
    loadingOrder({
      id: form.value.id,
      loadingServiceProviderId: form.value.loadingServiceProviderId,
      loadingServiceProviderName: form.value.loadingServiceProviderName,
    }).then(res => {
    let result = <any>[];
    if (optionNum.value == 'checkbox') {
      result = clearanceList.value.map(item => {
        return {
          id: item.id,
          loadingServiceProviderId: form.value.loadingServiceProviderId,
          loadingServiceProviderName: form.value.loadingServiceProviderName
        };
      });
    } else if (optionNum.value == 'radio') {
      result = [{
        id: form.value.id,
        loadingServiceProviderId: form.value.loadingServiceProviderId,
        loadingServiceProviderName: form.value.loadingServiceProviderName
      }]
    }
    loadingOrder(result).then(res => {
      ElMessage({
        message: "提交成功!",
        type: 'success'
@@ -3900,7 +4140,6 @@
                  form2.value.districtId = districtCode;
                  form2.value.streetId = townshipCode;
                  form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
                  console.log(form2.value, "form2")
                }
              });
            }
@@ -4074,17 +4313,32 @@
const handleCustoms = () => {
  title.value = '补充委托报关信息';
  open.value = true;
  form.value = selectionList.value[0];
  form.value = clearanceList.value[0];
  optionType.value = 'customs';
  optionNum.value = 'checkbox'
  boxFormOption.value = customsOption.value;
}
const handleCustomsAdd = (selectionList) => {
const handleCustomsAdd = (row) => {
  title.value = '补充委托装卸信息';
  clearanceList.value = [];
  // 2. 清除表格视觉上的选中状态
  if (crudRef.value) {
    crudRef.value.clearSelection();
  }
  // 3. 重置表单
  form.value = {};
  // 4. 将当前点击的行数据赋值给 form,用于弹窗编辑
  Object.assign(form.value, row);
  open.value = true;
  form.value = selectionList;
  optionType.value = 'loading';
  optionNum.value = 'radio';
  boxFormOption.value = loadingOption.value;
}
const handleLoading = () => {
@@ -4092,14 +4346,33 @@
  open.value = true;
  form.value = selectionList.value[0];
  optionType.value = 'loading';
  optionNum.value = 'checkbox'
  boxFormOption.value = loadingOption.value;
}
const handleLoadingAdd = (selectionList) => {
  title.value = '补充委托装卸信息';
const handleLoadingAdd = (row: any) => {
  // 1. 清空批量选中的数据列表,导致顶部按钮 disabled (length === 0)
  clearanceList.value = [];
  // 2. 清除表格视觉上的选中状态
  if (crudRef.value) {
    crudRef.value.clearSelection();
  }
  // 3. 重置表单
  form.value = {};
  // 4. 将当前点击的行数据赋值给 form,用于弹窗编辑
  Object.assign(form.value, row);
  // 5. 设置弹窗配置
  title.value = '补充委托报关信息';
  optionType.value = 'customs';
  optionNum.value = 'radio';
  boxFormOption.value = customsOption.value;
  // 6. 打开弹窗
  open.value = true;
  form.value = selectionList;
  optionType.value = 'loading';
  boxFormOption.value = loadingOption.value;
  // 【调试】此时打印,长度应为 0
}
const quotationItems = ref();
const getQuotationItems = async () => {
@@ -4109,7 +4382,6 @@
getQuotationItems();
const getTabData = (val: string) => {
  console.log(val)
  let filter = quotationItems.value.filter((item: any) => {
    return item.remark == val;
  });
@@ -4127,9 +4399,7 @@
    dispatchOrderId: form.value.id, financeType: 2,
    pageNum: 1, pageSize: 999
  }).then(async res => {
    boxTableData.value = res.rows || [];
    boxForm.value = {
      dispatchOrderId: form.value.id,
      dataSource: 0,
@@ -4173,8 +4443,12 @@
    // 3. 处理凭证 URL (如果有单张或多张上传的逻辑)
    // 假设后端需要的是逗号分隔的字符串
    const submitData = validDetails.map(item => {
    const submitData = validDetails.map((item: any) => {
      let url = item.voucherUrl;
      item.dispatchOrderId = form.value.id;
      item.financeType = 2;
      item.status = 0;
      item.dataSource = 1;
      if (Array.isArray(url)) {
        url = url.join(',');
      }
@@ -4187,8 +4461,9 @@
        message: "操作成功!",
        type: 'success'
      })
      open4.value = false;
      // open4.value = false;
      onLoad(page.value)
      initExpenditureData();
      boxFormRef.value?.resetFields();
      getTab4Data();
    })
@@ -4244,7 +4519,6 @@
}
const submitForm5 = () => {
  boxFormRef.value.validate((valid: boolean, done: any) => {
    console.log(valid)
    if (valid) {
      boxForm.value.id = form.value.id;
      closeOrder(boxForm.value).then(res => {
@@ -4741,7 +5015,6 @@
      accept: 'string', dataType: 'object',
      type: 'upload',
      // action: '/common/upload2',
      prop: 'voucherUrl', // 这里改成 prop 属性
      slot: true,        // 开启插槽
      width: 200
@@ -4755,6 +5028,7 @@
});
// 3. 回显初始化
const initExpenditureData = () => {
  tmsFinanceDetails.value = []
  if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) {
    tmsFinanceDetails.value = fee_type.value.map(item => ({
      feeType: item.value,
@@ -4772,19 +5046,25 @@
    initExpenditureData();
  }
});
const handleUploadAfter = (res, done, loading, column, row) => {
const handleUploadAfter = (res: any, row: any) => {
  // res 是接口返回的完整数据
  if (res && res.url) {
  if (res.code === 200) {
    // 手动给这一行的数据赋值
    row.voucherUrl = res.url;
    console.log('上传成功,当前行数据:', row);
    row.voucherUrl = res.data.url;
  } else if (res.data && res.data.url) {
    // 如果返回的数据包裹在 data 里
    row.voucherUrl = res.data.url;
  }
  done(); // 必须调用 done 结束上传状态
};
/** 当文件超出限制时(实现自动替换逻辑) */
const handleExceed = (files: any, row: any) => {
  // 1. 清除当前显示的文件列表
  uploadRef.value.clearFiles();
  // 2. 手动把新选择的文件添加进去重新上传
  const file = files[0];
  uploadRef.value.handleStart(file);
  uploadRef.value.submit();
};
const flowLogIshow = ref()
const flowParams = ref([])
@@ -4799,6 +5079,203 @@
  })
}
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(() => {
    let data = {
      id: boxSelectionList.value[0].id,
      status: 1
    }
    tmsFinanceDetail(data).then(res => {
      ElMessage.success('作废成功');
      getTab4Data(); // 刷新数据
    }).catch(err => {
      ElMessage.error('作废失败');
    });
  }).catch(() => {
    // 取消操作
  });
}
const handleOrderTypeChange = (value: any) => {
  // 防止 value 为 null 或 undefined 时出错 (当清空选择时)
  if (value === null || value === undefined) {
    return;
  }
  option.value.group.forEach((item: any) => {
    if (item.prop == 'pcxx') {
      // 处理装货点必填规则
      if (item.column.shipperId && item.column.shipperId.rules) {
        item.column.shipperId.rules.forEach((cItem: any) => {
          cItem.required = !(value == 1);
        });
      }
      // 处理卸货点必填规则
      if (item.column.receiverId && item.column.receiverId.rules) {
        item.column.receiverId.rules.forEach((cItem: any) => {
          cItem.required = !(value == 1);
        });
      }
    }
  });
  // 【新增逻辑】如果切换到了非必填状态 (value == 1),则清除这两个字段的校验提示
  if (value == 1) {
    // 确保 crudRef 存在且暴露了 clearValidate 方法
    if (crudRef.value && typeof crudRef.value.clearValidate === 'function') {
      // 清除指定字段的校验状态
      crudRef.value.clearValidate(['shipperId', 'receiverId']);
    }
  }
};
/* 车牌号 */
// --- 状态管理 ---
const vehicleDialogVisible = ref(false);
const vehicleData = ref<VehicleRow[]>([]);
const vehicleQuery = ref<any>({});
const selectedVehicleRow = ref<VehicleRow>({});
const vehiclePage = ref({
  currentPage: 1,
  pageSize: 10,
  total: 0
});
// --- 弹窗配置 ---
const vehicleOption = ref({
  header: true,
  menu: false,
  addBtn: false,
  refreshBtn: true,
  columnBtn: false,
  index: false,
  selection: false,
  searchShow: true,
  searchMenuSpan: 6,
  searchLabelWidth: 100,
  highlightCurrentRow: true,
  column: [
    { label: '车辆服务商', prop: 'serviceProviderName', search: true },
    {
      label: '车辆类型',
      prop: 'vehicleType',
      type: 'select',
      dataType: 'string',
      dicUrl: '/system/dict/data/type/vehicle_type',
      search: true
    },
    { label: '车辆内部编码', prop: 'internalCode', search: true },
    { label: '车牌号', prop: 'licensePlate', search: true },
    { label: '香港牌照', prop: 'licenseHk' },
    { label: '澳门牌照', prop: 'licenseMo' }
  ]
});
// --- 方法 ---
/**
 * 加载数据:默认强制传 carrierType: '0'
 */
const loadVehicleList = async (page?: any, params?: any) => {
  const query = {
    pageNum: vehiclePage.value.currentPage,
    pageSize: vehiclePage.value.pageSize,
    carrierType: '0', // 默认强制传0
    ...vehicleQuery.value,
    ...params
  };
  try {
    const res = await listTmsVehicle(query);
    if (res.code === 200) {
      // const { records, total } = res.rows;
      vehicleData.value = res.rows;
      vehiclePage.value.total = res.total;
    }
  } catch (error) {
    console.error("加载车辆列表失败", error);
  }
};
/**
 * 搜索:带入搜索参数并强制 carrierType 为 0
 */
const vehicleSearchChange = (params: any, done: Function) => {
  vehicleQuery.value = params;
  vehiclePage.value.currentPage = 1;
  loadVehicleList();
  done();
};
/**
 * 重置:清空搜索条件,但依然保留 carrierType 为 0
 */
const vehicleSearchReset = () => {
  vehicleQuery.value = {}; // 清空搜索
  vehiclePage.value.currentPage = 1;
  loadVehicleList(); // loadVehicleList 内部已经写死 carrierType: '0'
};
const vehicleCurrentChange = (val: number) => {
  vehiclePage.value.currentPage = val;
  loadVehicleList();
};
const vehicleSizeChange = (val: number) => {
  vehiclePage.value.pageSize = val;
  loadVehicleList();
};
const handleVehicleRowClick = (row: VehicleRow) => {
  selectedVehicleRow.value = row;
};
// 打开弹窗方法
const handleVehicleSelect = () => {
  selectedVehicleRow.value = {};
  vehicleDialogVisible.value = true;
};
/**
 * 确认选择:回显到主表单
 */
const confirmVehicleSelection = () => {
  if (!selectedVehicleRow.value.licensePlate) {
    appContext.$message.warning("请点击选择一行记录");
    return;
  }
  // 1. 赋值 (确保主表单 data.form 存在)
  data.form.vehicleId = selectedVehicleRow.value.id;
  data.form.licensePlate = selectedVehicleRow.value.licensePlate;
  data.form.actualVehicleType= selectedVehicleRow.value.vehicleType;
  // 如果需要其他字段也可以一并带回,比如服务商等
  // data.form.serviceProviderName = selectedVehicleRow.value.serviceProviderName;
  vehicleDialogVisible.value = false;
  // 2. 强制视图更新
  nextTick(() => {
    appContext.$forceUpdate();
  });
};
</script>
<style lang="scss" scoped>
::v-deep .cydprint .el-dialog__body {
@@ -4874,4 +5351,74 @@
.link-btn {
  font-size: 18px;
}
/*  */
/* 现有的样式保持不变... */
.specific-drag-area {
  width: 100%;
  :deep(.full-width-drag) {
    // 1. 核心:隐藏 Avue 默认在 dragger 下方生成的那个“点击上传”按钮
    // 在 3.x 版本中,它是 el-upload 后的一个兄弟节点或者是内部节点
    .el-button--primary {
      display: none !important;
    }
    .el-upload {
      width: 100%;
      display: block; // 确保块级显示
      .el-upload-dragger {
        width: 100%;
        height: 120px;
        background-color: #fcfdfe;
        border: 2px dashed #dcdfe6;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 0 !important;
        // 覆盖 Element Plus 默认的内部文字排版,防止冲突
        .el-upload__text {
          display: none !important;
        }
        &:hover {
          border-color: #409eff;
          background-color: #f5f7fa;
        }
      }
    }
  }
  // 3. 自定义内容的样式(确保它不被 display:none 影响)
  .drag-zone-inner {
    pointer-events: none;
    text-align: center;
    .upload-icon {
      font-size: 32px !important;
      color: #909399;
      margin-bottom: 8px;
    }
    .drag-text {
      .main-title {
        font-size: 14px;
        color: #606266;
        font-weight: bold;
        line-height: 1.5;
      }
      .sub-title {
        font-size: 12px;
        color: #a8abb2;
        margin-top: 4px;
      }
    }
  }
}
</style>