diff --git a/docs/swagger.json b/docs/swagger.json index 41154569..30072e07 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -3595,7 +3595,7 @@ "BearerAuth": [] } ], - "description": "获取所有计划的列表", + "description": "获取所有计划的列表,支持按类型过滤和分页", "produces": [ "application/json" ], @@ -3603,6 +3603,36 @@ "计划管理" ], "summary": "获取计划列表", + "parameters": [ + { + "type": "integer", + "description": "页码", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "每页大小", + "name": "pageSize", + "in": "query" + }, + { + "enum": [ + "所有任务", + "自定义任务", + "系统任务" + ], + "type": "string", + "x-enum-varnames": [ + "PlanTypeFilterAll", + "PlanTypeFilterCustom", + "PlanTypeFilterSystem" + ], + "description": "计划类型", + "name": "planType", + "in": "query" + } + ], "responses": { "200": { "description": "业务码为200代表成功获取列表", @@ -3615,10 +3645,7 @@ "type": "object", "properties": { "data": { - "type": "array", - "items": { - "$ref": "#/definitions/dto.PlanResponse" - } + "$ref": "#/definitions/dto.ListPlansResponse" } } } @@ -3728,7 +3755,7 @@ "BearerAuth": [] } ], - "description": "根据计划ID更新计划的详细信息。", + "description": "根据计划ID更新计划的详细信息。系统计划不允许修改。", "consumes": [ "application/json" ], @@ -3784,7 +3811,7 @@ "BearerAuth": [] } ], - "description": "根据计划ID删除计划。(软删除)", + "description": "根据计划ID删除计划。(软删除)系统计划不允许删除。", "produces": [ "application/json" ], @@ -3818,7 +3845,7 @@ "BearerAuth": [] } ], - "description": "根据计划ID启动一个计划的执行。", + "description": "根据计划ID启动一个计划的执行。系统计划不允许手动启动。", "produces": [ "application/json" ], @@ -3852,7 +3879,7 @@ "BearerAuth": [] } ], - "description": "根据计划ID停止一个正在执行的计划。", + "description": "根据计划ID停止一个正在执行的计划。系统计划不能被停止。", "produces": [ "application/json" ], @@ -4149,6 +4176,7 @@ 2001, 4000, 4001, + 4003, 4004, 4009, 5000, @@ -4158,6 +4186,7 @@ "CodeBadRequest": "请求参数错误", "CodeConflict": "资源冲突", "CodeCreated": "创建成功", + "CodeForbidden": "禁止访问", "CodeInternalError": "服务器内部错误", "CodeNotFound": "资源未找到", "CodeServiceUnavailable": "服务不可用", @@ -4169,6 +4198,7 @@ "创建成功", "请求参数错误", "未授权", + "禁止访问", "资源未找到", "资源冲突", "服务器内部错误", @@ -4179,6 +4209,7 @@ "CodeCreated", "CodeBadRequest", "CodeUnauthorized", + "CodeForbidden", "CodeNotFound", "CodeConflict", "CodeInternalError", @@ -4739,6 +4770,21 @@ } } }, + "dto.ListPlansResponse": { + "type": "object", + "properties": { + "plans": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PlanResponse" + } + }, + "total": { + "type": "integer", + "example": 100 + } + } + }, "dto.ListRawMaterialPurchaseResponse": { "type": "object", "properties": { @@ -5434,6 +5480,9 @@ "plan_id": { "type": "integer" }, + "plan_name": { + "type": "string" + }, "started_at": { "type": "string" }, @@ -5488,6 +5537,14 @@ "type": "string", "example": "猪舍温度控制计划" }, + "plan_type": { + "allOf": [ + { + "$ref": "#/definitions/models.PlanType" + } + ], + "example": "自定义任务" + }, "status": { "allOf": [ { @@ -6732,6 +6789,17 @@ "PlanStatusFailed" ] }, + "models.PlanType": { + "type": "string", + "enum": [ + "自定义任务", + "系统任务" + ], + "x-enum-varnames": [ + "PlanTypeCustom", + "PlanTypeSystem" + ] + }, "models.SensorType": { "type": "string", "enum": [ @@ -6787,22 +6855,26 @@ "enum": [ "计划分析", "等待", - "下料" + "下料", + "全量采集" ], "x-enum-comments": { "TaskPlanAnalysis": "解析Plan的Task列表并添加到待执行队列的特殊任务", + "TaskTypeFullCollection": "新增的全量采集任务", "TaskTypeReleaseFeedWeight": "下料口释放指定重量任务", "TaskTypeWaiting": "等待任务" }, "x-enum-descriptions": [ "解析Plan的Task列表并添加到待执行队列的特殊任务", "等待任务", - "下料口释放指定重量任务" + "下料口释放指定重量任务", + "新增的全量采集任务" ], "x-enum-varnames": [ "TaskPlanAnalysis", "TaskTypeWaiting", - "TaskTypeReleaseFeedWeight" + "TaskTypeReleaseFeedWeight", + "TaskTypeFullCollection" ] }, "models.ValueDescriptor": { @@ -6836,6 +6908,19 @@ "NotifierTypeLog" ] }, + "repository.PlanTypeFilter": { + "type": "string", + "enum": [ + "所有任务", + "自定义任务", + "系统任务" + ], + "x-enum-varnames": [ + "PlanTypeFilterAll", + "PlanTypeFilterCustom", + "PlanTypeFilterSystem" + ] + }, "zapcore.Level": { "type": "integer", "format": "int32", diff --git a/src/api/plan.js b/src/api/plan.js index bd37a776..fe7ea8fd 100644 --- a/src/api/plan.js +++ b/src/api/plan.js @@ -1,7 +1,7 @@ import http from '../utils/http'; /** - * @typedef {('计划分析'|'等待'|'下料')} TaskType + * @typedef {('计划分析'|'等待'|'下料'|'全量采集')} TaskType */ /** @@ -67,6 +67,10 @@ import http from '../utils/http'; * @typedef {('子计划'|'任务')} PlanContentType */ +/** + * @typedef {('自定义任务'|'系统任务')} PlanType + */ + /** * @typedef {object} PlanResponse * @property {number} id @@ -78,17 +82,41 @@ import http from '../utils/http'; * @property {number} execute_count * @property {PlanStatus} status * @property {PlanContentType} content_type + * @property {PlanType} plan_type * @property {Array} tasks * @property {Array} sub_plans */ +/** + * @typedef {object} ListPlansResponse + * @property {Array} plans + * @property {number} total + */ + +/** + * @typedef {object} PlanExecutionLogDTO + * @property {string} created_at + * @property {string} ended_at + * @property {string} error + * @property {number} id + * @property {number} plan_id + * @property {string} plan_name + * @property {string} started_at + * @property {string} status + * @property {string} updated_at + */ + /** * 获取所有计划的列表 - * @returns {Promise>} + * @param {object} params - 查询参数 + * @param {number} [params.page] - 页码 + * @param {number} [params.pageSize] - 每页大小 + * @param {('所有任务'|'自定义任务'|'系统任务')} [params.planType] - 计划类型 + * @returns {Promise} */ -const getPlans = () => { - return http.get('/api/v1/plans'); +const getPlans = (params) => { + return http.get('/api/v1/plans', { params }); }; /** @@ -110,7 +138,7 @@ const getPlanById = (id) => { }; /** - * 根据计划ID更新计划的详细信息 + * 根据计划ID更新计划的详细信息。系统计划不允许修改。 * @param {number} id - 计划ID * @param {UpdatePlanRequest} planData - 更新后的计划信息 * @returns {Promise} @@ -120,7 +148,7 @@ const updatePlan = (id, planData) => { }; /** - * 根据计划ID删除计划(软删除) + * 根据计划ID删除计划。(软删除)系统计划不允许删除。 * @param {number} id - 计划ID * @returns {Promise<*>} */ @@ -129,7 +157,7 @@ const deletePlan = (id) => { }; /** - * 根据计划ID启动一个计划的执行 + * 根据计划ID启动一个计划的执行。系统计划不允许手动启动。 * @param {number} id - 计划ID * @returns {Promise<*>} */ @@ -138,7 +166,7 @@ const startPlan = (id) => { }; /** - * 根据计划ID停止一个正在执行的计划 + * 根据计划ID停止一个正在执行的计划。系统计划不能被停止。 * @param {number} id - 计划ID * @returns {Promise<*>} */ diff --git a/src/components/PlanDetail.vue b/src/components/PlanDetail.vue index 35948304..d7f22d09 100644 --- a/src/components/PlanDetail.vue +++ b/src/components/PlanDetail.vue @@ -20,9 +20,9 @@ {{ plan.name }} - 内容
@@ -32,12 +32,14 @@ type="primary" size="small" @click="showAddSubPlanDialog" + :disabled="plan.plan_type === '系统任务'" >增加子计划 增加子任务
@@ -61,8 +63,8 @@ 延时: {{ task.parameters.delay_duration }} 秒

- 编辑 - 删除 + 编辑 + 删除 @@ -80,7 +82,7 @@ - 删除 + 删除 @@ -135,16 +137,16 @@ > - + - + - + @@ -160,7 +163,7 @@ @@ -355,7 +358,7 @@ export default { }, async fetchAvailablePlans() { try { - const response = await apiClient.plans.getPlans(); // 更正此处 + const response = await apiClient.plans.getPlans({ planType: '自定义任务' }); this.availablePlans = response.data.plans.filter(p => p.id !== this.planId ); @@ -483,7 +486,8 @@ export default { } else { ElMessage.error('未找到要编辑的任务'); } - } else { + } + else { // Add a new task const newTask = { id: Date.now(), diff --git a/src/views/monitor/PlanExecutionLogsView.vue b/src/views/monitor/PlanExecutionLogsView.vue index 24791ea9..9f293528 100644 --- a/src/views/monitor/PlanExecutionLogsView.vue +++ b/src/views/monitor/PlanExecutionLogsView.vue @@ -34,6 +34,12 @@ const planExecutionLogColumns = [ sorter: true, minWidth: 120, }, + { + title: '计划名称', + dataIndex: 'plan_name', + key: 'plan_name', + minWidth: 150, + }, { title: '状态', dataIndex: 'status', diff --git a/src/views/plan/PlanList.vue b/src/views/plan/PlanList.vue index 67196fb6..afe364c8 100644 --- a/src/views/plan/PlanList.vue +++ b/src/views/plan/PlanList.vue @@ -9,7 +9,15 @@ - 添加计划 + +
+ + + + + + 添加计划 +
@@ -65,17 +73,18 @@ @@ -145,7 +154,8 @@ export default { }, selectedPlanIdForDetails: null, // 当前要查看详情的计划ID startingPlanId: null, - stoppingPlanId: null + stoppingPlanId: null, + planTypeFilter: '自定义任务', // 新增:计划类型筛选,默认自定义任务 }; }, async mounted() { @@ -158,7 +168,7 @@ export default { this.error = null; try { - const response = await apiClient.plans.getPlans(); // 更正此处 + const response = await apiClient.plans.getPlans({ planType: this.planTypeFilter }); // 传递 planTypeFilter let fetchedPlans = response.data?.plans || []; // Default sort by ID ascending fetchedPlans.sort((a, b) => a.id - b.id); @@ -326,6 +336,10 @@ export default { handlePlanCancel() { this.dialogVisible = false; } + }, + watch: { + // 监听 planTypeFilter 变化,重新加载计划列表 + planTypeFilter: 'loadPlans' } }; @@ -388,6 +402,11 @@ export default { height: 20px; } +.filter-and-add { + display: flex; + align-items: center; +} + @media (max-width: 768px) { .plan-list { padding: 10px; @@ -397,4 +416,4 @@ export default { gap: 15px; } } - \ No newline at end of file +