You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
3.4 KiB

  1. package com.qyft.ms.system.controller;
  2. import cn.hutool.json.JSONUtil;
  3. import com.qyft.ms.system.common.constant.CommandStatus;
  4. import com.qyft.ms.system.common.device.command.FrontCommand;
  5. import com.qyft.ms.system.functions.CommandHandler;
  6. import com.qyft.ms.system.core.registry.CommandHandlerRegistry;
  7. import com.qyft.ms.system.model.form.FrontCmdControlForm;
  8. import io.swagger.v3.oas.annotations.Operation;
  9. import io.swagger.v3.oas.annotations.tags.Tag;
  10. import lombok.RequiredArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.http.MediaType;
  13. import org.springframework.web.bind.annotation.PostMapping;
  14. import org.springframework.web.bind.annotation.RequestBody;
  15. import org.springframework.web.bind.annotation.RequestMapping;
  16. import org.springframework.web.bind.annotation.RestController;
  17. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
  18. import java.util.concurrent.CompletableFuture;
  19. @Tag(name = "前端调用指令")
  20. @RestController
  21. @RequestMapping("/api/function")
  22. @RequiredArgsConstructor
  23. @Slf4j
  24. public class FrontCmdController {
  25. private final CommandHandlerRegistry registry;
  26. @Operation(summary = "前端统一调用一个接口")
  27. @PostMapping
  28. public ResponseBodyEmitter controlMethod(@RequestBody FrontCmdControlForm form) {
  29. ResponseBodyEmitter emitter = new ResponseBodyEmitter(3600000L);
  30. String id = form.getCmdId();
  31. String code = form.getCmdCode();
  32. try {
  33. emitter.send(FrontCommand.backstage(id, code, CommandStatus.RECEIVE, "已收到业务指令请求,开始处理"), MediaType.APPLICATION_JSON);
  34. CommandHandler commandHandler = registry.getHandler(code);
  35. if (commandHandler == null) {
  36. emitter.send(FrontCommand.backstage(id, code, CommandStatus.ERROR, "未找到对应的业务指令"), MediaType.APPLICATION_JSON);
  37. log.error("未找到对应的业务指令");
  38. emitter.complete();
  39. return emitter;
  40. }
  41. emitter.send(FrontCommand.backstage(id, code, CommandStatus.START, "业务指令开始执行"), MediaType.APPLICATION_JSON);
  42. log.info("业务指令开始执行");
  43. CompletableFuture<Void> future = commandHandler.handle(form, emitter);
  44. future.whenComplete((v, ex) -> {
  45. try {
  46. if (ex != null) {
  47. emitter.send(FrontCommand.backstage(id, code, CommandStatus.ERROR, "业务指令执行异常", ex.getMessage()), MediaType.APPLICATION_JSON);
  48. log.error("执行业务指令发生异常: {}", JSONUtil.toJsonStr(form), ex);
  49. }
  50. Thread.sleep(50);
  51. emitter.send(FrontCommand.backstage(id, code, CommandStatus.FINISH, "业务指令执行结束"), MediaType.APPLICATION_JSON);
  52. log.info("业务指令执行结束");
  53. } catch (Exception e) {
  54. log.error("执行业务指令发生异常: {}", JSONUtil.toJsonStr(form), e);
  55. } finally {
  56. log.info("业务指令 emitter complete");
  57. emitter.complete();
  58. }
  59. });
  60. } catch (Exception e) {
  61. log.error("执行业务指令发生异常: {}", JSONUtil.toJsonStr(form), e);
  62. emitter.complete();
  63. }
  64. return emitter;
  65. }
  66. }