diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..7b016a89 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/docs/gateway-routes-config-fix.md b/docs/gateway-routes-config-fix.md new file mode 100644 index 00000000..72400731 --- /dev/null +++ b/docs/gateway-routes-config-fix.md @@ -0,0 +1,120 @@ +# 网关路由配置修复说明 + +## 问题分析 + +您的网关配置中已经包含了 `ruoyi-system` 和 `ruoyi-manage` 的路由,但是 **缺少 Swagger 文档的专门路由**。 + +### 当前路由配置 +- `ruoyi-system` → `/system/**` +- `ruoyi-manage` → `/manage/**` + +### Swagger 文档访问路径 +- `ruoyi-system` Swagger → `/ruoyi-system/v3/api-docs` +- `ruoyi-manage` Swagger → `/ruoyi-manage/v3/api-docs` + +**问题**:`/ruoyi-system/v3/api-docs` 和 `/ruoyi-manage/v3/api-docs` 无法匹配现有的路由规则! + +## 解决方案 + +在 Nacos 配置中心的 `ruoyi-gateway-dev.yml` 文件中,添加 Swagger 文档的专门路由: + +```yaml +spring: + cloud: + gateway: + discovery: + locator: + lowerCaseServiceId: true + enabled: true + routes: + # 认证中心 + - id: ruoyi-auth + uri: lb://ruoyi-auth + predicates: + - Path=/auth/** + filters: + - CacheRequestBody + - ValidateCodeFilter + - StripPrefix=1 + # 代码生成 + - id: ruoyi-gen + uri: lb://ruoyi-gen + predicates: + - Path=/code/** + filters: + - StripPrefix=1 + # 定时任务 + - id: ruoyi-job + uri: lb://ruoyi-job + predicates: + - Path=/schedule/** + filters: + - StripPrefix=1 + # 系统模块 + - id: ruoyi-system + uri: lb://ruoyi-system + predicates: + - Path=/system/** + filters: + - StripPrefix=1 + # 系统模块 Swagger 文档(新增) + - id: ruoyi-system-swagger + uri: lb://ruoyi-system + predicates: + - Path=/ruoyi-system/v3/api-docs/** + filters: + - StripPrefix=1 + # 文件服务 + - id: ruoyi-file + uri: lb://ruoyi-file + predicates: + - Path=/file/** + filters: + - StripPrefix=1 + # 物业施工作业管理系统 + - id: ruoyi-manage + uri: lb://ruoyi-manage + predicates: + - Path=/manage/** + filters: + - StripPrefix=1 + # 物业施工作业管理系统 Swagger 文档(新增) + - id: ruoyi-manage-swagger + uri: lb://ruoyi-manage + predicates: + - Path=/ruoyi-manage/v3/api-docs/** + filters: + - StripPrefix=1 +``` + +## 操作步骤 + +1. 登录 Nacos 控制台:`http://127.0.0.1:8848/nacos` +2. 进入"配置管理" -> "配置列表" +3. 找到 `ruoyi-gateway-dev.yml` 配置文件 +4. 在 `routes` 列表中添加上述两个 Swagger 路由配置 +5. 点击"发布"保存配置 +6. **重启网关服务**(`ruoyi-gateway`) + +## 验证 + +配置完成后,访问以下 URL 验证: + +1. **Swagger 文档**: + - `http://localhost:8080/ruoyi-system/v3/api-docs` - 应该返回系统模块的 API 文档 JSON + - `http://localhost:8080/ruoyi-manage/v3/api-docs` - 应该返回管理模块的 API 文档 JSON + +2. **Swagger UI**: + - `http://localhost:8080/swagger-ui.html` 或 `http://localhost:8080/doc.html` + - 在服务下拉列表中应该能看到 `ruoyi-system` 和 `ruoyi-manage` + - 选择服务后应该能看到"用户管理"和"部门管理"的接口 + +3. **业务接口**: + - `http://localhost:8080/system/user/list` - 用户列表 + - `http://localhost:8080/system/dept/list` - 部门列表 + +## 注意事项 + +- 路由配置修改后必须重启网关服务才能生效 +- `StripPrefix=1` 表示去掉路径的第一段(如 `/ruoyi-system/v3/api-docs` 会变成 `/v3/api-docs` 转发到后端服务) +- Swagger 文档路径已经在白名单中(`/*/v3/api-docs`),不需要认证即可访问 diff --git a/docs/gateway-routes-config.md b/docs/gateway-routes-config.md new file mode 100644 index 00000000..e3563bc4 --- /dev/null +++ b/docs/gateway-routes-config.md @@ -0,0 +1,95 @@ +# 网关路由配置说明 + +## 问题分析 + +用户管理和部门管理的 Swagger 接口不显示,可能是因为网关路由配置缺失。 + +## 网关路由配置位置 + +网关路由配置在 **Nacos 配置中心**,配置文件名:`application-dev.yml`(根据环境可能是 `application-prod.yml` 等) + +## 需要检查的配置 + +### 1. 登录 Nacos 控制台 +- 地址:`http://127.0.0.1:8848/nacos` +- 用户名/密码:`nacos/nacos`(默认) + +### 2. 查找配置文件 +- **Data ID**: `application-dev.yml` +- **Group**: `DEFAULT_GROUP` +- **命名空间**: 根据实际情况选择 + +### 3. 检查路由配置 + +网关路由配置应该包含以下内容: + +```yaml +spring: + cloud: + gateway: + discovery: + locator: + enabled: true # 启用服务发现自动路由 + lower-case-service-id: true # 服务ID转小写 + routes: + # ruoyi-system 路由配置 + - id: ruoyi-system + uri: lb://ruoyi-system + predicates: + - Path=/system/** + filters: + - StripPrefix=1 + # ruoyi-manage 路由配置 + - id: ruoyi-manage + uri: lb://ruoyi-manage + predicates: + - Path=/manage/** + filters: + - StripPrefix=1 + # Swagger 路由配置 + - id: ruoyi-system-swagger + uri: lb://ruoyi-system + predicates: + - Path=/ruoyi-system/v3/api-docs/** + filters: + - StripPrefix=1 + - id: ruoyi-manage-swagger + uri: lb://ruoyi-manage + predicates: + - Path=/ruoyi-manage/v3/api-docs/** + filters: + - StripPrefix=1 +``` + +## 如果配置不存在 + +如果 Nacos 中没有上述路由配置,需要添加: + +1. 登录 Nacos 控制台 +2. 进入"配置管理" -> "配置列表" +3. 找到或创建 `application-dev.yml` +4. 添加上述路由配置 +5. 发布配置 +6. 重启网关服务 + +## 验证步骤 + +1. **检查服务注册**:在 Nacos 控制台的"服务管理" -> "服务列表"中,确认以下服务已注册: + - `ruoyi-system` + - `ruoyi-manage` + +2. **检查路由**:访问以下 URL 验证路由是否正常: + - `http://localhost:8080/system/user/list` - 系统模块用户列表 + - `http://localhost:8080/manage/unit/archive/list` - 管理模块单位建档列表 + - `http://localhost:8080/ruoyi-system/v3/api-docs` - 系统模块 Swagger 文档 + - `http://localhost:8080/ruoyi-manage/v3/api-docs` - 管理模块 Swagger 文档 + +3. **检查 Swagger UI**: + - 访问:`http://localhost:8080/swagger-ui.html` 或 `http://localhost:8080/doc.html` + - 在服务下拉列表中应该能看到 `ruoyi-system` 和 `ruoyi-manage` + +## 注意事项 + +- 如果启用了 `discovery.locator.enabled: true`,网关会自动为所有注册的服务创建路由,路径格式为:`/服务名/**` +- 但为了更好的控制和明确的路由规则,建议显式配置路由 +- 路由配置修改后需要重启网关服务才能生效 diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/controller/PcCameraReturnController.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/controller/PcCameraReturnController.java index f7860b0d..bbe15567 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/controller/PcCameraReturnController.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/controller/PcCameraReturnController.java @@ -27,7 +27,7 @@ public class PcCameraReturnController extends BaseController { this.bizService = bizService; } - @Operation(summary = "回收记录列表(已回收待入库/已入库/已驳回等)") + @Operation(summary = "待回收列表(已分配但未提交回收的球机)") @PreAuthorize("@ss.hasPermi('property:camera:return:list')") @GetMapping("/list") public TableDataInfo list(PcCameraReturn query) { diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraInbound.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraInbound.java index 738283d3..a029c6a9 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraInbound.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraInbound.java @@ -12,12 +12,24 @@ import java.util.Date; @Schema(description = "球机入库记录") public class PcCameraInbound extends BaseEntity { + @Schema(description = "入库ID") private Long inboundId; + + @Schema(description = "回收记录ID") private Long returnId; + + @Schema(description = "球机ID") private Long cameraId; + @Schema(description = "仓库") private String warehouse; + + @Schema(description = "库管/审核人") private String keeper; + + @Schema(description = "入库时间") private Date inboundTime; + + @Schema(description = "备注") private String remark; } diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraReturn.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraReturn.java index 34fc79c9..b8dc3684 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraReturn.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/PcCameraReturn.java @@ -12,35 +12,67 @@ import java.util.Date; @Schema(description = "球机回收记录(待入库审核)") public class PcCameraReturn extends BaseEntity { + @Schema(description = "回收记录ID") private Long returnId; + + @Schema(description = "分配记录ID") private Long allocId; + + @Schema(description = "项目ID") private Long projectId; + + @Schema(description = "球机ID") private Long cameraId; - @Schema(description = "0合格 1不合格 2不齐全") - private String checkResult; + @Schema(description = "外观完整性:0完好 1破损 2丢失") + private String appearanceIntegrity; + @Schema(description = "功能测试结果:0正常 1异常") + private String functionalTestResult; + + @Schema(description = "回收人") private String returnBy; + + @Schema(description = "回收时间") private Date returnTime; @Schema(description = "回收照片url,逗号分隔") private String photoUrls; + @Schema(description = "备注") private String remark; - @Schema(description = "0待审核 1已通过 2已驳回") + @Schema(description = "回收状态:-1待回收 0待审核 1已通过 2已驳回") private String auditStatus; + @Schema(description = "审核人") private String auditBy; + + @Schema(description = "审核时间") private Date auditTime; + + @Schema(description = "审核备注") private String auditRemark; + @Schema(description = "删除标志(0代表存在 2代表删除)") private String delFlag; // JOIN展示字段 + @Schema(description = "球机编号(关联查询)") private String cameraNo; + + @Schema(description = "球机ID列表(聚合,逗号分隔,用于待回收列表)") + private String cameraIds; + + @Schema(description = "球机型号(关联查询)") private String model; + + @Schema(description = "项目名称(关联查询)") private String projectName; + + @Schema(description = "施工单位(关联查询)") private String constructionUnit; + + @Schema(description = "作业地点(关联查询)") private String workLocation; } diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraAllocConfirmDTO.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraAllocConfirmDTO.java index 9edc498d..de61bafa 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraAllocConfirmDTO.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraAllocConfirmDTO.java @@ -19,6 +19,9 @@ public class PcCameraAllocConfirmDTO { @Schema(description = "分配时间(不传则取当前时间)") private Date allocTime; + @Schema(description = "分配人(不传则取当前登录用户)") + private String allocBy; + @Schema(description = "分配备注") private String allocNote; } diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraReturnSubmitDTO.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraReturnSubmitDTO.java index e0b0bfb6..4aea8eee 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraReturnSubmitDTO.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/domain/dto/PcCameraReturnSubmitDTO.java @@ -16,8 +16,11 @@ public class PcCameraReturnSubmitDTO { @Schema(description = "回收球机ID列表") private List cameraIds; - @Schema(description = "0合格 1不合格 2不齐全") - private String checkResult; + @Schema(description = "外观完整性:0完好 1破损 2丢失") + private String appearanceIntegrity; + + @Schema(description = "功能测试结果:0正常 1异常") + private String functionalTestResult; @Schema(description = "回收时间(不传则取当前时间)") private Date returnTime; diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/service/impl/PcCameraBizServiceImpl.java b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/service/impl/PcCameraBizServiceImpl.java index 29fccf48..0032e8fa 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/service/impl/PcCameraBizServiceImpl.java +++ b/ruoyi-modules/aidmt-manage-ms/src/main/java/com/admin/property/service/impl/PcCameraBizServiceImpl.java @@ -59,6 +59,7 @@ public class PcCameraBizServiceImpl implements IPcCameraBizService { if (project == null) throw new ServiceException("项目不存在或已删除"); Date allocTime = dto.getAllocTime() != null ? dto.getAllocTime() : new Date(); + String allocBy = dto.getAllocBy() != null && !dto.getAllocBy().isEmpty() ? dto.getAllocBy() : SecurityUtils.getUsername(); String username = SecurityUtils.getUsername(); // 校验球机是否可分配 + 状态更新(在库->已分配) @@ -92,7 +93,7 @@ public class PcCameraBizServiceImpl implements IPcCameraBizService { a.setProjectId(dto.getProjectId()); a.setCameraId(cameraId); a.setAllocTime(allocTime); - a.setAllocBy(username); + a.setAllocBy(allocBy); a.setAllocNote(dto.getAllocNote()); a.setAllocStatus(PcAllocStatus.ALLOCATED); a.setCreateBy(username); @@ -128,7 +129,8 @@ public class PcCameraBizServiceImpl implements IPcCameraBizService { public int submitReturn(PcCameraReturnSubmitDTO dto) { if (dto.getProjectId() == null) throw new ServiceException("projectId不能为空"); if (dto.getCameraIds() == null || dto.getCameraIds().isEmpty()) throw new ServiceException("cameraIds不能为空"); - if (dto.getCheckResult() == null || dto.getCheckResult().isEmpty()) throw new ServiceException("checkResult不能为空"); + if (dto.getAppearanceIntegrity() == null || dto.getAppearanceIntegrity().isEmpty()) throw new ServiceException("appearanceIntegrity不能为空"); + if (dto.getFunctionalTestResult() == null || dto.getFunctionalTestResult().isEmpty()) throw new ServiceException("functionalTestResult不能为空"); String username = SecurityUtils.getUsername(); Date returnTime = dto.getReturnTime() != null ? dto.getReturnTime() : new Date(); @@ -170,7 +172,8 @@ public class PcCameraBizServiceImpl implements IPcCameraBizService { r.setAllocId(a.getAllocId()); r.setProjectId(dto.getProjectId()); r.setCameraId(cameraId); - r.setCheckResult(dto.getCheckResult()); + r.setAppearanceIntegrity(dto.getAppearanceIntegrity()); + r.setFunctionalTestResult(dto.getFunctionalTestResult()); r.setReturnBy(username); r.setReturnTime(returnTime); r.setPhotoUrls(photoUrls); @@ -232,11 +235,15 @@ public class PcCameraBizServiceImpl implements IPcCameraBizService { inboundList.add(in); // 可选:同步台账的仓库字段 - PcCameraLedger ledger = new PcCameraLedger(); - ledger.setCameraId(r.getCameraId()); - ledger.setWarehouse(dto.getWarehouse()); - ledger.setUpdateBy(username); - ledgerMapper.updatePcCameraLedger(ledger); + PcCameraLedger existingLedger = ledgerMapper.selectPcCameraLedgerByCameraId(r.getCameraId()); + if (existingLedger != null) { + PcCameraLedger ledger = new PcCameraLedger(); + ledger.setCameraId(r.getCameraId()); + ledger.setCameraNo(existingLedger.getCameraNo()); // camera_no 字段必填 + ledger.setWarehouse(dto.getWarehouse()); + ledger.setUpdateBy(username); + ledgerMapper.updatePcCameraLedger(ledger); + } } inboundMapper.insertBatch(inboundList); diff --git a/ruoyi-modules/aidmt-manage-ms/src/main/resources/mapper/PcCameraReturnMapper.xml b/ruoyi-modules/aidmt-manage-ms/src/main/resources/mapper/PcCameraReturnMapper.xml index 63caf4b8..6664f22c 100644 --- a/ruoyi-modules/aidmt-manage-ms/src/main/resources/mapper/PcCameraReturnMapper.xml +++ b/ruoyi-modules/aidmt-manage-ms/src/main/resources/mapper/PcCameraReturnMapper.xml @@ -5,38 +5,54 @@ - select * from pc_camera_return where return_id=#{returnId} and del_flag='0' + select + r.return_id as returnId, + r.alloc_id as allocId, + r.project_id as projectId, + r.camera_id as cameraId, + r.appearance_integrity as appearanceIntegrity, + r.functional_test_result as functionalTestResult, + r.return_by as returnBy, + r.return_time as returnTime, + r.photo_urls as photoUrls, + r.remark as remark, + r.audit_status as auditStatus, + r.audit_by as auditBy, + r.audit_time as auditTime, + r.audit_remark as auditRemark, + r.del_flag as delFlag + from pc_camera_return r + where r.return_id=#{returnId} and r.del_flag='0'