Three questions — where the deck lives, what happens where the cable section meets the approach, and how this stays compatible with every other bridge in the system.
Things that stand at a support: piles, pile caps, walls, caps — and now pylons and stay cables.
Things that stretch between supports: girders, cross girders, deck, barriers.
On a cantilevered main span the deck isn't built span by span. It grows outward from each pylon in both directions at once, segment by segment, each new segment held by the next stay cable. Two arms from adjacent pylons meet in the middle and are joined by a closure pour. So one span is built by two crews working from opposite ends.
Location stays p_2_p_3 — consistent with every other span component. The item number records which pylon cast it:
This is the same shape as things BMS already does: pile_1…pile_n at a pier, g_1…g_n in a span. Location identifies where, item number identifies which one. No new concept.
And it answers your question directly: P3's deck work is the p3_seg_* items — which appear in both adjacent spans, P2–P3 and P3–P4. One pylon, two arms, two span locations.
You asked what happens at the last pier, where one side is cable-supported and the other isn't. On Mindhola that's P6. Its two adjacent spans use completely different deck and girder systems.
erection_method and deck_system from the form, the changeover happens automatically. P6 is just an ordinary pier that happens to have different neighbours.
Today BridgeComponentPlanRepository::getComponentsLocation() generates the same location list for every component, purely from no_of_span. Every component is offered at every location.
That breaks here. Selecting span P6–P7 must not offer Edge Girder — it doesn't exist there. Selecting P5–P6 must not offer the precast Girder 3-step. Selecting P1 must not offer Stay Cable.
// today — same list for every component
getComponentsLocation($bridge_id) → ['a_1','p_1',…,'a_2', 'a_1_p_1',…]
// needed — component-aware, derived from the inventory JSON
getComponentsLocation($bridge_id, $componentId)
Pylon / Stay Cable → supports where pile_details[i].support_type = 'pylon'
Pier Wall / Cap → supports where support_type = 'pier'
Edge Girder → spans where super_structure_details[i].cable_supported = 'yes'
Girder (3-step) → spans where erection_method = 'precast_launched'
Deck Segment → spans where erection_method is cantilever/segment
Deck Slab → spans where erection_method is NOT segmentalpile_details for supports and super_structure_details for spans. Exactly the approach already agreed for pylon placement.
You asked how this is managed alongside every other bridge in the system. The answer is that all four girder-family components share one pattern — span location + item number + optional step — and differ only in how many items and how many steps.
| Component | Location | Item numbers | Steps | Appears on |
|---|---|---|---|---|
| Girder 18 | p_6_p_7 | g_1 … g_6 | 3 — cast / stress / launch | precast-launched spans |
| Edge Girder 163 | p_2_p_3 | eg_us, eg_ds | 2 — cast / stress | cable-supported spans |
| Cross Girder 10 | p_2_p_3 | cg_1 … cg_22 | none — binary | every span (count varies) |
| Deck Segment 162 | p_2_p_3 | p2_seg_n · closure · p3_seg_n | 2 — cast / stress | cantilevered spans |
bridge_component_progress row shape — location + item_number + girder_step. No new table, no new column, and the roll-up services keep treating them as ordinary step-based components. A plain girder bridge is just the case where only the first row applies.