170 lines
3.7 KiB
TypeScript
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 ?? {},
|
|
),
|
|
);
|
|
},
|
|
};
|