Skip to content

Commit 32a052b

Browse files
committed
Added close ups in wheel analysis task
1 parent 6da388e commit 32a052b

File tree

23 files changed

+203
-39
lines changed

23 files changed

+203
-39
lines changed

documentation/src/utils/schemas.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,18 @@ export const CreatePricingTaskOptionsSchema = z.object({
200200
methodology: z.string().optional(),
201201
});
202202

203+
export const CreateWheelAnalysisTaskOptionsSchema = z.object({
204+
name: z.literal(TaskName.WHEEL_ANALYSIS),
205+
useLongShots: z.boolean(),
206+
callbacks: z.array(TaskCallbackOptionsSchema).optional(),
207+
});
208+
203209
export const InspectionCreateTaskSchema = z
204210
.nativeEnum(TaskName)
205211
.or(CreateDamageDetectionTaskOptionsSchema)
206212
.or(CreateHinlTaskOptionsSchema)
207-
.or(CreatePricingTaskOptionsSchema);
213+
.or(CreatePricingTaskOptionsSchema)
214+
.or(CreateWheelAnalysisTaskOptionsSchema);
208215

209216
export const AdditionalDataSchema = z.record(z.string(), z.unknown());
210217

documentation/src/utils/schemas/createInspection.schema.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,18 @@ export const CreatePricingTaskOptionsSchema = z.object({
2828
methodology: z.string().optional(),
2929
});
3030

31+
export const CreateWheelAnalysisTaskOptionsSchema = z.object({
32+
name: z.literal(TaskName.WHEEL_ANALYSIS),
33+
useLongShots: z.boolean(),
34+
callbacks: z.array(TaskCallbackOptionsSchema).optional(),
35+
});
36+
3137
export const InspectionCreateTaskSchema = z
3238
.nativeEnum(TaskName)
3339
.or(CreateDamageDetectionTaskOptionsSchema)
3440
.or(CreateHinlTaskOptionsSchema)
35-
.or(CreatePricingTaskOptionsSchema);
41+
.or(CreatePricingTaskOptionsSchema)
42+
.or(CreateWheelAnalysisTaskOptionsSchema);
3643

3744
export const AdditionalDataSchema = z.record(z.string(), z.unknown());
3845

packages/inspection-capture-web/src/hooks/useUploadQueue.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Queue, uniq, useQueue } from '@monkvision/common';
1+
import { Queue, uniq, useMonkState, useQueue } from '@monkvision/common';
22
import { AddImageOptions, ImageUploadType, MonkApiConfig, useMonkApi } from '@monkvision/network';
33
import {
44
PhotoCaptureAppConfig,
@@ -133,6 +133,7 @@ function createAddImageOptions(
133133
enableThumbnail: boolean,
134134
additionalTasks?: PhotoCaptureAppConfig['additionalTasks'],
135135
compliance?: ComplianceOptions,
136+
wheelAnalysisCloseUp?: boolean,
136137
): AddImageOptions {
137138
if (upload.mode === CaptureMode.SIGHT) {
138139
return {
@@ -143,6 +144,7 @@ function createAddImageOptions(
143144
inspectionId,
144145
compliance,
145146
useThumbnailCaching: enableThumbnail,
147+
wheelAnalysisCloseUp,
146148
};
147149
}
148150
if (upload.mode === CaptureMode.ADD_DAMAGE_PART_SELECT_SHOT) {
@@ -179,6 +181,11 @@ export function useUploadQueue({
179181
const { handleError } = useMonitoring();
180182
const siblingIdRef = useRef(0);
181183
const { addImage } = useMonkApi(apiConfig);
184+
const { state } = useMonkState();
185+
186+
const wheelAnalysisCloseUp = state.tasks.find(
187+
(task) => task.name === TaskName.WHEEL_ANALYSIS && task.wheelAnalysisCloseUp,
188+
)?.wheelAnalysisCloseUp;
182189

183190
return useQueue<PictureUpload>(async (upload: PictureUpload) => {
184191
if (upload.mode === CaptureMode.ADD_DAMAGE_1ST_SHOT) {
@@ -194,6 +201,7 @@ export function useUploadQueue({
194201
true,
195202
additionalTasks,
196203
complianceOptions,
204+
wheelAnalysisCloseUp,
197205
),
198206
);
199207
const uploadDurationMs = Date.now() - startTs;

packages/network/src/api/image/requests.ts

+22
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ export interface AddBeautyShotImageOptions {
8686
* Additional options used to configure the compliance locally.
8787
*/
8888
compliance?: ComplianceOptions;
89+
90+
wheelAnalysisCloseUp?: boolean;
8991
}
9092

9193
/**
@@ -291,6 +293,7 @@ function createBeautyShotImageData(
291293
TaskName.IMAGES_OCR,
292294
TaskName.ODOMETER,
293295
TaskName.WARNING_LIGHTS,
296+
TaskName.WHEEL_ANALYSIS,
294297
].includes(task),
295298
) as ApiImagePostTask[];
296299
tasks.push({
@@ -323,6 +326,25 @@ function createBeautyShotImageData(
323326
wait_for_result: true,
324327
});
325328
}
329+
if (options.tasks.includes(TaskName.WHEEL_ANALYSIS)) {
330+
const sightName = sights[options.sightId].wheelName;
331+
if (options.wheelAnalysisCloseUp && !sightName) {
332+
throw new Error('Wheel analysis task close-up requires a sight name.');
333+
}
334+
if (!options.wheelAnalysisCloseUp && sightName) {
335+
throw new Error(
336+
"Wheel analysis task long shoot can't be run on sight that contains sightName.",
337+
);
338+
}
339+
if (options.wheelAnalysisCloseUp && sightName) {
340+
tasks.push({
341+
name: TaskName.WHEEL_ANALYSIS,
342+
image_details: { wheel_name: sightName },
343+
});
344+
} else {
345+
tasks.push(TaskName.WHEEL_ANALYSIS);
346+
}
347+
}
326348

327349
const body: ApiImagePost = {
328350
acquisition: {

packages/network/src/api/inspection/mappers.ts

+18-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
CreateHinlTaskOptions,
66
CreateInspectionOptions,
77
CreatePricingTaskOptions,
8+
CreateWheelAnalysisTaskOptions,
89
CurrencyCode,
910
CustomSeverityValue,
1011
Damage,
@@ -326,6 +327,11 @@ function mapTasks(response: ApiInspectionGet): { tasks: Task[]; taskIds: string[
326327
name: task.name as TaskName,
327328
status: task.status as ProgressStatus,
328329
images: task.images?.map((image) => image.image_id) ?? [],
330+
...(task.arguments?.['use_longshots'] !== undefined
331+
? {
332+
wheelAnalysisCloseUp: !task.arguments['use_longshots'] as boolean,
333+
}
334+
: {}),
329335
});
330336
});
331337

@@ -563,10 +569,20 @@ function getDamageDetectionOptions(
563569
function getWheelAnalysisOptions(
564570
options: CreateInspectionOptions,
565571
): ApiWheelAnalysisTaskPostComponent | undefined {
566-
return options.tasks.includes(TaskName.WHEEL_ANALYSIS)
572+
if (options.tasks.includes(TaskName.WHEEL_ANALYSIS)) {
573+
return {
574+
status: ProgressStatus.NOT_STARTED,
575+
use_longshots: true,
576+
};
577+
}
578+
const taskOptions = options.tasks.find(
579+
(task) => typeof task === 'object' && task.name === TaskName.WHEEL_ANALYSIS,
580+
) as CreateWheelAnalysisTaskOptions | undefined;
581+
return taskOptions
567582
? {
568583
status: ProgressStatus.NOT_STARTED,
569-
use_longshots: true,
584+
use_longshots: taskOptions.useLongShots,
585+
callbacks: taskOptions.callbacks,
570586
}
571587
: undefined;
572588
}

packages/network/src/api/models/image.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ApiImagesOCRTaskPost,
1111
ApiImagesOdometerTaskPost,
1212
ApiImagesWarningLightsTaskPost,
13+
ApiImagesWheelAnalysisTaskPost,
1314
} from './task';
1415

1516
export type ApiImageType = 'unknown' | 'beauty_shot' | 'close_up';
@@ -111,7 +112,8 @@ export type ApiImagePostTask =
111112
| ApiHinlTaskPost
112113
| ApiImagesOCRTaskPost
113114
| ApiImagesOdometerTaskPost
114-
| ApiImagesWarningLightsTaskPost;
115+
| ApiImagesWarningLightsTaskPost
116+
| ApiImagesWheelAnalysisTaskPost;
115117

116118
export interface ApiImagePost {
117119
acquisition: ApiAcquisition;

packages/network/src/api/models/task.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ApiPricingMethodology } from './pricingV2';
2+
import { ApiWheelType } from './wheelAnalysis';
23

34
export interface ApiImageInTask {
45
image_id: string;
@@ -57,6 +58,15 @@ export interface ApiImagesWarningLightsTaskPost {
5758
wait_for_result?: boolean;
5859
}
5960

61+
export interface ApiWheelAnalysisImageDetails {
62+
wheel_name: ApiWheelType;
63+
}
64+
65+
export interface ApiImagesWheelAnalysisTaskPost {
66+
name: 'wheel_analysis';
67+
image_details: ApiWheelAnalysisImageDetails;
68+
}
69+
6070
export type ApiTaskProgressStatus =
6171
| 'NOT_STARTED'
6272
| 'TODO'
@@ -71,6 +81,7 @@ export interface ApiTaskGet {
7181
images: ApiImageInTask[];
7282
name: ApiBusinessTaskName;
7383
status: ApiTaskProgressStatus;
84+
arguments?: Record<string, unknown>;
7485
}
7586

7687
export type ApiTasks = ApiTaskGet[];

packages/network/test/api/image/requests.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ describe('Image requests', () => {
306306
TaskName.IMAGES_OCR,
307307
TaskName.ODOMETER,
308308
TaskName.WARNING_LIGHTS,
309+
TaskName.WHEEL_ANALYSIS,
309310
].includes(task),
310311
),
311312
{
@@ -328,6 +329,7 @@ describe('Image requests', () => {
328329
name: TaskName.WARNING_LIGHTS,
329330
wait_for_result: true,
330331
},
332+
TaskName.WHEEL_ANALYSIS,
331333
],
332334
additional_data: {
333335
sight_id: options.sightId,

packages/network/test/api/inspection/data/apiInspectionGet.data.ts

+1
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ export default {
946946
name: 'wheel_analysis',
947947
status: 'DONE',
948948
images: ['6a5e9a4c-8752-c1e6-6a34-38338074eda1'],
949+
wheelAnalysisCloseUp: false,
949950
},
950951
],
951952
vehicles: [

packages/sights/research/data/fesc20/fesc20.json

+4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"vehicle": "fesc20",
7171
"mirror_sight": "fesc20-raHPDUNm",
7272
"dev": true,
73+
"wheel_name": "wheel_back_left",
7374
"tasks": ["wheel_analysis"]
7475
},
7576
"fesc20-5Ts1UkPT": {
@@ -96,6 +97,7 @@
9697
"vehicle": "fesc20",
9798
"mirror_sight": "fesc20-Tlu3sz8A",
9899
"dev": true,
100+
"wheel_name": "wheel_back_right",
99101
"tasks": ["wheel_analysis"]
100102
},
101103
"fesc20-6GPUkfYn": {
@@ -335,6 +337,7 @@
335337
"vehicle": "fesc20",
336338
"mirror_sight": "fesc20-W6XrryMO",
337339
"dev": true,
340+
"wheel_name": "wheel_front_left",
338341
"tasks": ["wheel_analysis"]
339342
},
340343
"fesc20-WMUaKDp1": {
@@ -419,6 +422,7 @@
419422
"vehicle": "fesc20",
420423
"mirror_sight": "fesc20-YPcJPAZE",
421424
"dev": true,
425+
"wheel_name": "wheel_front_right",
422426
"tasks": ["wheel_analysis"]
423427
},
424428
"fesc20-dfICsfSV": {

packages/sights/research/data/ff150/ff150.json

+4
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
"vehicle": "ff150",
115115
"mirror_sight": "ff150-7vyfzrVQ",
116116
"dev": true,
117+
"wheel_name": "wheel_back_right",
117118
"tasks": ["wheel_analysis"]
118119
},
119120
"ff150-7UI3m9B3": {
@@ -155,6 +156,7 @@
155156
"vehicle": "ff150",
156157
"mirror_sight": "ff150-pNO26q4D",
157158
"dev": true,
159+
"wheel_name": "wheel_front_right",
158160
"tasks": ["wheel_analysis"]
159161
},
160162
"ff150-BmXfb-qD": {
@@ -197,6 +199,7 @@
197199
"vehicle": "ff150",
198200
"mirror_sight": "ff150-jUBEKij0",
199201
"dev": true,
202+
"wheel_name": "wheel_front_left",
200203
"tasks": ["wheel_analysis"]
201204
},
202205
"ff150-GOx2s_9L": {
@@ -419,6 +422,7 @@
419422
"vehicle": "ff150",
420423
"mirror_sight": "ff150-H3MCPESJ",
421424
"dev": true,
425+
"wheel_name": "wheel_back_right",
422426
"tasks": ["wheel_analysis"]
423427
},
424428
"ff150-phbX7Bef": {

packages/sights/research/data/ffocus18/ffocus18.json

+4
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@
175175
"vehicle": "ffocus18",
176176
"mirror_sight": "ffocus18-Eo0jqD_a",
177177
"dev": true,
178+
"wheel_name": "wheel_front_right",
178179
"tasks": ["wheel_analysis"]
179180
},
180181
"ffocus18-L2UM_68Q": {
@@ -230,6 +231,7 @@
230231
"vehicle": "ffocus18",
231232
"mirror_sight": "ffocus18-JFX8WF9P",
232233
"dev": true,
234+
"wheel_name": "wheel_back_right",
233235
"tasks": ["wheel_analysis"]
234236
},
235237
"ffocus18-QKfhXU7o": {
@@ -272,6 +274,7 @@
272274
"vehicle": "ffocus18",
273275
"mirror_sight": "ffocus18-tufa4FoL",
274276
"dev": true,
277+
"wheel_name": "wheel_back_left",
275278
"tasks": ["wheel_analysis"]
276279
},
277280
"ffocus18-U3Bcfc2Q": {
@@ -543,6 +546,7 @@
543546
"vehicle": "ffocus18",
544547
"mirror_sight": "ffocus18-jkSlWpql",
545548
"dev": true,
549+
"wheel_name": "wheel_front_left",
546550
"tasks": ["wheel_analysis"]
547551
},
548552
"ffocus18-yo9eBDW6": {

packages/sights/research/data/ftransit18/ftransit18.json

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"vehicle": "ftransit18",
4040
"mirror_sight": "ftransit18-AuCXxG5o",
4141
"dev": true,
42+
"wheel_name": "wheel_back_left",
4243
"tasks": ["wheel_analysis"]
4344
},
4445
"ftransit18-3dkU10af": {
@@ -96,6 +97,7 @@
9697
"vehicle": "ftransit18",
9798
"mirror_sight": "ftransit18-mGSvkRHz",
9899
"dev": true,
100+
"wheel_name": "wheel_front_right",
99101
"tasks": ["wheel_analysis"]
100102
},
101103
"ftransit18-5SiNC94w": {
@@ -243,6 +245,7 @@
243245
"vehicle": "ftransit18",
244246
"mirror_sight": "ftransit18-yxw9gmyL",
245247
"dev": true,
248+
"wheel_name": "wheel_back_right",
246249
"tasks": ["wheel_analysis"]
247250
},
248251
"ftransit18-TkXihCj4": {
@@ -299,6 +302,7 @@
299302
"vehicle": "ftransit18",
300303
"mirror_sight": "ftransit18-7qLSCnFP",
301304
"dev": true,
305+
"wheel_name": "wheel_front_left",
302306
"tasks": ["wheel_analysis"]
303307
},
304308
"ftransit18-aA2K898S": {

packages/sights/research/data/haccord/haccord.json

+4
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
"vehicle": "haccord",
113113
"mirror_sight": "haccord-boMeNVsC",
114114
"dev": true,
115+
"wheel_name": "wheel_front_front",
115116
"tasks": ["wheel_analysis"]
116117
},
117118
"haccord-GdWvsqrm": {
@@ -184,6 +185,7 @@
184185
"vehicle": "haccord",
185186
"mirror_sight": "haccord-2v-2_QD5",
186187
"dev": true,
188+
"wheel_name": "wheel_front_right",
187189
"tasks": ["wheel_analysis"]
188190
},
189191
"haccord-KvP-pm8L": {
@@ -226,6 +228,7 @@
226228
"vehicle": "haccord",
227229
"mirror_sight": "haccord-H_eRrLBl",
228230
"dev": true,
231+
"wheel_name": "wheel_back_right",
229232
"tasks": ["wheel_analysis"]
230233
},
231234
"haccord-PGr3RzzP": {
@@ -299,6 +302,7 @@
299302
"vehicle": "haccord",
300303
"mirror_sight": "haccord-9fxMGSs6",
301304
"dev": true,
305+
"wheel_name": "wheel_back_left",
302306
"tasks": ["wheel_analysis"]
303307
},
304308
"haccord-Z84erkMb": {

0 commit comments

Comments
 (0)