Маркер «вот где остановилась mechanic-сессия» — не разбито по логическим коммитам,
зафиксировано целиком чтобы не потерять при отвлечении/чекаутах.
Modified:
- pages/InspectionEditor.tsx — расширение damage-flow внутри редактора
- pages/VehicleCard.tsx — vendor data + расширение карточки
- pages/InspectionReview.tsx — обновлённый review
- api/{auth,inspections,photos,vehicles}.ts — новые endpoints для TT + photo flow
- components/damage-flow/DamageClassifyDialog.tsx — multi-step UI
- components/vehicle-scheme/VendorVehicleScheme.tsx — SVG zone interaction
- data/damageVocabulary.ts — обновлённый словарь повреждений
- frontend index.html/manifest/icons — PWA-метаданные
New (untracked):
- components/damage-flow/PhotoAnnotateStep.tsx — новый шаг flow'а
- components/tt/ — vendor TT-state UI
- pages/TtStateDetail.tsx — экран осмотра вендора
- recon/findings/damage_model.md + damage_vocabulary.json + scheme/ — recon docs
Cleanup: удалены bash-garbage 'Last' и 'dict[str' из frontend/.
Per-Part Detail SVG: API-Fetched, Not Embedded
Verdict: API-FETCHED
No per-part SVG <path d="..."> data is embedded in the DLL binaries. The vendor app fetches detail part SVGs from the server at runtime.
How It Works
1. Vehicle Load: vehicle/vehiclemeta?id=<vehicleId>
When the mechanic selects a vehicle, the app calls:
GET {baseUrl}/vehicle/vehiclemeta?id={vehicleId}
Authorization: Bearer {token}
The response includes a list of DetailScheme objects — one per tappable zone. Each DetailScheme has at minimum:
Id— database PKMetaId— maps to the SVGclass="N"zone ID (0..56)Scheme— full SVG string for the enlarged part viewViewBox— the viewBox string for that part's SVG (e.g."0 0 400 300")
2. Zone Tap → Detail View
When user taps zone N on the composite SVG:
Foo.TouchEnd(N)fires (JavaScript in WebView)- App calls
GetDamagedDetailScheme(metaId: N)(C# method inTtc.dll) - The cached
DetailSchemefor that MetaId is retrieved - Its
SchemeSVG is rendered in a new WebView/Activity (DetailSchemeActivity) - The scheme has the same
<script>click handler so mechanic can tap damage spots
3. Damage Point Overlay: damage/details + damage/damagescard?id=
Existing damage points are overlaid on the detail scheme via:
GET {baseUrl}/damage/details # returns damage list for the part
GET {baseUrl}/damage/damagescard?id={damageId} # returns single damage card
Key C# Symbols
DetailScheme — per-part SVG wrapper (field: Scheme, ViewBox, MetaId)
DetailSchemeWithStack — same with pre-rendered damage circle stack
DetailSchemeWithDamages — ViewModel binding damage points to scheme
GetDamagedDetailScheme(metaId) — retrieves scheme by zone ID
GetDamagedDetailSchemeWithStack(...) — retrieves scheme + overlaid damage marks
GenerateDamagesFromStack — draws circle markers from DamageCoordinates
DetailSchemeActivity — the Android Activity that hosts the per-part WebView
Base URL
http://ttcontrol.naughtysoft.ru/api/
(Found at US heap 0x83898 in Ttc.dll — hard-coded base URL)
Why No Embedded SVGs
The composite exterior and salon SVGs are embedded (they are static templates). Per-part detail SVGs are vehicle-model-specific and change when the fleet changes vehicle types, so they are served from the API to stay updatable without an app release.
Our Implementation Options
- Mirror the API contract: Implement our own
GET /vehicle/vehiclemeta?id=that returnsDetailScheme[]with our custom per-part SVGs. - Embed static SVGs: For each of the 57 zone IDs we use, design our own per-part SVG and bundle it in the frontend. Simpler but requires a frontend release for changes.
- Hybrid: Embed SVGs for the top-N most common damage zones (bumpers, doors, hood, roof = zones 0,4,10,11,12,13,16,22) and fetch others from API.
Option 2 (embed static) is recommended for Phase 1 — we control all 57 shapes.