feat(ops): 巡检模板CRUD及动态表单接口(Task 2+3)
This commit is contained in:
81
.ralph/fix_plan.md
Normal file
81
.ralph/fix_plan.md
Normal file
@@ -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 的编码模式
|
||||
69
sql/mysql/aiot_ops_inspection.sql
Normal file
69
sql/mysql/aiot_ops_inspection.sql
Normal file
@@ -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='巡检明细';
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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<OpsInspectionRecordItemDO> {
|
||||
|
||||
/**
|
||||
* 按巡检记录ID查询明细
|
||||
*/
|
||||
default List<OpsInspectionRecordItemDO> selectListByRecordId(Long recordId) {
|
||||
return selectList(OpsInspectionRecordItemDO::getRecordId, recordId);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<OpsInspectionRecordDO> {
|
||||
|
||||
}
|
||||
@@ -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<OpsInspectionTemplateDO> {
|
||||
|
||||
/**
|
||||
* 按功能类型查询启用的检查项,按排序序号升序
|
||||
*/
|
||||
default List<OpsInspectionTemplateDO> selectListByFunctionType(String functionType) {
|
||||
return selectList(new LambdaQueryWrapperX<OpsInspectionTemplateDO>()
|
||||
.eq(OpsInspectionTemplateDO::getFunctionType, functionType)
|
||||
.eq(OpsInspectionTemplateDO::getIsActive, true)
|
||||
.orderByAsc(OpsInspectionTemplateDO::getSortOrder));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<OpsInspectionTemplateDO> getTemplatePage(InspectionTemplatePageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 按功能类型获取启用的检查项列表
|
||||
*
|
||||
* @param functionType 功能类型
|
||||
* @return 检查项列表(按 sortOrder 排序)
|
||||
*/
|
||||
List<OpsInspectionTemplateDO> getTemplateListByFunctionType(String functionType);
|
||||
|
||||
/**
|
||||
* 按区域ID获取动态巡检表单(检查项列表)
|
||||
* <p>
|
||||
* 流程: area_id → 查 ops_bus_area 获取 function_type → 查 ops_inspection_template 加载检查项
|
||||
*
|
||||
* @param areaId 区域ID
|
||||
* @return 检查项列表(按 sortOrder 排序)
|
||||
*/
|
||||
List<OpsInspectionTemplateDO> getTemplateListByAreaId(Long areaId);
|
||||
|
||||
}
|
||||
@@ -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<OpsInspectionTemplateDO> getTemplatePage(InspectionTemplatePageReqVO pageReqVO) {
|
||||
return inspectionTemplateMapper.selectPage(pageReqVO, new LambdaQueryWrapperX<OpsInspectionTemplateDO>()
|
||||
.eqIfPresent(OpsInspectionTemplateDO::getFunctionType, pageReqVO.getFunctionType())
|
||||
.eqIfPresent(OpsInspectionTemplateDO::getIsActive, pageReqVO.getIsActive())
|
||||
.likeIfPresent(OpsInspectionTemplateDO::getItemTitle, pageReqVO.getItemTitle())
|
||||
.orderByAsc(OpsInspectionTemplateDO::getSortOrder));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OpsInspectionTemplateDO> getTemplateListByFunctionType(String functionType) {
|
||||
return inspectionTemplateMapper.selectListByFunctionType(functionType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OpsInspectionTemplateDO> 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Long> createTemplate(@Valid @RequestBody InspectionTemplateSaveReqVO createReqVO) {
|
||||
return success(inspectionTemplateService.createTemplate(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新巡检模板")
|
||||
@PreAuthorize("@ss.hasPermission('ops:inspection-template:update')")
|
||||
public CommonResult<Boolean> 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<Boolean> 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<InspectionTemplateRespVO> 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<PageResult<InspectionTemplateRespVO>> getTemplatePage(@Valid InspectionTemplatePageReqVO pageReqVO) {
|
||||
PageResult<OpsInspectionTemplateDO> 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<List<InspectionTemplateRespVO>> getTemplateListByArea(@RequestParam("areaId") Long areaId) {
|
||||
List<OpsInspectionTemplateDO> list = inspectionTemplateService.getTemplateListByAreaId(areaId);
|
||||
return success(BeanUtils.toBean(list, InspectionTemplateRespVO.class));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user