| service.config.ts | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/components/custom/SearchPanel.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/layouts/components/tab/DropTabs.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/styles/robotaxi.scss | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/businessOperations/geofenceManagement/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/businessOperations/geofenceManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/transaction/order/orderManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | 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,