Просмотр исходного кода

fix(web-admin): put trip driver/escort on vehicle summary row

Merge「本次安排」into PlVehicleSummaryStrip instead of a separate
row above the vehicle info strip.

Co-authored-by: Cursor <cursoragent@cursor.com>
wuzilong 1 месяц назад
Родитель
Сommit
499896b29c

+ 3 - 5
docs/superpowers/specs/2026-09-13-pl-plan-view-trip-personnel-design.md

@@ -13,8 +13,8 @@
 | # | 项 | 决策 |
 |---|-----|------|
 | D1 | 展示内容 | 本次司机 + 本次押运员(姓名;有电话则附电话) |
-| D2 | 布局 | 方案 1:车辆摘要条**上方**增加「本次安排」一行 |
-| D3 | 车辆全员条 | **保留**(仍展示快照/车辆关联人员,作参考) |
+| D2 | 布局 | 并入车辆摘要**同一行**:左侧车辆信息,右侧「本次安排」司机/押运 |
+| D3 | 车辆全员条 | 查看弹窗已安排时**改为展示本次司机/押运**(全员仍可点「查看」进车辆详情) |
 | D4 | 数据源 | 优先运输单 `driver*` / `escort*`,缺则回退计划同名字段 |
 | D5 | 未安排 / 未选 | 已安排但未选某角色:该角色显示「—」;未安排运输:不展示「本次安排」行 |
 
@@ -23,12 +23,10 @@
 ```text
 【运输信息】
   [司机链接 / 现场链接 …]          ← 已有,不变
-  本次安排  司机:张三 138…   押运员:李四 139…   ← 新增
-  [车辆摘要条:车牌 + 关联全员]    ← 已有,不变
+  [车辆 | 车牌… | 本次安排 司机… 押运员…]  ← 同一行
 ```
 
 ## 非目标
 
 - 不改安排运输表单、公开司机页、小程序
-- 不删除车辆关联人员展示
 - 不改后端 API(字段已存在)

+ 3 - 44
web-admin/src/components/business/pl-plan-view-tabs/index.vue

@@ -57,27 +57,15 @@
           </div>
         </div>
 
-        <div
-          v-if="showTripPersonnelRow"
-          class="pl-plan-trip-personnel pl-plan-transport-block"
-        >
-          <span class="pl-plan-trip-personnel__label">本次安排</span>
-          <span class="pl-plan-trip-personnel__item">
-            <el-tag type="primary" size="small">司机</el-tag>
-            <span class="pl-plan-trip-personnel__value">{{ tripDriverDisplay }}</span>
-          </span>
-          <span class="pl-plan-trip-personnel__item">
-            <el-tag type="warning" size="small">押运员</el-tag>
-            <span class="pl-plan-trip-personnel__value">{{ tripEscortDisplay }}</span>
-          </span>
-        </div>
-
         <PlVehicleSummaryStrip
           v-if="vehicleBundle"
           class="pl-plan-transport-block"
           :detail="vehicleBundle.detail"
           :personnel-list="vehicleBundle.personnelList"
           :carrier-name="summaryCarrierName"
+          :show-trip-personnel="showTripPersonnelRow"
+          :trip-driver-display="tripDriverDisplay"
+          :trip-escort-display="tripEscortDisplay"
           @view="vehicleViewVisible = true"
         />
         <p v-else-if="!loading" class="pl-plan-form-empty-hint">暂无车辆信息</p>
@@ -1660,35 +1648,6 @@
     }
   }
 
-  .pl-plan-trip-personnel {
-    display: flex;
-    align-items: center;
-    flex-wrap: wrap;
-    gap: 10px 16px;
-    padding: 10px 12px;
-    border: 1px solid #a7f3d0;
-    border-radius: 8px;
-    background: #ecfdf5;
-  }
-
-  .pl-plan-trip-personnel__label {
-    font-size: 12px;
-    font-weight: 600;
-    color: #047857;
-  }
-
-  .pl-plan-trip-personnel__item {
-    display: inline-flex;
-    align-items: center;
-    gap: 6px;
-    min-width: 0;
-  }
-
-  .pl-plan-trip-personnel__value {
-    font-size: 13px;
-    color: #1e293b;
-  }
-
   .pl-plan-view-stop-block {
     display: flex;
     flex-direction: column;

+ 31 - 12
web-admin/src/components/business/pl-vehicle-summary-strip/index.vue

@@ -21,19 +21,31 @@
       <span class="pl-vehicle-summary-divider" aria-hidden="true" />
 
       <div class="pl-vehicle-summary-group">
-        <span class="pl-vehicle-summary-label">人员</span>
-        <span v-if="!personnelList.length" class="pl-vehicle-summary-value muted">暂无关联人员</span>
-        <template v-else>
-          <span
-            v-for="(person, index) in personnelList"
-            :key="person.personnelId || `${person.personnelName}-${index}`"
-            class="pl-vehicle-summary-person"
-          >
-            <el-tag :type="getRoleTagType(person.role)" size="small">{{ getRoleLabel(person.role) }}</el-tag>
-            <span class="pl-vehicle-summary-value">{{ person.personnelName || '—' }}</span>
-            <span v-if="person.phoneNo" class="pl-vehicle-summary-value muted">{{ person.phoneNo }}</span>
+        <span class="pl-vehicle-summary-label">{{ showTripPersonnel ? '本次安排' : '人员' }}</span>
+        <template v-if="showTripPersonnel">
+          <span class="pl-vehicle-summary-person">
+            <el-tag type="primary" size="small">司机</el-tag>
+            <span class="pl-vehicle-summary-value">{{ tripDriverDisplay || '—' }}</span>
+          </span>
+          <span class="pl-vehicle-summary-person">
+            <el-tag type="warning" size="small">押运员</el-tag>
+            <span class="pl-vehicle-summary-value">{{ tripEscortDisplay || '—' }}</span>
           </span>
         </template>
+        <template v-else>
+          <span v-if="!personnelList.length" class="pl-vehicle-summary-value muted">暂无关联人员</span>
+          <template v-else>
+            <span
+              v-for="(person, index) in personnelList"
+              :key="person.personnelId || `${person.personnelName}-${index}`"
+              class="pl-vehicle-summary-person"
+            >
+              <el-tag :type="getRoleTagType(person.role)" size="small">{{ getRoleLabel(person.role) }}</el-tag>
+              <span class="pl-vehicle-summary-value">{{ person.personnelName || '—' }}</span>
+              <span v-if="person.phoneNo" class="pl-vehicle-summary-value muted">{{ person.phoneNo }}</span>
+            </span>
+          </template>
+        </template>
       </div>
     </div>
 
@@ -55,9 +67,16 @@ const props = withDefaults(
     personnelList?: VehiclePersonnelViewRow[]
     /** 展示用承运商名称,优先于 detail.carrierName */
     carrierName?: string
+    /** 为 true 时人员区展示本次司机/押运,不再列车辆关联全员 */
+    showTripPersonnel?: boolean
+    tripDriverDisplay?: string
+    tripEscortDisplay?: string
   }>(),
   {
-    personnelList: () => []
+    personnelList: () => [],
+    showTripPersonnel: false,
+    tripDriverDisplay: '',
+    tripEscortDisplay: ''
   }
 )