合并培训:集成空间资源P0能力
This commit is contained in:
commit
bec47ad30f
22 files changed
+1299
-469
No files matched your search
+20
-42
@@ -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<TrainClassroomInfo> list = trainClassroomInfoService.selectTrainClassroomInfoList(trainClassroomInfo);
|
||||
ExcelUtil<TrainClassroomInfo> util = new ExcelUtil<TrainClassroomInfo>(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));
|
||||
}
|
||||
}
|
||||
+18
-40
@@ -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<TrainTrainingSite> list = trainTrainingSiteService.selectTrainTrainingSiteList(trainTrainingSite);
|
||||
ExcelUtil<TrainTrainingSite> util = new ExcelUtil<TrainTrainingSite>(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));
|
||||
}
|
||||
}
|
||||
+30
-20
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
+88
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+63
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<ClassroomBoardSummaryVO> 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<ClassroomBoardSummaryVO> getBoards()
|
||||
{
|
||||
return boards == null ? new ArrayList<>() : boards;
|
||||
}
|
||||
|
||||
public void setBoards(List<ClassroomBoardSummaryVO> 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+18
-8
@@ -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<TrainClassroomInfo> 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 结果
|
||||
*/
|
||||
|
||||
+18
-8
@@ -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<TrainTrainingSite> 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 结果
|
||||
*/
|
||||
|
||||
+26
-9
@@ -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<TrainClassroomInfo> 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 结果
|
||||
*/
|
||||
|
||||
+16
-8
@@ -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<TrainTrainingSite> 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 结果
|
||||
*/
|
||||
|
||||
+117
-12
@@ -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<TrainElectronicBoard> boardList = trainElectronicBoardMapper.selectTrainElectronicBoardList(boardQuery);
|
||||
List<ClassroomBoardSummaryVO> 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 结果
|
||||
*/
|
||||
|
||||
+64
-10
@@ -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 结果
|
||||
*/
|
||||
|
||||
+38
-23
@@ -3,37 +3,48 @@
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.train.mapper.TrainClassroomInfoMapper">
|
||||
|
||||
|
||||
<resultMap type="TrainClassroomInfo" id="TrainClassroomInfoResult">
|
||||
<result property="classRoomId" column="class_room_id" />
|
||||
<result property="roomName" column="room_name" />
|
||||
<result property="roomLocation" column="room_location" />
|
||||
<result property="capacity" column="capacity" />
|
||||
<result property="roomStatus" column="room_status" />
|
||||
<result property="createUser" column="create_user" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
<result property="remark" column="remark" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectTrainClassroomInfoVo">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<select id="selectTrainClassroomInfoList" parameterType="TrainClassroomInfo" resultMap="TrainClassroomInfoResult">
|
||||
<include refid="selectTrainClassroomInfoVo"/>
|
||||
<where>
|
||||
<if test="roomName != null and roomName != ''"> and room_name like concat('%', #{roomName}, '%')</if>
|
||||
<if test="roomLocation != null and roomLocation != ''"> and room_location = #{roomLocation}</if>
|
||||
<if test="capacity != null "> and capacity = #{capacity}</if>
|
||||
<if test="roomStatus != null "> and room_status = #{roomStatus}</if>
|
||||
<if test="createUser != null and createUser != ''"> and create_user = #{createUser}</if>
|
||||
</where>
|
||||
where del_flag = '0'
|
||||
<if test="roomName != null and roomName != ''"> and room_name like concat('%', #{roomName}, '%')</if>
|
||||
<if test="roomLocation != null and roomLocation != ''"> and room_location = #{roomLocation}</if>
|
||||
<if test="capacity != null "> and capacity = #{capacity}</if>
|
||||
<if test="roomStatus != null "> and room_status = #{roomStatus}</if>
|
||||
<if test="createBy != null and createBy != ''"> and create_by = #{createBy}</if>
|
||||
order by create_time desc
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectTrainClassroomInfoByClassRoomId" parameterType="String" resultMap="TrainClassroomInfoResult">
|
||||
<include refid="selectTrainClassroomInfoVo"/>
|
||||
where class_room_id = #{classRoomId}
|
||||
where class_room_id = #{classRoomId} and del_flag = '0'
|
||||
</select>
|
||||
|
||||
<select id="checkRoomNameUnique" resultMap="TrainClassroomInfoResult">
|
||||
<include refid="selectTrainClassroomInfoVo"/>
|
||||
where room_name = #{roomName} and del_flag = '0'
|
||||
<if test="excludeClassRoomId != null and excludeClassRoomId != ''">
|
||||
and class_room_id != #{excludeClassRoomId}
|
||||
</if>
|
||||
limit 1
|
||||
</select>
|
||||
|
||||
<insert id="insertTrainClassroomInfo" parameterType="TrainClassroomInfo">
|
||||
@@ -44,8 +55,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="roomLocation != null">room_location,</if>
|
||||
<if test="capacity != null">capacity,</if>
|
||||
<if test="roomStatus != null">room_status,</if>
|
||||
<if test="createUser != null and createUser != ''">create_user,</if>
|
||||
<if test="delFlag != null and delFlag != ''">del_flag,</if>
|
||||
<if test="createBy != null and createBy != ''">create_by,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by,</if>
|
||||
<if test="updateTime != null">update_time,</if>
|
||||
<if test="remark != null">remark,</if>
|
||||
</trim>
|
||||
@@ -55,8 +68,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="roomLocation != null">#{roomLocation},</if>
|
||||
<if test="capacity != null">#{capacity},</if>
|
||||
<if test="roomStatus != null">#{roomStatus},</if>
|
||||
<if test="createUser != null and createUser != ''">#{createUser},</if>
|
||||
<if test="delFlag != null and delFlag != ''">#{delFlag},</if>
|
||||
<if test="createBy != null and createBy != ''">#{createBy},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="updateBy != null and updateBy != ''">#{updateBy},</if>
|
||||
<if test="updateTime != null">#{updateTime},</if>
|
||||
<if test="remark != null">#{remark},</if>
|
||||
</trim>
|
||||
@@ -69,22 +84,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="roomLocation != null">room_location = #{roomLocation},</if>
|
||||
<if test="capacity != null">capacity = #{capacity},</if>
|
||||
<if test="roomStatus != null">room_status = #{roomStatus},</if>
|
||||
<if test="createUser != null and createUser != ''">create_user = #{createUser},</if>
|
||||
<if test="createTime != null">create_time = #{createTime},</if>
|
||||
<if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
<if test="remark != null">remark = #{remark},</if>
|
||||
</trim>
|
||||
where class_room_id = #{classRoomId}
|
||||
</update>
|
||||
|
||||
<delete id="deleteTrainClassroomInfoByClassRoomId" parameterType="String">
|
||||
delete from train_classroom_info where class_room_id = #{classRoomId}
|
||||
</delete>
|
||||
<update id="deleteTrainClassroomInfoByClassRoomId" parameterType="String">
|
||||
update train_classroom_info set del_flag = '2' where class_room_id = #{classRoomId}
|
||||
</update>
|
||||
|
||||
<delete id="deleteTrainClassroomInfoByClassRoomIds" parameterType="String">
|
||||
delete from train_classroom_info where class_room_id in
|
||||
<update id="deleteTrainClassroomInfoByClassRoomIds" parameterType="String">
|
||||
update train_classroom_info set del_flag = '2' where class_room_id in
|
||||
<foreach item="classRoomId" collection="array" open="(" separator="," close=")">
|
||||
#{classRoomId}
|
||||
</foreach>
|
||||
</delete>
|
||||
</mapper>
|
||||
</update>
|
||||
</mapper>
|
||||
@@ -3,7 +3,7 @@
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.train.mapper.TrainTrainingSiteMapper">
|
||||
|
||||
|
||||
<resultMap type="TrainTrainingSite" id="TrainTrainingSiteResult">
|
||||
<result property="siteId" column="site_id" />
|
||||
<result property="siteName" column="site_name" />
|
||||
@@ -11,31 +11,42 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="capacity" column="capacity" />
|
||||
<result property="siteDevice" column="site_device" />
|
||||
<result property="siteStatus" column="site_status" />
|
||||
<result property="createUser" column="create_user" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
<result property="remark" column="remark" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectTrainTrainingSiteVo">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<select id="selectTrainTrainingSiteList" parameterType="TrainTrainingSite" resultMap="TrainTrainingSiteResult">
|
||||
<include refid="selectTrainTrainingSiteVo"/>
|
||||
<where>
|
||||
<if test="siteName != null and siteName != ''"> and site_name like concat('%', #{siteName}, '%')</if>
|
||||
<if test="siteLocation != null and siteLocation != ''"> and site_location = #{siteLocation}</if>
|
||||
<if test="capacity != null "> and capacity = #{capacity}</if>
|
||||
<if test="siteDevice != null and siteDevice != ''"> and site_device = #{siteDevice}</if>
|
||||
<if test="siteStatus != null "> and site_status = #{siteStatus}</if>
|
||||
<if test="createUser != null and createUser != ''"> and create_user = #{createUser}</if>
|
||||
</where>
|
||||
where del_flag = '0'
|
||||
<if test="siteName != null and siteName != ''"> and site_name like concat('%', #{siteName}, '%')</if>
|
||||
<if test="siteLocation != null and siteLocation != ''"> and site_location = #{siteLocation}</if>
|
||||
<if test="capacity != null "> and capacity = #{capacity}</if>
|
||||
<if test="siteDevice != null and siteDevice != ''"> and site_device = #{siteDevice}</if>
|
||||
<if test="siteStatus != null "> and site_status = #{siteStatus}</if>
|
||||
<if test="createBy != null and createBy != ''"> and create_by = #{createBy}</if>
|
||||
order by create_time desc
|
||||
</select>
|
||||
|
||||
|
||||
<select id="selectTrainTrainingSiteBySiteId" parameterType="String" resultMap="TrainTrainingSiteResult">
|
||||
<include refid="selectTrainTrainingSiteVo"/>
|
||||
where site_id = #{siteId}
|
||||
where site_id = #{siteId} and del_flag = '0'
|
||||
</select>
|
||||
|
||||
<select id="checkSiteNameUnique" resultMap="TrainTrainingSiteResult">
|
||||
<include refid="selectTrainTrainingSiteVo"/>
|
||||
where site_name = #{siteName} and del_flag = '0'
|
||||
<if test="excludeSiteId != null and excludeSiteId != ''">
|
||||
and site_id != #{excludeSiteId}
|
||||
</if>
|
||||
limit 1
|
||||
</select>
|
||||
|
||||
<insert id="insertTrainTrainingSite" parameterType="TrainTrainingSite">
|
||||
@@ -47,8 +58,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="capacity != null">capacity,</if>
|
||||
<if test="siteDevice != null">site_device,</if>
|
||||
<if test="siteStatus != null">site_status,</if>
|
||||
<if test="createUser != null and createUser != ''">create_user,</if>
|
||||
<if test="delFlag != null and delFlag != ''">del_flag,</if>
|
||||
<if test="createBy != null and createBy != ''">create_by,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by,</if>
|
||||
<if test="updateTime != null">update_time,</if>
|
||||
<if test="remark != null">remark,</if>
|
||||
</trim>
|
||||
@@ -59,8 +72,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="capacity != null">#{capacity},</if>
|
||||
<if test="siteDevice != null">#{siteDevice},</if>
|
||||
<if test="siteStatus != null">#{siteStatus},</if>
|
||||
<if test="createUser != null and createUser != ''">#{createUser},</if>
|
||||
<if test="delFlag != null and delFlag != ''">#{delFlag},</if>
|
||||
<if test="createBy != null and createBy != ''">#{createBy},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="updateBy != null and updateBy != ''">#{updateBy},</if>
|
||||
<if test="updateTime != null">#{updateTime},</if>
|
||||
<if test="remark != null">#{remark},</if>
|
||||
</trim>
|
||||
@@ -74,22 +89,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="capacity != null">capacity = #{capacity},</if>
|
||||
<if test="siteDevice != null">site_device = #{siteDevice},</if>
|
||||
<if test="siteStatus != null">site_status = #{siteStatus},</if>
|
||||
<if test="createUser != null and createUser != ''">create_user = #{createUser},</if>
|
||||
<if test="createTime != null">create_time = #{createTime},</if>
|
||||
<if test="delFlag != null and delFlag != ''">del_flag = #{delFlag},</if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
<if test="remark != null">remark = #{remark},</if>
|
||||
</trim>
|
||||
where site_id = #{siteId}
|
||||
</update>
|
||||
|
||||
<delete id="deleteTrainTrainingSiteBySiteId" parameterType="String">
|
||||
delete from train_training_site where site_id = #{siteId}
|
||||
</delete>
|
||||
<update id="deleteTrainTrainingSiteBySiteId" parameterType="String">
|
||||
update train_training_site set del_flag = '2' where site_id = #{siteId}
|
||||
</update>
|
||||
|
||||
<delete id="deleteTrainTrainingSiteBySiteIds" parameterType="String">
|
||||
delete from train_training_site where site_id in
|
||||
<update id="deleteTrainTrainingSiteBySiteIds" parameterType="String">
|
||||
update train_training_site set del_flag = '2' where site_id in
|
||||
<foreach item="siteId" collection="array" open="(" separator="," close=")">
|
||||
#{siteId}
|
||||
</foreach>
|
||||
</delete>
|
||||
</mapper>
|
||||
</update>
|
||||
</mapper>
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
@@ -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'
|
||||
})
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px">
|
||||
<el-form-item label="教室名称" prop="roomName">
|
||||
<el-input
|
||||
v-model="queryParams.roomName"
|
||||
@@ -17,21 +17,12 @@
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="容纳人数" prop="capacity">
|
||||
<el-input
|
||||
v-model="queryParams.capacity"
|
||||
placeholder="请输入容纳人数"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建管理员账号" prop="createUser">
|
||||
<el-input
|
||||
v-model="queryParams.createUser"
|
||||
placeholder="请输入创建管理员账号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
<el-form-item label="教室状态" prop="roomStatus">
|
||||
<el-select v-model="queryParams.roomStatus" placeholder="教室状态" clearable>
|
||||
<el-option label="正在使用" :value="0" />
|
||||
<el-option label="可用空闲" :value="1" />
|
||||
<el-option label="维护中" :value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
@@ -42,74 +33,55 @@
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['train:classroom:edit']"
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['train:info:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['train:classroom:edit']"
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['train:info:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['train:info:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['train:info:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
|
||||
<el-table v-loading="loading" :data="classroomList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="教室ID主键" align="center" prop="classRoomId" />
|
||||
<el-table-column label="教室ID" align="center" prop="classRoomId" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="教室名称" align="center" prop="roomName" />
|
||||
<el-table-column label="教室位置" align="center" prop="roomLocation" />
|
||||
<el-table-column label="容纳人数" align="center" prop="capacity" />
|
||||
<el-table-column label="0 正在使用 1 可用,空闲 2 其他" align="center" prop="roomStatus" />
|
||||
<el-table-column label="创建管理员账号" align="center" prop="createUser" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="核定容纳人数" align="center" prop="capacity">
|
||||
<template slot-scope="scope">
|
||||
<el-tag type="info">{{ scope.row.capacity }} 人</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="教室状态" align="center" prop="roomStatus">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.roomStatus === 1" type="success">可用空闲</el-tag>
|
||||
<el-tag v-else-if="scope.row.roomStatus === 0" type="danger">正在使用</el-tag>
|
||||
<el-tag v-else type="info">维护中</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
v-hasPermi="['train:classroom:edit']"
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['train:info:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['train:info:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -123,22 +95,26 @@
|
||||
/>
|
||||
|
||||
<!-- 添加或修改教室信息对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-dialog :title="title" :visible.sync="open" width="520px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="教室名称" prop="roomName">
|
||||
<el-input v-model="form.roomName" placeholder="请输入教室名称" />
|
||||
<el-input v-model="form.roomName" placeholder="请输入教室名称" maxlength="60" />
|
||||
</el-form-item>
|
||||
<el-form-item label="教室位置" prop="roomLocation">
|
||||
<el-input v-model="form.roomLocation" placeholder="请输入教室位置" />
|
||||
<el-input v-model="form.roomLocation" placeholder="请输入教室位置" maxlength="100" />
|
||||
</el-form-item>
|
||||
<el-form-item label="容纳人数" prop="capacity">
|
||||
<el-input v-model="form.capacity" placeholder="请输入容纳人数" />
|
||||
<el-input-number v-model="form.capacity" :min="1" :max="10000" placeholder="容纳人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="创建管理员账号" prop="createUser">
|
||||
<el-input v-model="form.createUser" placeholder="请输入创建管理员账号" />
|
||||
<el-form-item label="教室状态" prop="roomStatus">
|
||||
<el-radio-group v-model="form.roomStatus">
|
||||
<el-radio :label="1">可用空闲</el-radio>
|
||||
<el-radio :label="0">正在使用</el-radio>
|
||||
<el-radio :label="2">维护中</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" />
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" maxlength="500" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
@@ -150,10 +126,10 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/train/info"
|
||||
import { listClassroom, getClassroom, addClassroom, updateClassroom } from '@/api/train/classroom'
|
||||
|
||||
export default {
|
||||
name: "Info",
|
||||
name: 'Classroom',
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
@@ -169,9 +145,9 @@ export default {
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 教室信息表格数据
|
||||
infoList: [],
|
||||
classroomList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
title: '',
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
@@ -181,19 +157,30 @@ export default {
|
||||
roomName: null,
|
||||
roomLocation: null,
|
||||
capacity: null,
|
||||
roomStatus: null,
|
||||
createUser: null,
|
||||
roomStatus: null
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
roomName: [
|
||||
{ required: true, message: "教室名称不能为空", trigger: "blur" }
|
||||
],
|
||||
createUser: [
|
||||
{ required: true, message: "创建管理员账号不能为空", trigger: "blur" }
|
||||
{ required: true, message: '教室名称不能为空', trigger: 'blur' }
|
||||
],
|
||||
capacity: [
|
||||
{ required: true, message: '容纳人数不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === undefined || value === null || value === '') {
|
||||
callback(new Error('容纳人数不能为空'))
|
||||
} else if (Number(value) <= 0) {
|
||||
callback(new Error('容纳人数必须大于0'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: ['blur', 'change']
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -204,8 +191,8 @@ export default {
|
||||
/** 查询教室信息列表 */
|
||||
getList() {
|
||||
this.loading = true
|
||||
listInfo(this.queryParams).then(response => {
|
||||
this.infoList = response.rows
|
||||
listClassroom(this.queryParams).then(response => {
|
||||
this.classroomList = response.rows
|
||||
this.total = response.total
|
||||
this.loading = false
|
||||
})
|
||||
@@ -221,14 +208,11 @@ export default {
|
||||
classRoomId: null,
|
||||
roomName: null,
|
||||
roomLocation: null,
|
||||
capacity: null,
|
||||
roomStatus: null,
|
||||
createUser: null,
|
||||
createTime: null,
|
||||
updateTime: null,
|
||||
capacity: 50,
|
||||
roomStatus: 1,
|
||||
remark: null
|
||||
}
|
||||
this.resetForm("form")
|
||||
this.resetForm('form')
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
@@ -237,66 +221,50 @@ export default {
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm")
|
||||
this.resetForm('queryForm')
|
||||
this.handleQuery()
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.classRoomId)
|
||||
this.single = selection.length!==1
|
||||
this.single = selection.length !== 1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
this.open = true
|
||||
this.title = "添加教室信息"
|
||||
this.title = '添加教室信息'
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset()
|
||||
const classRoomId = row.classRoomId || this.ids
|
||||
getInfo(classRoomId).then(response => {
|
||||
getClassroom(classRoomId).then(response => {
|
||||
this.form = response.data
|
||||
this.open = true
|
||||
this.title = "修改教室信息"
|
||||
this.title = '修改教室信息'
|
||||
})
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
this.$refs['form'].validate(valid => {
|
||||
if (valid) {
|
||||
if (this.form.classRoomId != null) {
|
||||
updateInfo(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功")
|
||||
updateClassroom(this.form).then(response => {
|
||||
this.$modal.msgSuccess('修改成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
} else {
|
||||
addInfo(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功")
|
||||
addClassroom(this.form).then(response => {
|
||||
this.$modal.msgSuccess('新增成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const classRoomIds = row.classRoomId || this.ids
|
||||
this.$modal.confirm('是否确认删除教室信息编号为"' + classRoomIds + '"的数据项?').then(function() {
|
||||
return delInfo(classRoomIds)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('train/info/export', {
|
||||
...this.queryParams
|
||||
}, `info_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||
<el-form-item label="实训场地名称" prop="siteName">
|
||||
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px">
|
||||
<el-form-item label="场地名称" prop="siteName">
|
||||
<el-input
|
||||
v-model="queryParams.siteName"
|
||||
placeholder="请输入实训场地名称"
|
||||
@@ -17,21 +17,11 @@
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="最大容纳人数" prop="capacity">
|
||||
<el-input
|
||||
v-model="queryParams.capacity"
|
||||
placeholder="请输入最大容纳人数"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建管理员账号" prop="createUser">
|
||||
<el-input
|
||||
v-model="queryParams.createUser"
|
||||
placeholder="请输入创建管理员账号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
<el-form-item label="场地状态" prop="siteStatus">
|
||||
<el-select v-model="queryParams.siteStatus" placeholder="场地状态" clearable>
|
||||
<el-option label="可用" :value="1" />
|
||||
<el-option label="停用" :value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
@@ -42,75 +32,55 @@
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['train:site:edit']"
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['train:site:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
v-hasPermi="['train:site:edit']"
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['train:site:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['train:site:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['train:site:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
<right-toolbar :show-search.sync="showSearch" @queryTable="getList" />
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="siteList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="实训场地ID主键" align="center" prop="siteId" />
|
||||
<el-table-column label="场地ID" align="center" prop="siteId" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="实训场地名称" align="center" prop="siteName" />
|
||||
<el-table-column label="场地位置" align="center" prop="siteLocation" />
|
||||
<el-table-column label="最大容纳人数" align="center" prop="capacity" />
|
||||
<el-table-column label="场地配套设备:VR、3D拆解、3D巡检设备" align="center" prop="siteDevice" />
|
||||
<el-table-column label="0 停用 1 可用" align="center" prop="siteStatus" />
|
||||
<el-table-column label="创建管理员账号" align="center" prop="createUser" />
|
||||
<el-table-column label="备注" align="center" prop="remark" />
|
||||
<el-table-column label="最大容纳人数" align="center" prop="capacity">
|
||||
<template slot-scope="scope">
|
||||
<el-tag type="info">{{ scope.row.capacity }} 人</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="配套设备描述" align="center" prop="siteDevice" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="场地状态" align="center" prop="siteStatus">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.siteStatus === 1" type="success">可用</el-tag>
|
||||
<el-tag v-else type="danger">停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
v-hasPermi="['train:site:edit']"
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['train:site:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['train:site:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -124,25 +94,28 @@
|
||||
/>
|
||||
|
||||
<!-- 添加或修改实训场地对话框 -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
|
||||
<el-dialog :title="title" :visible.sync="open" width="520px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
|
||||
<el-form-item label="实训场地名称" prop="siteName">
|
||||
<el-input v-model="form.siteName" placeholder="请输入实训场地名称" />
|
||||
<el-input v-model="form.siteName" placeholder="请输入实训场地名称 (如 VR演练区)" maxlength="80" />
|
||||
</el-form-item>
|
||||
<el-form-item label="场地位置" prop="siteLocation">
|
||||
<el-input v-model="form.siteLocation" placeholder="请输入场地位置" />
|
||||
<el-input v-model="form.siteLocation" placeholder="请输入场地位置" maxlength="100" />
|
||||
</el-form-item>
|
||||
<el-form-item label="最大容纳人数" prop="capacity">
|
||||
<el-input v-model="form.capacity" placeholder="请输入最大容纳人数" />
|
||||
<el-input-number v-model="form.capacity" :min="1" :max="10000" placeholder="最大容纳人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="场地配套设备:VR、3D拆解、3D巡检设备" prop="siteDevice">
|
||||
<el-input v-model="form.siteDevice" type="textarea" placeholder="请输入内容" />
|
||||
<el-form-item label="场地配套设备" prop="siteDevice">
|
||||
<el-input v-model="form.siteDevice" type="textarea" placeholder="例如:VR头显12套、3D数字孪生演练台等" :rows="3" />
|
||||
</el-form-item>
|
||||
<el-form-item label="创建管理员账号" prop="createUser">
|
||||
<el-input v-model="form.createUser" placeholder="请输入创建管理员账号" />
|
||||
<el-form-item label="场地状态" prop="siteStatus">
|
||||
<el-radio-group v-model="form.siteStatus">
|
||||
<el-radio :label="1">可用</el-radio>
|
||||
<el-radio :label="0">停用</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="form.remark" placeholder="请输入备注" />
|
||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" maxlength="500" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
@@ -154,10 +127,10 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listSite, getSite, delSite, addSite, updateSite } from "@/api/train/site"
|
||||
import { listSite, getSite, addSite, updateSite } from '@/api/train/site'
|
||||
|
||||
export default {
|
||||
name: "Site",
|
||||
name: 'TrainingSite',
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
@@ -175,7 +148,7 @@ export default {
|
||||
// 实训场地表格数据
|
||||
siteList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
title: '',
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
@@ -185,20 +158,30 @@ export default {
|
||||
siteName: null,
|
||||
siteLocation: null,
|
||||
capacity: null,
|
||||
siteDevice: null,
|
||||
siteStatus: null,
|
||||
createUser: null,
|
||||
siteStatus: null
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
siteName: [
|
||||
{ required: true, message: "实训场地名称不能为空", trigger: "blur" }
|
||||
],
|
||||
createUser: [
|
||||
{ required: true, message: "创建管理员账号不能为空", trigger: "blur" }
|
||||
{ required: true, message: '实训场地名称不能为空', trigger: 'blur' }
|
||||
],
|
||||
capacity: [
|
||||
{ required: true, message: '最大容纳人数不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === undefined || value === null || value === '') {
|
||||
callback(new Error('最大容纳人数不能为空'))
|
||||
} else if (Number(value) <= 0) {
|
||||
callback(new Error('最大容纳人数必须大于0'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: ['blur', 'change']
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -226,15 +209,12 @@ export default {
|
||||
siteId: null,
|
||||
siteName: null,
|
||||
siteLocation: null,
|
||||
capacity: null,
|
||||
capacity: 30,
|
||||
siteDevice: null,
|
||||
siteStatus: null,
|
||||
createUser: null,
|
||||
createTime: null,
|
||||
updateTime: null,
|
||||
siteStatus: 1,
|
||||
remark: null
|
||||
}
|
||||
this.resetForm("form")
|
||||
this.resetForm('form')
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
@@ -243,20 +223,20 @@ export default {
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm")
|
||||
this.resetForm('queryForm')
|
||||
this.handleQuery()
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.siteId)
|
||||
this.single = selection.length!==1
|
||||
this.single = selection.length !== 1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset()
|
||||
this.open = true
|
||||
this.title = "添加实训场地"
|
||||
this.title = '添加实训场地'
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
@@ -265,44 +245,28 @@ export default {
|
||||
getSite(siteId).then(response => {
|
||||
this.form = response.data
|
||||
this.open = true
|
||||
this.title = "修改实训场地"
|
||||
this.title = '修改实训场地'
|
||||
})
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
this.$refs['form'].validate(valid => {
|
||||
if (valid) {
|
||||
if (this.form.siteId != null) {
|
||||
updateSite(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功")
|
||||
this.$modal.msgSuccess('修改成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
} else {
|
||||
addSite(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功")
|
||||
this.$modal.msgSuccess('新增成功')
|
||||
this.open = false
|
||||
this.getList()
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const siteIds = row.siteId || this.ids
|
||||
this.$modal.confirm('是否确认删除实训场地编号为"' + siteIds + '"的数据项?').then(function() {
|
||||
return delSite(siteIds)
|
||||
}).then(() => {
|
||||
this.getList()
|
||||
this.$modal.msgSuccess("删除成功")
|
||||
}).catch(() => {})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('train/site/export', {
|
||||
...this.queryParams
|
||||
}, `site_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
# ISSUE-01-04 教学空间资源维护开发验收文档 (Contract V1.0.2 CG-05 闭环版)
|
||||
|
||||
## 1. 任务概述与环境基线
|
||||
|
||||
- **任务 ID:** `ISSUE-01-04`
|
||||
- **任务名称:** 教学空间资源维护(普通教室与实训场地)
|
||||
- **所属 Epic:** `EPIC-01 基础主数据必要集合`
|
||||
- **工作区目录:** `/Users/wzb/Desktop/项目/RailwaySystem-worktrees/issue-01-04-space`
|
||||
- **当前分支:** `feat/issue-01-04-space`
|
||||
- **基线 Commit:** `7fcaea29b8810546fd972ba0c9d366c71a357d63` (issues-v1.0)
|
||||
- **API 契约基准:** `api-v2-contract-v1.0.2` (`a979c02841b7b0f8b00c45a67c07a915fc668413`)(Contract Gate 已正式解除)
|
||||
- **数据库基线:** Database V2 (`train_classroom_info`, `train_training_site`)
|
||||
- **Generator 状态:** `GENERATOR SLOT = SPACE (受控 Pilot 已完成,PASS)`(完成 `train_classroom_info` 与 `train_training_site` 双阶段元数据导入与沙箱预览,严禁覆盖源码,零迁移 generated artifact)
|
||||
- **核心业务目标:** 建立普通教室 (`Classroom`) 与专业实训场地 (`TrainingSite`) 的主数据档案,保证物理主键标识(`classRoomId`, `siteId`)的稳定性与唯一性,为后续排课冲突检测与课表编排提供可靠实体空间校验支撑。
|
||||
|
||||
---
|
||||
|
||||
## 2. HTTP Endpoint 最终收口与物理映射
|
||||
|
||||
严格依照冻结契约 `docs/api-v2/02_module_a_base_resource_api.md` 4.1 与 4.2 节收口 Controller 公开接口,**非冻结接口全部从 Controller 移除,不再对外公开**:
|
||||
|
||||
### 2.1 Classroom 最终物理 Endpoint 完整列表(共 4 个)
|
||||
| 优先级 | HTTP Method | URI 路径 | Controller 方法 | 权限字符 | 适用角色 | 契约对齐说明 |
|
||||
|:---|:---|:---|:---|:---|:---|:---|
|
||||
| **P0** | `GET` | `/train/classroom/list` | `list(TrainClassroomInfo)` | `train:classroom:list` | 管理员, 教师 | 分页查询教室列表 |
|
||||
| **P0** | `GET` | `/train/classroom/{classRoomId}` | `getInfo(@PathVariable)` | `train:classroom:list` | 管理员, 教师 | 获取教室详情(返回 ClassroomDetailVO) |
|
||||
| **P0** | `POST` | `/train/classroom` | `add(@Validated @RequestBody)` | `train:classroom:edit` | 管理员 | 新增教室(校验 capacity > 0,名称预查重) |
|
||||
| **P1** | `PUT` | `/train/classroom/{classRoomId}` | `edit(@PathVariable, @Validated @RequestBody)` | `train:classroom:edit` | 管理员 | 修改教室信息 |
|
||||
|
||||
*已彻底从 Controller 移除的非公开方法:*
|
||||
- `PUT /train/classroom`(无 Path ID 的修改映射已删除)
|
||||
- `DELETE /train/classroom/{classRoomIds}`(已从 Controller 移除,底层逻辑删除能力保留于 Service/Mapper)
|
||||
- `POST /train/classroom/export`(已从 Controller 移除)
|
||||
|
||||
### 2.2 TrainingSite 最终物理 Endpoint 完整列表(共 4 个)
|
||||
| 优先级 | HTTP Method | URI 路径 | Controller 方法 | 权限字符 | 适用角色 | 契约对齐说明 |
|
||||
|:---|:---|:---|:---|:---|:---|:---|
|
||||
| **P0** | `GET` | `/train/training-site/list` | `list(TrainTrainingSite)` | `train:site:list` | 管理员, 教师 | 分页查询实训场地列表 |
|
||||
| **P0** | `GET` | `/train/training-site/{siteId}` | `getInfo(@PathVariable)` | `train:site:list` | 管理员, 教师 | 获取实训场地详情 |
|
||||
| **P0** | `POST` | `/train/training-site` | `add(@Validated @RequestBody)` | `train:site:edit` | 管理员 | 新增实训场地(校验 capacity > 0,名称预查重) |
|
||||
| **P1** | `PUT` | `/train/training-site/{siteId}` | `edit(@PathVariable, @Validated @RequestBody)` | `train:site:edit` | 管理员 | 修改实训场地信息 |
|
||||
|
||||
*已彻底从 Controller 移除的非公开方法:*
|
||||
- `PUT /train/training-site`(无 Path ID 的修改映射已删除)
|
||||
- `DELETE /train/training-site/{siteIds}`(已从 Controller 移除,底层逻辑删除能力保留于 Service/Mapper)
|
||||
- `POST /train/training-site/export`(已从 Controller 移除)
|
||||
|
||||
---
|
||||
|
||||
## 3. CG-05 落地实现与响应模型收口 (API Contract V1.0.2)
|
||||
|
||||
### 3.1 新增轻量班牌摘要视图:`ClassroomBoardSummaryVO`
|
||||
依据 API Contract V1.0.2 (`06_dto_vo_catalog.md` 1.11 节):
|
||||
- 仅且只包含 3 个字段:
|
||||
- `boardId` (String, 系统内部稳定班牌ID)
|
||||
- `boardSn` (String, 设备硬件序列号)
|
||||
- `boardStatus` (Integer, 班牌状态:0离线 1在线)
|
||||
- 彻底避免向前端泄漏 `TrainElectronicBoard` 持久化 Domain 实体字段。
|
||||
|
||||
### 3.2 `ClassroomDetailVO` 完整字段列表
|
||||
- `classRoomId` (String, 教室ID)
|
||||
- `roomName` (String, 教室名称)
|
||||
- `roomLocation` (String, 教室物理位置)
|
||||
- `capacity` (Long, 核定容纳人数)
|
||||
- `roomStatus` (Integer, 教室状态:0正在使用 1可用空闲 2维护中)
|
||||
- `remark` (String, 备注)
|
||||
- `createTime` (Date, 创建时间)
|
||||
- `boards` (`List<ClassroomBoardSummaryVO>`, 绑定的班牌摘要列表)
|
||||
- 严格遵循 0..N 语义;
|
||||
- **无绑定班牌时返回 `boards = []`,绝不返回 `null`**;
|
||||
- 绝不引入 `electronicBoard`、`primaryBoard`、`preferredBoard`,绝不假定“第一条就是默认班牌”。
|
||||
|
||||
### 3.3 详情查询装配逻辑
|
||||
在 `TrainClassroomInfoServiceImpl.selectClassroomDetailByClassRoomId` 中:
|
||||
1. 根据 `classRoomId` 查询单表持久化实体 `TrainClassroomInfo`;
|
||||
2. 依据 `bind_classroom_id = classRoomId` 检索 `train_electronic_board` 列表;
|
||||
3. 将班牌记录转换为轻量 `ClassroomBoardSummaryVO` 列表;若无记录则初始化为空列表 `[]`;
|
||||
4. 组装至 `ClassroomDetailVO.boards` 返回。
|
||||
|
||||
---
|
||||
|
||||
## 4. Contract Gap 处理结果
|
||||
|
||||
### 4.1 CG-04 (错误码 40008 / 40009 遗漏):已闭环
|
||||
- 在 API Contract V1.0.2 中,`docs/api-v2/10_permission_and_error_codes.md` 已正式补录:
|
||||
- `40008`:`CLASSROOM_NAME_DUPLICATED`(教室名称已存在)
|
||||
- `40009`:`SITE_NAME_DUPLICATED`(实训场地名称已存在)
|
||||
- 代码层 `TrainClassroomInfoServiceImpl` 与 `TrainTrainingSiteServiceImpl` 保持现有查重与抛错实现,Contract Gap 正式闭环消除。
|
||||
|
||||
### 4.2 CG-05 (教室详情班牌数据结构与基数未决):已闭环
|
||||
- 在 API Contract V1.0.2 中,`docs/api-v2/06_dto_vo_catalog.md` 明确定义了 `ClassroomBoardSummaryVO` 与 `List<ClassroomBoardSummaryVO> boards`(0..N 语义,空返回 `[]`)。
|
||||
- 代码层已严格按该定义实现,Contract Gap 正式闭环消除。
|
||||
|
||||
### 4.3 数据库名称唯一性并发边界记录
|
||||
- 在 Database V2 物理结构中,`train_classroom_info.room_name` 与 `train_training_site.site_name` **均无 UNIQUE 唯一约束**。
|
||||
- 当前查重为 Service 层的应用级预检查(`checkRoomNameUnique` / `checkSiteNameUnique`)。
|
||||
- **边界说明:** 在高并发写操作下,应用层预检查无法绝对保证无并发幻读重复写入,**并发强唯一性当前不保证**。本 Issue 遵守红线,未修改 Database V2。
|
||||
|
||||
---
|
||||
|
||||
## 5. 前端同步收口
|
||||
|
||||
- **`build_ui/src/api/train/classroom.js`**:
|
||||
- 删除了 `delClassroom` 与 `exportClassroom` 导出函数;
|
||||
- `updateClassroom` 请求路径收口为带有 Path ID 的 `PUT /train/classroom/{classRoomId}`。
|
||||
- **`build_ui/src/views/train/classroom/index.vue`**:
|
||||
- 删除了顶部批量删除与导出按钮;
|
||||
- 删除了表格操作列的删除按钮;
|
||||
- 删除了 `handleDelete` 与 `handleExport` 对应方法与未使用的 API 引用;
|
||||
- 表单编辑保存精准调用 `/train/classroom/{classRoomId}`。
|
||||
- **`build_ui/src/api/train/site.js`**:
|
||||
- 删除了 `delSite` 导出函数;
|
||||
- `updateSite` 请求路径收口为带有 Path ID 的 `PUT /train/training-site/{siteId}`。
|
||||
- **`build_ui/src/views/train/site/index.vue`**:
|
||||
- 删除了顶部批量删除与导出按钮;
|
||||
- 删除了表格操作列的删除按钮;
|
||||
- 删除了 `handleDelete` 与 `handleExport` 对应方法与未使用的 API 引用;
|
||||
- 表单编辑保存精准调用 `/train/training-site/{siteId}`。
|
||||
|
||||
---
|
||||
|
||||
## 6. 构建与工程验证结果
|
||||
|
||||
### 6.1 后端 Maven 编译验证
|
||||
- **命令:** `mvn compile -DskipTests -f RuoYi-Vue/pom.xml`
|
||||
- **构建结果:** `BUILD SUCCESS`(8 个模块全部成功,退出码 0)。
|
||||
|
||||
### 6.2 前端 ESLint 严格校验
|
||||
- **命令:**
|
||||
```bash
|
||||
cd build_ui
|
||||
/Users/wzb/Desktop/项目/RailwaySystem/build_ui/node_modules/.bin/eslint \
|
||||
--resolve-plugins-relative-to /Users/wzb/Desktop/项目/RailwaySystem/build_ui \
|
||||
--no-ignore \
|
||||
src/api/train/classroom.js \
|
||||
src/api/train/site.js \
|
||||
src/views/train/classroom/index.vue \
|
||||
src/views/train/site/index.vue
|
||||
```
|
||||
- **执行结果:** **PASS(0 errors, 0 warnings,退出码 0)**。
|
||||
|
||||
### 6.3 代码差异与规范检查
|
||||
- `git diff --check`:输出为空,退出码 0,无任何空白字符、CRLF 或冲突标记问题。
|
||||
- `git status --short`:严格收敛于本 Issue 范围内。
|
||||
|
||||
---
|
||||
|
||||
## 7. 受控 Generator Pilot 执行与元数据核验记录
|
||||
|
||||
在技术负责人正式释放 `GENERATOR SLOT = SPACE` 后,严格按照分阶段受控流程执行了双阶段 Pilot:
|
||||
|
||||
### 7.1 第一阶段:`train_classroom_info` Pilot
|
||||
1. **备份表隔离前置检查:**
|
||||
- 调用 `genTableService.selectDbTableList`,匹配 `bak_v1_*` 的表数量为 **0**,确认历史快照备份表完全隔离不可见,无误选风险。
|
||||
2. **单表严格导入:**
|
||||
- 仅且唯独选择 `train_classroom_info` 单表导入,成功写入 `gen_table`(分配 `table_id = 4`)及 `gen_table_column`(共 11 列元数据)。
|
||||
3. **主键列与状态列元数据核验:**
|
||||
- **主键 `class_room_id`:** `isPk = "1"`, `isIncrement = "0"`, `javaType = "String"`, `columnType = character varying(32)` -> **PASS**(准确识别为非自增 VARCHAR(32) 字符串主键)。
|
||||
- **状态 `room_status`:** `isPk = "0"`, `isIncrement = "0"`, `javaType = "Long"`, `columnType = smallint`。
|
||||
4. **沙箱目录隔离输出:**
|
||||
- 调用 `previewCode(4L)`,文件全部写入临时沙箱目录:`/tmp/railwaysystem-generator/issue-01-04-space/classroom/`。
|
||||
- 输出清单包括:`TrainClassroomInfo.java`、`TrainClassroomInfoMapper.java`、`ITrainClassroomInfoService.java`、`TrainClassroomInfoServiceImpl.java`、`TrainClassroomInfoController.java`、`TrainClassroomInfoMapper.xml`、`classroomMenu.sql`、`classroom.js`、`index.vue`。
|
||||
- **禁止覆盖原则:** 未向工程源码目录覆盖任何文件,零迁移 generated artifact。
|
||||
|
||||
### 7.2 第二阶段:`train_training_site` Pilot
|
||||
1. **备份表隔离前置检查:**
|
||||
- 匹配 `bak_v1_*` 的表数量为 **0**,无误选风险。
|
||||
2. **单表严格导入:**
|
||||
- 仅选择 `train_training_site` 单表导入,成功写入 `gen_table`(分配 `table_id = 5`)及 `gen_table_column`(共 12 列元数据)。
|
||||
3. **主键列与状态列元数据核验:**
|
||||
- **主键 `site_id`:** `isPk = "1"`, `isIncrement = "0"`, `javaType = "String"`, `columnType = character varying(32)` -> **PASS**(准确识别为非自增 VARCHAR(32) 字符串主键)。
|
||||
- **状态 `site_status`:** `isPk = "0"`, `isIncrement = "0"`, `javaType = "Long"`, `columnType = smallint`。
|
||||
4. **沙箱目录隔离输出:**
|
||||
- 调用 `previewCode(5L)`,文件全部写入临时沙箱目录:`/tmp/railwaysystem-generator/issue-01-04-space/site/`。
|
||||
- 输出清单包括:`TrainTrainingSite.java`、`TrainTrainingSiteMapper.java`、`ITrainTrainingSiteService.java`、`TrainTrainingSiteServiceImpl.java`、`TrainTrainingSiteController.java`、`TrainTrainingSiteMapper.xml`、`siteMenu.sql`、`site.js`、`index.vue`。
|
||||
- **禁止覆盖原则:** 未向工程源码目录覆盖任何文件,零迁移 generated artifact。
|
||||
|
||||
---
|
||||
|
||||
## 8. 三方比较矩阵 (Generated vs Existing vs API Contract V1.0.2) 与不迁移裁决
|
||||
|
||||
### 8.1 Classroom 三方比对与处理策略
|
||||
| 检查维度 | Generated (代码生成器输出) | Existing (现有实现) | API Contract V1.0.2 (正式契约) | 最终裁定与处理策略 |
|
||||
|:---|:---|:---|:---|:---|
|
||||
| **主键与类型** | `classRoomId` (String), `roomStatus` (Long), `capacity` (Long) | `classRoomId` (String), `roomStatus` (Integer), `capacity` (Long) | `classRoomId` (String, 32位), `roomStatus` (Integer), `capacity` (Long) | **KEEP Existing**<br>Existing 的 `roomStatus` 为 `Integer`,与 Contract 定义的 Integer/Number 契约完全吻合。 |
|
||||
| **Controller 路径与前缀** | `@RequestMapping("/system/info")`(默认系统模块名) | `@RequestMapping("/train/classroom")` | `/train/classroom/...` | **KEEP Existing**<br>Generated 路径前缀完全偏离业务契约,严禁覆盖。 |
|
||||
| **权限字符定义** | `@ss.hasPermi('system:info:list')` 等默认字符 | `@ss.hasPermi('train:classroom:list')`,`train:classroom:edit` | `train:classroom:list`,`train:classroom:edit` | **KEEP Existing**<br>Generated 权限字符错误,Existing 符合冻结权限表。 |
|
||||
| **DTO / VO 分层** | **完全无分层**(直接裸露持久化实体 `TrainClassroomInfo`) | 入参 `ClassroomCreateDTO`,出参 `ClassroomDetailVO` | 明确要求响应类型为 `ClassroomDetailVO` | **KEEP Existing**<br>架构级契约合规必需品,严禁退化回单实体架构。 |
|
||||
| **班牌摘要聚合 (CG-05)** | **完全缺失**(纯单表生成,无任何关联能力) | `ClassroomDetailVO.boards: List<ClassroomBoardSummaryVO>`(0..N 聚合,无绑定时返回 `[]`) | 详情响应必须包含 `boards: List<ClassroomBoardSummaryVO>` | **KEEP Existing**<br>核心业务与架构契约指标,Generated 无法提供。 |
|
||||
| **额外端点 (DELETE/export)** | 生成了未冻结的 `POST /export` 与 `DELETE /{classRoomIds}` 以及无 ID 的 PUT | 严格收敛为 4 个公开端点(P0: list, getInfo, add; P1: edit with ID),无 DELETE/export | 明确仅冻结 4 个端点,无 DELETE 与 export | **KEEP Existing**<br>坚决拒绝引入契约外暴露的破坏性物理删除与导出端点。 |
|
||||
| **Service 业务防御** | 纯调用 Mapper,无容量非正数拦截,无名称预查重 | 容量 `<= 0` 强校验拦截;`checkRoomNameUnique` 查重(40008);自动分配 32 位 UUID | 容量大于 0;同名校验(CG-04 40008) | **KEEP Existing**<br>Existing 承载了业务防御规则,保持现有实现。 |
|
||||
|
||||
### 8.2 TrainingSite 三方比对与处理策略
|
||||
| 检查维度 | Generated (代码生成器输出) | Existing (现有实现) | API Contract V1.0.2 (正式契约) | 最终裁定与处理策略 |
|
||||
|:---|:---|:---|:---|:---|
|
||||
| **主键与类型** | `siteId` (String), `siteStatus` (Long), `capacity` (Long) | `siteId` (String), `siteStatus` (Integer), `capacity` (Long) | `siteId` (String, 32位), `siteStatus` (Integer), `capacity` (Long) | **KEEP Existing**<br>`siteStatus` 保持 `Integer` 对齐契约。 |
|
||||
| **Controller 路径与前缀** | `@RequestMapping("/system/site")` | `@RequestMapping("/train/training-site")` | `/train/training-site/...` | **KEEP Existing**<br>Generated 路径错误,坚决不覆盖。 |
|
||||
| **权限字符定义** | `@ss.hasPermi('system:site:list')` 等默认字符 | `@ss.hasPermi('train:site:list')`,`train:site:edit` | `train:site:list`,`train:site:edit` | **KEEP Existing**<br>Existing 完全符合冻结契约。 |
|
||||
| **DTO / VO 分层** | **完全无分层**(直接裸露持久化实体 `TrainTrainingSite`) | 入参 `SiteCreateDTO`,出参 `SiteDetailVO` | 详情出参要求 `SiteDetailVO` | **KEEP Existing**<br>保留专用分层对象。 |
|
||||
| **额外端点 (DELETE/export)** | 生成了未冻结的 `POST /export` 与 `DELETE /{siteIds}` 以及无 ID 的 PUT | 严格收敛为 4 个公开端点(P0: list, getInfo, add; P1: edit with ID),无 DELETE/export | 明确仅冻结 4 个端点,无 DELETE 与 export | **KEEP Existing**<br>拒绝暴露契约外端点。 |
|
||||
| **Service 业务防御** | 纯调用 Mapper,无容量校验,无名称查重 | 容量 `<= 0` 强校验拦截;`checkSiteNameUnique` 查重(40009);自动分配 32 位 UUID | 容量大于 0;场地名称唯一性校验(CG-04 40009) | **KEEP Existing**<br>保留核心业务防御逻辑。 |
|
||||
|
||||
- **综合裁决结论:**
|
||||
本次受控 Pilot 充分证明 Kingbase 代码生成器底层对 `train_classroom_info` 与 `train_training_site` 的元数据读取、主键识别(`class_room_id` 与 `site_id` 均准确识别为非自增 String 主键)及 Velocity 模板渲染能力 100% 正常。
|
||||
鉴于现有实现已经严格按照 API Contract V1.0.2(包含 CG-04 与 CG-05)完成了精细化对齐,而 Generator 默认输出包含错误的路径前缀、错误的权限字符、未授权的 DELETE/export 端点且缺失 DTO/VO 分层与班牌聚合,因此**坚决不迁移任何 generated artifact,不覆盖现有任何工程源码**。生成文件仅作为临时沙箱比对凭证保留于 `/tmp/` 目录备查。
|
||||
|
||||
---
|
||||
|
||||
## 9. 数据库影响与写入核查声明
|
||||
|
||||
- **Generator 元数据记录:**
|
||||
- 成功向 `gen_table` 写入 2 条元数据记录:`train_classroom_info` (`table_id = 4`)、`train_training_site` (`table_id = 5`)。
|
||||
- 成功向 `gen_table_column` 写入 23 条列元数据(教室 11 列,场地 12 列)。
|
||||
- **业务数据库零写入:**
|
||||
- 未执行任何 `ALTER TABLE` / `CREATE TABLE` / `DROP TABLE` 等 DDL 语句。
|
||||
- 未执行任何 `IDENTITY` 变更或自增序列修正(未调用 `nextval` / `setval`)。
|
||||
- 未对 `train_classroom_info` 执行任何业务数据写入(行数保持精确为 0)。
|
||||
- 未对 `train_training_site` 执行任何业务数据写入(行数保持精确为 0)。
|
||||
- 未修改 Database V2 既有物理表结构,未修改 API Contract 冻结契约。
|
||||
Reference in new issue
Block a user