diff --git a/docs/swagger.json b/docs/swagger.json index f01bbf30..93b73087 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -2722,6 +2722,18 @@ ], "summary": "获取原料列表", "parameters": [ + { + "type": "number", + "description": "参考价格最大值", + "name": "max_reference_price", + "in": "query" + }, + { + "type": "number", + "description": "参考价格最小值", + "name": "min_reference_price", + "in": "query" + }, { "type": "string", "description": "按原料名称模糊查询", @@ -2793,7 +2805,7 @@ "summary": "创建原料", "parameters": [ { - "description": "原料信息", + "description": "原料信息,包含名称、描述和参考价格", "name": "rawMaterial", "in": "body", "required": true, @@ -2895,7 +2907,7 @@ "required": true }, { - "description": "更新后的原料信息", + "description": "更新后的原料信息,包含名称、描述和参考价格", "name": "rawMaterial", "in": "body", "required": true, @@ -3262,6 +3274,215 @@ } } }, + "/api/v1/inventory/stock/adjust": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "手动调整指定原料的库存量。", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "库存管理" + ], + "summary": "调整原料库存", + "parameters": [ + { + "description": "库存调整请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.StockAdjustmentRequest" + } + } + ], + "responses": { + "200": { + "description": "业务码为200代表调整成功", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.StockLogResponse" + } + } + } + ] + } + } + } + } + }, + "/api/v1/inventory/stock/current": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "获取所有原料的当前库存列表,支持分页和过滤。", + "produces": [ + "application/json" + ], + "tags": [ + "库存管理" + ], + "summary": "获取当前库存列表", + "parameters": [ + { + "type": "string", + "description": "排序字段, 例如 \"stock DESC\"", + "name": "order_by", + "in": "query" + }, + { + "type": "integer", + "description": "页码", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "每页数量", + "name": "page_size", + "in": "query" + }, + { + "type": "string", + "description": "按原料名称模糊查询", + "name": "raw_material_name", + "in": "query" + } + ], + "responses": { + "200": { + "description": "业务码为200代表成功获取列表", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.ListCurrentStockResponse" + } + } + } + ] + } + } + } + } + }, + "/api/v1/inventory/stock/logs": { + "get": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "获取原料库存变动历史记录,支持分页、过滤和时间范围查询。", + "produces": [ + "application/json" + ], + "tags": [ + "库存管理" + ], + "summary": "获取库存变动日志", + "parameters": [ + { + "type": "string", + "description": "结束时间 (RFC3339格式)", + "name": "end_time", + "in": "query" + }, + { + "type": "string", + "description": "排序字段", + "name": "order_by", + "in": "query" + }, + { + "type": "integer", + "description": "页码", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "每页数量", + "name": "page_size", + "in": "query" + }, + { + "type": "integer", + "description": "按原料ID精确查询", + "name": "raw_material_id", + "in": "query" + }, + { + "type": "array", + "items": { + "enum": [ + "采购入库", + "饲喂出库", + "变质出库", + "售卖出库", + "杂用领取", + "手动盘点", + "发酵出库", + "发酵入库" + ], + "type": "string" + }, + "collectionFormat": "csv", + "description": "按来源类型查询", + "name": "source_types", + "in": "query" + }, + { + "type": "string", + "description": "开始时间 (RFC3339格式, e.g., \"2023-01-01T00:00:00Z\")", + "name": "start_time", + "in": "query" + } + ], + "responses": { + "200": { + "description": "业务码为200代表成功获取列表", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/controller.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.ListStockLogResponse" + } + } + } + ] + } + } + } + } + }, "/api/v1/monitor/device-command-logs": { "get": { "security": [ @@ -3443,6 +3664,7 @@ }, { "enum": [ + 7, -1, 0, 1, @@ -3452,12 +3674,12 @@ 5, -1, 5, - 6, - 7 + 6 ], "type": "integer", "format": "int32", "x-enum-varnames": [ + "_numLevels", "DebugLevel", "InfoLevel", "WarnLevel", @@ -3467,8 +3689,7 @@ "FatalLevel", "_minLevel", "_maxLevel", - "InvalidLevel", - "_numLevels" + "InvalidLevel" ], "name": "level", "in": "query" @@ -6999,6 +7220,10 @@ "description": "原料名称", "type": "string", "maxLength": 100 + }, + "reference_price": { + "description": "参考价格(kg/元)", + "type": "number" } } }, @@ -7057,6 +7282,27 @@ } } }, + "dto.CurrentStockResponse": { + "type": "object", + "properties": { + "last_updated": { + "description": "最后更新时间", + "type": "string" + }, + "raw_material_id": { + "description": "原料ID", + "type": "integer" + }, + "raw_material_name": { + "description": "原料名称", + "type": "string" + }, + "stock": { + "description": "当前库存量, 单位: g", + "type": "number" + } + } + }, "dto.DeleteDeviceThresholdAlarmDTO": { "type": "object", "required": [ @@ -7254,6 +7500,20 @@ } } }, + "dto.ListCurrentStockResponse": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.CurrentStockResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationDTO" + } + } + }, "dto.ListDeviceCommandLogResponse": { "type": "object", "properties": { @@ -7535,6 +7795,20 @@ } } }, + "dto.ListStockLogResponse": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.StockLogResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationDTO" + } + } + }, "dto.ListTaskExecutionLogResponse": { "type": "object", "properties": { @@ -8491,6 +8765,10 @@ "items": { "$ref": "#/definitions/dto.RawMaterialNutrientDTO" } + }, + "reference_price": { + "description": "参考价格(kg/元)", + "type": "number" } } }, @@ -8847,6 +9125,63 @@ } } }, + "dto.StockAdjustmentRequest": { + "type": "object", + "required": [ + "change_amount", + "raw_material_id" + ], + "properties": { + "change_amount": { + "description": "变动数量, 正数为入库, 负数为出库, 单位: g", + "type": "number" + }, + "raw_material_id": { + "description": "要调整的原料ID", + "type": "integer" + }, + "remarks": { + "description": "备注", + "type": "string", + "maxLength": 255 + } + } + }, + "dto.StockLogResponse": { + "type": "object", + "properties": { + "after_quantity": { + "type": "number" + }, + "before_quantity": { + "type": "number" + }, + "change_amount": { + "type": "number" + }, + "happened_at": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "raw_material_id": { + "type": "integer" + }, + "raw_material_name": { + "type": "string" + }, + "remarks": { + "type": "string" + }, + "source_id": { + "type": "integer" + }, + "source_type": { + "$ref": "#/definitions/models.StockLogSourceType" + } + } + }, "dto.SubPlanResponse": { "type": "object", "properties": { @@ -9465,6 +9800,10 @@ "description": "原料名称", "type": "string", "maxLength": 100 + }, + "reference_price": { + "description": "参考价格(kg/元)", + "type": "number" } } }, @@ -10066,6 +10405,43 @@ "FatalLevel" ] }, + "models.StockLogSourceType": { + "type": "string", + "enum": [ + "采购入库", + "饲喂出库", + "变质出库", + "售卖出库", + "杂用领取", + "手动盘点", + "发酵出库", + "发酵入库" + ], + "x-enum-comments": { + "StockLogSourceFermentEnd": "发酵料产出,作为新原料计入库存", + "StockLogSourceFermentStart": "原料投入发酵,从库存中扣除" + }, + "x-enum-descriptions": [ + "", + "", + "", + "", + "", + "", + "原料投入发酵,从库存中扣除", + "发酵料产出,作为新原料计入库存" + ], + "x-enum-varnames": [ + "StockLogSourcePurchase", + "StockLogSourceFeeding", + "StockLogSourceDeteriorate", + "StockLogSourceSale", + "StockLogSourceMiscellaneous", + "StockLogSourceManual", + "StockLogSourceFermentStart", + "StockLogSourceFermentEnd" + ] + }, "models.TaskType": { "type": "string", "enum": [ @@ -10142,6 +10518,7 @@ "type": "integer", "format": "int32", "enum": [ + 7, -1, 0, 1, @@ -10151,10 +10528,10 @@ 5, -1, 5, - 6, - 7 + 6 ], "x-enum-varnames": [ + "_numLevels", "DebugLevel", "InfoLevel", "WarnLevel", @@ -10164,8 +10541,7 @@ "FatalLevel", "_minLevel", "_maxLevel", - "InvalidLevel", - "_numLevels" + "InvalidLevel" ] } }, diff --git a/src/api/feed.js b/src/api/feed.js index cca808cb..6b417d2c 100644 --- a/src/api/feed.js +++ b/src/api/feed.js @@ -239,6 +239,7 @@ import {PaginationDTO, Response} from '../enums'; * @property {string} name * @property {string} description * @property {Array} raw_material_nutrients + * @property {number} [reference_price] - 参考价格(kg/元) */ /** @@ -251,6 +252,8 @@ import {PaginationDTO, Response} from '../enums'; * @typedef {object} RawMaterialsParams * @property {string} [name] - 按原料名称模糊查询 * @property {string} [nutrient_name] - 按营养名称模糊查询 + * @property {number} [max_reference_price] - 参考价格最大值 + * @property {number} [min_reference_price] - 参考价格最小值 * @property {string} [order_by] - 排序字段,例如 "id DESC" * @property {number} [page] * @property {number} [page_size] @@ -260,12 +263,14 @@ import {PaginationDTO, Response} from '../enums'; * @typedef {object} CreateRawMaterialRequest * @property {string} name - 原料名称 * @property {string} [description] - 描述 + * @property {number} [reference_price] - 参考价格(kg/元) */ /** * @typedef {object} UpdateRawMaterialRequest * @property {string} name - 原料名称 * @property {string} [description] - 描述 + * @property {number} [reference_price] - 参考价格(kg/元) */ // --- Recipe --- diff --git a/src/api/index.js b/src/api/index.js index 029eb132..4d124036 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -5,6 +5,7 @@ import { AlarmApi } from './alarm.js'; // 导入告警API import { HealthApi } from './health.js'; // 导入健康检查API import { DeviceTemplateApi } from './deviceTemplate.js'; // 导入设备模板API import { FeedApi } from './feed.js'; // 导入饲料管理API +import { InventoryApi } from './inventory.js'; // 导入库存管理API /** * API客户端 @@ -19,6 +20,7 @@ export class ApiClient { this.alarms = AlarmApi; // 添加告警API this.deviceTemplates = DeviceTemplateApi; // 添加设备模板API this.feeds = FeedApi; // 添加饲料管理API + this.inventory = InventoryApi; // 添加库存管理API } } diff --git a/src/api/inventory.js b/src/api/inventory.js new file mode 100644 index 00000000..e5a04f80 --- /dev/null +++ b/src/api/inventory.js @@ -0,0 +1,104 @@ +import http from '../utils/http'; +import { PaginationDTO, Response, StockLogSourceType } from '../enums'; + +// --- Typedefs for Inventory Management --- + +/** + * @typedef {object} StockAdjustmentRequest + * @property {number} change_amount - 变动数量, 正数为入库, 负数为出库, 单位: g + * @property {number} raw_material_id - 要调整的原料ID + * @property {string} [remarks] - 备注 + */ + +/** + * @typedef {object} StockLogResponse + * @property {number} after_quantity + * @property {number} before_quantity + * @property {number} change_amount + * @property {string} happened_at + * @property {number} id + * @property {number} raw_material_id + * @property {string} raw_material_name + * @property {string} remarks + * @property {number} source_id + * @property {StockLogSourceType} source_type + */ + +/** + * @typedef {object} ListStockLogResponse + * @property {Array} list + * @property {PaginationDTO} pagination + */ + +/** + * @typedef {object} CurrentStockResponse + * @property {string} last_updated - 最后更新时间 + * @property {number} raw_material_id - 原料ID + * @property {string} raw_material_name - 原料名称 + * @property {number} stock - 当前库存量, 单位: g + */ + +/** + * @typedef {object} ListCurrentStockResponse + * @property {Array} list + * @property {PaginationDTO} pagination + */ + +/** + * @typedef {object} AdjustStockParams + * @property {StockAdjustmentRequest} request - 库存调整请求 + */ + +/** + * @typedef {object} GetCurrentStockListParams + * @property {string} [order_by] - 排序字段, 例如 "stock DESC" + * @property {number} [page] - 页码 + * @property {number} [page_size] - 每页数量 + * @property {string} [raw_material_name] - 按原料名称模糊查询 + */ + +/** + * @typedef {object} GetStockLogListParams + * @property {string} [end_time] - 结束时间 (RFC3339格式) + * @property {string} [order_by] - 排序字段 + * @property {number} [page] - 页码 + * @property {number} [page_size] - 每页数量 + * @property {number} [raw_material_id] - 按原料ID精确查询 + * @property {Array} [source_types] - 按来源类型查询 + * @property {string} [start_time] - 开始时间 (RFC3339格式, e.g., "2023-01-01T00:00:00Z") + */ + +// --- API Functions --- + +/** + * 调整原料库存 + * @param {StockAdjustmentRequest} data - 库存调整请求 + * @returns {Promise>} + */ +export const adjustStock = (data) => { + return http.post('/api/v1/inventory/stock/adjust', data); +}; + +/** + * 获取当前库存列表 + * @param {GetCurrentStockListParams} params - 查询参数 + * @returns {Promise>} + */ +export const getCurrentStockList = (params) => { + return http.get('/api/v1/inventory/stock/current', { params }); +}; + +/** + * 获取库存变动日志 + * @param {GetStockLogListParams} params - 查询参数 + * @returns {Promise>} + */ +export const getStockLogList = (params) => { + return http.get('/api/v1/inventory/stock/logs', { params }); +}; + +export const InventoryApi = { + adjustStock, + getCurrentStockList, + getStockLogList, +}; diff --git a/src/enums.js b/src/enums.js index 015434bf..947a9600 100644 --- a/src/enums.js +++ b/src/enums.js @@ -64,6 +64,21 @@ export const LogChangeType = { CORRECTION: '盘点校正', }; +/** + * 库存变动来源类型 + * @enum {string} + */ +export const StockLogSourceType = { + PURCHASE: '采购入库', + FEEDING: '饲喂出库', + DETERIORATE: '变质出库', + SALE: '售卖出库', + MISCELLANEOUS: '杂用领取', + MANUAL: '手动盘点', + FERMENT_START: '发酵出库', // 原料投入发酵,从库存中扣除 + FERMENT_END: '发酵入库', // 发酵料产出,作为新原料计入库存 +}; + /** * 用药原因 * @enum {string} @@ -263,6 +278,7 @@ export const ZapcoreLevel = { PANIC: 4, FATAL: 5, INVALID: 6, + NUM_LEVELS: 7, // 新增的级别数量 }; /**