diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipVisitController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipVisitController.java new file mode 100644 index 00000000..b5da4fc6 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyInternshipVisitController.java @@ -0,0 +1,131 @@ +package org.dromara.zsjy.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipVisitVo; +import org.dromara.zsjy.service.IZsjyInternshipVisitService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 班主任走访Controller + * + * @author system + * @date 2025-01-03 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zsjy/internshipVisit") +@Tag(name = "班主任走访管理", description = "班主任走访管理") +public class ZsjyInternshipVisitController extends BaseController { + + private final IZsjyInternshipVisitService zsjyInternshipVisitService; + + /** + * 查询班主任走访列表 + */ + @Operation(summary = "查询班主任走访列表") + @SaCheckPermission("zsjy:internshipVisit:list") + @GetMapping("/list") + public TableDataInfo list(ZsjyInternshipVisitQueryBo bo, PageQuery pageQuery) { + return zsjyInternshipVisitService.queryPageList(bo, pageQuery); + } + + /** + * 导出班主任走访列表 + */ + @Operation(summary = "导出班主任走访列表") + @SaCheckPermission("zsjy:internshipVisit:export") + @Log(title = "班主任走访", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ZsjyInternshipVisitQueryBo bo, HttpServletResponse response) { + List list = zsjyInternshipVisitService.queryList(bo); + ExcelUtil.exportExcel(list, "班主任走访", ZsjyInternshipVisitVo.class, response); + } + + /** + * 获取班主任走访详细信息 + */ + @Operation(summary = "获取班主任走访详细信息") + @SaCheckPermission("zsjy:internshipVisit:query") + @GetMapping("/{visitId}") + @Parameters({ + @Parameter(name = "visitId", description = "走访记录ID", required = true) + }) + public R getInfo(@NotNull(message = "走访记录ID不能为空") + @PathVariable Long visitId) { + return R.ok(zsjyInternshipVisitService.queryById(visitId)); + } + + /** + * 新增班主任走访 + */ + @Operation(summary = "新增班主任走访") + @SaCheckPermission("zsjy:internshipVisit:add") + @Log(title = "班主任走访", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody ZsjyInternshipVisitBo bo) { + return toAjax(zsjyInternshipVisitService.insertByBo(bo)); + } + + /** + * 修改班主任走访 + */ + @Operation(summary = "修改班主任走访") + @SaCheckPermission("zsjy:internshipVisit:edit") + @Log(title = "班主任走访", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody ZsjyInternshipVisitBo bo) { + return toAjax(zsjyInternshipVisitService.updateByBo(bo)); + } + + /** + * 删除班主任走访 + */ + @Operation(summary = "删除班主任走访") + @SaCheckPermission("zsjy:internshipVisit:remove") + @Log(title = "班主任走访", businessType = BusinessType.DELETE) + @DeleteMapping("/{visitIds}") + @Parameters({ + @Parameter(name = "visitIds", description = "走访记录ID串", required = true) + }) + public R remove(@NotEmpty(message = "走访记录ID不能为空") + @PathVariable Long[] visitIds) { + return toAjax(zsjyInternshipVisitService.deleteWithValidByIds(List.of(visitIds), true)); + } + + /** + * 获取可选项列表(学生选择) + */ + @Operation(summary = "获取可选项列表") + @SaCheckPermission("zsjy:internshipVisit:list") + @GetMapping("/options") + public R> getOptions() { + List list = zsjyInternshipVisitService.getStudentOptions(); + return R.ok(list); + } +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipVisit.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipVisit.java new file mode 100644 index 00000000..b09fc6a7 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyInternshipVisit.java @@ -0,0 +1,173 @@ +package org.dromara.zsjy.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 班主任走访实体对象 zsjy_internship_visit + * + * @author system + * @date 2025-01-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("zsjy_internship_visit") +public class ZsjyInternshipVisit extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 走访记录ID + */ + @TableId(value = "visit_id", type = IdType.ASSIGN_ID) + private Long visitId; + + /** + * 租户ID + */ + @TableField("tenant_id") + private String tenantId; + + /** + * 实习ID + */ + @TableField("internship_id") + private Long internshipId; + + /** + * 学生ID + */ + @TableField("student_id") + private Long studentId; + + /** + * 企业名称 + */ + @TableField("company_name") + private String companyName; + + /** + * 企业地址 + */ + @TableField("company_address") + private String companyAddress; + + /** + * 走访时间 + */ + @TableField("visit_date") + private Date visitDate; + + /** + * 走访人员 + */ + @TableField("visitor_name") + private String visitorName; + + /** + * 走访人员职务 + */ + @TableField("visitor_position") + private String visitorPosition; + + /** + * 走访目的 + */ + @TableField("visit_purpose") + private String visitPurpose; + + /** + * 企业情况 + */ + @TableField("company_situation") + private String companySituation; + + /** + * 学生表现 + */ + @TableField("student_performance") + private String studentPerformance; + + /** + * 发现问题 + */ + @TableField("problems_found") + private String problemsFound; + + /** + * 改进建议 + */ + @TableField("suggestions") + private String suggestions; + + /** + * 走访总结 + */ + @TableField("visit_summary") + private String visitSummary; + + /** + * 现场照片(JSON格式) + */ + @TableField("visit_images") + private String visitImages; + + /** + * 走访文件附件(JSON格式) + */ + @TableField("visit_files") + private String visitFiles; + + /** + * 走访状态:数据库存储数字编码(0-草稿 1-已提交 2-已审核) + */ + @TableField("status") + private String status; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + // ==================== 扩展字段(数据库中不存在,通过关联查询获取) ==================== + + /** + * 学生姓名 (通过student_id关联查询获取) + */ + @TableField(exist = false) + private String studentName; + + /** + * 学号 (通过student_id关联查询获取) + */ + @TableField(exist = false) + private String studentNumber; + + /** + * 班级名称 (通过student_id关联查询获取) + */ + @TableField(exist = false) + private String className; + + /** + * 专业名称 (通过student_id关联查询获取) + */ + @TableField(exist = false) + private String majorName; + + /** + * 学院名称 (通过student_id关联查询获取) + */ + @TableField(exist = false) + private String collegeName; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitBo.java new file mode 100644 index 00000000..32272bb0 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitBo.java @@ -0,0 +1,131 @@ +package org.dromara.zsjy.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.zsjy.domain.ZsjyInternshipVisit; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import java.util.Date; + +/** + * 班主任走访业务对象 ZsjyInternshipVisitBo + * + * @author system + * @date 2025-01-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = ZsjyInternshipVisit.class, reverseConvertGenerate = false) +public class ZsjyInternshipVisitBo extends BaseEntity { + + /** + * 走访记录ID + */ + @NotNull(message = "走访记录ID不能为空", groups = { EditGroup.class }) + private Long visitId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 实习ID + */ + @NotNull(message = "实习ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long internshipId; + + /** + * 学生ID + */ + @NotNull(message = "学生ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long studentId; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 企业地址 + */ + private String companyAddress; + + /** + * 走访时间 + */ + @NotNull(message = "走访时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date visitDate; + + /** + * 走访人员 + */ + @NotBlank(message = "走访人员不能为空", groups = { AddGroup.class, EditGroup.class }) + private String visitorName; + + /** + * 走访人员职务 + */ + private String visitorPosition; + + /** + * 走访目的 + */ + @NotBlank(message = "走访目的不能为空", groups = { AddGroup.class, EditGroup.class }) + private String visitPurpose; + + /** + * 企业情况 + */ + private String companySituation; + + /** + * 学生表现 + */ + private String studentPerformance; + + /** + * 发现问题 + */ + private String problemsFound; + + /** + * 改进建议 + */ + private String suggestions; + + /** + * 走访总结 + */ + private String visitSummary; + + /** + * 现场照片(JSON格式) + */ + private String visitImages; + + /** + * 走访文件附件(JSON格式) + */ + private String visitFiles; + + /** + * 走访状态:数据库存储数字编码(0-草稿 1-已提交 2-已审核) + */ + @Pattern(regexp = "^[0-2]$", + message = "走访状态只能是:0(草稿)、1(已提交)、2(已审核)", + groups = { AddGroup.class, EditGroup.class }) + private String status; + + /** + * 备注 + */ + private String remark; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitQueryBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitQueryBo.java new file mode 100644 index 00000000..8c656c92 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyInternshipVisitQueryBo.java @@ -0,0 +1,86 @@ +package org.dromara.zsjy.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 班主任走访查询业务对象 ZsjyInternshipVisitQueryBo + * + * @author system + * @date 2025-01-03 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "班主任走访查询业务对象") +public class ZsjyInternshipVisitQueryBo extends BaseEntity { + + /** + * 走访记录ID + */ + @Schema(description = "走访记录ID") + private Long visitId; + + /** + * 实习ID + */ + @Schema(description = "实习ID") + private Long internshipId; + + /** + * 学生ID + */ + @Schema(description = "学生ID") + private Long studentId; + + /** + * 学生姓名 + */ + @Schema(description = "学生姓名") + private String studentName; + + /** + * 学号 + */ + @Schema(description = "学号") + private String studentNumber; + + /** + * 班级名称 + */ + @Schema(description = "班级名称") + private String className; + + /** + * 企业名称 + */ + @Schema(description = "企业名称") + private String companyName; + + /** + * 走访人员 + */ + @Schema(description = "走访人员") + private String visitorName; + + /** + * 走访状态:数据库存储数字编码(0-草稿 1-已提交 2-已审核),前端通过字典显示为中文 + */ + @Schema(description = "走访状态") + private String status; + + /** + * 走访开始时间 + */ + @Schema(description = "走访开始时间") + private Date visitStartDate; + + /** + * 走访结束时间 + */ + @Schema(description = "走访结束时间") + private Date visitEndDate; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipVisitVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipVisitVo.java new file mode 100644 index 00000000..546dc88a --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyInternshipVisitVo.java @@ -0,0 +1,201 @@ +package org.dromara.zsjy.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.github.linpeilie.annotations.AutoMapper; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.dromara.zsjy.domain.ZsjyInternshipVisit; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 班主任走访视图对象 ZsjyInternshipVisitVo + * + * @author system + * @date 2025-01-03 + */ +@Data +@AutoMapper(target = ZsjyInternshipVisit.class) +@Schema(description = "班主任走访视图对象") +public class ZsjyInternshipVisitVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 走访记录ID + */ + @Schema(description = "走访记录ID") + private Long visitId; + + /** + * 租户编号 + */ + @Schema(description = "租户编号") + private String tenantId; + + /** + * 实习ID + */ + @Schema(description = "实习ID") + private Long internshipId; + + /** + * 学生ID + */ + @Schema(description = "学生ID") + private Long studentId; + + /** + * 企业名称 + */ + @Schema(description = "企业名称") + private String companyName; + + /** + * 企业地址 + */ + @Schema(description = "企业地址") + private String companyAddress; + + /** + * 走访时间 + */ + @Schema(description = "走访时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date visitDate; + + /** + * 走访人员 + */ + @Schema(description = "走访人员") + private String visitorName; + + /** + * 走访人员职务 + */ + @Schema(description = "走访人员职务") + private String visitorPosition; + + /** + * 走访目的 + */ + @Schema(description = "走访目的") + private String visitPurpose; + + /** + * 企业情况 + */ + @Schema(description = "企业情况") + private String companySituation; + + /** + * 学生表现 + */ + @Schema(description = "学生表现") + private String studentPerformance; + + /** + * 发现问题 + */ + @Schema(description = "发现问题") + private String problemsFound; + + /** + * 改进建议 + */ + @Schema(description = "改进建议") + private String suggestions; + + /** + * 走访总结 + */ + @Schema(description = "走访总结") + private String visitSummary; + + /** + * 现场照片(JSON格式) + */ + @Schema(description = "现场照片") + private String visitImages; + + /** + * 走访文件附件(JSON格式) + */ + @Schema(description = "走访文件附件") + private String visitFiles; + + /** + * 走访状态:数据库存储数字编码(0-草稿 1-已提交 2-已审核),前端通过字典显示为中文 + */ + @Schema(description = "走访状态") + private String status; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + + // ==================== 关联查询字段 ==================== + + /** + * 学生姓名 + */ + @Schema(description = "学生姓名") + private String studentName; + + /** + * 学号 + */ + @Schema(description = "学号") + private String studentNumber; + + /** + * 班级名称 + */ + @Schema(description = "班级名称") + private String className; + + /** + * 专业名称 + */ + @Schema(description = "专业名称") + private String majorName; + + /** + * 学院名称 + */ + @Schema(description = "学院名称") + private String collegeName; + + // ==================== 统一基础字段(强制性,避免MyBatis映射错误) ==================== + + /** + * 创建者 + */ + @Schema(description = "创建者") + private Long createBy; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + @Schema(description = "更新者") + private Long updateBy; + + /** + * 更新时间 + */ + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipVisitMapper.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipVisitMapper.java new file mode 100644 index 00000000..1475b578 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyInternshipVisitMapper.java @@ -0,0 +1,40 @@ +package org.dromara.zsjy.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zsjy.domain.ZsjyInternshipVisit; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipVisitVo; + +import java.util.List; + +/** + * 班主任走访Mapper接口 + * + * @author system + * @date 2025-01-03 + */ +public interface ZsjyInternshipVisitMapper extends BaseMapperPlus { + + /** + * 根据ID查询班主任走访详情(包含关联学生信息) + * @param visitId 走访记录ID + * @return 走访详情VO + */ + ZsjyInternshipVisitVo selectById(Long visitId); + + /** + * 查询班主任走访列表(包含关联学生信息) + * @param bo 查询条件 + * @return 走访记录列表 + */ + List queryList(ZsjyInternshipVisitQueryBo bo); + + /** + * 分页查询班主任走访列表(包含关联学生信息) + * @param page 分页参数 + * @param bo 查询条件 + * @return 走访记录分页结果 + */ + Page queryPageList(Page page, ZsjyInternshipVisitQueryBo bo); +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipVisitService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipVisitService.java new file mode 100644 index 00000000..f2d624aa --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyInternshipVisitService.java @@ -0,0 +1,54 @@ +package org.dromara.zsjy.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipVisitVo; + +import java.util.Collection; +import java.util.List; + +/** + * 班主任走访Service接口 + * + * @author system + * @date 2025-01-03 + */ +public interface IZsjyInternshipVisitService { + + /** + * 查询班主任走访 + */ + ZsjyInternshipVisitVo queryById(Long visitId); + + /** + * 查询班主任走访列表 + */ + TableDataInfo queryPageList(ZsjyInternshipVisitQueryBo bo, PageQuery pageQuery); + + /** + * 查询班主任走访列表 + */ + List queryList(ZsjyInternshipVisitQueryBo bo); + + /** + * 新增班主任走访 + */ + Boolean insertByBo(ZsjyInternshipVisitBo bo); + + /** + * 修改班主任走访 + */ + Boolean updateByBo(ZsjyInternshipVisitBo bo); + + /** + * 校验并批量删除班主任走访信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取学生选项列表(用于下拉选择) + */ + List getStudentOptions(); +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipVisitServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipVisitServiceImpl.java new file mode 100644 index 00000000..40fbfc66 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyInternshipVisitServiceImpl.java @@ -0,0 +1,116 @@ +package org.dromara.zsjy.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.zsjy.domain.ZsjyInternshipVisit; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitBo; +import org.dromara.zsjy.domain.bo.ZsjyInternshipVisitQueryBo; +import org.dromara.zsjy.domain.vo.ZsjyInternshipVisitVo; +import org.dromara.zsjy.mapper.ZsjyInternshipVisitMapper; +import org.dromara.zsjy.service.IZsjyInternshipVisitService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 班主任走访Service业务层处理 + * + * @author system + * @date 2025-01-03 + */ +@RequiredArgsConstructor +@Service +public class ZsjyInternshipVisitServiceImpl implements IZsjyInternshipVisitService { + + private final ZsjyInternshipVisitMapper baseMapper; + + /** + * 查询班主任走访 + */ + @Override + public ZsjyInternshipVisitVo queryById(Long visitId){ + return baseMapper.selectById(visitId); + } + + /** + * 查询班主任走访列表 + */ + @Override + public TableDataInfo queryPageList(ZsjyInternshipVisitQueryBo bo, PageQuery pageQuery) { + // 使用自定义分页查询方法获取包含学生信息的完整数据 + Page result = baseMapper.queryPageList(pageQuery.build(), bo); + return TableDataInfo.build(result); + } + + /** + * 查询班主任走访列表 + */ + @Override + public List queryList(ZsjyInternshipVisitQueryBo bo) { + // 使用自定义查询方法获取包含学生信息的完整数据 + return baseMapper.queryList(bo); + } + + /** + * 新增班主任走访 + */ + @Override + public Boolean insertByBo(ZsjyInternshipVisitBo bo) { + ZsjyInternshipVisit add = MapstructUtils.convert(bo, ZsjyInternshipVisit.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setVisitId(add.getVisitId()); + } + return flag; + } + + /** + * 修改班主任走访 + */ + @Override + public Boolean updateByBo(ZsjyInternshipVisitBo bo) { + ZsjyInternshipVisit update = MapstructUtils.convert(bo, ZsjyInternshipVisit.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(ZsjyInternshipVisit entity){ + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除班主任走访 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取学生选项列表(用于下拉选择) + */ + @Override + public List getStudentOptions() { + // TODO 实现获取有实习信息的学生列表 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(ZsjyInternshipVisit::getStudentId, ZsjyInternshipVisit::getInternshipId); + lqw.groupBy(ZsjyInternshipVisit::getStudentId); + return baseMapper.selectVoList(lqw); + } +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipVisitMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipVisitMapper.xml new file mode 100644 index 00000000..2e2e4270 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipVisitMapper.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + v.visit_id, + v.tenant_id, + v.internship_id, + v.student_id, + v.company_name, + v.company_address, + v.visit_date, + v.visitor_name, + v.visitor_position, + v.visit_purpose, + v.company_situation, + v.student_performance, + v.problems_found, + v.suggestions, + v.visit_summary, + v.visit_images, + v.visit_files, + v.status, + v.remark, + v.create_by, + v.create_time, + v.update_by, + v.update_time, + -- 关联查询学生信息 + s.name as student_name, + s.student_no as student_number, + s.class_name as class_name, + s.major_name as major_name, + s.college_name as college_name + from zsjy_internship_visit v + left join zsjy_internship_info ii on v.internship_id = ii.internship_id and ii.tenant_id = '000000' + left join xg_student_msg s on v.student_id = s.id and s.tenant_id = '000000' and s.deleted = 0 + + + + + + + + + diff --git a/web/src/api/zsjy/internshipVisit.ts b/web/src/api/zsjy/internshipVisit.ts new file mode 100644 index 00000000..a6a909f3 --- /dev/null +++ b/web/src/api/zsjy/internshipVisit.ts @@ -0,0 +1,85 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { InternshipVisitVO, InternshipVisitQuery, InternshipVisitAddBO, InternshipVisitEditBO } from '@/api/zsjy/types'; +import { TableDataInfo, R } from '@/api/types'; + +/** + * 查询班主任走访记录列表 + * @param query 查询参数 + */ +export const listInternshipVisit = (query?: InternshipVisitQuery): AxiosPromise> => { + return request({ + url: '/zsjy/internshipVisit/list', + method: 'get', + params: query + }); +}; + +/** + * 查询班主任走访记录详细信息 + * @param visitId 走访记录ID + */ +export const getInternshipVisit = (visitId: string | number): AxiosPromise> => { + return request({ + url: `/zsjy/internshipVisit/${visitId}`, + method: 'get' + }); +}; + +/** + * 新增班主任走访记录 + * @param data 走访记录信息 + */ +export const addInternshipVisit = (data: InternshipVisitAddBO): AxiosPromise> => { + return request({ + url: '/zsjy/internshipVisit', + method: 'post', + data: data + }); +}; + +/** + * 修改班主任走访记录 + * @param data 走访记录信息 + */ +export const updateInternshipVisit = (data: InternshipVisitEditBO): AxiosPromise> => { + return request({ + url: '/zsjy/internshipVisit', + method: 'put', + data: data + }); +}; + +/** + * 删除班主任走访记录 + * @param visitIds 走访记录ID + */ +export const delInternshipVisit = (visitIds: string | number | Array): AxiosPromise> => { + return request({ + url: `/zsjy/internshipVisit/${visitIds}`, + method: 'delete' + }); +}; + +/** + * 导出班主任走访记录列表 + * @param query 查询参数 + */ +export const exportInternshipVisit = (query: InternshipVisitQuery) => { + return request({ + url: '/zsjy/internshipVisit/export', + method: 'post', + data: query, + responseType: 'blob' + }); +}; + +/** + * 获取可选项列表(学生选择) + */ +export const getInternshipVisitOptions = (): AxiosPromise> => { + return request({ + url: '/zsjy/internshipVisit/options', + method: 'get' + }); +}; diff --git a/web/src/views/zsjy/internship/visit/index.vue b/web/src/views/zsjy/internship/visit/index.vue new file mode 100644 index 00000000..3392c16c --- /dev/null +++ b/web/src/views/zsjy/internship/visit/index.vue @@ -0,0 +1,1056 @@ + + + + +