diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java index 380f64147..85593bb82 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainClassroomInfoController.java @@ -1,34 +1,33 @@ package com.ruoyi.web.controller.train; import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.train.domain.TrainClassroomInfo; import com.ruoyi.train.service.ITrainClassroomInfoService; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; /** * 教室信息Controller - * + * * @author ruoyi * @date 2026-09-08 */ @RestController -@RequestMapping({"/train/classroominfo", "/train/classroom", "/train/info"}) +@RequestMapping("/train/classroom") public class TrainClassroomInfoController extends BaseController { @Autowired @@ -37,7 +36,7 @@ public class TrainClassroomInfoController extends BaseController /** * 查询教室信息列表 */ - @PreAuthorize("@ss.hasPermi('system:info:list')") + @PreAuthorize("@ss.hasPermi('train:classroom:list')") @GetMapping("/list") public TableDataInfo list(TrainClassroomInfo trainClassroomInfo) { @@ -47,58 +46,37 @@ public class TrainClassroomInfoController extends BaseController } /** - * 导出教室信息列表 + * 获取教室信息详细信息(回显详情) */ - @PreAuthorize("@ss.hasPermi('system:info:export')") - @Log(title = "教室信息", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, TrainClassroomInfo trainClassroomInfo) - { - List list = trainClassroomInfoService.selectTrainClassroomInfoList(trainClassroomInfo); - ExcelUtil util = new ExcelUtil(TrainClassroomInfo.class); - util.exportExcel(response, list, "教室信息数据"); - } - - /** - * 获取教室信息详细信息 - */ - @PreAuthorize("@ss.hasPermi('system:info:query')") + @PreAuthorize("@ss.hasPermi('train:classroom:list')") @GetMapping(value = "/{classRoomId}") public AjaxResult getInfo(@PathVariable("classRoomId") String classRoomId) { - return success(trainClassroomInfoService.selectTrainClassroomInfoByClassRoomId(classRoomId)); + return success(trainClassroomInfoService.selectClassroomDetailByClassRoomId(classRoomId)); } /** * 新增教室信息 */ - @PreAuthorize("@ss.hasPermi('system:info:add')") + @PreAuthorize("@ss.hasPermi('train:classroom:edit')") @Log(title = "教室信息", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody TrainClassroomInfo trainClassroomInfo) + public AjaxResult add(@Validated @RequestBody TrainClassroomInfo trainClassroomInfo) { + trainClassroomInfo.setCreateBy(SecurityUtils.getUsername()); return toAjax(trainClassroomInfoService.insertTrainClassroomInfo(trainClassroomInfo)); } /** - * 修改教室信息 + * 修改教室信息 (RESTful PUT /train/classroom/{classRoomId}) */ - @PreAuthorize("@ss.hasPermi('system:info:edit')") + @PreAuthorize("@ss.hasPermi('train:classroom:edit')") @Log(title = "教室信息", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainClassroomInfo trainClassroomInfo) + @PutMapping("/{classRoomId}") + public AjaxResult edit(@PathVariable("classRoomId") String classRoomId, @Validated @RequestBody TrainClassroomInfo trainClassroomInfo) { + trainClassroomInfo.setClassRoomId(classRoomId); + trainClassroomInfo.setUpdateBy(SecurityUtils.getUsername()); return toAjax(trainClassroomInfoService.updateTrainClassroomInfo(trainClassroomInfo)); } - - /** - * 删除教室信息 - */ - @PreAuthorize("@ss.hasPermi('system:info:remove')") - @Log(title = "教室信息", businessType = BusinessType.DELETE) - @DeleteMapping("/{classRoomIds}") - public AjaxResult remove(@PathVariable String[] classRoomIds) - { - return toAjax(trainClassroomInfoService.deleteTrainClassroomInfoByClassRoomIds(classRoomIds)); - } } diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainTrainingSiteController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainTrainingSiteController.java index cb6e81e50..a88fe16cd 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainTrainingSiteController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainTrainingSiteController.java @@ -1,34 +1,33 @@ package com.ruoyi.web.controller.train; import java.util.List; -import javax.servlet.http.HttpServletResponse; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.train.domain.TrainTrainingSite; import com.ruoyi.train.service.ITrainTrainingSiteService; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; /** * 实训场地Controller - * + * * @author ruoyi * @date 2026-09-08 */ @RestController -@RequestMapping("/train/site") +@RequestMapping("/train/training-site") public class TrainTrainingSiteController extends BaseController { @Autowired @@ -37,7 +36,7 @@ public class TrainTrainingSiteController extends BaseController /** * 查询实训场地列表 */ - @PreAuthorize("@ss.hasPermi('system:site:list')") + @PreAuthorize("@ss.hasPermi('train:site:list')") @GetMapping("/list") public TableDataInfo list(TrainTrainingSite trainTrainingSite) { @@ -46,23 +45,10 @@ public class TrainTrainingSiteController extends BaseController return getDataTable(list); } - /** - * 导出实训场地列表 - */ - @PreAuthorize("@ss.hasPermi('system:site:export')") - @Log(title = "实训场地", businessType = BusinessType.EXPORT) - @PostMapping("/export") - public void export(HttpServletResponse response, TrainTrainingSite trainTrainingSite) - { - List list = trainTrainingSiteService.selectTrainTrainingSiteList(trainTrainingSite); - ExcelUtil util = new ExcelUtil(TrainTrainingSite.class); - util.exportExcel(response, list, "实训场地数据"); - } - /** * 获取实训场地详细信息 */ - @PreAuthorize("@ss.hasPermi('system:site:query')") + @PreAuthorize("@ss.hasPermi('train:site:list')") @GetMapping(value = "/{siteId}") public AjaxResult getInfo(@PathVariable("siteId") String siteId) { @@ -72,33 +58,25 @@ public class TrainTrainingSiteController extends BaseController /** * 新增实训场地 */ - @PreAuthorize("@ss.hasPermi('system:site:add')") + @PreAuthorize("@ss.hasPermi('train:site:edit')") @Log(title = "实训场地", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody TrainTrainingSite trainTrainingSite) + public AjaxResult add(@Validated @RequestBody TrainTrainingSite trainTrainingSite) { + trainTrainingSite.setCreateBy(SecurityUtils.getUsername()); return toAjax(trainTrainingSiteService.insertTrainTrainingSite(trainTrainingSite)); } /** - * 修改实训场地 + * 修改实训场地 (RESTful PUT /train/training-site/{siteId}) */ - @PreAuthorize("@ss.hasPermi('system:site:edit')") + @PreAuthorize("@ss.hasPermi('train:site:edit')") @Log(title = "实训场地", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainTrainingSite trainTrainingSite) + @PutMapping("/{siteId}") + public AjaxResult edit(@PathVariable("siteId") String siteId, @Validated @RequestBody TrainTrainingSite trainTrainingSite) { + trainTrainingSite.setSiteId(siteId); + trainTrainingSite.setUpdateBy(SecurityUtils.getUsername()); return toAjax(trainTrainingSiteService.updateTrainTrainingSite(trainTrainingSite)); } - - /** - * 删除实训场地 - */ - @PreAuthorize("@ss.hasPermi('system:site:remove')") - @Log(title = "实训场地", businessType = BusinessType.DELETE) - @DeleteMapping("/{siteIds}") - public AjaxResult remove(@PathVariable String[] siteIds) - { - return toAjax(trainTrainingSiteService.deleteTrainTrainingSiteBySiteIds(siteIds)); - } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassroomInfo.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassroomInfo.java index 273905f48..1733539bc 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassroomInfo.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainClassroomInfo.java @@ -1,5 +1,9 @@ package com.ruoyi.train.domain; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -7,7 +11,7 @@ import com.ruoyi.common.core.domain.BaseEntity; /** * 教室信息对象 train_classroom_info - * + * * @author ruoyi * @date 2026-09-08 */ @@ -19,83 +23,87 @@ public class TrainClassroomInfo extends BaseEntity private String classRoomId; /** 教室名称 */ + @NotBlank(message = "教室名称不能为空") + @Size(max = 60, message = "教室名称长度不能超过60个字符") @Excel(name = "教室名称") private String roomName; /** 教室位置 */ + @Size(max = 100, message = "教室位置长度不能超过100个字符") @Excel(name = "教室位置") private String roomLocation; /** 容纳人数 */ + @NotNull(message = "容纳人数不能为空") + @Min(value = 1, message = "容纳人数必须大于0") @Excel(name = "容纳人数") private Long capacity; /** 0 正在使用 1 可用,空闲 2 其他 */ - @Excel(name = "0 正在使用 1 可用,空闲 2 其他") + @Excel(name = "教室状态", readConverterExp = "0=正在使用,1=可用空闲,2=其他") private Integer roomStatus; - /** 创建管理员账号 */ - @Excel(name = "创建管理员账号") - private String createUser; + /** 删除标志 (0代表存在 2代表删除) */ + private String delFlag; - public void setClassRoomId(String classRoomId) + public void setClassRoomId(String classRoomId) { this.classRoomId = classRoomId; } - public String getClassRoomId() + public String getClassRoomId() { return classRoomId; } - public void setRoomName(String roomName) + public void setRoomName(String roomName) { this.roomName = roomName; } - public String getRoomName() + public String getRoomName() { return roomName; } - public void setRoomLocation(String roomLocation) + public void setRoomLocation(String roomLocation) { this.roomLocation = roomLocation; } - public String getRoomLocation() + public String getRoomLocation() { return roomLocation; } - public void setCapacity(Long capacity) + public void setCapacity(Long capacity) { this.capacity = capacity; } - public Long getCapacity() + public Long getCapacity() { return capacity; } - public void setRoomStatus(Integer roomStatus) + public void setRoomStatus(Integer roomStatus) { this.roomStatus = roomStatus; } - public Integer getRoomStatus() + public Integer getRoomStatus() { return roomStatus; } - public void setCreateUser(String createUser) + public void setDelFlag(String delFlag) { - this.createUser = createUser; + this.delFlag = delFlag; } - public String getCreateUser() + public String getDelFlag() { - return createUser; + return delFlag; } @Override @@ -106,8 +114,10 @@ public class TrainClassroomInfo extends BaseEntity .append("roomLocation", getRoomLocation()) .append("capacity", getCapacity()) .append("roomStatus", getRoomStatus()) - .append("createUser", getCreateUser()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainTrainingSite.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainTrainingSite.java index 021c5ead9..fd705060f 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainTrainingSite.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainTrainingSite.java @@ -1,5 +1,9 @@ package com.ruoyi.train.domain; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; @@ -7,7 +11,7 @@ import com.ruoyi.common.core.domain.BaseEntity; /** * 实训场地对象 train_training_site - * + * * @author ruoyi * @date 2026-09-08 */ @@ -19,14 +23,19 @@ public class TrainTrainingSite extends BaseEntity private String siteId; /** 实训场地名称 */ + @NotBlank(message = "实训场地名称不能为空") + @Size(max = 80, message = "实训场地名称长度不能超过80个字符") @Excel(name = "实训场地名称") private String siteName; /** 场地位置 */ + @Size(max = 100, message = "场地位置长度不能超过100个字符") @Excel(name = "场地位置") private String siteLocation; /** 最大容纳人数 */ + @NotNull(message = "最大容纳人数不能为空") + @Min(value = 1, message = "最大容纳人数必须大于0") @Excel(name = "最大容纳人数") private Long capacity; @@ -35,81 +44,80 @@ public class TrainTrainingSite extends BaseEntity private String siteDevice; /** 0 停用 1 可用 */ - @Excel(name = "0 停用 1 可用") + @Excel(name = "场地状态", readConverterExp = "0=停用,1=可用") private Integer siteStatus; - /** 创建管理员账号 */ - @Excel(name = "创建管理员账号") - private String createUser; + /** 删除标志 (0代表存在 2代表删除) */ + private String delFlag; - public void setSiteId(String siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public String getSiteId() + public String getSiteId() { return siteId; } - public void setSiteName(String siteName) + public void setSiteName(String siteName) { this.siteName = siteName; } - public String getSiteName() + public String getSiteName() { return siteName; } - public void setSiteLocation(String siteLocation) + public void setSiteLocation(String siteLocation) { this.siteLocation = siteLocation; } - public String getSiteLocation() + public String getSiteLocation() { return siteLocation; } - public void setCapacity(Long capacity) + public void setCapacity(Long capacity) { this.capacity = capacity; } - public Long getCapacity() + public Long getCapacity() { return capacity; } - public void setSiteDevice(String siteDevice) + public void setSiteDevice(String siteDevice) { this.siteDevice = siteDevice; } - public String getSiteDevice() + public String getSiteDevice() { return siteDevice; } - public void setSiteStatus(Integer siteStatus) + public void setSiteStatus(Integer siteStatus) { this.siteStatus = siteStatus; } - public Integer getSiteStatus() + public Integer getSiteStatus() { return siteStatus; } - public void setCreateUser(String createUser) + public void setDelFlag(String delFlag) { - this.createUser = createUser; + this.delFlag = delFlag; } - public String getCreateUser() + public String getDelFlag() { - return createUser; + return delFlag; } @Override @@ -121,8 +129,10 @@ public class TrainTrainingSite extends BaseEntity .append("capacity", getCapacity()) .append("siteDevice", getSiteDevice()) .append("siteStatus", getSiteStatus()) - .append("createUser", getCreateUser()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/ClassroomCreateDTO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/ClassroomCreateDTO.java new file mode 100644 index 000000000..8e1758ed7 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/ClassroomCreateDTO.java @@ -0,0 +1,88 @@ +package com.ruoyi.train.domain.dto; + +import java.io.Serializable; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 教室创建 DTO (ISSUE-01-04 / API Contract V1.0.1) + * + * @author ruoyi + */ +public class ClassroomCreateDTO implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 教室名称 */ + @NotBlank(message = "教室名称不能为空") + @Size(max = 60, message = "教室名称长度不能超过60个字符") + private String roomName; + + /** 教室位置 */ + @Size(max = 100, message = "教室位置长度不能超过100个字符") + private String roomLocation; + + /** 核定容纳人数 */ + @NotNull(message = "容纳人数不能为空") + @Min(value = 1, message = "容纳人数必须大于0") + private Long capacity; + + /** 教室状态 (0: 正在使用, 1: 可用空闲, 2: 维护中) */ + private Integer roomStatus; + + /** 备注 */ + @Size(max = 500, message = "备注长度不能超过500个字符") + private String remark; + + public String getRoomName() + { + return roomName; + } + + public void setRoomName(String roomName) + { + this.roomName = roomName; + } + + public String getRoomLocation() + { + return roomLocation; + } + + public void setRoomLocation(String roomLocation) + { + this.roomLocation = roomLocation; + } + + public Long getCapacity() + { + return capacity; + } + + public void setCapacity(Long capacity) + { + this.capacity = capacity; + } + + public Integer getRoomStatus() + { + return roomStatus; + } + + public void setRoomStatus(Integer roomStatus) + { + this.roomStatus = roomStatus; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/SiteCreateDTO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/SiteCreateDTO.java new file mode 100644 index 000000000..6744760d5 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/SiteCreateDTO.java @@ -0,0 +1,101 @@ +package com.ruoyi.train.domain.dto; + +import java.io.Serializable; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 实训场地创建 DTO (ISSUE-01-04 / API Contract V1.0.1) + * + * @author ruoyi + */ +public class SiteCreateDTO implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 实训场地名称 */ + @NotBlank(message = "实训场地名称不能为空") + @Size(max = 80, message = "实训场地名称长度不能超过80个字符") + private String siteName; + + /** 场地位置 */ + @Size(max = 100, message = "场地位置长度不能超过100个字符") + private String siteLocation; + + /** 最大容纳人数 */ + @NotNull(message = "最大容纳人数不能为空") + @Min(value = 1, message = "最大容纳人数必须大于0") + private Long capacity; + + /** 场地配套设备:VR、3D拆解、3D巡检设备等 */ + private String siteDevice; + + /** 场地状态 (0: 停用, 1: 可用) */ + private Integer siteStatus; + + /** 备注 */ + @Size(max = 500, message = "备注长度不能超过500个字符") + private String remark; + + public String getSiteName() + { + return siteName; + } + + public void setSiteName(String siteName) + { + this.siteName = siteName; + } + + public String getSiteLocation() + { + return siteLocation; + } + + public void setSiteLocation(String siteLocation) + { + this.siteLocation = siteLocation; + } + + public Long getCapacity() + { + return capacity; + } + + public void setCapacity(Long capacity) + { + this.capacity = capacity; + } + + public String getSiteDevice() + { + return siteDevice; + } + + public void setSiteDevice(String siteDevice) + { + this.siteDevice = siteDevice; + } + + public Integer getSiteStatus() + { + return siteStatus; + } + + public void setSiteStatus(Integer siteStatus) + { + this.siteStatus = siteStatus; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomBoardSummaryVO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomBoardSummaryVO.java new file mode 100644 index 000000000..7a02b7b49 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomBoardSummaryVO.java @@ -0,0 +1,63 @@ +package com.ruoyi.train.domain.vo; + +import java.io.Serializable; + +/** + * 教室绑定的电子班牌轻量摘要视图 (API Contract V1.0.2 / CG-05 闭环) + * + * @author ruoyi + */ +public class ClassroomBoardSummaryVO implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 班牌设备唯一标识 */ + private String boardId; + + /** 设备硬件序列号 */ + private String boardSn; + + /** 班牌业务状态 (0: 离线, 1: 在线正常) */ + private Integer boardStatus; + + public ClassroomBoardSummaryVO() + { + } + + public ClassroomBoardSummaryVO(String boardId, String boardSn, Integer boardStatus) + { + this.boardId = boardId; + this.boardSn = boardSn; + this.boardStatus = boardStatus; + } + + public String getBoardId() + { + return boardId; + } + + public void setBoardId(String boardId) + { + this.boardId = boardId; + } + + public String getBoardSn() + { + return boardSn; + } + + public void setBoardSn(String boardSn) + { + this.boardSn = boardSn; + } + + public Integer getBoardStatus() + { + return boardStatus; + } + + public void setBoardStatus(Integer boardStatus) + { + this.boardStatus = boardStatus; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomDetailVO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomDetailVO.java new file mode 100644 index 000000000..32e35ce66 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/ClassroomDetailVO.java @@ -0,0 +1,122 @@ +package com.ruoyi.train.domain.vo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 教室详情 VO (API Contract V1.0.2 / CG-05 闭环) + * + * @author ruoyi + */ +public class ClassroomDetailVO implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 教室ID主键 */ + private String classRoomId; + + /** 教室名称 */ + private String roomName; + + /** 教室位置 */ + private String roomLocation; + + /** 核定容纳人数 */ + private Long capacity; + + /** 教室状态 (0: 正在使用, 1: 可用空闲, 2: 维护中) */ + private Integer roomStatus; + + /** 绑定的班牌摘要列表。无绑定班牌时返回 [],不得返回 null */ + private List boards = new ArrayList<>(); + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + public String getClassRoomId() + { + return classRoomId; + } + + public void setClassRoomId(String classRoomId) + { + this.classRoomId = classRoomId; + } + + public String getRoomName() + { + return roomName; + } + + public void setRoomName(String roomName) + { + this.roomName = roomName; + } + + public String getRoomLocation() + { + return roomLocation; + } + + public void setRoomLocation(String roomLocation) + { + this.roomLocation = roomLocation; + } + + public Long getCapacity() + { + return capacity; + } + + public void setCapacity(Long capacity) + { + this.capacity = capacity; + } + + public Integer getRoomStatus() + { + return roomStatus; + } + + public void setRoomStatus(Integer roomStatus) + { + this.roomStatus = roomStatus; + } + + public List getBoards() + { + return boards == null ? new ArrayList<>() : boards; + } + + public void setBoards(List boards) + { + this.boards = (boards == null) ? new ArrayList<>() : boards; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/SiteDetailVO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/SiteDetailVO.java new file mode 100644 index 000000000..082eb7b49 --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/vo/SiteDetailVO.java @@ -0,0 +1,120 @@ +package com.ruoyi.train.domain.vo; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 实训场地详情 VO (ISSUE-01-04 / API Contract V1.0.1) + * + * @author ruoyi + */ +public class SiteDetailVO implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 实训场地ID主键 */ + private String siteId; + + /** 实训场地名称 */ + private String siteName; + + /** 场地位置 */ + private String siteLocation; + + /** 最大容纳人数 */ + private Long capacity; + + /** 场地配套设备:VR、3D拆解、3D巡检设备等 */ + private String siteDevice; + + /** 场地状态 (0: 停用, 1: 可用) */ + private Integer siteStatus; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + public String getSiteId() + { + return siteId; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteName() + { + return siteName; + } + + public void setSiteName(String siteName) + { + this.siteName = siteName; + } + + public String getSiteLocation() + { + return siteLocation; + } + + public void setSiteLocation(String siteLocation) + { + this.siteLocation = siteLocation; + } + + public Long getCapacity() + { + return capacity; + } + + public void setCapacity(Long capacity) + { + this.capacity = capacity; + } + + public String getSiteDevice() + { + return siteDevice; + } + + public void setSiteDevice(String siteDevice) + { + this.siteDevice = siteDevice; + } + + public Integer getSiteStatus() + { + return siteStatus; + } + + public void setSiteStatus(Integer siteStatus) + { + this.siteStatus = siteStatus; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassroomInfoMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassroomInfoMapper.java index b840b6fb3..76bcb4821 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassroomInfoMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainClassroomInfoMapper.java @@ -1,19 +1,20 @@ package com.ruoyi.train.mapper; import java.util.List; +import org.apache.ibatis.annotations.Param; import com.ruoyi.train.domain.TrainClassroomInfo; /** * 教室信息Mapper接口 - * + * * @author ruoyi * @date 2026-09-08 */ -public interface TrainClassroomInfoMapper +public interface TrainClassroomInfoMapper { /** * 查询教室信息 - * + * * @param classRoomId 教室信息主键 * @return 教室信息 */ @@ -21,15 +22,24 @@ public interface TrainClassroomInfoMapper /** * 查询教室信息列表 - * + * * @param trainClassroomInfo 教室信息 * @return 教室信息集合 */ public List selectTrainClassroomInfoList(TrainClassroomInfo trainClassroomInfo); + /** + * 校验教室名称是否唯一 + * + * @param roomName 教室名称 + * @param excludeClassRoomId 排除的教室ID (修改时传,新增时传null) + * @return 教室信息 + */ + public TrainClassroomInfo checkRoomNameUnique(@Param("roomName") String roomName, @Param("excludeClassRoomId") String excludeClassRoomId); + /** * 新增教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @@ -37,7 +47,7 @@ public interface TrainClassroomInfoMapper /** * 修改教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @@ -45,7 +55,7 @@ public interface TrainClassroomInfoMapper /** * 删除教室信息 - * + * * @param classRoomId 教室信息主键 * @return 结果 */ @@ -53,7 +63,7 @@ public interface TrainClassroomInfoMapper /** * 批量删除教室信息 - * + * * @param classRoomIds 需要删除的数据主键集合 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainTrainingSiteMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainTrainingSiteMapper.java index 2d7d7e044..376bd0cb2 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainTrainingSiteMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainTrainingSiteMapper.java @@ -1,19 +1,20 @@ package com.ruoyi.train.mapper; import java.util.List; +import org.apache.ibatis.annotations.Param; import com.ruoyi.train.domain.TrainTrainingSite; /** * 实训场地Mapper接口 - * + * * @author ruoyi * @date 2026-09-08 */ -public interface TrainTrainingSiteMapper +public interface TrainTrainingSiteMapper { /** * 查询实训场地 - * + * * @param siteId 实训场地主键 * @return 实训场地 */ @@ -21,15 +22,24 @@ public interface TrainTrainingSiteMapper /** * 查询实训场地列表 - * + * * @param trainTrainingSite 实训场地 * @return 实训场地集合 */ public List selectTrainTrainingSiteList(TrainTrainingSite trainTrainingSite); + /** + * 校验实训场地名称是否唯一 + * + * @param siteName 实训场地名称 + * @param excludeSiteId 排除的场地ID (修改时传,新增时传null) + * @return 实训场地信息 + */ + public TrainTrainingSite checkSiteNameUnique(@Param("siteName") String siteName, @Param("excludeSiteId") String excludeSiteId); + /** * 新增实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @@ -37,7 +47,7 @@ public interface TrainTrainingSiteMapper /** * 修改实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @@ -45,7 +55,7 @@ public interface TrainTrainingSiteMapper /** * 删除实训场地 - * + * * @param siteId 实训场地主键 * @return 结果 */ @@ -53,7 +63,7 @@ public interface TrainTrainingSiteMapper /** * 批量删除实训场地 - * + * * @param siteIds 需要删除的数据主键集合 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassroomInfoService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassroomInfoService.java index 1eac3c578..2f573de45 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassroomInfoService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainClassroomInfoService.java @@ -2,18 +2,27 @@ package com.ruoyi.train.service; import java.util.List; import com.ruoyi.train.domain.TrainClassroomInfo; +import com.ruoyi.train.domain.vo.ClassroomDetailVO; /** * 教室信息Service接口 - * + * * @author ruoyi * @date 2026-09-08 */ -public interface ITrainClassroomInfoService +public interface ITrainClassroomInfoService { /** - * 查询教室信息 - * + * 查询教室详情(聚合电子班牌信息,供API详情接口使用) + * + * @param classRoomId 教室信息主键 + * @return 教室详情VO + */ + public ClassroomDetailVO selectClassroomDetailByClassRoomId(String classRoomId); + + /** + * 查询教室基础信息 + * * @param classRoomId 教室信息主键 * @return 教室信息 */ @@ -21,15 +30,23 @@ public interface ITrainClassroomInfoService /** * 查询教室信息列表 - * + * * @param trainClassroomInfo 教室信息 * @return 教室信息集合 */ public List selectTrainClassroomInfoList(TrainClassroomInfo trainClassroomInfo); + /** + * 校验教室名称是否唯一 + * + * @param trainClassroomInfo 教室信息 + * @return 结果 (true 唯一, false 不唯一) + */ + public boolean checkRoomNameUnique(TrainClassroomInfo trainClassroomInfo); + /** * 新增教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @@ -37,7 +54,7 @@ public interface ITrainClassroomInfoService /** * 修改教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @@ -45,7 +62,7 @@ public interface ITrainClassroomInfoService /** * 批量删除教室信息 - * + * * @param classRoomIds 需要删除的教室信息主键集合 * @return 结果 */ @@ -53,7 +70,7 @@ public interface ITrainClassroomInfoService /** * 删除教室信息信息 - * + * * @param classRoomId 教室信息主键 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainTrainingSiteService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainTrainingSiteService.java index 53b34842d..19286b56b 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainTrainingSiteService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainTrainingSiteService.java @@ -5,15 +5,15 @@ import com.ruoyi.train.domain.TrainTrainingSite; /** * 实训场地Service接口 - * + * * @author ruoyi * @date 2026-09-08 */ -public interface ITrainTrainingSiteService +public interface ITrainTrainingSiteService { /** * 查询实训场地 - * + * * @param siteId 实训场地主键 * @return 实训场地 */ @@ -21,15 +21,23 @@ public interface ITrainTrainingSiteService /** * 查询实训场地列表 - * + * * @param trainTrainingSite 实训场地 * @return 实训场地集合 */ public List selectTrainTrainingSiteList(TrainTrainingSite trainTrainingSite); + /** + * 校验实训场地名称是否唯一 + * + * @param trainTrainingSite 实训场地 + * @return 结果 (true 唯一, false 不唯一) + */ + public boolean checkSiteNameUnique(TrainTrainingSite trainTrainingSite); + /** * 新增实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @@ -37,7 +45,7 @@ public interface ITrainTrainingSiteService /** * 修改实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @@ -45,7 +53,7 @@ public interface ITrainTrainingSiteService /** * 批量删除实训场地 - * + * * @param siteIds 需要删除的实训场地主键集合 * @return 结果 */ @@ -53,7 +61,7 @@ public interface ITrainTrainingSiteService /** * 删除实训场地信息 - * + * * @param siteId 实训场地主键 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java index acc541e32..988a49b2b 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainClassroomInfoServiceImpl.java @@ -1,28 +1,82 @@ package com.ruoyi.train.service.impl; +import java.util.ArrayList; import java.util.List; -import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.train.mapper.TrainClassroomInfoMapper; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.train.domain.TrainClassroomInfo; +import com.ruoyi.train.domain.TrainElectronicBoard; +import com.ruoyi.train.domain.vo.ClassroomBoardSummaryVO; +import com.ruoyi.train.domain.vo.ClassroomDetailVO; +import com.ruoyi.train.mapper.TrainClassroomInfoMapper; +import com.ruoyi.train.mapper.TrainElectronicBoardMapper; import com.ruoyi.train.service.ITrainClassroomInfoService; /** * 教室信息Service业务层处理 - * + * * @author ruoyi * @date 2026-09-08 */ @Service -public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService +public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService { @Autowired private TrainClassroomInfoMapper trainClassroomInfoMapper; + @Autowired + private TrainElectronicBoardMapper trainElectronicBoardMapper; + /** - * 查询教室信息 - * + * 查询教室详情(供API详情接口使用,聚合班牌轻量摘要列表,0..N语义) + * + * @param classRoomId 教室信息主键 + * @return 教室详情VO + */ + @Override + public ClassroomDetailVO selectClassroomDetailByClassRoomId(String classRoomId) + { + TrainClassroomInfo classroom = trainClassroomInfoMapper.selectTrainClassroomInfoByClassRoomId(classRoomId); + if (classroom == null) + { + return null; + } + ClassroomDetailVO vo = new ClassroomDetailVO(); + vo.setClassRoomId(classroom.getClassRoomId()); + vo.setRoomName(classroom.getRoomName()); + vo.setRoomLocation(classroom.getRoomLocation()); + vo.setCapacity(classroom.getCapacity()); + vo.setRoomStatus(classroom.getRoomStatus()); + vo.setRemark(classroom.getRemark()); + vo.setCreateTime(classroom.getCreateTime()); + + // 按 bind_classroom_id 查询绑定的电子班牌(0..N),映射为轻量摘要 VO,无绑定时返回空列表 [] + TrainElectronicBoard boardQuery = new TrainElectronicBoard(); + boardQuery.setBindClassroomId(classRoomId); + List boardList = trainElectronicBoardMapper.selectTrainElectronicBoardList(boardQuery); + List summaryList = new ArrayList<>(); + if (boardList != null && !boardList.isEmpty()) + { + for (TrainElectronicBoard board : boardList) + { + summaryList.add(new ClassroomBoardSummaryVO( + board.getBoardId(), + board.getBoardSn(), + board.getBoardStatus() + )); + } + } + vo.setBoards(summaryList); + return vo; + } + + /** + * 查询教室基础信息 (仅持久化Domain) + * * @param classRoomId 教室信息主键 * @return 教室信息 */ @@ -34,7 +88,7 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService /** * 查询教室信息列表 - * + * * @param trainClassroomInfo 教室信息 * @return 教室信息 */ @@ -44,35 +98,86 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService return trainClassroomInfoMapper.selectTrainClassroomInfoList(trainClassroomInfo); } + /** + * 校验教室名称是否唯一 + * + * @param trainClassroomInfo 教室信息 + * @return 结果 (true 唯一, false 不唯一) + */ + @Override + public boolean checkRoomNameUnique(TrainClassroomInfo trainClassroomInfo) + { + if (StringUtils.isEmpty(trainClassroomInfo.getRoomName())) + { + return true; + } + TrainClassroomInfo info = trainClassroomInfoMapper.checkRoomNameUnique( + trainClassroomInfo.getRoomName(), + trainClassroomInfo.getClassRoomId() + ); + return info == null; + } + /** * 新增教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @Override public int insertTrainClassroomInfo(TrainClassroomInfo trainClassroomInfo) { + // 1. 容纳人数必须大于0 + if (trainClassroomInfo.getCapacity() == null || trainClassroomInfo.getCapacity() <= 0) + { + throw new ServiceException("教室容纳人数必须大于0"); + } + // 2. 教室名称全局/基地内唯一校验 + if (!checkRoomNameUnique(trainClassroomInfo)) + { + throw new ServiceException("教室名称已存在", 40008); + } + // 3. 自动生成32位主键UUID(若未指定) + if (StringUtils.isEmpty(trainClassroomInfo.getClassRoomId())) + { + trainClassroomInfo.setClassRoomId(IdUtils.fastSimpleUUID()); + } + // 4. 默认值处理 + if (trainClassroomInfo.getRoomStatus() == null) + { + trainClassroomInfo.setRoomStatus(1); // 默认可用空闲 + } + trainClassroomInfo.setDelFlag("0"); trainClassroomInfo.setCreateTime(DateUtils.getNowDate()); return trainClassroomInfoMapper.insertTrainClassroomInfo(trainClassroomInfo); } /** * 修改教室信息 - * + * * @param trainClassroomInfo 教室信息 * @return 结果 */ @Override public int updateTrainClassroomInfo(TrainClassroomInfo trainClassroomInfo) { + // 1. 容纳人数校验 + if (trainClassroomInfo.getCapacity() != null && trainClassroomInfo.getCapacity() <= 0) + { + throw new ServiceException("教室容纳人数必须大于0"); + } + // 2. 教室名称唯一性校验 + if (!checkRoomNameUnique(trainClassroomInfo)) + { + throw new ServiceException("教室名称已存在", 40008); + } trainClassroomInfo.setUpdateTime(DateUtils.getNowDate()); return trainClassroomInfoMapper.updateTrainClassroomInfo(trainClassroomInfo); } /** * 批量删除教室信息 - * + * * @param classRoomIds 需要删除的教室信息主键 * @return 结果 */ @@ -83,8 +188,8 @@ public class TrainClassroomInfoServiceImpl implements ITrainClassroomInfoService } /** - * 删除教室信息信息 - * + * 删除教室信息 + * * @param classRoomId 教室信息主键 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainTrainingSiteServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainTrainingSiteServiceImpl.java index 2499c2830..627d35a07 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainTrainingSiteServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainTrainingSiteServiceImpl.java @@ -1,28 +1,31 @@ package com.ruoyi.train.service.impl; import java.util.List; -import com.ruoyi.common.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.train.mapper.TrainTrainingSiteMapper; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.train.domain.TrainTrainingSite; +import com.ruoyi.train.mapper.TrainTrainingSiteMapper; import com.ruoyi.train.service.ITrainTrainingSiteService; /** * 实训场地Service业务层处理 - * + * * @author ruoyi * @date 2026-09-08 */ @Service -public class TrainTrainingSiteServiceImpl implements ITrainTrainingSiteService +public class TrainTrainingSiteServiceImpl implements ITrainTrainingSiteService { @Autowired private TrainTrainingSiteMapper trainTrainingSiteMapper; /** * 查询实训场地 - * + * * @param siteId 实训场地主键 * @return 实训场地 */ @@ -34,7 +37,7 @@ public class TrainTrainingSiteServiceImpl implements ITrainTrainingSiteService /** * 查询实训场地列表 - * + * * @param trainTrainingSite 实训场地 * @return 实训场地 */ @@ -44,35 +47,86 @@ public class TrainTrainingSiteServiceImpl implements ITrainTrainingSiteService return trainTrainingSiteMapper.selectTrainTrainingSiteList(trainTrainingSite); } + /** + * 校验实训场地名称是否唯一 + * + * @param trainTrainingSite 实训场地 + * @return 结果 (true 唯一, false 不唯一) + */ + @Override + public boolean checkSiteNameUnique(TrainTrainingSite trainTrainingSite) + { + if (StringUtils.isEmpty(trainTrainingSite.getSiteName())) + { + return true; + } + TrainTrainingSite site = trainTrainingSiteMapper.checkSiteNameUnique( + trainTrainingSite.getSiteName(), + trainTrainingSite.getSiteId() + ); + return site == null; + } + /** * 新增实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @Override public int insertTrainTrainingSite(TrainTrainingSite trainTrainingSite) { + // 1. 容纳人数必须大于0 + if (trainTrainingSite.getCapacity() == null || trainTrainingSite.getCapacity() <= 0) + { + throw new ServiceException("场地最大容纳人数必须大于0"); + } + // 2. 场地名称唯一性校验 + if (!checkSiteNameUnique(trainTrainingSite)) + { + throw new ServiceException("实训场地名称已存在", 40009); + } + // 3. 自动生成32位主键UUID(若未指定) + if (StringUtils.isEmpty(trainTrainingSite.getSiteId())) + { + trainTrainingSite.setSiteId(IdUtils.fastSimpleUUID()); + } + // 4. 默认值处理 + if (trainTrainingSite.getSiteStatus() == null) + { + trainTrainingSite.setSiteStatus(1); // 默认可用 + } + trainTrainingSite.setDelFlag("0"); trainTrainingSite.setCreateTime(DateUtils.getNowDate()); return trainTrainingSiteMapper.insertTrainTrainingSite(trainTrainingSite); } /** * 修改实训场地 - * + * * @param trainTrainingSite 实训场地 * @return 结果 */ @Override public int updateTrainTrainingSite(TrainTrainingSite trainTrainingSite) { + // 1. 容纳人数校验 + if (trainTrainingSite.getCapacity() != null && trainTrainingSite.getCapacity() <= 0) + { + throw new ServiceException("场地最大容纳人数必须大于0"); + } + // 2. 场地名称唯一性校验 + if (!checkSiteNameUnique(trainTrainingSite)) + { + throw new ServiceException("实训场地名称已存在", 40009); + } trainTrainingSite.setUpdateTime(DateUtils.getNowDate()); return trainTrainingSiteMapper.updateTrainTrainingSite(trainTrainingSite); } /** * 批量删除实训场地 - * + * * @param siteIds 需要删除的实训场地主键 * @return 结果 */ @@ -84,7 +138,7 @@ public class TrainTrainingSiteServiceImpl implements ITrainTrainingSiteService /** * 删除实训场地信息 - * + * * @param siteId 实训场地主键 * @return 结果 */ diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassroomInfoMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassroomInfoMapper.xml index 206ade585..4dcfe990f 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassroomInfoMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainClassroomInfoMapper.xml @@ -3,37 +3,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + - + + + - select class_room_id, room_name, room_location, capacity, room_status, create_user, create_time, update_time, remark from train_classroom_info + select class_room_id, room_name, room_location, capacity, room_status, del_flag, create_by, create_time, update_by, update_time, remark from train_classroom_info - + + + @@ -44,8 +55,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" room_location, capacity, room_status, - create_user, + del_flag, + create_by, create_time, + update_by, update_time, remark, @@ -55,8 +68,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{roomLocation}, #{capacity}, #{roomStatus}, - #{createUser}, + #{delFlag}, + #{createBy}, #{createTime}, + #{updateBy}, #{updateTime}, #{remark}, @@ -69,22 +84,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" room_location = #{roomLocation}, capacity = #{capacity}, room_status = #{roomStatus}, - create_user = #{createUser}, - create_time = #{createTime}, + del_flag = #{delFlag}, + update_by = #{updateBy}, update_time = #{updateTime}, remark = #{remark}, where class_room_id = #{classRoomId} - - delete from train_classroom_info where class_room_id = #{classRoomId} - + + update train_classroom_info set del_flag = '2' where class_room_id = #{classRoomId} + - - delete from train_classroom_info where class_room_id in + + update train_classroom_info set del_flag = '2' where class_room_id in #{classRoomId} - - \ No newline at end of file + + diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainTrainingSiteMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainTrainingSiteMapper.xml index 243b11751..12a52116c 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainTrainingSiteMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainTrainingSiteMapper.xml @@ -3,7 +3,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -11,31 +11,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + + - select site_id, site_name, site_location, capacity, site_device, site_status, create_user, create_time, update_time, remark from train_training_site + select site_id, site_name, site_location, capacity, site_device, site_status, del_flag, create_by, create_time, update_by, update_time, remark from train_training_site - + + + @@ -47,8 +58,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" capacity, site_device, site_status, - create_user, + del_flag, + create_by, create_time, + update_by, update_time, remark, @@ -59,8 +72,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{capacity}, #{siteDevice}, #{siteStatus}, - #{createUser}, + #{delFlag}, + #{createBy}, #{createTime}, + #{updateBy}, #{updateTime}, #{remark}, @@ -74,22 +89,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" capacity = #{capacity}, site_device = #{siteDevice}, site_status = #{siteStatus}, - create_user = #{createUser}, - create_time = #{createTime}, + del_flag = #{delFlag}, + update_by = #{updateBy}, update_time = #{updateTime}, remark = #{remark}, where site_id = #{siteId} - - delete from train_training_site where site_id = #{siteId} - + + update train_training_site set del_flag = '2' where site_id = #{siteId} + - - delete from train_training_site where site_id in + + update train_training_site set del_flag = '2' where site_id in #{siteId} - - \ No newline at end of file + + diff --git a/build_ui/src/api/train/classroom.js b/build_ui/src/api/train/classroom.js index 406641e97..e031e89a5 100644 --- a/build_ui/src/api/train/classroom.js +++ b/build_ui/src/api/train/classroom.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询教室信息列表 export function listClassroom(query) { return request({ - url: '/train/classroominfo/list', + url: '/train/classroom/list', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function listClassroom(query) { // 查询教室信息详细 export function getClassroom(classRoomId) { return request({ - url: '/train/classroominfo/' + classRoomId, + url: '/train/classroom/' + classRoomId, method: 'get' }) } @@ -20,7 +20,7 @@ export function getClassroom(classRoomId) { // 新增教室信息 export function addClassroom(data) { return request({ - url: '/train/classroominfo', + url: '/train/classroom', method: 'post', data: data }) @@ -29,25 +29,8 @@ export function addClassroom(data) { // 修改教室信息 export function updateClassroom(data) { return request({ - url: '/train/classroominfo', + url: '/train/classroom/' + data.classRoomId, method: 'put', data: data }) } - -// 删除教室信息 -export function delClassroom(classRoomId) { - return request({ - url: '/train/classroominfo/' + classRoomId, - method: 'delete' - }) -} - -// 导出教室信息 -export function exportClassroom(query) { - return request({ - url: '/train/classroominfo/export', - method: 'post', - params: query - }) -} diff --git a/build_ui/src/api/train/site.js b/build_ui/src/api/train/site.js index 4d1701d98..e2e38964e 100644 --- a/build_ui/src/api/train/site.js +++ b/build_ui/src/api/train/site.js @@ -3,7 +3,7 @@ import request from '@/utils/request' // 查询实训场地列表 export function listSite(query) { return request({ - url: '/train/site/list', + url: '/train/training-site/list', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function listSite(query) { // 查询实训场地详细 export function getSite(siteId) { return request({ - url: '/train/site/' + siteId, + url: '/train/training-site/' + siteId, method: 'get' }) } @@ -20,7 +20,7 @@ export function getSite(siteId) { // 新增实训场地 export function addSite(data) { return request({ - url: '/train/site', + url: '/train/training-site', method: 'post', data: data }) @@ -29,16 +29,8 @@ export function addSite(data) { // 修改实训场地 export function updateSite(data) { return request({ - url: '/train/site', + url: '/train/training-site/' + data.siteId, method: 'put', data: data }) } - -// 删除实训场地 -export function delSite(siteId) { - return request({ - url: '/train/site/' + siteId, - method: 'delete' - }) -} diff --git a/build_ui/src/views/train/classroom/index.vue b/build_ui/src/views/train/classroom/index.vue index 2a575210b..55466358c 100644 --- a/build_ui/src/views/train/classroom/index.vue +++ b/build_ui/src/views/train/classroom/index.vue @@ -1,6 +1,6 @@