zjk
2026-03-31 d1464e052c7a1e3da51ffcb5059155f7c7298253
feat: 修改样式
7个文件已修改
127 ■■■■■ 已修改文件
service.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/custom/SearchPanel.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layouts/components/tab/DropTabs.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/styles/robotaxi.scss 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/geofenceManagement/detail.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/businessOperations/geofenceManagement/index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/transaction/order/orderManagement/index.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service.config.ts
@@ -2,8 +2,9 @@
export const serviceConfig: Record<ServiceEnvType, Record<string, string>> = {
  dev: {
    // url: 'http://localhost:3000',
    url: 'http://221.182.45.100:8000',
    // url: 'http://221.182.45.100:8000',
    // url: 'http://192.168.110.80:8000',
    url: 'https://rt-api.deploy-test.xiaopeng.com',
  },
  production: {
    url: 'https://rt-api.deploy-test.xiaopeng.com',
src/components/custom/SearchPanel.vue
@@ -103,7 +103,7 @@
      <!-- 操作区 -->
      <n-gi suffix class="n-grid-item">
        <div class="search-panel__actions">
          <n-button v-if="showToggle" text size="small" @click="toggle">
          <n-button v-if="showToggle" class="collapse-toggle-btn" text size="small" icon-placement="right" @click="toggle">
            <template #icon>
              <icon-park-outline-up v-if="!collapsed" />
              <icon-park-outline-down v-else />
@@ -129,4 +129,14 @@
  align-items: center;
  gap: 8px;
}
:deep(.collapse-toggle-btn.n-button) {
  --n-color-hover: transparent;
  --n-color-pressed: transparent;
  --n-color-focus: transparent;
  --n-ripple-color: transparent;
  --n-text-color-hover: var(--n-text-color);
  --n-text-color-pressed: var(--n-text-color);
  --n-text-color-focus: var(--n-text-color);
}
</style>
src/layouts/components/tab/DropTabs.vue
@@ -95,7 +95,7 @@
  }
  .list-content {
    max-height: 800px;
    max-height: 80vh;
    overflow-y: auto;
    padding-bottom: 18px;
src/styles/robotaxi.scss
@@ -319,6 +319,12 @@
  color: #FF9000 !important;
}
.custom-dialog {
  .n-base-icon.n-dialog__icon {
    color: #0068FF !important;
  }
}
.n-time-picker-actions {
  justify-content: space-between !important;
src/views/businessOperations/geofenceManagement/detail.vue
@@ -57,6 +57,9 @@
const disallowedAreaList = ref<any[]>([])
const drawerVisible = ref(false)
// 存储已渲染的多边形对象
const renderedPolygons = ref<any[]>([])
// 判断多边形是否自相交
function isPolygonSelfIntersect(points: number[][]): boolean {
  const len = points.length
@@ -735,6 +738,23 @@
  }
}
function isEndTimeDisabledByStart(hour: number, minute: number | undefined, sub: any) {
  if (!sub.startTime) {
    return false
  }
  const [startH, startM] = sub.startTime.split(':').map(Number)
  if (minute === undefined) {
    return hour < startH
  }
  if (hour < startH) {
    return true
  }
  if (hour === startH) {
    return minute <= startM
  }
  return false
}
function disablePreviousDate(ts: number) {
  const today = new Date()
  today.setHours(0, 0, 0, 0)
@@ -1129,7 +1149,7 @@
}
/** 确认禁行区编辑 */
/** 判断禁行区时间是否被禁用 */
function isDisallowedTimeDisabled(hour: number, minute: number | undefined, item: any, type: 'start' | 'end') {
function isDisallowedTimeDisabled(hour: number, minute: number | undefined, item: any) {
  if (groupList.value.length === 0 || !item.typeStr) {
    return false
  }
@@ -1370,8 +1390,6 @@
const renderedMarkers = ref<any[]>([])
/** 运营中区域列表 */
const fenceAreaList = ref<any[]>([])
// 存储已渲染的多边形对象
const renderedPolygons = ref<any[]>([])
/** 保存草稿/发布围栏 */
function handleAddFence(type: number) {
@@ -1474,6 +1492,8 @@
  formRef.value.validate().then(() => {
    // 验证运营策略重复
    const strategyTypes = new Set<string>()
    let hasStrategyError = false
    const globalStrategyErrors: string[] = []
    for (const item of groupList.value) {
      let typeKey = ''
      if (item.type === 0) { // 工作日
@@ -1493,17 +1513,15 @@
      }
      if (typeKey) {
        if (strategyTypes.has(typeKey)) {
          message.error(`运营策略存在重复:${item.name} 的类型已存在`)
          mainScrollRef.value?.scrollTo({ top: 9999, behavior: 'smooth' })
          return
          hasStrategyError = true
          globalStrategyErrors.push(`运营策略存在重复:${item.name} 的类型已存在`)
        }
        strategyTypes.add(typeKey)
      }
      // 验证每天与其他策略互斥
      if (typeKey.includes('custom-0') && groupList.value.length > 1) {
        message.error('选择“每天”时,不能添加其他运营策略')
        mainScrollRef.value?.scrollTo({ top: 9999, behavior: 'smooth' })
        return
        hasStrategyError = true
        globalStrategyErrors.push('选择“每天”时,不能添加其他运营策略')
      }
    }
    // 验证运营策略时间段
@@ -1529,8 +1547,8 @@
      }
      if (hasError) {
        mainScrollRef.value?.scrollTo({ top: 9999, behavior: 'smooth' })
        return
        hasStrategyError = true
        continue
      }
      // 验证时间段重叠
@@ -1544,9 +1562,16 @@
      }
      if (hasError) {
        mainScrollRef.value?.scrollTo({ top: 9999, behavior: 'smooth' })
        return
        hasStrategyError = true
      }
    }
    if (globalStrategyErrors.length > 0) {
      message.error(globalStrategyErrors[0])
    }
    if (hasStrategyError) {
      mainScrollRef.value?.scrollTo({ top: 9999, behavior: 'smooth' })
      return
    }
    // 策略组
@@ -2606,6 +2631,8 @@
                            v-model:formatted-value="sub.endTime" format="HH:mm" value-format="HH:mm"
                            placeholder="请选择" clearable :disabled="isEdit" :actions="['now']"
                            :status="((item.errorMsg === '开始时间和结束时间不能为空' || item.errorMsg === '时间段不能为空') && !sub.endTime) || (item.errorMsg === '结束时间不能小于或等于开始时间' && sub.startTime >= sub.endTime) || item.errorMsg === '同一个策略的时段不能重叠' ? 'error' : (sub.endTime ? 'success' : undefined)"
                            :is-hour-disabled="(hour: number) => isEndTimeDisabledByStart(hour, undefined, sub)"
                            :is-minute-disabled="(minute: any, hour: any) => isEndTimeDisabledByStart(hour, minute, sub)"
                            class="custom-time-picker"
                            @update:value="() => { closeTimePicker(); item.errorMsg = '' }"
                          />
@@ -2950,8 +2977,8 @@
                        v-model:formatted-value="sub.startTime" format="HH:mm" value-format="HH:mm"
                        placeholder="请选择" clearable
                        :status="((item.errorMsg === '开始时间和结束时间不能为空' || item.errorMsg === '时间段不能为空') && !sub.startTime) || (item.errorMsg === '结束时间不能小于或等于开始时间' && sub.startTime >= sub.endTime) || item.errorMsg === '同一个策略的时段不能重叠' ? 'error' : (sub.startTime ? 'success' : undefined)"
                        :actions="['now']" :is-hour-disabled="(hour: number) => isDisallowedTimeDisabled(hour, undefined, item, 'start')"
                        :is-minute-disabled="(minute: number, hour: any) => isDisallowedTimeDisabled(hour, minute, item, 'start')"
                        :actions="['now']" :is-hour-disabled="(hour: number) => isDisallowedTimeDisabled(hour, undefined, item)"
                        :is-minute-disabled="(minute: number, hour: any) => isDisallowedTimeDisabled(hour, minute, item)"
                        @update:value="() => { closeTimePicker(); item.errorMsg = '' }"
                      />
                      至
@@ -2959,8 +2986,8 @@
                        v-model:formatted-value="sub.endTime" format="HH:mm" value-format="HH:mm"
                        placeholder="请选择" clearable
                        :status="((item.errorMsg === '开始时间和结束时间不能为空' || item.errorMsg === '时间段不能为空') && !sub.endTime) || (item.errorMsg === '结束时间不能小于或等于开始时间' && sub.startTime >= sub.endTime) || item.errorMsg === '同一个策略的时段不能重叠' ? 'error' : (sub.endTime ? 'success' : undefined)"
                        :actions="['now']" :is-hour-disabled="(hour: number) => isDisallowedTimeDisabled(hour, undefined, item, 'end')"
                        :is-minute-disabled="(minute: number, hour: any) => isDisallowedTimeDisabled(hour, minute, item, 'end')"
                        :actions="['now']" :is-hour-disabled="(hour: number) => isDisallowedTimeDisabled(hour, undefined, item)"
                        :is-minute-disabled="(minute: number, hour: any) => isDisallowedTimeDisabled(hour, minute, item)"
                        @update:value="() => { closeTimePicker(); item.errorMsg = '' }"
                      />
                      <img
src/views/businessOperations/geofenceManagement/index.vue
@@ -210,11 +210,12 @@
            onClick={() => {
              dialog.create({
                title: '是否确认复制?',
                content: `复制为【副本_${row.electronicName}】`,
                content: `复制为【${row.electronicName}_副本】`,
                positiveText: '确定',
                negativeText: '取消',
                maskClosable: false,
                autoFocus: false,
                class: 'custom-dialog',
                onPositiveClick: () => {
                  copyFence(row.id).then((res) => {
                    if (res.code === 200) {
src/views/transaction/order/orderManagement/index.vue
@@ -47,6 +47,37 @@
const modalRef1 = ref()
const checkedRowKeysRef = ref<DataTableRowKey[]>([])
const listData = ref<any[]>([])
function getActionCount(row: any) {
  let count = 1
  if (row.status === 1 || row.status === 2 || row.status === 3 || row.status === 4)
    count += 1
  if (row.status === 6)
    count += 1
  if (row.status === 8)
    count += 1
  if (row.status === 2 || row.status === 3 || row.status === 4)
    count += 1
  if (row.status === 0)
    count += 1
  return count
}
const actionColumnWidth = computed(() => {
  const maxCount = listData.value.reduce((max, row) => Math.max(max, getActionCount(row)), 1)
  if (maxCount <= 1)
    return 60
  if (maxCount === 2)
    return 80
  if (maxCount === 3)
    return 140
  if (maxCount === 4)
    return 180
  if (maxCount === 5)
    return 220
  return 260
})
const columns = computed<DataTableColumns<any>>(() => [
  {
@@ -166,7 +197,7 @@
  {
    title: '操作',
    key: 'actions',
    width: 160,
    width: actionColumnWidth.value,
    fixed: 'right',
    render: (row) => {
      return (
@@ -384,7 +415,7 @@
      <n-select
        v-model:value={model.value.fleetId}
        onUpdate:show={(val: any) => isFleetIdOpen.value = val}
        options={options}
        options={options.value}
        clearable
      >
        {{
@@ -427,7 +458,7 @@
    label: t('transaction.city'),
    path: 'cityCode',
    render: () => (
      <n-cascader v-model:value={model.value.cityCode} options={pcaOptions.value} onUpdate:show={(val: any) => isCityCodeIdOpen.value = val} value-field="code" label-field="name" check-strategy="all" clearable>
      <n-cascader v-model:value={model.value.cityCode} options={pcaOptions.value} onUpdate:show={(val: any) => isCityCodeIdOpen.value = val} value-field="code" label-field="name" check-strategy="child" clearable>
        {{
          arrow: () => (
            <img
@@ -472,7 +503,6 @@
])
const count = ref(0)
const listData = ref<any[]>([])
async function getList() {
  startLoading()
@@ -547,7 +577,7 @@
async function fetchFleetList() {
  const res = await getFleetList()
  if (res.code === 200 && res.data) {
  if (res.code === 200) {
    options.value = res.data.map((item: any) => ({
      label: item.fleetName,
      value: item.id,