diff --git a/docs/swagger.json b/docs/swagger.json index b58b6c6f..f01bbf30 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -3016,6 +3016,252 @@ } } }, + "/api/v1/feed/recipes": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "获取所有配方的列表,支持分页和过滤。", + "produces": [ + "application/json" + ], + "tags": [ + "饲料管理-配方" + ], + "summary": "获取配方列表", + "parameters": [ + { + "type": "string", + "description": "按名称模糊查询", + "name": "name", + "in": "query" + }, + { + "type": "string", + "description": "排序字段,例如 \"id DESC\"", + "name": "order_by", + "in": "query" + }, + { + "type": "integer", + "description": "页码", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "每页数量", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "业务码为200代表成功获取列表", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.ListRecipeResponse" + } + } + } + ] + } + } + } + }, + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "创建一个新的配方,包含其原料组成。", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "饲料管理-配方" + ], + "summary": "创建配方", + "parameters": [ + { + "description": "配方信息", + "name": "recipe", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.CreateRecipeRequest" + } + } + ], + "responses": { + "200": { + "description": "业务码为201代表创建成功", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.RecipeResponse" + } + } + } + ] + } + } + } + } + }, + "/api/v1/feed/recipes/{id}": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "根据ID获取单个配方的详细信息。", + "produces": [ + "application/json" + ], + "tags": [ + "饲料管理-配方" + ], + "summary": "获取配方详情", + "parameters": [ + { + "type": "integer", + "description": "配方ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "业务码为200代表成功获取", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.RecipeResponse" + } + } + } + ] + } + } + } + }, + "put": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "根据ID更新配方信息及其原料组成。", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "饲料管理-配方" + ], + "summary": "更新配方", + "parameters": [ + { + "type": "integer", + "description": "配方ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "更新后的配方信息", + "name": "recipe", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdateRecipeRequest" + } + } + ], + "responses": { + "200": { + "description": "业务码为200代表更新成功", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.RecipeResponse" + } + } + } + ] + } + } + } + }, + "delete": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "根据ID删除配方。", + "produces": [ + "application/json" + ], + "tags": [ + "饲料管理-配方" + ], + "summary": "删除配方", + "parameters": [ + { + "type": "integer", + "description": "配方ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "业务码为200代表删除成功", + "schema": { + "$ref": "#/definitions/controller.Response" + } + } + } + } + }, "/api/v1/monitor/device-command-logs": { "get": { "security": [ @@ -6756,6 +7002,31 @@ } } }, + "dto.CreateRecipeRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "description": "配方描述", + "type": "string", + "maxLength": 255 + }, + "name": { + "description": "配方名称", + "type": "string", + "maxLength": 100 + }, + "recipe_ingredients": { + "description": "配方原料组成", + "type": "array", + "items": { + "$ref": "#/definitions/dto.RecipeIngredientDto" + } + } + } + }, "dto.CreateUserRequest": { "type": "object", "required": [ @@ -7236,6 +7507,20 @@ } } }, + "dto.ListRecipeResponse": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.RecipeResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationDTO" + } + } + }, "dto.ListSensorDataResponse": { "type": "object", "properties": { @@ -8209,6 +8494,44 @@ } } }, + "dto.RecipeIngredientDto": { + "type": "object", + "required": [ + "raw_material_id" + ], + "properties": { + "percentage": { + "description": "原料在配方中的百分比 (0-1之间)", + "type": "number", + "maximum": 1, + "minimum": 0 + }, + "raw_material_id": { + "description": "原料ID", + "type": "integer" + } + } + }, + "dto.RecipeResponse": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "recipe_ingredients": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.RecipeIngredientDto" + } + } + } + }, "dto.ReclassifyPenToNewBatchRequest": { "type": "object", "required": [ @@ -9145,6 +9468,31 @@ } } }, + "dto.UpdateRecipeRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "description": { + "description": "配方描述", + "type": "string", + "maxLength": 255 + }, + "name": { + "description": "配方名称", + "type": "string", + "maxLength": 100 + }, + "recipe_ingredients": { + "description": "配方原料组成", + "type": "array", + "items": { + "$ref": "#/definitions/dto.RecipeIngredientDto" + } + } + } + }, "dto.UserActionLogDTO": { "type": "object", "properties": { diff --git a/src/api/feed.js b/src/api/feed.js index 7a1cb76f..bc1761d2 100644 --- a/src/api/feed.js +++ b/src/api/feed.js @@ -212,6 +212,98 @@ import {PaginationDTO, Response} from '../enums'; * @property {Array} nutrient_requirements - 新的营养需求列表 */ +// --- Recipe --- + +/** + * @typedef {object} RecipeIngredientDto + * @property {number} raw_material_id - 原料ID + * @property {number} [percentage] - 原料在配方中的百分比 (0-1之间) + */ + +/** + * @typedef {object} RecipeResponse + * @property {number} id + * @property {string} name + * @property {string} description + * @property {Array} recipe_ingredients + */ + +/** + * @typedef {object} ListRecipeResponse + * @property {Array} list + * @property {PaginationDTO} pagination + */ + +/** + * @typedef {object} RecipesParams + * @property {string} [name] - 按名称模糊查询 + * @property {string} [order_by] - 排序字段,例如 "id DESC" + * @property {number} [page] + * @property {number} [page_size] + */ + +/** + * @typedef {object} CreateRecipeRequest + * @property {string} name - 配方名称 + * @property {string} [description] - 配方描述 + * @property {Array} [recipe_ingredients] - 配方原料组成 + */ + +/** + * @typedef {object} UpdateRecipeRequest + * @property {string} name - 配方名称 + * @property {string} [description] - 配方描述 + * @property {Array} [recipe_ingredients] - 配方原料组成 + */ + +// --- Recipe --- + +/** + * 获取配方列表 + * @param {RecipesParams} params - 查询参数 + * @returns {Promise>} + */ +export const getRecipes = (params) => { + return http.get('/api/v1/feed/recipes', {params}); +}; + +/** + * 创建配方 + * @param {CreateRecipeRequest} data - 请求体 + * @returns {Promise>} + */ +export const createRecipe = (data) => { + return http.post('/api/v1/feed/recipes', data); +}; + +/** + * 获取配方详情 + * @param {number} id - 配方ID + * @returns {Promise>} + */ +export const getRecipeById = (id) => { + return http.get(`/api/v1/feed/recipes/${id}`); +}; + +/** + * 更新配方 + * @param {number} id - 配方ID + * @param {UpdateRecipeRequest} data - 请求体 + * @returns {Promise>} + */ +export const updateRecipe = (id, data) => { + return http.put(`/api/v1/feed/recipes/${id}`, data); +}; + +/** + * 删除配方 + * @param {number} id - 配方ID + * @returns {Promise} + */ +export const deleteRecipe = (id) => { + return http.delete(`/api/v1/feed/recipes/${id}`); +}; + // --- RawMaterial --- /** @@ -473,6 +565,98 @@ export const updatePigTypeNutrientRequirements = (id, data) => { return http.put(`/api/v1/feed/pig-types/${id}/nutrient-requirements`, data); }; +// --- Recipe --- + +/** + * @typedef {object} RecipeIngredientDto + * @property {number} raw_material_id - 原料ID + * @property {number} [percentage] - 原料在配方中的百分比 (0-1之间) + */ + +/** + * @typedef {object} RecipeResponse + * @property {number} id + * @property {string} name + * @property {string} description + * @property {Array} recipe_ingredients + */ + +/** + * @typedef {object} ListRecipeResponse + * @property {Array} list + * @property {PaginationDTO} pagination + */ + +/** + * @typedef {object} RecipesParams + * @property {string} [name] - 按名称模糊查询 + * @property {string} [order_by] - 排序字段,例如 "id DESC" + * @property {number} [page] + * @property {number} [page_size] + */ + +/** + * @typedef {object} CreateRecipeRequest + * @property {string} name - 配方名称 + * @property {string} [description] - 配方描述 + * @property {Array} [recipe_ingredients] - 配方原料组成 + */ + +/** + * @typedef {object} UpdateRecipeRequest + * @property {string} name - 配方名称 + * @property {string} [description] - 配方描述 + * @property {Array} [recipe_ingredients] - 配方原料组成 + */ + +// --- Recipe --- + +/** + * 获取配方列表 + * @param {RecipesParams} params - 查询参数 + * @returns {Promise>} + */ +export const getRecipes = (params) => { + return http.get('/api/v1/feed/recipes', {params}); +}; + +/** + * 创建配方 + * @param {CreateRecipeRequest} data - 请求体 + * @returns {Promise>} + */ +export const createRecipe = (data) => { + return http.post('/api/v1/feed/recipes', data); +}; + +/** + * 获取配方详情 + * @param {number} id - 配方ID + * @returns {Promise>} + */ +export const getRecipeById = (id) => { + return http.get(`/api/v1/feed/recipes/${id}`); +}; + +/** + * 更新配方 + * @param {number} id - 配方ID + * @param {UpdateRecipeRequest} data - 请求体 + * @returns {Promise>} + */ +export const updateRecipe = (id, data) => { + return http.put(`/api/v1/feed/recipes/${id}`, data); +}; + +/** + * 删除配方 + * @param {number} id - 配方ID + * @returns {Promise} + */ +export const deleteRecipe = (id) => { + return http.delete(`/api/v1/feed/recipes/${id}`); +}; + // --- RawMaterial --- /** @@ -554,6 +738,11 @@ export const FeedApi = { updatePigType, deletePigType, updatePigTypeNutrientRequirements, + getRecipes, + createRecipe, + getRecipeById, + updateRecipe, + deleteRecipe, getRawMaterials, createRawMaterial, getRawMaterialById,