From 664764292d640f293859c2ab5c355c21e936f9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Mon, 28 Apr 2025 09:38:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=B7=A5=E8=89=BA=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/app/controller/CraftsController.java | 32 +++++++++++++++--- .../iflytop/gd/app/model/dto/StartCraftsDTO.java | 3 +- .../com/iflytop/gd/app/model/vo/CraftStatusVO.java | 27 +++++++++++++++ .../com/iflytop/gd/app/service/CraftsService.java | 38 +++++++++++++++++++--- 4 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java diff --git a/src/main/java/com/iflytop/gd/app/controller/CraftsController.java b/src/main/java/com/iflytop/gd/app/controller/CraftsController.java index be408b6..10a38ab 100644 --- a/src/main/java/com/iflytop/gd/app/controller/CraftsController.java +++ b/src/main/java/com/iflytop/gd/app/controller/CraftsController.java @@ -5,7 +5,9 @@ import com.iflytop.gd.app.model.dto.ResumeCraftsDto; import com.iflytop.gd.app.model.dto.StartCraftsDTO; import com.iflytop.gd.app.model.dto.StopCraftsDto; import com.iflytop.gd.app.model.entity.Crafts; +import com.iflytop.gd.app.model.vo.CraftStatusVO; import com.iflytop.gd.app.service.CraftsService; +import com.iflytop.gd.app.model.bo.CraftsStep; import com.iflytop.gd.common.result.Result; import com.iflytop.gd.common.result.ResultCode; import io.swagger.v3.oas.annotations.Operation; @@ -20,7 +22,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; - +import java.util.Map; @Tag(name = "工艺管理") @RestController @@ -33,9 +35,10 @@ public class CraftsController { @Operation(summary = "根据矿石id获取工艺列表") @GetMapping("/list/{oresId}") - public Result> getAllCrafts(@NotNull(message = "矿石ID 不能为空") - @Min(value = 1, message = "矿石ID 必须大于等于 1") - @Parameter(description = "矿石ID") @PathVariable Long oresId) { + public Result> getAllCrafts( + @NotNull(message = "矿石ID 不能为空") + @Min(value = 1, message = "矿石ID 必须大于等于 1") + @Parameter(description = "矿石ID") @PathVariable Long oresId) { List craftList = craftsService.selectAllByOresId(oresId); return Result.success(craftList); } @@ -67,7 +70,8 @@ public class CraftsController { @Operation(summary = "删除工艺") @DeleteMapping("/{ids}") - public Result deleteCrafts(@Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) { + public Result deleteCrafts( + @Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) { boolean isSuccess = craftsService.deleteCrafts(ids); if (isSuccess) { return Result.success(); @@ -108,4 +112,22 @@ public class CraftsController { } return Result.failed(); } + + @Operation(summary = "获取某个加热区工艺状态") + @GetMapping("/status/{heatId}") + public Result getStatus( + @NotNull @PathVariable String heatId) { + CraftStatusVO vo = craftsService.getStatus(heatId); + if (vo == null) { + return Result.failed(ResultCode.NOT_FOUND, "未找到执行任务"); + } + return Result.success(vo); + } + + @Operation(summary = "获取所有加热区工艺状态列表") + @GetMapping("/status") + public Result> getAllStatuses() { + List list = craftsService.getAllStatuses(); + return Result.success(list); + } } diff --git a/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java b/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java index 59cc86f..f7b711a 100644 --- a/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java +++ b/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java @@ -2,12 +2,13 @@ package com.iflytop.gd.app.model.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Positive; import lombok.Data; @Schema(description = "开始工艺") @Data public class StartCraftsDTO { - @NotBlank + @Positive(message = "工艺ID 必须是正数") @Schema(description = "工艺id") private Long craftId; @NotBlank diff --git a/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java b/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java new file mode 100644 index 0000000..605d8e0 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java @@ -0,0 +1,27 @@ +package com.iflytop.gd.app.model.vo; + +import com.iflytop.gd.app.common.enums.CraftStates; +import com.iflytop.gd.app.model.bo.CraftsStep; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 工艺执行状态视图对象 + */ +@Data +public class CraftStatusVO { + + @Schema(description = "加热区 ID") + private String heatId; + + @Schema(description = "当前状态") + private CraftStates state; + + @Schema(description = "当前执行到的步骤索引") + private int currentIndex; + + @Schema(description = "工艺所有步骤") + private List steps; +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsService.java b/src/main/java/com/iflytop/gd/app/service/CraftsService.java index b3ca695..b39844d 100644 --- a/src/main/java/com/iflytop/gd/app/service/CraftsService.java +++ b/src/main/java/com/iflytop/gd/app/service/CraftsService.java @@ -7,6 +7,7 @@ import com.iflytop.gd.app.common.enums.CraftStates; import com.iflytop.gd.app.core.CraftsContext; import com.iflytop.gd.app.mapper.CraftsMapper; import com.iflytop.gd.app.model.entity.Crafts; +import com.iflytop.gd.app.model.vo.CraftStatusVO; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import org.springframework.statemachine.config.StateMachineFactory; @@ -27,7 +28,6 @@ public class CraftsService extends ServiceImpl { private final WebSocketService webSocketService; private ExecutorService executor; - private final ConcurrentHashMap contextMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap> futureMap = new ConcurrentHashMap<>(); @@ -40,7 +40,7 @@ public class CraftsService extends ServiceImpl { * 开始执行工艺 */ public synchronized boolean startCrafts(Long craftId, String heatId) { - if (futureMap.containsKey(heatId)) { // 已有任务在执行,不重复启动 + if (futureMap.containsKey(heatId)) { return false; } Crafts craft = this.getById(craftId); @@ -97,7 +97,37 @@ public class CraftsService extends ServiceImpl { return false; } - // TODO: 如需提供查询当前执行状态,可添加 getStatus(heatId) 方法,返回 ctx.getCurrentIndex(), ctx.getSm().getState().getId(), ctx.getRemainingSteps() 等 + /** + * 查询指定 heatId 的执行状态 + */ + public synchronized CraftStatusVO getStatus(String heatId) { + CraftsContext ctx = contextMap.get(heatId); + if (ctx == null) { + return null; + } + CraftStatusVO vo = new CraftStatusVO(); + vo.setHeatId(heatId); + vo.setState(ctx.getSm().getState().getId()); + vo.setCurrentIndex(ctx.getCurrentIndex()); + vo.setSteps(ctx.getCraftsStepList()); + return vo; + } + + /** + * 查询所有正在执行的工艺状态 + */ + public synchronized List getAllStatuses() { + return contextMap.entrySet().stream().map(entry -> { + String heatId = entry.getKey(); + CraftsContext ctx = entry.getValue(); + CraftStatusVO vo = new CraftStatusVO(); + vo.setHeatId(heatId); + vo.setState(ctx.getSm().getState().getId()); + vo.setCurrentIndex(ctx.getCurrentIndex()); + vo.setSteps(ctx.getCraftsStepList()); + return vo; + }).collect(Collectors.toList()); + } public List selectAllByOresId(Long oresId) { return this.baseMapper.selectAllByOresId(oresId); @@ -121,4 +151,4 @@ public class CraftsService extends ServiceImpl { .collect(Collectors.toList()); return this.removeByIds(ids); } -} +} \ No newline at end of file