| | |
| | | } |
| | | |
| | | .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> |
| | |
| | | <el-tag size="mini" :type="defaultProfileCode === item.profileCode ? 'success' : 'info'">{{ defaultProfileCode === item.profileCode ? '默认' : '模板' }}</el-tag> |
| | | </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 }} |
| | | S1: 长度(s1LenWeight) {{ item.config.s1LenWeight }} / 拐点(s1TurnWeight) {{ item.config.s1TurnWeight }} / 顶升(s1LiftWeight) {{ item.config.s1LiftWeight }}<br> |
| | | S2: 拥堵(s2BusyWeight) {{ item.config.s2BusyWeight }} / 排队(s2QueueWeight) {{ item.config.s2QueueWeight }} / 等待(s2WaitWeight) {{ item.config.s2WaitWeight }} / 死锁(s2DeadlockWeight) {{ item.config.s2DeadlockWeight }} / 堵塞(s2RunBlockWeight) {{ item.config.s2RunBlockWeight }} / 环线(s2LoopLoadWeight) {{ item.config.s2LoopLoadWeight }}<br> |
| | | 平衡: 长度(stationPathLenWeightPercent) {{ item.config.stationPathLenWeightPercent }}% / 承载(stationPathCongWeightPercent) {{ item.config.stationPathCongWeightPercent }}% / 他出惩罚(stationPathPassOtherOutStationWeightPercent) {{ item.config.stationPathPassOtherOutStationWeightPercent }} / 强跳(stationPathPassOtherOutStationForceSkip) {{ 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 class="section-card"> |
| | | <h3>候选生成</h3> |
| | | <div class="dialog-grid"> |
| | | <el-form-item label="最大深度"><el-input-number v-model="profileForm.config.calcMaxDepth" :min="20" :max="500" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="最大路径数"><el-input-number v-model="profileForm.config.calcMaxPaths" :min="10" :max="3000" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="最大代价"><el-input-number v-model="profileForm.config.calcMaxCost" :min="10" :max="5000" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="S1 保留 TopK"><el-input-number v-model="profileForm.config.s1TopK" :min="1" :max="50" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="最大深度(calcMaxDepth)"><el-input-number v-model="profileForm.config.calcMaxDepth" :min="20" :max="500" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="最大路径数(calcMaxPaths)"><el-input-number v-model="profileForm.config.calcMaxPaths" :min="10" :max="3000" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="最大代价(calcMaxCost)"><el-input-number v-model="profileForm.config.calcMaxCost" :min="10" :max="5000" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="S1 保留 TopK(s1TopK)"><el-input-number v-model="profileForm.config.s1TopK" :min="1" :max="50" style="width: 100%;"></el-input-number></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.s1LenWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="拐点权重"><el-input-number v-model="profileForm.config.s1TurnWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="顶升权重"><el-input-number v-model="profileForm.config.s1LiftWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="偏离人工路径权重"><el-input-number v-model="profileForm.config.s1SoftDeviationWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="长度放宽比例"><el-input-number v-model="profileForm.config.s1MaxLenRatio" :min="1" :step="0.05" :precision="2" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="允许多拐点数"><el-input-number v-model="profileForm.config.s1MaxTurnDiff" :min="0" :max="20" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="长度权重(s1LenWeight)"><el-input-number v-model="profileForm.config.s1LenWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="拐点权重(s1TurnWeight)"><el-input-number v-model="profileForm.config.s1TurnWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="顶升权重(s1LiftWeight)"><el-input-number v-model="profileForm.config.s1LiftWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="偏离人工路径权重(s1SoftDeviationWeight)"><el-input-number v-model="profileForm.config.s1SoftDeviationWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="长度放宽比例(s1MaxLenRatio)"><el-input-number v-model="profileForm.config.s1MaxLenRatio" :min="1" :step="0.05" :precision="2" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="允许多拐点数(s1MaxTurnDiff)"><el-input-number v-model="profileForm.config.s1MaxTurnDiff" :min="0" :max="20" style="width: 100%;"></el-input-number></el-form-item> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="section-card"> |
| | | <h3>路径平衡参数</h3> |
| | | <div class="dialog-grid"> |
| | | <el-form-item label="路径长度权重占比(stationPathLenWeightPercent)"><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="任务承载权重占比(stationPathCongWeightPercent)"><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="其他出库站点惩罚权重(stationPathPassOtherOutStationWeightPercent)"><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="其他出库站点强制跳过(stationPathPassOtherOutStationForceSkip)"><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> |
| | | <el-form-item label="堵塞权重"><el-input-number v-model="profileForm.config.s2RunBlockWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="环线负载权重"><el-input-number v-model="profileForm.config.s2LoopLoadWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="拥堵程度权重(s2BusyWeight)"><el-input-number v-model="profileForm.config.s2BusyWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="排队量权重(s2QueueWeight)"><el-input-number v-model="profileForm.config.s2QueueWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="预计等待时间权重(s2WaitWeight)"><el-input-number v-model="profileForm.config.s2WaitWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="死锁风险权重(s2DeadlockWeight)"><el-input-number v-model="profileForm.config.s2DeadlockWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="堵塞权重(s2RunBlockWeight)"><el-input-number v-model="profileForm.config.s2RunBlockWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | <el-form-item label="环线负载权重(s2LoopLoadWeight)"><el-input-number v-model="profileForm.config.s2LoopLoadWeight" :min="0" :step="0.5" style="width: 100%;"></el-input-number></el-form-item> |
| | | </div> |
| | | </div> |
| | | </el-form> |