diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java index 253d0f22..345ef357 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/controller/TeacherAssessmentController.java @@ -155,8 +155,8 @@ public class TeacherAssessmentController extends BaseController { */ @SaCheckPermission("bzrkh:teacherAssessment:detail") @GetMapping("/classStudentRecords") - public R getClassStudentRecords(@RequestParam Long classId) { - ClassStudentRecordsVo records = teacherAssessmentService.queryClassStudentRecords(classId); + public R getClassStudentRecords(@RequestParam Long classId, @RequestParam Long planId) { + ClassStudentRecordsVo records = teacherAssessmentService.queryClassStudentRecords(classId, planId); return R.ok(records); } diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java index 740c28d4..44f0bd48 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/mapper/TeacherAssessmentMapper.java @@ -12,6 +12,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -137,18 +138,30 @@ public interface TeacherAssessmentMapper extends BaseMapperPlus String selectClassNameById(@Param("classId") Long classId); /** - * 根据班级ID查询学生违纪记录 + * 根据班级ID和时间范围查询学生违纪记录 * - * @param classId 班级ID + * @param classId 班级ID + * @param startTime 数据提取开始时间 + * @param endTime 数据提取结束时间 * @return 学生违纪记录列表 */ - List selectStudentDisciplineRecordsByClassId(@Param("classId") Long classId); + List selectStudentDisciplineRecordsByClassIdAndTimeRange(@Param("classId") Long classId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); /** - * 根据班级ID查询学生奖励记录 + * 根据班级ID和时间范围查询学生奖励记录 * - * @param classId 班级ID + * @param classId 班级ID + * @param startTime 数据提取开始时间 + * @param endTime 数据提取结束时间 * @return 学生奖励记录列表 */ - List selectStudentRewardRecordsByClassId(@Param("classId") Long classId); + List selectStudentRewardRecordsByClassIdAndTimeRange(@Param("classId") Long classId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 根据计划ID查询数据提取时间范围 + * + * @param planId 计划ID + * @return 包含数据提取开始和结束时间的Map,key为startTime和endTime + */ + BmzrAssessmentPlanVo selectDataExtractTimeByPlanId(@Param("planId") Long planId); } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java index 251a7f76..a8e598bb 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/ITeacherAssessmentService.java @@ -99,7 +99,8 @@ public interface ITeacherAssessmentService { * 查询班级学生违纪记录和奖励记录 * * @param classId 班级ID + * @param planId 考核计划ID * @return 班级学生记录 */ - ClassStudentRecordsVo queryClassStudentRecords(Long classId); + ClassStudentRecordsVo queryClassStudentRecords(Long classId, Long planId); } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorServiceImpl.java index d450dc3e..83ac4f2e 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorServiceImpl.java @@ -73,7 +73,7 @@ public class BmzrAssessmentIndicatorServiceImpl implements IBmzrAssessmentIndica private LambdaQueryWrapper buildQueryWrapper(BmzrAssessmentIndicatorBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getIndicatorName()), BmzrAssessmentIndicator::getIndicatorName, bo.getIndicatorName()); - lqw.eq(StringUtils.isNotBlank(bo.getIndicatorCode()), BmzrAssessmentIndicator::getIndicatorCode, bo.getIndicatorCode()); + lqw.like(StringUtils.isNotBlank(bo.getIndicatorCode()), BmzrAssessmentIndicator::getIndicatorCode, bo.getIndicatorCode()); lqw.eq(StringUtils.isNotBlank(bo.getIndicatorType()), BmzrAssessmentIndicator::getIndicatorType, bo.getIndicatorType()); lqw.eq(bo.getParentId() != null, BmzrAssessmentIndicator::getParentId, bo.getParentId()); lqw.eq(StringUtils.isNotBlank(bo.getAllowSelfEvaluation()), BmzrAssessmentIndicator::getAllowSelfEvaluation, bo.getAllowSelfEvaluation()); diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorTypeServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorTypeServiceImpl.java index 0d5a2fe7..211d94b8 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorTypeServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentIndicatorTypeServiceImpl.java @@ -97,10 +97,10 @@ public class BmzrAssessmentIndicatorTypeServiceImpl implements IBmzrAssessmentIn log.info("添加指标类型名称模糊查询条件: {}", bo.getIndicatorTypeName()); } - // 指标类型编码精确查询 + // 指标类型编码模糊查询 if (StringUtils.isNotBlank(bo.getIndicatorTypeCode())) { - lqw.eq(BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode()); - log.info("添加指标类型编码精确查询条件: {}", bo.getIndicatorTypeCode()); + lqw.like(BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode()); + log.info("添加指标类型编码模糊查询条件: {}", bo.getIndicatorTypeCode()); } // 状态查询 @@ -121,7 +121,7 @@ public class BmzrAssessmentIndicatorTypeServiceImpl implements IBmzrAssessmentIn // 禁用逻辑删除过滤器,查询包含已删除的记录 lqw.in(BmzrAssessmentIndicatorType::getDeleted, 0, 1); lqw.like(StringUtils.isNotBlank(bo.getIndicatorTypeName()), BmzrAssessmentIndicatorType::getIndicatorTypeName, bo.getIndicatorTypeName()); - lqw.eq(StringUtils.isNotBlank(bo.getIndicatorTypeCode()), BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode()); + lqw.like(StringUtils.isNotBlank(bo.getIndicatorTypeCode()), BmzrAssessmentIndicatorType::getIndicatorTypeCode, bo.getIndicatorTypeCode()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), BmzrAssessmentIndicatorType::getStatus, bo.getStatus()); lqw.orderByAsc(BmzrAssessmentIndicatorType::getCreateTime); return lqw; diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentSchemeServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentSchemeServiceImpl.java index 28dd910b..82e0f822 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentSchemeServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/BmzrAssessmentSchemeServiceImpl.java @@ -75,8 +75,8 @@ public class BmzrAssessmentSchemeServiceImpl implements IBmzrAssessmentSchemeSer Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getSchemeName()), BmzrAssessmentScheme::getSchemeName, bo.getSchemeName()); - lqw.eq(StringUtils.isNotBlank(bo.getSchemeCode()), BmzrAssessmentScheme::getSchemeCode, bo.getSchemeCode()); - lqw.eq(StringUtils.isNotBlank(bo.getAcademicYear()), BmzrAssessmentScheme::getAcademicYear, bo.getAcademicYear()); + lqw.like(StringUtils.isNotBlank(bo.getSchemeCode()), BmzrAssessmentScheme::getSchemeCode, bo.getSchemeCode()); + lqw.like(StringUtils.isNotBlank(bo.getAcademicYear()), BmzrAssessmentScheme::getAcademicYear, bo.getAcademicYear()); lqw.eq(StringUtils.isNotBlank(bo.getSemester()), BmzrAssessmentScheme::getSemester, bo.getSemester()); lqw.eq(StringUtils.isNotBlank(bo.getSelfEvaluationRequired()), BmzrAssessmentScheme::getSelfEvaluationRequired, bo.getSelfEvaluationRequired()); lqw.eq(StringUtils.isNotBlank(bo.getSuperiorEvaluationRequired()), BmzrAssessmentScheme::getSuperiorEvaluationRequired, bo.getSuperiorEvaluationRequired()); diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java index d42f5e34..1e0eb5d2 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/java/org/dromara/bzrkh/service/impl/TeacherAssessmentServiceImpl.java @@ -665,18 +665,38 @@ public class TeacherAssessmentServiceImpl implements ITeacherAssessmentService { * 查询班级学生违纪记录和奖励记录 * * @param classId 班级ID + * @param planId 考核计划ID * @return 班级学生记录 */ @Override - public ClassStudentRecordsVo queryClassStudentRecords(Long classId) { + public ClassStudentRecordsVo queryClassStudentRecords(Long classId, Long planId) { // 查询班级信息 String className = teacherAssessmentMapper.selectClassNameById(classId); - // 查询班级学生违纪记录 - List disciplineRecords = teacherAssessmentMapper.selectStudentDisciplineRecordsByClassId(classId); + // 查询考核计划的数据提取时间范围 + BmzrAssessmentPlanVo plan = teacherAssessmentMapper.selectDataExtractTimeByPlanId(planId); + if (plan == null) { + throw new RuntimeException("考核计划不存在,计划ID:" + planId); + } - // 查询班级学生奖励记录 - List rewardRecords = teacherAssessmentMapper.selectStudentRewardRecordsByClassId(classId); + Date startTime = plan.getDataExtractStartTime(); + Date endTime = plan.getDataExtractEndTime(); + + List disciplineRecords = null; + List rewardRecords = null; + + // 如果设置了数据提取时间范围,按时间范围查询;否则查询所有记录 + if (startTime != null && endTime != null) { + // 查询指定时间范围内的班级学生违纪记录 + disciplineRecords = teacherAssessmentMapper.selectStudentDisciplineRecordsByClassIdAndTimeRange(classId, startTime, endTime); + + // 查询指定时间范围内的班级学生奖励记录 + rewardRecords = teacherAssessmentMapper.selectStudentRewardRecordsByClassIdAndTimeRange(classId, startTime, endTime); + } else { + // 如果没有设置时间范围,查询所有记录(兼容旧数据) + disciplineRecords = teacherAssessmentMapper.selectStudentDisciplineRecordsByClassIdAndTimeRange(classId, null, null); + rewardRecords = teacherAssessmentMapper.selectStudentRewardRecordsByClassIdAndTimeRange(classId, null, null); + } // 构建返回对象 ClassStudentRecordsVo result = new ClassStudentRecordsVo(); diff --git a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml index f6ca8ec7..26e64763 100644 --- a/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml +++ b/backend/ruoyi-modules/ruoyi-bzrkh/src/main/resources/mapper/bzrkh/TeacherAssessmentMapper.xml @@ -376,13 +376,13 @@ - - SELECT id, student_id, @@ -410,11 +410,15 @@ WHERE class_id = #{classId} AND deleted = 0 AND status = '1' + + AND discipline_date >= #{startTime} + AND discipline_date <= #{endTime} + ORDER BY discipline_date DESC - - SELECT id, student_id, @@ -441,7 +445,22 @@ WHERE class_id = #{classId} AND deleted = 0 AND status = '1' + + AND reward_date >= #{startTime} + AND reward_date <= #{endTime} + ORDER BY reward_date DESC + + + \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApplicationController.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApplicationController.java index 3ecb90ed..ad5df660 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApplicationController.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApplicationController.java @@ -27,6 +27,7 @@ import jakarta.servlet.http.HttpServletResponse; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; /** * 培训申请控制器 @@ -48,7 +49,7 @@ public class RsTrainingApplicationController extends BaseController { private ISysUserService sysUserService; /** - * 查询培训申请列表 + * 查询培训申请列表(供管理员和审批人使用) */ @SaCheckPermission("rs:trainingapplication:list") @GetMapping("/list") @@ -249,9 +250,31 @@ public class RsTrainingApplicationController extends BaseController { } /** - * 查询我的培训申请列表 + * 查询待审批的培训申请列表(供审批人使用) */ - @SaCheckPermission("rs:trainingapplication:list") + @SaCheckPermission("rs:trainingapproval:process") + @GetMapping("/pending/list") + public TableDataInfo pendingList(RsTrainingApplication application, PageQuery pageQuery) { + // 设置租户ID + if (application.getTenantId() == null || application.getTenantId().isEmpty()) { + application.setTenantId(LoginHelper.getTenantId()); + } + + // 只查询待审核状态的申请(排除已通过状态) + application.setExcludeStatus("1"); // 排除已通过状态 + + log.info("查询待审批培训申请列表 - 用户: {}, 角色: {}, 查询条件: {}", + LoginHelper.getUsername(), + StpUtil.getRoleList(), + application); + + return trainingApplicationService.selectPageRsTrainingApplicationList(application, pageQuery); + } + + /** + * 查询我的培训申请列表(供申请人使用) + */ + @SaCheckPermission("rs:trainingapplication:query") @GetMapping("/my") public TableDataInfo listMyApplications(RsTrainingApplication application, PageQuery pageQuery) { return trainingApplicationService.selectPageMyApplications(StpUtil.getLoginIdAsLong(), application, pageQuery); diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApprovalController.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApprovalController.java index 0b284cb7..f6af716c 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApprovalController.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingApprovalController.java @@ -40,7 +40,17 @@ public class RsTrainingApprovalController extends BaseController { */ @SaCheckPermission("rs:trainingapproval:list") @GetMapping("/list") - public TableDataInfo list(RsTrainingApproval approval, PageQuery pageQuery) { + public TableDataInfo list(RsTrainingApproval approval, PageQuery pageQuery, + @RequestParam(value = "courseName", required = false) String courseName, + @RequestParam(value = "userName", required = false) String userName) { + // 参数转换:将前端传递的参数名转换为后端Mapper期望的参数名 + if (courseName != null && !courseName.trim().isEmpty()) { + approval.setCourseTitle(courseName.trim()); + } + if (userName != null && !userName.trim().isEmpty()) { + approval.setApplicationUserName(userName.trim()); + } + // 使用带详细信息的查询方法,返回申请人姓名和课程名称 return trainingApprovalService.selectPageRsTrainingApprovalWithDetailsList(approval, pageQuery); } diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingRecordController.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingRecordController.java index 923eed17..26e2c0e2 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingRecordController.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsTrainingRecordController.java @@ -26,8 +26,8 @@ import java.util.Map; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.stp.StpUtil; import jakarta.servlet.http.HttpServletResponse; -import cn.dev33.satoken.annotation.SaCheckPermission; import org.dromara.rs.service.impl.RsTrainingRecordServiceImpl; +import lombok.extern.slf4j.Slf4j; /** * 培训记录控制器 @@ -35,6 +35,7 @@ import org.dromara.rs.service.impl.RsTrainingRecordServiceImpl; * @author weizzzz * @date 2025-07-16 */ +@Slf4j @RestController @RequestMapping("/rs/training/record") public class RsTrainingRecordController extends BaseController { @@ -51,6 +52,34 @@ public class RsTrainingRecordController extends BaseController { return trainingRecordService.selectPageRsTrainingRecordList(record, pageQuery); } + /** + * 测试培训地点搜索功能 + */ + @SaCheckPermission("rs:trainingrecord:list") + @GetMapping("/test-location") + public R> testLocationSearch(@RequestParam String location) { + log.info("测试培训地点搜索 - location参数: {}", location); + + // 创建查询对象 + RsTrainingRecord record = new RsTrainingRecord(); + record.setLocation(location); + + log.info("创建的查询对象 - location: {}", record.getLocation()); + + // 直接调用Mapper方法 + List list = trainingRecordService.selectRsTrainingRecordList(record); + + log.info("查询结果数量: {}", list.size()); + if (!list.isEmpty()) { + log.info("前3条记录的location值:"); + list.stream().limit(3).forEach(r -> + log.info(" - recordId: {}, location: {}", r.getRecordId(), r.getLocation()) + ); + } + + return R.ok(list); + } + /** * 导出培训记录列表 */ diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsJob.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsJob.java index b4041fc8..35989e42 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsJob.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsJob.java @@ -86,7 +86,7 @@ public class RsJob extends BaseEntity { * 浏览次数 */ @ExcelProperty(value = "浏览次数") - @TableField(value = "views") + @TableField(value = "view_count") private Integer viewCount; /** diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsTrainingApplication.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsTrainingApplication.java index 0dc6f2d6..9e5fb734 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsTrainingApplication.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/RsTrainingApplication.java @@ -118,4 +118,10 @@ public class RsTrainingApplication extends BaseEntity { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date rejectTime; + + /** + * 排除状态(查询时排除指定状态,不存储到数据库) + */ + @TableField(exist = false) + private String excludeStatus; } \ No newline at end of file diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApplicationServiceImpl.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApplicationServiceImpl.java index b7ff22ba..5b5c1d39 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApplicationServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApplicationServiceImpl.java @@ -84,6 +84,9 @@ public class RsTrainingApplicationServiceImpl implements IRsTrainingApplicationS } else if (StpUtil.hasRole("rs-admin")) { // 人事管理员可以看到所有申请(包括审批和部门管理功能) // 不设置额外过滤条件,让管理员能看到所有申请 + } else if (StpUtil.hasRole("rs-Approver")) { + // 审批人角色:可以看到所有申请(用于审批) + // 不设置过滤条件,允许查看所有申请 } else { // 默认情况:只能看到自己创建的申请 application.setCreateBy(currentUserId); @@ -196,6 +199,10 @@ public class RsTrainingApplicationServiceImpl implements IRsTrainingApplicationS lqw.eq(application.getStatus() != null, RsTrainingApplication::getStatus, application.getStatus()); lqw.like(application.getLocation() != null, RsTrainingApplication::getLocation, application.getLocation()); lqw.eq(application.getDuration() != null, RsTrainingApplication::getDuration, application.getDuration()); + // 课程名称搜索:搜索自定义课程名称字段 + lqw.like(application.getCourseName() != null, RsTrainingApplication::getCourseName, application.getCourseName()); + // 排除指定状态的条件(用于待审批接口) + lqw.ne(application.getExcludeStatus() != null, RsTrainingApplication::getStatus, application.getExcludeStatus()); return lqw; } diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApprovalServiceImpl.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApprovalServiceImpl.java index eb8b103b..8cae68fa 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApprovalServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingApprovalServiceImpl.java @@ -78,9 +78,9 @@ public class RsTrainingApprovalServiceImpl implements IRsTrainingApprovalService // 申请人只能看到与自己相关的审批记录 // 这里需要通过申请表关联查询 lqw.exists("SELECT 1 FROM rs_training_application app WHERE app.application_id = rs_training_approval.application_id AND app.user_id = " + currentUserId); - } else if (StpUtil.hasRole("rs-admin")) { - // 人事管理员可以看到所有审批记录 - // 不设置额外过滤条件,让管理员能看到所有审批 + } else if (StpUtil.hasRole("rs-admin") || StpUtil.hasRole("rs-Approver")) { + // 人事管理员和审批人可以看到所有审批记录 + // 不设置额外过滤条件,让管理员和审批人能看到所有审批 } else { // 默认情况:只能看到自己创建或处理的审批 lqw.and(wrapper -> wrapper.eq(RsTrainingApproval::getCreateBy, currentUserId) @@ -126,7 +126,15 @@ public class RsTrainingApprovalServiceImpl implements IRsTrainingApprovalService @Override public TableDataInfo selectPagePendingApprovals(Long approverId, RsTrainingApproval approval, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(approval); - lqw.eq(RsTrainingApproval::getApproverId, approverId); + + // 简化权限模型:审批人和管理员可以看到所有待审核记录 + if (StpUtil.hasRole("rs-admin") || StpUtil.hasRole("rs-Approver")) { + // 管理员和审批人可以看到所有待审核记录,不限制approverId + } else { + // 其他角色只能看到指派给自己的待审核记录 + lqw.eq(RsTrainingApproval::getApproverId, approverId); + } + lqw.eq(RsTrainingApproval::getStatus, "0"); // 待审核状态 com.baomidou.mybatisplus.extension.plugins.pagination.Page page = trainingApprovalMapper.selectPage(pageQuery.build(), lqw); return TableDataInfo.build(page); diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingRecordServiceImpl.java b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingRecordServiceImpl.java index 194ac935..88119a30 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingRecordServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/service/impl/RsTrainingRecordServiceImpl.java @@ -21,6 +21,8 @@ import org.slf4j.LoggerFactory; import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.dromara.common.satoken.utils.LoginHelper; +import cn.dev33.satoken.stp.StpUtil; /** * 培训记录服务实现类 @@ -61,9 +63,49 @@ public class RsTrainingRecordServiceImpl implements IRsTrainingRecordService, Ap */ @Override public TableDataInfo selectPageRsTrainingRecordList(RsTrainingRecord record, PageQuery pageQuery) { + // ===== 调试日志:检查location参数 ===== + log.info("培训记录查询参数 - location: {}", record.getLocation()); + log.info("培训记录查询参数 - courseName: {}", record.getCourseName()); + log.info("培训记录查询参数 - department: {}", record.getDepartment()); + + // ===== 业务逻辑层权限过滤 ===== + // 根据用户角色进行数据权限过滤 + if (!LoginHelper.isSuperAdmin()) { + // 获取当前登录用户信息 + Long currentUserId = LoginHelper.getUserId(); + + // 检查用户角色并应用相应的数据过滤 + if (StpUtil.hasRole("rs-Applicant")) { + // 申请人只能看到自己的培训记录 + record.setUserId(currentUserId); + } else if (StpUtil.hasRole("rs-admin")) { + // 人事管理员可以看到所有培训记录 + // 不设置额外过滤条件,让管理员能看到所有记录 + } else if (StpUtil.hasRole("rs-Approver")) { + // 审批人角色:可以看到所有培训记录(用于管理) + // 不设置过滤条件,允许查看所有记录 + } else { + // 默认情况:只能看到自己的培训记录 + record.setUserId(currentUserId); + } + } + + // ===== 调试日志:检查权限过滤后的参数 ===== + log.info("权限过滤后 - location: {}", record.getLocation()); + log.info("权限过滤后 - userId: {}", record.getUserId()); + // 使用手动分页方式,参考培训申请的实现 List allList = trainingRecordMapper.selectRsTrainingRecordList(record); + // ===== 调试日志:检查查询结果 ===== + log.info("查询结果总数: {}", allList.size()); + if (!allList.isEmpty() && record.getLocation() != null && !record.getLocation().isEmpty()) { + long matchCount = allList.stream() + .filter(r -> r.getLocation() != null && r.getLocation().contains(record.getLocation())) + .count(); + log.info("包含location[{}]的记录数: {}", record.getLocation(), matchCount); + } + // 创建分页对象 Page page = pageQuery.build(); long current = page.getCurrent(); diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApplicationMapper.xml b/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApplicationMapper.xml index d8bff300..965aa2f5 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApplicationMapper.xml +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApplicationMapper.xml @@ -60,6 +60,16 @@ and a.tenant_id = #{tenantId} and a.location like concat('%', #{location}, '%') and a.duration = #{duration} + + + and ( + (a.course_id = 0 and a.course_name like concat('%', #{courseName}, '%')) + or + (a.course_id != 0 and c.title like concat('%', #{courseName}, '%')) + ) + + + and a.status != #{excludeStatus} ORDER BY a.create_time DESC @@ -80,6 +90,18 @@ and a.apply_time = #{app.applyTime} and a.current_approver = #{app.currentApprover} and a.tenant_id = #{app.tenantId} + and a.location like concat('%', #{app.location}, '%') + and a.duration = #{app.duration} + + + and ( + (a.course_id = 0 and a.course_name like concat('%', #{app.courseName}, '%')) + or + (a.course_id != 0 and c.title like concat('%', #{app.courseName}, '%')) + ) + + + and a.status != #{app.excludeStatus} ORDER BY a.create_time DESC LIMIT #{offset}, #{limit} diff --git a/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingRecordMapper.xml b/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingRecordMapper.xml index 0572d2ad..d26766c6 100644 --- a/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingRecordMapper.xml +++ b/backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingRecordMapper.xml @@ -60,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and r.completion_status = #{completionStatus} and r.status = #{status} and r.department like concat('%', #{department}, '%') + and r.location like concat('%', #{location}, '%') and date_format(r.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') and date_format(r.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') diff --git a/docs/开发文档/API/物业报修管理API.md b/docs/开发文档/API/物业报修管理API.md deleted file mode 100644 index ddae470c..00000000 --- a/docs/开发文档/API/物业报修管理API.md +++ /dev/null @@ -1,670 +0,0 @@ -# 物业报修管理 API - -## 📋 文档说明 - -本文档记录物业报修管理相关 API 接口,包括维修分类管理、报修工单管理、工单进度跟踪等功能。 - -**依赖文档**: 请先阅读 [API 文档基础规范.md](./API文档基础规范.md) 了解通用规范。 - ---- - -## 🔧 维修分类管理 - -### 查询维修分类列表 - -**接口地址**: `GET /hq/pm/repairCategory/list` - -**接口描述**: 分页查询维修分类列表,支持权限过滤 - -**权限要求**: `pm:category:list` - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | -| ------------ | ------ | ---- | --------------------- | -| pageNum | int | 否 | 页码,默认 1 | -| pageSize | int | 否 | 页大小,默认 10 | -| categoryName | string | 否 | 分类名称 | -| categoryCode | string | 否 | 分类编码 | -| parentId | long | 否 | 父级分类 ID | -| skillLevel | string | 否 | 技能等级要求 | -| status | string | 否 | 状态(0-停用,1-正常) | - -**响应示例**: - -```json -{ - "total": 6, - "rows": [ - { - "id": 1, - "categoryName": "电路维修", - "categoryCode": "ELECTRIC", - "categoryDescription": "电路、照明、开关、插座等电气设备维修", - "parentId": 0, - "ancestorIds": "0", - "levelDepth": 1, - "childrenCount": 0, - "requiredSkills": "电工技能、安全操作", - "skillLevel": "2", - "estimatedDuration": 120, - "standardCost": 200.0, - "iconUrl": null, - "colorCode": "#FF6B35", - "sortOrder": 1, - "status": "1", - "usageCount": 0, - "lastUsedTime": null, - "remark": null, - "createTime": "2025-01-23 14:30:00" - } - ], - "code": 200, - "msg": "查询成功" -} -``` - -### 获取维修分类树形结构 - -**接口地址**: `GET /hq/pm/repairCategory/tree` - -**接口描述**: 获取维修分类的树形结构数据 - -**权限要求**: `pm:category:tree` - -**请求参数**: 无 - -**响应示例**: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": [ - { - "id": 1, - "categoryName": "电路维修", - "categoryCode": "ELECTRIC", - "categoryDescription": "电路、照明、开关、插座等电气设备维修", - "parentId": 0, - "children": [] - } - ] -} -``` - -### 获取维修分类下拉选项 - -**接口地址**: `GET /hq/pm/repairCategory/options` - -**接口描述**: 获取维修分类的下拉选项数据,用于表单选择器 - -**权限要求**: `pm:category:list` - -**请求参数**: 无 - -**响应示例**: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": [ - { - "value": 1, - "label": "电路维修" - }, - { - "value": 2, - "label": "水管维修" - }, - { - "value": 3, - "label": "门窗维修" - } - ] -} -``` - -**数据格式说明**: - -- **value**: 分类 ID,用于表单提交 -- **label**: 分类名称,用于显示 -- **扁平化处理**: 将树形结构扁平化,便于下拉选择 - -**使用场景**: - -- 报修工单创建时选择维修类型 -- 表单编辑时的分类选择 -- 搜索条件中的分类筛选 - -### 获取维修分类详情 - -**接口地址**: `GET /hq/pm/repairCategory/{id}` - -**接口描述**: 根据 ID 获取维修分类详细信息 - -**权限要求**: `pm:category:query` - -**路径参数**: - -| 参数名 | 类型 | 必填 | 说明 | -| ------ | ---- | ---- | ------- | -| id | long | 是 | 分类 ID | - -### 新增维修分类 - -**接口地址**: `POST /hq/pm/repairCategory` - -**接口描述**: 创建新的维修分类 - -**权限要求**: `pm:category:add` - -**请求参数**: - -```json -{ - "categoryName": "测试维修类型", - "categoryCode": "TEST_REPAIR", - "categoryDescription": "这是一个测试的维修类型", - "parentId": 0, - "skillLevel": "1", - "estimatedDuration": 60, - "standardCost": 100.0, - "colorCode": "#1890FF", - "sortOrder": 99, - "status": "1", - "remark": "测试数据" -} -``` - ---- - -## 🛠️ 报修工单管理 - -### 查询报修工单列表 - -**接口地址**: `GET /hq/pm/repairOrder/list` - -**接口描述**: 分页查询报修工单列表,支持多种条件筛选,根据用户角色进行数据权限过滤 - -**权限要求**: `pm:repairOrder:list` - -**数据权限说明**: - -- **超级管理员**: 可查看所有报修工单 -- **物业维修管理员** (role_key: property_maintenance_admin): 可查看所有报修工单 -- **维修人员** (role_key: maintenance_worker): 只能查看自己创建的工单和分配给自己的工单 -- **普通用户**: 只能查看自己创建的工单 - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | -| --------------- | ------ | ---- | --------------- | -| pageNum | int | 否 | 页码,默认 1 | -| pageSize | int | 否 | 页大小,默认 10 | -| orderNo | string | 否 | 工单编号 | -| title | string | 否 | 报修标题 | -| repairLocation | string | 否 | 报修地点 | -| categoryId | long | 否 | 维修类型 ID | -| priorityLevel | int | 否 | 紧急程度 | -| reporterName | string | 否 | 报修人姓名 | -| reporterPhone | string | 否 | 报修人电话 | -| orderStatus | string | 否 | 工单状态 | -| assigneeId | long | 否 | 分派维修员 ID | -| assigneeName | string | 否 | 分派维修员姓名 | -| createTimeRange | array | 否 | 创建时间范围 | -| finishTimeRange | array | 否 | 完成时间范围 | - -**响应示例**: - -```json -{ - "total": 1, - "rows": [ - { - "id": "1939510596285673473", - "tenantId": "000000", - "orderNo": "RO202506300002", - "title": "详细测试工单 - 会议室投影仪故障", - "description": "会议室投影仪无法正常启动,显示器黑屏,影响会议正常进行。设备型号:EPSON EB-U05,购买时间:2023年6月。", - "repairLocation": "行政楼三楼305会议室", - "categoryId": 1, - "categoryName": "电路维修", - "priorityLevel": 2, - "expectedFinishTime": "2025-07-02 02:25:34", - "reporterId": 1, - "reporterName": "测试用户", - "reporterPhone": "13900139001", - "reporterDept": "信息技术部", - "orderStatus": "1", - "assignTime": null, - "assigneeId": null, - "assigneeName": null, - "assignRemark": null, - "startTime": null, - "finishTime": null, - "totalDuration": null, - "repairResult": null, - "usedMaterials": null, - "followSuggestions": null, - "evaluationScore": null, - "evaluationTime": null, - "attachmentCount": 0, - "progressCount": 1, - "cancelReason": null, - "remark": "设备在保修期内,请联系厂家技术支持", - "createTime": "2025-06-30 02:25:34", - "updateTime": "2025-06-30 02:25:34" - } - ], - "code": 200, - "msg": "查询成功" -} -``` - -### 生成工单编号 - -**接口地址**: `GET /hq/pm/repairOrder/generateOrderNo` - -**接口描述**: 自动生成报修工单编号 - -**权限要求**: 无需特殊权限 - -**请求参数**: 无 - -**响应示例**: - -```json -{ - "code": 200, - "msg": "RO202506300002", - "data": null -} -``` - -**说明**: 工单编号格式为`RO + 年月日 + 序号`,如`RO202506300002` - -### 获取报修统计数据 - -**接口地址**: `GET /hq/pm/repairOrder/statistics` - -**接口描述**: 获取报修工单的统计数据,用于仪表板展示 - -**权限要求**: `pm:repairOrder:statistics` - -**访问权限说明**: - -- **超级管理员**: 可以访问统计数据 -- **物业维修管理员** (role_key: property_maintenance_admin): 可以访问统计数据 -- **维修人员** (role_key: maintenance_worker): **无权限访问** -- **普通用户**: **无权限访问** - -**请求参数**: 无 - -**响应示例**: - -```json -{ - "code": 200, - "msg": "操作成功", - "data": { - "totalOrders": 156, - "pendingAssign": 23, - "inProgress": 45, - "completed": 88, - "cancelled": 0, - "avgProcessTime": 2.5, - "avgEvaluationScore": 4.3, - "monthlyNewOrders": 67, - "monthlyCompletedOrders": 52, - "statusDistribution": [ - { - "status": "待分派", - "count": 23, - "percentage": 14.7 - }, - { - "status": "进行中", - "count": 45, - "percentage": 28.8 - }, - { - "status": "已完成", - "count": 88, - "percentage": 56.4 - } - ], - "categoryDistribution": [ - { - "categoryName": "电路维修", - "count": 45, - "percentage": 28.8 - }, - { - "categoryName": "水管维修", - "count": 38, - "percentage": 24.4 - } - ], - "priorityDistribution": [ - { - "priorityLevel": 1, - "count": 12, - "percentage": 7.7 - }, - { - "priorityLevel": 2, - "count": 34, - "percentage": 21.8 - } - ] - } -} -``` - -**统计字段说明**: - -| 字段名 | 类型 | 说明 | -| ---------------------- | ----- | ---------------------- | -| totalOrders | int | 总工单数量 | -| pendingAssign | int | 待分派工单数 | -| inProgress | int | 进行中工单数 | -| completed | int | 已完成工单数 | -| cancelled | int | 已取消工单数 | -| avgProcessTime | float | 平均处理时长(小时) | -| avgEvaluationScore | float | 平均评价得分(1-5 分) | -| monthlyNewOrders | int | 本月新增工单数 | -| monthlyCompletedOrders | int | 本月完成工单数 | -| statusDistribution | array | 各状态分布统计 | -| categoryDistribution | array | 各类型分布统计 | -| priorityDistribution | array | 紧急程度分布统计 | - -### 分派工单 - -**接口地址**: `PUT /hq/pm/repairOrder/{orderId}/assign` - -**接口描述**: 分派工单给维修员 - -**权限要求**: `pm:repairOrder:assign` - -**路径参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ------- | ---- | ---- | ------- | ------ | -| orderId | Long | 是 | 工单 ID | 1 | - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ------------ | ------ | ---- | --------- | ---------- | -| assigneeId | Long | 是 | 维修员 ID | 2 | -| assignRemark | String | 否 | 分派备注 | "紧急处理" | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "分派成功", - "data": null -} -``` - -**错误码**: - -| 错误码 | 说明 | 解决方案 | -| ------ | ------------------ | ------------- | -| 400001 | 工单不存在 | 检查工单 ID | -| 400002 | 维修员不存在 | 检查维修员 ID | -| 400003 | 工单状态不允许分派 | 检查工单状态 | - -### 获取工单进度列表 - -**接口地址**: `GET /hq/pm/repairOrder/{orderId}/progress` - -**接口描述**: 获取指定工单的进度记录列表 - -**权限要求**: `pm:repairOrder:progress` - -**路径参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ------- | ---- | ---- | ------- | ------ | -| orderId | Long | 是 | 工单 ID | 1 | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "查询成功", - "data": [ - { - "id": 1, - "orderId": 1, - "progressType": "5", - "progressStatus": "正在维修", - "progressDetail": "已到达现场,开始检查设备", - "operatorId": 2, - "operatorName": "张维修", - "operatorRole": "worker", - "locationInfo": "教学楼A座301", - "estimatedDuration": 60, - "operationTime": "2025-06-30 14:30:00", - "nextStep": "更换零件", - "issuesEncountered": "发现零件老化", - "materialsNeeded": "电路板x1", - "remark": "需要采购新零件" - } - ] -} -``` - -### 更新维修进度 - -**接口地址**: `POST /hq/pm/repairOrder/progress` - -**接口描述**: 添加工单维修进度记录 - -**权限要求**: `pm:repairOrder:updateProgress` - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ----------------- | ------- | ---- | ---------------------------------------------------------------------------------------------------------------- | -------------------------- | -| orderId | Long | 是 | 工单 ID | 1 | -| progressType | String | 是 | 进度类型:1-工单分派,2-接收确认,3-到达现场,4-开始维修,5-进度更新,6-完成维修,7-用户评价,8-工单归档,9-其他 | "5" | -| progressStatus | String | 是 | 进度状态描述 | "正在维修" | -| progressDetail | String | 是 | 进度详细描述 | "已到达现场,开始检查设备" | -| locationInfo | String | 否 | 操作位置信息 | "教学楼 A 座 301" | -| estimatedDuration | Integer | 否 | 预计耗时(分钟) | 60 | -| nextStep | String | 否 | 下一步计划 | "更换零件" | -| issuesEncountered | String | 否 | 遇到的问题 | "发现零件老化" | -| materialsNeeded | String | 否 | 需要的材料 | "电路板 x1" | -| remark | String | 否 | 备注信息 | "需要采购新零件" | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "进度更新成功", - "data": null -} -``` - -### 完成工单 - -**接口地址**: `PUT /hq/pm/repairOrder/{orderId}/finish` - -**接口描述**: 完成工单维修,填写维修结果 - -**权限要求**: `pm:repairOrder:complete` - -**路径参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ------- | ---- | ---- | ------- | ------ | -| orderId | Long | 是 | 工单 ID | 1 | - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ----------------- | ------ | ---- | ------------ | -------------------------------- | -| repairResult | String | 是 | 维修结果描述 | "已更换故障电路板,设备恢复正常" | -| usedMaterials | String | 否 | 使用材料清单 | "电路板 x1, 螺丝 x4" | -| followSuggestions | String | 否 | 后续建议 | "建议定期检查电路板状态" | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "工单完成成功", - "data": null -} -``` - ---- - -## ⭐ 服务评价管理 - -### 创建服务评价 - -**接口地址**: `POST /hq/pm/repairOrder/evaluation` - -**接口描述**: 创建工单服务评价 - -**权限要求**: `pm:repairOrder:evaluate` - -**请求参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ---------------------- | ------- | ---- | -------------------------------------------------------------- | ---------------------------- | -| orderId | Long | 是 | 工单 ID | 1 | -| evaluatedWorkerId | Long | 是 | 被评价维修员 ID | 2 | -| overallScore | Number | 是 | 综合评价得分(1.0-5.0) | 4.5 | -| qualityScore | Number | 是 | 维修质量得分(1.0-5.0) | 4.8 | -| attitudeScore | Number | 是 | 服务态度得分(1.0-5.0) | 4.5 | -| responseSpeedScore | Number | 是 | 响应速度得分(1.0-5.0) | 4.2 | -| communicationScore | Number | 是 | 沟通效果得分(1.0-5.0) | 4.6 | -| evaluationContent | String | 是 | 文字评价内容 | "维修师傅技术过硬,态度很好" | -| satisfactionLevel | String | 是 | 满意度等级:1-非常满意,2-满意,3-一般,4-不满意,5-非常不满意 | "1" | -| isAnonymous | Integer | 否 | 是否匿名评价:0-否,1-是 | 0 | -| isPublic | Integer | 否 | 是否公开显示:0-否,1-是 | 1 | -| positiveTags | String | 否 | 正面标签 | "技术专业,态度友好" | -| negativeTags | String | 否 | 负面标签 | "" | -| improvementSuggestions | String | 否 | 改进建议 | "希望能提前通知到达时间" | -| remark | String | 否 | 备注信息 | "" | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "评价提交成功", - "data": null -} -``` - -### 获取工单评价 - -**接口地址**: `GET /hq/pm/repairOrder/{orderId}/evaluation` - -**接口描述**: 获取指定工单的服务评价信息 - -**权限要求**: `pm:repairOrder:query` - -**路径参数**: - -| 参数名 | 类型 | 必填 | 说明 | 示例值 | -| ------- | ---- | ---- | ------- | ------ | -| orderId | Long | 是 | 工单 ID | 1 | - -**响应示例**: - -```json -{ - "code": 200, - "msg": "查询成功", - "data": { - "id": 1, - "orderId": 1, - "evaluatorId": 3, - "evaluatorName": "张老师", - "evaluatedWorkerId": 2, - "evaluatedWorkerName": "张维修", - "overallScore": 4.5, - "qualityScore": 4.8, - "attitudeScore": 4.5, - "responseSpeedScore": 4.2, - "communicationScore": 4.6, - "evaluationContent": "维修师傅技术过硬,态度很好", - "satisfactionLevel": "1", - "isAnonymous": 0, - "isPublic": 1, - "positiveTags": "技术专业,态度友好", - "improvementSuggestions": "希望能提前通知到达时间", - "evaluationTime": "2025-06-30 16:30:00" - } -} -``` - ---- - -## 📊 数据字典 - -### 工单状态 - -| 值 | 说明 | 备注 | -| --- | ------ | ------------ | -| 1 | 待分派 | 已创建待分派 | -| 2 | 进行中 | 已分派进行中 | -| 3 | 已完成 | 维修完成 | -| 4 | 已取消 | 工单取消 | - -### 紧急程度 - -| 值 | 说明 | 备注 | -| --- | ---- | ------------ | -| 1 | 低 | 一般维修 | -| 2 | 中 | 较重要维修 | -| 3 | 高 | 紧急维修 | -| 4 | 紧急 | 非常紧急维修 | - -### 进度类型 - -| 值 | 说明 | 备注 | -| --- | -------- | -------------- | -| 1 | 工单分派 | 分派给维修员 | -| 2 | 接收确认 | 维修员确认接收 | -| 3 | 到达现场 | 到达维修现场 | -| 4 | 开始维修 | 开始进行维修 | -| 5 | 进度更新 | 维修进度更新 | -| 6 | 完成维修 | 维修工作完成 | -| 7 | 用户评价 | 用户评价完成 | -| 8 | 工单归档 | 工单归档完成 | -| 9 | 其他 | 其他操作 | - -### 满意度等级 - -| 值 | 说明 | 备注 | -| --- | ---------- | ---- | -| 1 | 非常满意 | 5 分 | -| 2 | 满意 | 4 分 | -| 3 | 一般 | 3 分 | -| 4 | 不满意 | 2 分 | -| 5 | 非常不满意 | 1 分 | - ---- - -## 📞 联系方式 - -如有物业报修相关问题,请联系开发团队或查看项目仓库的 Issues。 - ---- - -**📝 维护**: 物业报修管理 API 文档 -**🔄 更新**: 2025-07-01 -**�� 文件**: 物业报修管理 API.md diff --git a/mobile/src/pages/login/index.vue b/mobile/src/pages/login/index.vue index bf32c5ba..32bf3e40 100644 --- a/mobile/src/pages/login/index.vue +++ b/mobile/src/pages/login/index.vue @@ -4,7 +4,7 @@