| | |
| | | } |
| | | |
| | | .preview-toolbar-row-secondary { |
| | | grid-template-columns: minmax(280px, 360px) minmax(0, 1fr); |
| | | grid-template-columns: 1fr; |
| | | } |
| | | |
| | | .preview-toolbar-actions { |
| | |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | .preview-zoom-card { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 14px; |
| | | padding: 10px 14px; |
| | | border-radius: 18px; |
| | | background: linear-gradient(180deg, rgba(247, 250, 255, 0.96) 0%, rgba(243, 248, 254, 0.96) 100%); |
| | | border: 1px solid rgba(217, 227, 236, 0.96); |
| | | } |
| | | |
| | | .preview-zoom-meta { |
| | | min-width: 74px; |
| | | } |
| | | |
| | | .preview-zoom-meta strong { |
| | | display: block; |
| | | font-size: 12px; |
| | | margin-bottom: 2px; |
| | | } |
| | | |
| | | .preview-zoom-meta span { |
| | | font-size: 12px; |
| | | color: var(--text-sub); |
| | | } |
| | | |
| | | .preview-panel-body { |
| | |
| | | grid-column: span 2; |
| | | } |
| | | |
| | | .profile-dialog-layout { |
| | | width: 100%; |
| | | } |
| | | |
| | | .profile-dialog-layout .el-form { |
| | | width: 100%; |
| | | } |
| | | |
| | | .section-card { |
| | | border: 1px solid rgba(219, 229, 238, 0.96); |
| | | border-radius: 18px; |
| | |
| | | <div class="hero-grid"> |
| | | <div class="panel-card profile-panel"> |
| | | <div class="panel-head"> |
| | | <div><h2>模板与模式</h2></div> |
| | | <div><h2>模板配置</h2></div> |
| | | <el-button type="primary" plain size="small" icon="el-icon-plus" @click="openProfileDialog()">新增模板</el-button> |
| | | </div> |
| | | <div class="panel-body"> |
| | | <div class="setting-grid"> |
| | | <div class="section-card"> |
| | | <h3>全局开关</h3> |
| | | <h3>全局配置</h3> |
| | | <el-form label-position="top"> |
| | | <div class="dialog-grid"> |
| | | <el-form-item label="评分模式" class="span-2"> |
| | | <el-radio-group v-model="scoreMode"> |
| | | <el-radio-button label="legacy">legacy</el-radio-button> |
| | | <el-radio-button label="twoStage">twoStage</el-radio-button> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="默认模板" class="span-2"> |
| | | <el-select v-model="defaultProfileCode" placeholder="请选择默认模板" filterable style="width: 100%;"> |
| | | <el-option v-for="item in profiles" :key="item.profileCode" :label="item.profileName + ' (' + item.profileCode + ')'" :value="item.profileCode"></el-option> |
| | |
| | | </div> |
| | | <div class="entity-desc"> |
| | | S1: 长度 {{ item.config.s1LenWeight }} / 拐点 {{ item.config.s1TurnWeight }} / 顶升 {{ item.config.s1LiftWeight }}<br> |
| | | S2: 忙站 {{ item.config.s2BusyWeight }} / 堵塞 {{ item.config.s2RunBlockWeight }} / 环线 {{ item.config.s2LoopLoadWeight }} |
| | | S2: 忙站 {{ item.config.s2BusyWeight }} / 堵塞 {{ item.config.s2RunBlockWeight }} / 环线 {{ item.config.s2LoopLoadWeight }}<br> |
| | | 平衡: 长度 {{ item.config.stationPathLenWeightPercent }}% / 承载 {{ item.config.stationPathCongWeightPercent }}% / 他出惩罚 {{ item.config.stationPathPassOtherOutStationWeightPercent }} / 强跳 {{ item.config.stationPathPassOtherOutStationForceSkip ? '是' : '否' }} |
| | | </div> |
| | | <div class="entity-actions"> |
| | | <el-button size="mini" @click.stop="openProfileDialog(item)">编辑</el-button> |
| | |
| | | </el-select> |
| | | </div> |
| | | <div class="preview-toolbar-row preview-toolbar-row-secondary"> |
| | | <div class="preview-zoom-card"> |
| | | <div class="preview-zoom-meta"> |
| | | <strong>地图缩放</strong> |
| | | <span>{{ mapZoomPercent }}%</span> |
| | | </div> |
| | | <el-slider :value="mapZoomPercent" @input="updateMapZoom" :min="60" :max="220" :step="10" :show-tooltip="false" style="flex: 1;"></el-slider> |
| | | </div> |
| | | <div class="preview-toolbar-actions"> |
| | | <el-button @click="fitMap" :disabled="!mapContext.nodes.length">适配地图</el-button> |
| | | <el-button @click="resetPreview">清空</el-button> |
| | |
| | | </div> |
| | | |
| | | <el-dialog title="路径模板" :visible.sync="profileDialogVisible" width="820px" class="dialog-panel" append-to-body :destroy-on-close="true"> |
| | | <div class="dialog-grid"> |
| | | <div class="profile-dialog-layout"> |
| | | <el-form label-position="top" label-width="120px" style="width: 100%;"> |
| | | <div class="section-card"> |
| | | <h3>基础信息</h3> |
| | |
| | | </div> |
| | | |
| | | <div class="section-card"> |
| | | <h3>路径平衡参数</h3> |
| | | <div class="dialog-grid"> |
| | | <el-form-item label="路径长度权重占比(%)"><el-input-number v-model="profileForm.config.stationPathLenWeightPercent" :min="0" :step="5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="任务承载权重占比(%)"><el-input-number v-model="profileForm.config.stationPathCongWeightPercent" :min="0" :step="5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="其他出库站点惩罚权重"><el-input-number v-model="profileForm.config.stationPathPassOtherOutStationWeightPercent" :min="0" :step="10" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="其他出库站点强制跳过"><el-switch v-model="profileForm.config.stationPathPassOtherOutStationForceSkip"></el-switch></el-form-item> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section-card"> |
| | | <h3>第二阶段动态评分</h3> |
| | | <div class="dialog-grid"> |
| | | <el-form-item label="忙站权重"><el-input-number v-model="profileForm.config.s2BusyWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |