From 71d4ae131d8e581eec167aa7f0c82ea5d33502f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 27 Apr 2025 10:46:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E7=9F=BF=E7=9F=B3?= =?UTF-8?q?=E3=80=81=E5=B7=A5=E8=89=BA=E8=A1=A8=E4=B8=8E=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=AE=9E=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/app/controller/CraftsController.java | 106 +++++++++++++++ .../iflytop/gd/app/controller/OresController.java | 74 +++++++++++ .../com/iflytop/gd/app/core/CraftsContext.java | 2 +- .../com/iflytop/gd/app/mapper/CraftsMapper.java | 19 +++ .../java/com/iflytop/gd/app/mapper/OresMapper.java | 15 +++ .../iflytop/gd/app/model/dto/PauseCraftsDto.java | 11 ++ .../iflytop/gd/app/model/dto/ResumeCraftsDto.java | 11 ++ .../iflytop/gd/app/model/dto/StartCraftsDTO.java | 13 ++ .../iflytop/gd/app/model/dto/StopCraftsDto.java | 11 ++ .../com/iflytop/gd/app/model/entity/Crafts.java | 25 ++++ .../java/com/iflytop/gd/app/model/entity/Ores.java | 20 +++ .../iflytop/gd/app/model/vo/OresCraftsListVO.java | 30 +++++ .../com/iflytop/gd/app/service/CraftsService.java | 44 +++++++ .../iflytop/gd/app/service/CraftsStepService.java | 145 +++++++++------------ .../com/iflytop/gd/app/service/OresService.java | 100 ++++++++++++++ .../gd/system/common/result/ResultCode.java | 2 +- .../com/iflytop/gd/system/mapper/CraftsMapper.java | 19 --- .../com/iflytop/gd/system/mapper/OresMapper.java | 15 --- .../com/iflytop/gd/system/model/entity/Crafts.java | 25 ---- .../com/iflytop/gd/system/model/entity/Ores.java | 20 --- .../gd/system/model/vo/OresCraftsListVO.java | 30 ----- .../iflytop/gd/system/service/CraftsService.java | 47 ------- .../com/iflytop/gd/system/service/OresService.java | 98 -------------- src/main/resources/sql/init.sql | 23 +++- 24 files changed, 564 insertions(+), 341 deletions(-) create mode 100644 src/main/java/com/iflytop/gd/app/controller/CraftsController.java create mode 100644 src/main/java/com/iflytop/gd/app/controller/OresController.java create mode 100644 src/main/java/com/iflytop/gd/app/mapper/CraftsMapper.java create mode 100644 src/main/java/com/iflytop/gd/app/mapper/OresMapper.java create mode 100644 src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java create mode 100644 src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java create mode 100644 src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java create mode 100644 src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java create mode 100644 src/main/java/com/iflytop/gd/app/model/entity/Crafts.java create mode 100644 src/main/java/com/iflytop/gd/app/model/entity/Ores.java create mode 100644 src/main/java/com/iflytop/gd/app/model/vo/OresCraftsListVO.java create mode 100644 src/main/java/com/iflytop/gd/app/service/CraftsService.java create mode 100644 src/main/java/com/iflytop/gd/app/service/OresService.java delete mode 100644 src/main/java/com/iflytop/gd/system/mapper/CraftsMapper.java delete mode 100644 src/main/java/com/iflytop/gd/system/mapper/OresMapper.java delete mode 100644 src/main/java/com/iflytop/gd/system/model/entity/Crafts.java delete mode 100644 src/main/java/com/iflytop/gd/system/model/entity/Ores.java delete mode 100644 src/main/java/com/iflytop/gd/system/model/vo/OresCraftsListVO.java delete mode 100644 src/main/java/com/iflytop/gd/system/service/CraftsService.java delete mode 100644 src/main/java/com/iflytop/gd/system/service/OresService.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 new file mode 100644 index 0000000..fde8823 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/controller/CraftsController.java @@ -0,0 +1,106 @@ +package com.iflytop.gd.app.controller; + +import com.iflytop.gd.app.model.dto.PauseCraftsDto; +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.service.CraftsStepService; +import com.iflytop.gd.system.common.result.Result; +import com.iflytop.gd.system.common.result.ResultCode; +import com.iflytop.gd.app.model.entity.Crafts; +import com.iflytop.gd.app.service.CraftsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Tag(name = "工艺管理") +@RestController +@RequestMapping("/api/crafts") +@RequiredArgsConstructor +@Slf4j +public class CraftsController { + private final CraftsService craftsService; + private final CraftsStepService craftsStepService; + + @Operation(summary = "根据矿石id获取工艺列表") + @GetMapping("/list/{oresId}") + public Result> getAllCrafts(@Parameter(description = "矿石ID") @PathVariable Long oresId) { + List craftList = craftsService.selectAllByOresId(oresId); + return Result.success(craftList); + } + + @Operation(summary = "添加新工艺") + @PostMapping("/") + public Result addCrafts(@RequestBody Crafts crafts) { + Crafts existingCrafts = craftsService.findByName(crafts.getName()); + if (existingCrafts == null) { + boolean isSuccess = craftsService.addCrafts(crafts); + if (isSuccess) { + return Result.success(); + } + } else { + return Result.failed(ResultCode.DATA_ALREADY_EXISTS); + } + return Result.failed(); + } + + @Operation(summary = "更新工艺") + @PutMapping("/{id}") + public Result updateCrafts(@PathVariable Long id, @RequestBody Crafts crafts) { + crafts.setId(id); + boolean isSuccess = craftsService.updateCrafts(crafts); + if (isSuccess) { + return Result.success(); + } + return Result.failed(); + } + + @Operation(summary = "删除工艺") + @DeleteMapping("/{ids}") + public Result deleteCrafts(@Parameter(description = "工艺ID,多个以英文逗号(,)分割") @PathVariable String ids) { + boolean isSuccess = craftsService.deleteCrafts(ids); + if (isSuccess) { + return Result.success(); + } + return Result.failed(); + } + + @Operation(summary = "开始执行工艺") + @PostMapping("/start") + public Result startCrafts(@RequestBody StartCraftsDTO startCraftsDTO) { + boolean isSuccess = craftsStepService.startCrafts(startCraftsDTO.getCraftId(), startCraftsDTO.getHeatId()); + if (isSuccess) { + return Result.success(); + } + return Result.failed(); + } + + @Operation(summary = "暂停执行工艺") + @PostMapping("/pause") + public Result pauseCrafts(@RequestBody PauseCraftsDto pauseCraftsDto) { + craftsStepService.pauseCrafts(pauseCraftsDto.getHeatId()); + return Result.success(); + } + + @Operation(summary = "恢复执行工艺") + @PostMapping("/resume") + public Result resumeCrafts(@RequestBody ResumeCraftsDto resumeCraftsDto) { + craftsStepService.resumeCrafts(resumeCraftsDto.getHeatId()); + return Result.success(); + } + + @Operation(summary = "停止执行工艺") + @PostMapping("/stop") + public Result stopCrafts(@RequestBody StopCraftsDto stopCraftsDto) { + boolean isSuccess = craftsStepService.stopCrafts(stopCraftsDto.getHeatId()); + if (isSuccess) { + return Result.success(); + } + return Result.failed(); + } +} diff --git a/src/main/java/com/iflytop/gd/app/controller/OresController.java b/src/main/java/com/iflytop/gd/app/controller/OresController.java new file mode 100644 index 0000000..db92a7e --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/controller/OresController.java @@ -0,0 +1,74 @@ +package com.iflytop.gd.app.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.iflytop.gd.app.model.entity.Ores; +import com.iflytop.gd.app.model.vo.OresCraftsListVO; +import com.iflytop.gd.system.common.base.BasePageQuery; +import com.iflytop.gd.system.common.result.PageResult; +import com.iflytop.gd.app.service.OresService; +import com.iflytop.gd.system.common.result.Result; +import com.iflytop.gd.system.common.result.ResultCode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "矿石管理") +@RestController +@RequestMapping("/api/ores") +@RequiredArgsConstructor +@Slf4j +public class OresController { + private final OresService oresService; + + @Operation(summary = "矿石工艺列表") + @GetMapping("/list") + public PageResult getAllOres(BasePageQuery pageQuery) { + IPage result = oresService.getPage(pageQuery); + return PageResult.success(result); + } + + @Operation(summary = "添加新矿石") + @PostMapping("/") + public Result addOres(@RequestBody Ores ores) { + Ores existingOres = oresService.findByName(ores.getName()); + if (existingOres == null) { + boolean isSuccess = oresService.addOres(ores); + if (isSuccess) { + return Result.success(); + } + } else { + return Result.failed(ResultCode.DATA_ALREADY_EXISTS); + } + return Result.failed(); + } + + @Operation(summary = "更新矿石") + @PutMapping("/{id}") + public Result updateOres(@PathVariable Long id, @RequestBody Ores ores) { + Ores existingOres = oresService.findByName(ores.getName()); + if (existingOres == null) { + ores.setId(id); + boolean isSuccess = oresService.updateOres(ores); + if (isSuccess) { + return Result.success(); + } + } else { + return Result.failed(ResultCode.DATA_ALREADY_EXISTS); + } + return Result.failed(); + } + + @Operation(summary = "删除矿石") + @DeleteMapping("/{ids}") + public Result deleteOres(@Parameter(description = "矿石ID,多个以英文逗号(,)分割") @PathVariable String ids) { + boolean isSuccess = oresService.deleteOres(ids); + if (isSuccess) { + return Result.success(); + } + return Result.failed(); + } + +} diff --git a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java index 57a5a1e..36ab562 100644 --- a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java +++ b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java @@ -6,7 +6,7 @@ import com.iflytop.gd.app.common.enums.CraftEvents; import com.iflytop.gd.app.common.enums.CraftStates; import com.iflytop.gd.app.model.bo.CraftsStep; import com.iflytop.gd.app.service.CraftsStepService; -import com.iflytop.gd.system.model.entity.Crafts; +import com.iflytop.gd.app.model.entity.Crafts; import com.iflytop.gd.system.service.WebSocketService; import lombok.Getter; import org.springframework.messaging.Message; diff --git a/src/main/java/com/iflytop/gd/app/mapper/CraftsMapper.java b/src/main/java/com/iflytop/gd/app/mapper/CraftsMapper.java new file mode 100644 index 0000000..e6f0b06 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/mapper/CraftsMapper.java @@ -0,0 +1,19 @@ +package com.iflytop.gd.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.iflytop.gd.app.model.entity.Crafts; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 工艺持久层接口 + */ +@Mapper +public interface CraftsMapper extends BaseMapper { + + @Select("SELECT * FROM crafts WHERE ores_id = #{oresId}") + List selectAllByOresId(Long oresId); + +} diff --git a/src/main/java/com/iflytop/gd/app/mapper/OresMapper.java b/src/main/java/com/iflytop/gd/app/mapper/OresMapper.java new file mode 100644 index 0000000..ac78af3 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/mapper/OresMapper.java @@ -0,0 +1,15 @@ +package com.iflytop.gd.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.iflytop.gd.app.model.entity.Ores; +import org.apache.ibatis.annotations.Mapper; + +/** + * 矿石持久层接口 + */ +@Mapper +public interface OresMapper extends BaseMapper { + + Ores findByName(String name); + +} diff --git a/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java new file mode 100644 index 0000000..a15faf0 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java @@ -0,0 +1,11 @@ +package com.iflytop.gd.app.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "暂停执行工艺") +@Data +public class PauseCraftsDto { + @Schema(description = "加热区id") + private String heatId; +} diff --git a/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java new file mode 100644 index 0000000..7857276 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java @@ -0,0 +1,11 @@ +package com.iflytop.gd.app.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "恢复执行工艺") +@Data +public class ResumeCraftsDto { + @Schema(description = "加热区id") + private String heatId; +} 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 new file mode 100644 index 0000000..b5c2f92 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java @@ -0,0 +1,13 @@ +package com.iflytop.gd.app.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "开始工艺") +@Data +public class StartCraftsDTO { + @Schema(description = "工艺id") + private Long craftId; + @Schema(description = "加热区id") + private String heatId; +} diff --git a/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java new file mode 100644 index 0000000..8f5ab6e --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java @@ -0,0 +1,11 @@ +package com.iflytop.gd.app.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "恢复执行工艺") +@Data +public class StopCraftsDto { + @Schema(description = "加热区id") + private String heatId; +} diff --git a/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java b/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java new file mode 100644 index 0000000..a954a64 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java @@ -0,0 +1,25 @@ +package com.iflytop.gd.app.model.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.iflytop.gd.system.common.base.BaseEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Schema(description = "工艺") +@TableName("crafts") +@Data +public class Crafts extends BaseEntity { + + @NotBlank + @Schema(description = "工艺名称") + private String name; + + @Schema(description = "工艺步骤") + private String steps; + + @Schema(description = "矿石ID") + private Long oresId; +} diff --git a/src/main/java/com/iflytop/gd/app/model/entity/Ores.java b/src/main/java/com/iflytop/gd/app/model/entity/Ores.java new file mode 100644 index 0000000..dec3b30 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/entity/Ores.java @@ -0,0 +1,20 @@ +package com.iflytop.gd.app.model.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.iflytop.gd.system.common.base.BaseEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Schema(description = "矿石") +@TableName("ores") +@Data +public class Ores extends BaseEntity { + + @NotBlank() + @Schema(description = "矿石名称") + private String name; + +} diff --git a/src/main/java/com/iflytop/gd/app/model/vo/OresCraftsListVO.java b/src/main/java/com/iflytop/gd/app/model/vo/OresCraftsListVO.java new file mode 100644 index 0000000..fa438d5 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/vo/OresCraftsListVO.java @@ -0,0 +1,30 @@ +package com.iflytop.gd.app.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.iflytop.gd.app.model.entity.Crafts; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "矿石工艺视图") +@Data +public class OresCraftsListVO { + + @Schema(description = "矿石id") + private Long id; + + @Schema(description = "矿石名称") + private String oresName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + @Schema(description = "该矿石下工艺列表") + private List craftsList; + +} diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsService.java b/src/main/java/com/iflytop/gd/app/service/CraftsService.java new file mode 100644 index 0000000..90cbe1e --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/service/CraftsService.java @@ -0,0 +1,44 @@ +package com.iflytop.gd.app.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.iflytop.gd.app.mapper.CraftsMapper; +import com.iflytop.gd.app.model.entity.Crafts; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 工艺 + */ +@Service +@RequiredArgsConstructor +public class CraftsService extends ServiceImpl{ + + public List selectAllByOresId(Long oresId) { + return this.baseMapper.selectAllByOresId(oresId); + } + + public Crafts findByName(String name) { + return this.getOne(new LambdaQueryWrapper<>(new Crafts()).eq(Crafts::getName, name)); + } + + public boolean addCrafts(Crafts crafts) { + return this.save(crafts); + } + + public boolean updateCrafts(Crafts crafts) { + return this.updateById(crafts); + } + + public boolean deleteCrafts(String idsStr) { + List ids = Arrays.stream(idsStr.split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + return this.removeByIds(ids); + } + +} diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java index 5f3db05..78cbc71 100644 --- a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java +++ b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java @@ -1,11 +1,20 @@ package com.iflytop.gd.app.service; -import com.iflytop.gd.app.model.bo.TubeSol; +import com.iflytop.gd.app.common.enums.CraftEvents; +import com.iflytop.gd.app.common.enums.CraftStates; +import com.iflytop.gd.app.core.CraftsContext; +import com.iflytop.gd.app.model.entity.Crafts; +import com.iflytop.gd.system.service.WebSocketService; +import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Service; -import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * 设备步骤操作 @@ -14,111 +23,79 @@ import java.util.List; @Service @RequiredArgsConstructor public class CraftsStepService { + private final CraftsService craftsService; + private final StateMachineFactory stateMachineFactory; + private final WebSocketService webSocketService; - /** - * 抬起托盘 - * - * @param heatId 加热区id - */ - public boolean upTray(String heatId) { - return true; - } - - /** - * 降下托盘 - * - * @param heatId 加热区id - */ - public boolean downTray(String heatId) { - return true; - } + private ExecutorService executor; - /** - * 添加溶液 - * - * @param tubeSolList 需要添加溶液的试管与溶液 - */ - public boolean addLiquid(List tubeSolList) { - return true; - } + private final ConcurrentHashMap contextMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> futureMap = new ConcurrentHashMap<>(); - /** - * 将指定加热区的托盘移至加液区 - * - * @param heatId 加热区id - */ - public boolean moveToSol(String heatId) { - return true; + @PostConstruct + public void init() { + this.executor = Executors.newCachedThreadPool(); } /** - * 移至加热 - * - * @param heatId 加热区id + * 开始执行工艺 */ - public boolean moveToHeat(String heatId) { - return true; - } - - /** - * 摇匀 - * - * @param second 摇匀时间 - */ - public boolean shaking(int second) { - return true; - } - - /** - * 开始加热 - * - * @param heatId 加热区id - * @param temperature 目标温度 - */ - public boolean startHeating(String heatId, double temperature) { + public synchronized boolean startCrafts(Long craftId, String heatId) { + if (futureMap.containsKey(heatId)) {// 已有任务在执行,不重复启动 + return false; + } + Crafts craft = craftsService.getById(craftId); + if (craft == null) { + return false; + } + CraftsContext ctx = new CraftsContext( + heatId, + craft, + stateMachineFactory, + this, + webSocketService + ); + Future future = executor.submit(ctx); + contextMap.put(heatId, ctx); + futureMap.put(heatId, future); return true; } /** - * 停止加热 - * - * @param heatId 加热区id + * 暂停执行工艺 */ - public boolean stopHeating(String heatId) { - return true; + public synchronized void pauseCrafts(String heatId) { + CraftsContext ctx = contextMap.get(heatId); + if (ctx != null) { + ctx.pause(); + } } /** - * 停止加热 + * 恢复执行工艺 */ - public boolean takePhoto() { - return true; - } - - //移至异常 - public boolean moveToExc() { - return true; - } - - //移除异常 - public boolean moveOutToExc() { - return true; + public synchronized void resumeCrafts(String heatId) { + CraftsContext ctx = contextMap.get(heatId); + if (ctx != null) { + ctx.resume(); + } } /** - * 等待 - * - * @param second 秒 + * 停止执行工艺 */ - public boolean delay(int second) { - try { - Thread.sleep(second * 1000L); + public synchronized boolean stopCrafts(String heatId) { + CraftsContext ctx = contextMap.get(heatId); + Future future = futureMap.get(heatId); + if (ctx != null && future != null) { + ctx.stop(); + future.cancel(true); + contextMap.remove(heatId); + futureMap.remove(heatId); return true; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); } return false; } - + // TODO: 如需提供查询当前执行状态,可在此类添加 getStatus(heatId) 方法,返回 ctx.getCurrentIndex(), ctx.getSm().getState().getId(), ctx.getRemainingSteps() 等 } diff --git a/src/main/java/com/iflytop/gd/app/service/OresService.java b/src/main/java/com/iflytop/gd/app/service/OresService.java new file mode 100644 index 0000000..f8952ec --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/service/OresService.java @@ -0,0 +1,100 @@ +package com.iflytop.gd.app.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.iflytop.gd.app.model.vo.OresCraftsListVO; +import com.iflytop.gd.system.common.base.BasePageQuery; +import com.iflytop.gd.app.mapper.CraftsMapper; +import com.iflytop.gd.app.mapper.OresMapper; +import com.iflytop.gd.app.model.entity.Crafts; +import com.iflytop.gd.app.model.entity.Ores; +import com.iflytop.gd.system.model.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 矿石业务实现类 + */ +@Service +@RequiredArgsConstructor +public class OresService extends ServiceImpl { + + private final CraftsMapper craftsMapper; + + + public IPage getPage(BasePageQuery pageQuery) { + // 构建分页对象 + Page oresPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + + // 分页查询矿石数据 + IPage oresIPage = this.baseMapper.selectPage(oresPage, new QueryWrapper()); + + // 获取矿石ID列表 + List oresIds = oresIPage.getRecords().stream() + .map(Ores::getId) + .collect(Collectors.toList()); + + // 查询对应的工艺数据 + QueryWrapper craftsQueryWrapper = new QueryWrapper<>(); + craftsQueryWrapper.in("ores_id", oresIds); + List craftsList = craftsMapper.selectList(craftsQueryWrapper); + + // 将工艺数据按矿石ID分组 + Map> craftsMap = craftsList.stream() + .collect(Collectors.groupingBy(Crafts::getOresId)); + + // 转换成 OresCraftsListVO + List oresCraftsList = oresIPage.getRecords().stream().map(ores -> { + OresCraftsListVO oresCraftsListVO = new OresCraftsListVO(); + oresCraftsListVO.setId(ores.getId()); + oresCraftsListVO.setOresName(ores.getName()); + oresCraftsListVO.setCreateTime(ores.getCreateTime()); + oresCraftsListVO.setUpdateTime(ores.getUpdateTime()); + + // 设置该矿石的工艺列表 + List crafts = craftsMap.get(ores.getId()); + oresCraftsListVO.setCraftsList(crafts); + + return oresCraftsListVO; + }).collect(Collectors.toList()); + + // 将转换后的分页数据放入新的分页对象 + Page resultPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); + resultPage.setTotal(oresIPage.getTotal()); + resultPage.setRecords(oresCraftsList); + + return resultPage; + + } + + + public Ores findByName(String name) { + return this.getOne(new LambdaQueryWrapper().eq(Ores::getName, name)); + } + + + public boolean addOres(Ores ores) { + return this.save(ores); + } + + + public boolean updateOres(Ores ores) { + return this.updateById(ores); + } + + + public boolean deleteOres(String idsStr) { + List ids = Arrays.stream(idsStr.split(",")) + .map(Long::parseLong) + .collect(Collectors.toList()); + return this.removeByIds(ids); + } +} diff --git a/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java b/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java index 4c74855..5def4f8 100644 --- a/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java +++ b/src/main/java/com/iflytop/gd/system/common/result/ResultCode.java @@ -35,7 +35,7 @@ public enum ResultCode implements IResultCode, Serializable { USER_ALREADY_EXISTS("4001", "用户已存在"), INVALID_CREDENTIALS("4002", "用户名或密码错误"), OPERATION_NOT_ALLOWED("4003", "业务操作不允许"), - + DATA_ALREADY_EXISTS("4004", "数据已存在"), //============================ 5xxx:系统 & 第三方 ============================ SYSTEM_ERROR("5000", "系统内部错误"), SERVICE_UNAVAILABLE("5001", "服务暂不可用"), diff --git a/src/main/java/com/iflytop/gd/system/mapper/CraftsMapper.java b/src/main/java/com/iflytop/gd/system/mapper/CraftsMapper.java deleted file mode 100644 index b707aeb..0000000 --- a/src/main/java/com/iflytop/gd/system/mapper/CraftsMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iflytop.gd.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.iflytop.gd.system.model.entity.Crafts; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * 工艺持久层接口 - */ -@Mapper -public interface CraftsMapper extends BaseMapper { - - List selectAllByOresId(Long oresId); - - Crafts findByName(String name); - -} diff --git a/src/main/java/com/iflytop/gd/system/mapper/OresMapper.java b/src/main/java/com/iflytop/gd/system/mapper/OresMapper.java deleted file mode 100644 index a08fb2f..0000000 --- a/src/main/java/com/iflytop/gd/system/mapper/OresMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.iflytop.gd.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.iflytop.gd.system.model.entity.Ores; -import org.apache.ibatis.annotations.Mapper; - -/** - * 矿石持久层接口 - */ -@Mapper -public interface OresMapper extends BaseMapper { - - Ores findByName(String name); - -} diff --git a/src/main/java/com/iflytop/gd/system/model/entity/Crafts.java b/src/main/java/com/iflytop/gd/system/model/entity/Crafts.java deleted file mode 100644 index 645740b..0000000 --- a/src/main/java/com/iflytop/gd/system/model/entity/Crafts.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iflytop.gd.system.model.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.iflytop.gd.system.common.base.BaseEntity; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Schema(description = "工艺") -@TableName("crafts") -@Data -public class Crafts extends BaseEntity { - - @NotBlank - @Schema(description = "工艺名称") - private String name; - - @Schema(description = "工艺步骤") - private String steps; - - @Schema(description = "矿石ID") - private Long oresId; -} diff --git a/src/main/java/com/iflytop/gd/system/model/entity/Ores.java b/src/main/java/com/iflytop/gd/system/model/entity/Ores.java deleted file mode 100644 index 6fe0c3a..0000000 --- a/src/main/java/com/iflytop/gd/system/model/entity/Ores.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.iflytop.gd.system.model.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.iflytop.gd.system.common.base.BaseEntity; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Schema(description = "矿石") -@TableName("ores") -@Data -public class Ores extends BaseEntity { - - @NotBlank() - @Schema(description = "矿石名称") - private String name; - -} diff --git a/src/main/java/com/iflytop/gd/system/model/vo/OresCraftsListVO.java b/src/main/java/com/iflytop/gd/system/model/vo/OresCraftsListVO.java deleted file mode 100644 index 24b8bb2..0000000 --- a/src/main/java/com/iflytop/gd/system/model/vo/OresCraftsListVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iflytop.gd.system.model.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.iflytop.gd.system.model.entity.Crafts; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Schema(description = "矿石工艺视图") -@Data -public class OresCraftsListVO { - - @Schema(description = "矿石id") - private Long id; - - @Schema(description = "矿石名称") - private String oresName; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - - @Schema(description = "该矿石下工艺列表") - private List craftsList; - -} diff --git a/src/main/java/com/iflytop/gd/system/service/CraftsService.java b/src/main/java/com/iflytop/gd/system/service/CraftsService.java deleted file mode 100644 index 37164bf..0000000 --- a/src/main/java/com/iflytop/gd/system/service/CraftsService.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.iflytop.gd.system.service; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.iflytop.gd.system.mapper.CraftsMapper; -import com.iflytop.gd.system.model.entity.Crafts; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 工艺 - */ -@Service -@RequiredArgsConstructor -public class CraftsService extends ServiceImpl{ - - public List selectAllByOresId(Long oresId) { - return this.baseMapper.selectAllByOresId(oresId); - } - - public Crafts findByName(String name) { - return this.baseMapper.findByName(name); - } - - public boolean addCrafts(Crafts crafts) { - return this.baseMapper.insert(crafts) > 0; - } - - public boolean updateCrafts(Crafts crafts) { - return this.baseMapper.updateById(crafts) > 0; - } - - public boolean deleteCrafts(String idsStr) { - List ids = Arrays.stream(idsStr.split(",")) - .map(Long::parseLong) - .collect(Collectors.toList()); - return this.removeByIds(ids); - } - - public Crafts findCraftsById(Long id) { - return this.baseMapper.selectById(id); - } - -} diff --git a/src/main/java/com/iflytop/gd/system/service/OresService.java b/src/main/java/com/iflytop/gd/system/service/OresService.java deleted file mode 100644 index cfdba6f..0000000 --- a/src/main/java/com/iflytop/gd/system/service/OresService.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.iflytop.gd.system.service; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.iflytop.gd.system.common.base.BasePageQuery; -import com.iflytop.gd.system.mapper.CraftsMapper; -import com.iflytop.gd.system.mapper.OresMapper; -import com.iflytop.gd.system.model.entity.Crafts; -import com.iflytop.gd.system.model.entity.Ores; -import com.iflytop.gd.system.model.vo.OresCraftsListVO; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 矿石业务实现类 - */ -@Service -@RequiredArgsConstructor -public class OresService extends ServiceImpl { - - private final CraftsMapper craftsMapper; - - - public IPage getPage(BasePageQuery pageQuery) { - // 构建分页对象 - Page oresPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); - - // 分页查询矿石数据 - IPage oresIPage = this.baseMapper.selectPage(oresPage, new QueryWrapper()); - - // 获取矿石ID列表 - List oresIds = oresIPage.getRecords().stream() - .map(Ores::getId) - .collect(Collectors.toList()); - - // 查询对应的工艺数据 - QueryWrapper craftsQueryWrapper = new QueryWrapper<>(); - craftsQueryWrapper.in("ores_id", oresIds); - List craftsList = craftsMapper.selectList(craftsQueryWrapper); - - // 将工艺数据按矿石ID分组 - Map> craftsMap = craftsList.stream() - .collect(Collectors.groupingBy(Crafts::getOresId)); - - // 转换成 OresCraftsListVO - List oresCraftsList = oresIPage.getRecords().stream().map(ores -> { - OresCraftsListVO oresCraftsListVO = new OresCraftsListVO(); - oresCraftsListVO.setId(ores.getId()); - oresCraftsListVO.setOresName(ores.getName()); - oresCraftsListVO.setCreateTime(ores.getCreateTime()); - oresCraftsListVO.setUpdateTime(ores.getUpdateTime()); - - // 设置该矿石的工艺列表 - List crafts = craftsMap.get(ores.getId()); - oresCraftsListVO.setCraftsList(crafts); - - return oresCraftsListVO; - }).collect(Collectors.toList()); - - // 将转换后的分页数据放入新的分页对象 - Page resultPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); - resultPage.setTotal(oresIPage.getTotal()); - resultPage.setRecords(oresCraftsList); - - return resultPage; - - } - - - public Ores findByName(String name) { - return this.baseMapper.findByName(name); - } - - - public boolean addOres(Ores ores) { - return this.baseMapper.insert(ores) > 0; - } - - - public boolean updateOres(Ores ores) { - return this.baseMapper.updateById(ores) > 0; - } - - - public boolean deleteOres(String idsStr) { - List ids = Arrays.stream(idsStr.split(",")) - .map(Long::parseLong) - .collect(Collectors.toList()); - return this.removeByIds(ids); - } -} diff --git a/src/main/resources/sql/init.sql b/src/main/resources/sql/init.sql index 38a4f6a..adec2d4 100644 --- a/src/main/resources/sql/init.sql +++ b/src/main/resources/sql/init.sql @@ -13,4 +13,25 @@ CREATE TABLE IF NOT EXISTS user ( INSERT INTO user (username,nickname, password, role, fixed_user, deleted) SELECT 'admin','Admin', '123456', 'ADMIN', 'ENABLE','DISABLE' - WHERE NOT EXISTS (SELECT 1 FROM user WHERE username = 'admin'); \ No newline at end of file + WHERE NOT EXISTS (SELECT 1 FROM user WHERE username = 'admin'); + + +-- 创建 ores 矿石 表 +CREATE TABLE IF NOT EXISTS ores +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR NOT NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 创建 crafts 工艺 表 +CREATE TABLE IF NOT EXISTS crafts +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name VARCHAR NOT NULL, + steps TEXT, + ores_id INTEGER, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); \ No newline at end of file