refactor(ops): 巡检接口重构 — 位置校验前移、列表/详情分离、表单聚合

接口变更:
- 删除 POST /verify-location,位置校验改为前端本地蓝牙信标匹配
- 新增 GET /record/get 巡检记录详情(含明细项、照片)
- GET /list-by-area 升级为返回完整巡检表单(区域+检查项+信标配置)
- GET /record/page 返回类型改为 VO,新增区域全路径名称和巡检员姓名
- 提交和表单接口增加 inspector 角色校验

代码质量(Code Review 修复):
- 提取 buildAreaFullName 至 OpsBusAreaMapper 消除两个 Service 的重复
- 新增 buildAreaFullNameMap 批量方法,修复分页场景 N+1 查询
- getRecordDetail 中 adminUserApi 改用 getUserMap + try-catch 降级
- InspectionTemplateServiceImpl 去掉 ObjectMapper 依赖,直接 Map 取值
- RSSI 阈值取最宽松值逻辑添加语义注释
- 巡检错误码从 1-020-003 迁移至 1-020-004,修复与安保模块的码段冲突
- InspectionRecordDetailRespVO.photos 使用 @OssPresignUrl 自动预签名

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
lzh
2026-03-22 15:00:07 +08:00
parent e11d3e1b6e
commit f213510b03
24 changed files with 585 additions and 246 deletions

View File

@@ -2,11 +2,8 @@ package com.viewsh.module.ops.controller.admin.inspection;
import com.viewsh.framework.common.pojo.CommonResult;
import com.viewsh.framework.common.pojo.PageResult;
import com.viewsh.framework.common.util.object.BeanUtils;
import com.viewsh.framework.security.core.util.SecurityFrameworkUtils;
import com.viewsh.module.ops.environment.controller.admin.inspection.vo.*;
import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionRecordDO;
import com.viewsh.module.ops.environment.service.inspection.InspectionLocationService;
import com.viewsh.module.ops.environment.service.inspection.InspectionRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -17,8 +14,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.viewsh.framework.common.pojo.CommonResult.success;
/**
@@ -30,36 +25,30 @@ import static com.viewsh.framework.common.pojo.CommonResult.success;
@Validated
public class InspectionController {
@Resource
private InspectionLocationService inspectionLocationService;
@Resource
private InspectionRecordService inspectionRecordService;
@PostMapping("/verify-location")
@Operation(summary = "蓝牙位置校验")
@Parameter(name = "areaId", description = "区域ID", required = true)
@PreAuthorize("@ss.hasPermission('ops:inspection:create')")
public CommonResult<LocationVerifyResultVO> verifyLocation(
@RequestParam("areaId") Long areaId,
@Valid @RequestBody List<DetectedBeaconVO> detectedBeacons) {
return success(inspectionLocationService.verifyLocation(areaId, detectedBeacons));
}
@PostMapping("/submit")
@Operation(summary = "提交巡检结果")
@PreAuthorize("@ss.hasPermission('ops:inspection:create')")
@PreAuthorize("@ss.hasPermission('ops:inspection:create') and @ss.hasRole('inspector')")
public CommonResult<Long> submitInspection(@Valid @RequestBody InspectionSubmitReqVO submitReqVO) {
Long inspectorId = SecurityFrameworkUtils.getLoginUserId();
return success(inspectionRecordService.submitInspection(submitReqVO, inspectorId));
}
@GetMapping("/record/get")
@Operation(summary = "获得巡检记录详情")
@Parameter(name = "id", description = "巡检记录ID", required = true)
@PreAuthorize("@ss.hasPermission('ops:inspection:query')")
public CommonResult<InspectionRecordDetailRespVO> getRecord(@RequestParam("id") Long id) {
return success(inspectionRecordService.getRecordDetail(id));
}
@GetMapping("/record/page")
@Operation(summary = "获得巡检记录分页")
@PreAuthorize("@ss.hasPermission('ops:inspection:query')")
public CommonResult<PageResult<InspectionRecordRespVO>> getRecordPage(@Valid InspectionRecordPageReqVO pageReqVO) {
PageResult<OpsInspectionRecordDO> pageResult = inspectionRecordService.getRecordPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, InspectionRecordRespVO.class));
return success(inspectionRecordService.getRecordPage(pageReqVO));
}
@GetMapping("/record/stats")

View File

@@ -3,6 +3,7 @@ package com.viewsh.module.ops.controller.admin.inspection;
import com.viewsh.framework.common.pojo.CommonResult;
import com.viewsh.framework.common.pojo.PageResult;
import com.viewsh.framework.common.util.object.BeanUtils;
import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionFormRespVO;
import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplatePageReqVO;
import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateRespVO;
import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateSaveReqVO;
@@ -75,12 +76,11 @@ public class InspectionTemplateController {
}
@GetMapping("/list-by-area")
@Operation(summary = "按区域获取巡检检查项列表(动态表单)")
@Operation(summary = "按区域获取巡检表单(扫码后调用")
@Parameter(name = "areaId", description = "区域ID", required = true)
@PreAuthorize("@ss.hasPermission('ops:inspection-template:query')")
public CommonResult<List<InspectionTemplateRespVO>> getTemplateListByArea(@RequestParam("areaId") Long areaId) {
List<OpsInspectionTemplateDO> list = inspectionTemplateService.getTemplateListByAreaId(areaId);
return success(BeanUtils.toBean(list, InspectionTemplateRespVO.class));
@PreAuthorize("@ss.hasPermission('ops:inspection-template:query') and @ss.hasRole('inspector')")
public CommonResult<InspectionFormRespVO> getInspectionFormByArea(@RequestParam("areaId") Long areaId) {
return success(inspectionTemplateService.getInspectionFormByAreaId(areaId));
}
}

View File

@@ -5,12 +5,14 @@ import com.viewsh.module.iot.api.device.IotDeviceControlApi;
import com.viewsh.module.iot.api.device.IotDeviceQueryApi;
import com.viewsh.module.iot.api.device.IotDeviceStatusQueryApi;
import com.viewsh.module.system.api.notify.NotifyMessageSendApi;
import com.viewsh.module.system.api.user.AdminUserApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(value = "opsRpcConfiguration", proxyBeanMethods = false)
@EnableFeignClients(clients = {
NotifyMessageSendApi.class,
AdminUserApi.class,
IotDeviceControlApi.class,
IotDeviceQueryApi.class,
IotDeviceStatusQueryApi.class,