Files
Frontend/src/libs/api/services/fertilizationRecommendationService.ts
T
2026-04-28 04:11:23 +03:30

170 lines
3.7 KiB
TypeScript

/**
* Fertilization Recommendation API
* @see RECOMMENDATION_APIS.md
*/
import { apiClient } from "../client";
const PREFIX = "/api/fertilization-recommendation";
const RECOMMEND_PREFIX = "/api/fertilization";
export interface FarmData {
soilType: string;
organicMatter: string;
waterEC: string;
}
export interface GrowthStage {
id: string;
icon: string;
label?: string;
}
export interface CropOption {
id: string;
labelKey?: string;
name?: string;
icon: string;
growthStages?: string[];
}
export interface FertilizationConfigResponse {
farm_uuid?: string;
farmData: FarmData;
growthStages: GrowthStage[];
cropOptions: CropOption[];
}
export interface FertilizationNpkRatio {
n: number;
p: number;
k: number;
label: string;
}
export interface FertilizationApplicationMethod {
id: string;
label: string;
}
export interface FertilizationApplicationInterval {
label: string;
unit: string;
value: number;
}
export interface FertilizationDosage {
label: string;
unit: string;
calculation_basis: string;
base_amount_per_hectare: number;
base_amount_per_square_meter: number;
}
export interface FertilizationPrimaryRecommendation {
fertilizer_code: string;
fertilizer_name: string;
display_title: string;
fertilizer_type: string;
reasoning: string;
summary: string;
npk_ratio: FertilizationNpkRatio;
application_method: FertilizationApplicationMethod;
application_interval: FertilizationApplicationInterval;
dosage: FertilizationDosage;
}
export interface FertilizationNutrientItem {
key: string;
name: string;
unit: string;
description: string;
value: number;
}
export interface FertilizationApplicationStep {
step_number: number;
title: string;
description: string;
}
export interface FertilizationApplicationGuide {
safety_warning: string;
steps: FertilizationApplicationStep[];
}
export interface FertilizationAlternativeRecommendation {
fertilizer_code: string;
fertilizer_name: string;
fertilizer_type: string;
usage_method: string;
description: string;
}
export interface FertilizationSection {
title: string;
icon: string;
type: string;
content?: string;
items?: string[];
applicationMethod?: string;
fertilizerType?: string;
validityPeriod?: string;
amount?: string;
expandableExplanation?: string;
timing?: string;
}
export interface FertilizationRecommendationResult {
primary_recommendation: FertilizationPrimaryRecommendation;
nutrient_analysis: {
macro: FertilizationNutrientItem[];
micro: FertilizationNutrientItem[];
};
application_guide: FertilizationApplicationGuide;
alternative_recommendations: FertilizationAlternativeRecommendation[];
sections: FertilizationSection[];
}
export interface FertilizationRecommendPayload {
farm_uuid: string;
crop_id?: string;
growth_stage?: string;
farm_data?: Partial<FarmData>;
soilType?: string;
organicMatter?: string;
waterEC?: string;
}
interface ApiResponse<T> {
code: number;
msg: string;
data: T;
}
async function unwrap<T>(promise: Promise<ApiResponse<T>>): Promise<T> {
const res = await promise;
return res.data;
}
export const fertilizationRecommendationService = {
getConfig(farmUuid: string): Promise<FertilizationConfigResponse> {
return unwrap(
apiClient.get<ApiResponse<FertilizationConfigResponse>>(
`${PREFIX}/config/?farm_uuid=${encodeURIComponent(farmUuid)}`,
),
);
},
recommend(
payload?: FertilizationRecommendPayload,
): Promise<FertilizationRecommendationResult> {
return unwrap(
apiClient.post<ApiResponse<FertilizationRecommendationResult>>(
`${RECOMMEND_PREFIX}/recommend/`,
payload ?? {},
),
);
},
};