feat(ops): 巡检模板CRUD及动态表单接口(Task 2+3)

This commit is contained in:
lzh
2026-03-05 17:04:45 +08:00
parent 3bcdb4119f
commit 99651be386
14 changed files with 703 additions and 0 deletions

81
.ralph/fix_plan.md Normal file
View 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 + Mapper3表3DO3Mapper
- [x] Task 2: 巡检模板 CRUDService + Impl + Controller + VOs
- [x] Task 3: 获取动态表单接口list-by-areaarea_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 的编码模式

View 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='巡检明细';

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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> {
}

View File

@@ -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));
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}
}

View File

@@ -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));
}
}