diff --git a/.ralph/fix_plan.md b/.ralph/fix_plan.md new file mode 100644 index 0000000..83457ef --- /dev/null +++ b/.ralph/fix_plan.md @@ -0,0 +1,81 @@ +# Ralph Fix Plan - 保洁巡检模块 + +## 需求文档 +参考: docs/物业服务AIoT平台-保洁服务模块.md(模块二:巡检小程序后端) + +## High Priority + +### 1. 数据库表 + DO + Mapper ✅ +- [x] 创建 `ops_inspection_template` 表及 SQL(巡检检查项模板) +- [x] 创建 `ops_inspection_record` 表及 SQL(巡检主记录) +- [x] 创建 `ops_inspection_record_item` 表及 SQL(巡检明细) +- [x] 创建对应 DO 类: OpsInspectionTemplateDO, OpsInspectionRecordDO, OpsInspectionRecordItemDO +- [x] 创建对应 Mapper: OpsInspectionTemplateMapper, OpsInspectionRecordMapper, OpsInspectionRecordItemMapper +- SQL: sql/mysql/aiot_ops_inspection.sql +- DO: environment-biz/dal/dataobject/inspection/ +- Mapper: environment-biz/dal/mysql/inspection/ + +### 2. 巡检模板 CRUD(管理后台配置检查项) ✅ +- [x] InspectionTemplateService 接口 + Impl(增删改查,按 function_type 查询) +- [x] InspectionTemplateController(管理端 REST API) +- [x] 请求/响应 VO 类 + +### 3. 获取动态表单接口 ✅ +- [x] GET /admin-api/ops/inspection/template/list-by-area + - 入参: area_id + detected_beacons(蓝牙指纹数组) + - 逻辑: area_id → 查 ops_bus_area 获取 function_type → 查 ops_inspection_template 加载检查项 + - 返回: 检查项列表 + +### 4. 蓝牙位置校验逻辑 +- [ ] InspectionLocationService(位置校验服务) + - 入参: area_id + detected_beacons + - 查询 ops_area_device_relation 获取该区域绑定的信标列表 + - 匹配算法: 至少1个绑定信标匹配,且 RSSI > 阈值 + - 返回: 校验通过/失败 + +## Medium Priority + +### 5. 提交巡检结果接口 +- [ ] POST /admin-api/ops/inspection/submit + - 入参: area_id, is_location_exception, items[{template_id, is_passed, remark}] + - 逻辑: + 1. 保存 ops_inspection_record 主记录 + 2. 批量保存 ops_inspection_record_item 明细 + 3. 判定 result_status: 任意一项 is_passed=false → 不合格 + 4. 不合格时触发异步归属判定 +- [ ] InspectionRecordService 接口 + Impl +- [ ] InspectionController(巡检提交 REST API) + +### 6. 归属判定异步逻辑 +- [ ] InspectionAttributionService(归属判定服务) + - 以巡检提交时间为基点,回溯该区域上一个 COMPLETED 工单 + - 获取保洁员实际停留时长 T_stay(来自 ops_order.actual_duration 或工单扩展) + - 获取区域标准时长 clean_threshold(来自 ops_bus_area.standard_duration) + - 判定: + - T_stay >= clean_threshold → attribution_result=2(突发状况),不扣分 + - T_stay < clean_threshold → attribution_result=1(个人责任),扣信用分 + - 更新 ops_inspection_record 的 attribution_result, last_order_id, stay_duration + +### 7. 整改工单自动创建 +- [ ] 不合格巡检触发创建整改派单 + - 调用现有 OpsOrderService / OrderLifecycleManager 创建工单 + - source_type = INSPECTION + - 关联 generated_order_id 回写到 ops_inspection_record + - 对接工单引擎的优先级和派单逻辑 + +## Low Priority +- [ ] 巡检记录查询接口(分页、按区域/时间筛选) +- [ ] 巡检统计接口(合格率、不合格热点区域) + +## Completed +- [x] 需求分析与表结构设计 +- [x] Task 1: 数据库表 + DO + Mapper(3表、3DO、3Mapper) +- [x] Task 2: 巡检模板 CRUD(Service + Impl + Controller + VOs) +- [x] Task 3: 获取动态表单接口(list-by-area,area_id → function_type → template 查询链路) + +## Notes +- 巡检是保洁业务线内的子功能,代码放 viewsh-module-environment-biz +- 复用 ops_area_device_relation 做蓝牙信标校验,不新建 iot_device_location +- 复用 ops_bus_area.standard_duration 作为 clean_threshold,不新建 ops_rule_config +- Controller 放在 ops-server 模块的 controller/admin/inspection/ 下 +- 遵循现有 CleanOrderService 的编码模式 diff --git a/sql/mysql/aiot_ops_inspection.sql b/sql/mysql/aiot_ops_inspection.sql new file mode 100644 index 0000000..7b4e1b4 --- /dev/null +++ b/sql/mysql/aiot_ops_inspection.sql @@ -0,0 +1,69 @@ +-- ============================================= +-- 巡检模块表结构 +-- ============================================= + +-- ---------------------------- +-- 巡检检查项模板表 +-- ---------------------------- +DROP TABLE IF EXISTS `ops_inspection_template`; +CREATE TABLE `ops_inspection_template` ( + `id` bigint NOT NULL COMMENT '模板ID', + `function_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '功能类型(关联 ops_bus_area.function_type)', + `item_title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '检查项标题', + `sort_order` int NOT NULL DEFAULT 0 COMMENT '排序序号', + `is_active` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否启用', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_function_type` (`function_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='巡检检查项模板'; + +-- ---------------------------- +-- 巡检主记录表 +-- ---------------------------- +DROP TABLE IF EXISTS `ops_inspection_record`; +CREATE TABLE `ops_inspection_record` ( + `id` bigint NOT NULL COMMENT '巡检记录ID', + `area_id` bigint NOT NULL COMMENT '区域ID', + `inspector_id` bigint NOT NULL COMMENT '巡检员用户ID', + `is_location_exception` tinyint NOT NULL DEFAULT 0 COMMENT '位置是否异常(0正常 1异常)', + `result_status` tinyint COMMENT '巡检结果(0不合格 1合格)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '备注', + `last_order_id` bigint COMMENT '归属判定-上一个完成工单ID', + `stay_duration` int COMMENT '归属判定-保洁员停留时长(秒)', + `attribution_result` tinyint COMMENT '归属判定结果(1个人责任 2突发状况 3正常)', + `generated_order_id` bigint COMMENT '整改工单ID', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_area_id` (`area_id`), + KEY `idx_inspector_id` (`inspector_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='巡检主记录'; + +-- ---------------------------- +-- 巡检明细表 +-- ---------------------------- +DROP TABLE IF EXISTS `ops_inspection_record_item`; +CREATE TABLE `ops_inspection_record_item` ( + `id` bigint NOT NULL COMMENT '明细ID', + `record_id` bigint NOT NULL COMMENT '巡检记录ID', + `template_id` bigint NOT NULL COMMENT '模板检查项ID', + `is_passed` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否合格', + `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '备注', + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_record_id` (`record_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='巡检明细'; diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplatePageReqVO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplatePageReqVO.java new file mode 100644 index 0000000..c2d6df8 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplatePageReqVO.java @@ -0,0 +1,22 @@ +package com.viewsh.module.ops.environment.controller.admin.inspection.vo; + +import com.viewsh.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Schema(description = "管理后台 - 巡检模板分页查询 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class InspectionTemplatePageReqVO extends PageParam { + + @Schema(description = "功能类型", example = "TOILET") + private String functionType; + + @Schema(description = "是否启用", example = "true") + private Boolean isActive; + + @Schema(description = "检查项标题(模糊搜索)", example = "地面") + private String itemTitle; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateRespVO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateRespVO.java new file mode 100644 index 0000000..f9c6f35 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateRespVO.java @@ -0,0 +1,30 @@ +package com.viewsh.module.ops.environment.controller.admin.inspection.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 巡检模板 Response VO") +@Data +public class InspectionTemplateRespVO { + + @Schema(description = "模板ID", example = "1") + private Long id; + + @Schema(description = "功能类型", example = "TOILET") + private String functionType; + + @Schema(description = "检查项标题", example = "地面是否干净") + private String itemTitle; + + @Schema(description = "排序序号", example = "1") + private Integer sortOrder; + + @Schema(description = "是否启用", example = "true") + private Boolean isActive; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateSaveReqVO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateSaveReqVO.java new file mode 100644 index 0000000..1b516bd --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/controller/admin/inspection/vo/InspectionTemplateSaveReqVO.java @@ -0,0 +1,30 @@ +package com.viewsh.module.ops.environment.controller.admin.inspection.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - 巡检模板创建/修改 Request VO") +@Data +public class InspectionTemplateSaveReqVO { + + @Schema(description = "模板ID(修改时必填)", example = "1") + private Long id; + + @Schema(description = "功能类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "TOILET") + @NotBlank(message = "功能类型不能为空") + private String functionType; + + @Schema(description = "检查项标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "地面是否干净") + @NotBlank(message = "检查项标题不能为空") + private String itemTitle; + + @Schema(description = "排序序号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "排序序号不能为空") + private Integer sortOrder; + + @Schema(description = "是否启用", example = "true") + private Boolean isActive; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordDO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordDO.java new file mode 100644 index 0000000..cc420de --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordDO.java @@ -0,0 +1,64 @@ +package com.viewsh.module.ops.environment.dal.dataobject.inspection; + +import com.viewsh.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 巡检主记录 DO + */ +@TableName("ops_inspection_record") +@KeySequence("ops_inspection_record_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OpsInspectionRecordDO extends BaseDO { + + /** + * 巡检记录ID + */ + @TableId + private Long id; + /** + * 区域ID + */ + private Long areaId; + /** + * 巡检员用户ID + */ + private Long inspectorId; + /** + * 位置是否异常(0正常 1异常) + */ + private Integer isLocationException; + /** + * 巡检结果(0不合格 1合格) + */ + private Integer resultStatus; + /** + * 备注 + */ + private String remark; + /** + * 归属判定-上一个完成工单ID + */ + private Long lastOrderId; + /** + * 归属判定-保洁员停留时长(秒) + */ + private Integer stayDuration; + /** + * 归属判定结果(1个人责任 2突发状况 3正常) + */ + private Integer attributionResult; + /** + * 整改工单ID + */ + private Long generatedOrderId; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordItemDO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordItemDO.java new file mode 100644 index 0000000..03c320f --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionRecordItemDO.java @@ -0,0 +1,44 @@ +package com.viewsh.module.ops.environment.dal.dataobject.inspection; + +import com.viewsh.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 巡检明细 DO + */ +@TableName("ops_inspection_record_item") +@KeySequence("ops_inspection_record_item_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OpsInspectionRecordItemDO extends BaseDO { + + /** + * 明细ID + */ + @TableId + private Long id; + /** + * 巡检记录ID + */ + private Long recordId; + /** + * 模板检查项ID + */ + private Long templateId; + /** + * 是否合格 + */ + private Boolean isPassed; + /** + * 备注 + */ + private String remark; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionTemplateDO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionTemplateDO.java new file mode 100644 index 0000000..5d2913a --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/dataobject/inspection/OpsInspectionTemplateDO.java @@ -0,0 +1,44 @@ +package com.viewsh.module.ops.environment.dal.dataobject.inspection; + +import com.viewsh.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 巡检检查项模板 DO + */ +@TableName("ops_inspection_template") +@KeySequence("ops_inspection_template_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OpsInspectionTemplateDO extends BaseDO { + + /** + * 模板ID + */ + @TableId + private Long id; + /** + * 功能类型(关联 ops_bus_area.function_type) + */ + private String functionType; + /** + * 检查项标题 + */ + private String itemTitle; + /** + * 排序序号 + */ + private Integer sortOrder; + /** + * 是否启用 + */ + private Boolean isActive; + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordItemMapper.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordItemMapper.java new file mode 100644 index 0000000..e3e7fe2 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordItemMapper.java @@ -0,0 +1,22 @@ +package com.viewsh.module.ops.environment.dal.mysql.inspection; + +import com.viewsh.framework.mybatis.core.mapper.BaseMapperX; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionRecordItemDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 巡检明细 Mapper + */ +@Mapper +public interface OpsInspectionRecordItemMapper extends BaseMapperX { + + /** + * 按巡检记录ID查询明细 + */ + default List selectListByRecordId(Long recordId) { + return selectList(OpsInspectionRecordItemDO::getRecordId, recordId); + } + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordMapper.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordMapper.java new file mode 100644 index 0000000..9e0a6a8 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionRecordMapper.java @@ -0,0 +1,13 @@ +package com.viewsh.module.ops.environment.dal.mysql.inspection; + +import com.viewsh.framework.mybatis.core.mapper.BaseMapperX; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionRecordDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 巡检主记录 Mapper + */ +@Mapper +public interface OpsInspectionRecordMapper extends BaseMapperX { + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionTemplateMapper.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionTemplateMapper.java new file mode 100644 index 0000000..d2ee1fa --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/mysql/inspection/OpsInspectionTemplateMapper.java @@ -0,0 +1,26 @@ +package com.viewsh.module.ops.environment.dal.mysql.inspection; + +import com.viewsh.framework.mybatis.core.mapper.BaseMapperX; +import com.viewsh.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionTemplateDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 巡检检查项模板 Mapper + */ +@Mapper +public interface OpsInspectionTemplateMapper extends BaseMapperX { + + /** + * 按功能类型查询启用的检查项,按排序序号升序 + */ + default List selectListByFunctionType(String functionType) { + return selectList(new LambdaQueryWrapperX() + .eq(OpsInspectionTemplateDO::getFunctionType, functionType) + .eq(OpsInspectionTemplateDO::getIsActive, true) + .orderByAsc(OpsInspectionTemplateDO::getSortOrder)); + } + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateService.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateService.java new file mode 100644 index 0000000..9f55997 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateService.java @@ -0,0 +1,71 @@ +package com.viewsh.module.ops.environment.service.inspection; + +import com.viewsh.framework.common.pojo.PageResult; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplatePageReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateSaveReqVO; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionTemplateDO; + +import java.util.List; + +/** + * 巡检检查项模板 Service + */ +public interface InspectionTemplateService { + + /** + * 创建巡检模板 + * + * @param createReqVO 创建请求 + * @return 模板ID + */ + Long createTemplate(InspectionTemplateSaveReqVO createReqVO); + + /** + * 更新巡检模板 + * + * @param updateReqVO 更新请求 + */ + void updateTemplate(InspectionTemplateSaveReqVO updateReqVO); + + /** + * 删除巡检模板 + * + * @param id 模板ID + */ + void deleteTemplate(Long id); + + /** + * 获得巡检模板 + * + * @param id 模板ID + * @return 巡检模板 + */ + OpsInspectionTemplateDO getTemplate(Long id); + + /** + * 获得巡检模板分页 + * + * @param pageReqVO 分页查询 + * @return 巡检模板分页 + */ + PageResult getTemplatePage(InspectionTemplatePageReqVO pageReqVO); + + /** + * 按功能类型获取启用的检查项列表 + * + * @param functionType 功能类型 + * @return 检查项列表(按 sortOrder 排序) + */ + List getTemplateListByFunctionType(String functionType); + + /** + * 按区域ID获取动态巡检表单(检查项列表) + *

+ * 流程: area_id → 查 ops_bus_area 获取 function_type → 查 ops_inspection_template 加载检查项 + * + * @param areaId 区域ID + * @return 检查项列表(按 sortOrder 排序) + */ + List getTemplateListByAreaId(Long areaId); + +} diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateServiceImpl.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateServiceImpl.java new file mode 100644 index 0000000..cd9127d --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/service/inspection/InspectionTemplateServiceImpl.java @@ -0,0 +1,101 @@ +package com.viewsh.module.ops.environment.service.inspection; + +import com.viewsh.framework.common.pojo.PageResult; +import com.viewsh.framework.common.util.object.BeanUtils; +import com.viewsh.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplatePageReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateSaveReqVO; +import com.viewsh.module.ops.dal.dataobject.area.OpsBusAreaDO; +import com.viewsh.module.ops.dal.mysql.area.OpsBusAreaMapper; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionTemplateDO; +import com.viewsh.module.ops.environment.dal.mysql.inspection.OpsInspectionTemplateMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.Collections; +import java.util.List; + +import static com.viewsh.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.viewsh.module.ops.enums.ErrorCodeConstants.AREA_NOT_FOUND; +import static com.viewsh.module.ops.enums.ErrorCodeConstants.INSPECTION_TEMPLATE_NOT_FOUND; + +/** + * 巡检检查项模板 Service 实现 + */ +@Service +@Validated +public class InspectionTemplateServiceImpl implements InspectionTemplateService { + + @Resource + private OpsInspectionTemplateMapper inspectionTemplateMapper; + + @Resource + private OpsBusAreaMapper opsBusAreaMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createTemplate(InspectionTemplateSaveReqVO createReqVO) { + OpsInspectionTemplateDO template = BeanUtils.toBean(createReqVO, OpsInspectionTemplateDO.class); + if (template.getIsActive() == null) { + template.setIsActive(true); + } + inspectionTemplateMapper.insert(template); + return template.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTemplate(InspectionTemplateSaveReqVO updateReqVO) { + validateTemplateExists(updateReqVO.getId()); + OpsInspectionTemplateDO updateObj = BeanUtils.toBean(updateReqVO, OpsInspectionTemplateDO.class); + inspectionTemplateMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTemplate(Long id) { + validateTemplateExists(id); + inspectionTemplateMapper.deleteById(id); + } + + @Override + public OpsInspectionTemplateDO getTemplate(Long id) { + return inspectionTemplateMapper.selectById(id); + } + + @Override + public PageResult getTemplatePage(InspectionTemplatePageReqVO pageReqVO) { + return inspectionTemplateMapper.selectPage(pageReqVO, new LambdaQueryWrapperX() + .eqIfPresent(OpsInspectionTemplateDO::getFunctionType, pageReqVO.getFunctionType()) + .eqIfPresent(OpsInspectionTemplateDO::getIsActive, pageReqVO.getIsActive()) + .likeIfPresent(OpsInspectionTemplateDO::getItemTitle, pageReqVO.getItemTitle()) + .orderByAsc(OpsInspectionTemplateDO::getSortOrder)); + } + + @Override + public List getTemplateListByFunctionType(String functionType) { + return inspectionTemplateMapper.selectListByFunctionType(functionType); + } + + @Override + public List getTemplateListByAreaId(Long areaId) { + OpsBusAreaDO area = opsBusAreaMapper.selectById(areaId); + if (area == null) { + throw exception(AREA_NOT_FOUND); + } + String functionType = area.getFunctionType(); + if (functionType == null || functionType.isEmpty()) { + return Collections.emptyList(); + } + return inspectionTemplateMapper.selectListByFunctionType(functionType); + } + + private void validateTemplateExists(Long id) { + if (inspectionTemplateMapper.selectById(id) == null) { + throw exception(INSPECTION_TEMPLATE_NOT_FOUND); + } + } + +} diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionTemplateController.java b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionTemplateController.java new file mode 100644 index 0000000..09418a4 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/java/com/viewsh/module/ops/controller/admin/inspection/InspectionTemplateController.java @@ -0,0 +1,86 @@ +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.InspectionTemplatePageReqVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateRespVO; +import com.viewsh.module.ops.environment.controller.admin.inspection.vo.InspectionTemplateSaveReqVO; +import com.viewsh.module.ops.environment.dal.dataobject.inspection.OpsInspectionTemplateDO; +import com.viewsh.module.ops.environment.service.inspection.InspectionTemplateService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +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; + +/** + * 管理后台 - 巡检模板 Controller + */ +@Tag(name = "管理后台 - 巡检模板") +@RestController +@RequestMapping("/ops/inspection/template") +@Validated +public class InspectionTemplateController { + + @Resource + private InspectionTemplateService inspectionTemplateService; + + @PostMapping("/create") + @Operation(summary = "创建巡检模板") + @PreAuthorize("@ss.hasPermission('ops:inspection-template:create')") + public CommonResult createTemplate(@Valid @RequestBody InspectionTemplateSaveReqVO createReqVO) { + return success(inspectionTemplateService.createTemplate(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新巡检模板") + @PreAuthorize("@ss.hasPermission('ops:inspection-template:update')") + public CommonResult updateTemplate(@Valid @RequestBody InspectionTemplateSaveReqVO updateReqVO) { + inspectionTemplateService.updateTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除巡检模板") + @Parameter(name = "id", description = "模板ID", required = true) + @PreAuthorize("@ss.hasPermission('ops:inspection-template:delete')") + public CommonResult deleteTemplate(@RequestParam("id") Long id) { + inspectionTemplateService.deleteTemplate(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得巡检模板") + @Parameter(name = "id", description = "模板ID", required = true) + @PreAuthorize("@ss.hasPermission('ops:inspection-template:query')") + public CommonResult getTemplate(@RequestParam("id") Long id) { + OpsInspectionTemplateDO template = inspectionTemplateService.getTemplate(id); + return success(BeanUtils.toBean(template, InspectionTemplateRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得巡检模板分页") + @PreAuthorize("@ss.hasPermission('ops:inspection-template:query')") + public CommonResult> getTemplatePage(@Valid InspectionTemplatePageReqVO pageReqVO) { + PageResult pageResult = inspectionTemplateService.getTemplatePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, InspectionTemplateRespVO.class)); + } + + @GetMapping("/list-by-area") + @Operation(summary = "按区域获取巡检检查项列表(动态表单)") + @Parameter(name = "areaId", description = "区域ID", required = true) + @PreAuthorize("@ss.hasPermission('ops:inspection-template:query')") + public CommonResult> getTemplateListByArea(@RequestParam("areaId") Long areaId) { + List list = inspectionTemplateService.getTemplateListByAreaId(areaId); + return success(BeanUtils.toBean(list, InspectionTemplateRespVO.class)); + } + +}