diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/enums/DeviceResponseEnum.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/enums/DeviceResponseEnum.java
index 7f4341155..3ccf38814 100644
--- a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/enums/DeviceResponseEnum.java
+++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/enums/DeviceResponseEnum.java
@@ -97,7 +97,10 @@ public enum DeviceResponseEnum {
LINE_GRADE_INDEX_ERR("A0362","异常等级索引"),
LINE_GRADE_LESS("A0363","监测点等级策略缺失"),
FLOW_UPDATE("A0364","默认类型必须存在一个"),
- NEWSTATION_IS_BIND_LINE("A0365","已绑定监测点")
+ NEWSTATION_IS_BIND_LINE("A0365","已绑定监测点"),
+
+ LINE_USER_EMPTY("A0366","用户侧监测点用户对象名称不可为空"),
+ LINE_NO_USER_EMPTY("A0367","电网侧监测点无需绑定用户对象")
;
diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/LineBaseEnum.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/LineBaseEnum.java
index 49a580062..f5794db75 100644
--- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/LineBaseEnum.java
+++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/LineBaseEnum.java
@@ -39,7 +39,13 @@ public enum LineBaseEnum {
* 电网标志
*/
POWER_FLAG(0,"电网侧"),
- POWER_FLAG_NOT(1,"非电网侧")
+ POWER_FLAG_NOT(1,"非电网侧"),
+
+
+ RUN(0,"在运"),
+ WAITE_RUN(1,"调试"),
+ STOP_RUN(2,"停运")
+
;
diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/LineParam.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/LineParam.java
index b7a058d6d..c4147179c 100644
--- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/LineParam.java
+++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/LineParam.java
@@ -124,9 +124,11 @@ public class LineParam {
private String objId;
@ApiModelProperty(name = "bigObjType",value = "对象大类")
+ @NotBlank(message = "对象大类不可为空")
private String bigObjType;
@ApiModelProperty(name = "smallObjType",value = "对象小类")
+ @NotBlank(message = "对象小类不可为空")
private String smallObjType;
/**
diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/dataClean/MonitorBaseParam.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/dataClean/MonitorBaseParam.java
new file mode 100644
index 000000000..366896123
--- /dev/null
+++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/param/dataClean/MonitorBaseParam.java
@@ -0,0 +1,22 @@
+package com.njcn.device.pq.pojo.param.dataClean;
+
+import com.njcn.web.pojo.param.BaseParam;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Author: cdf
+ * @CreateTime: 2025-03-26
+ * @Description:
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MonitorBaseParam extends BaseParam {
+
+ private String deptId;
+
+ private String objType;
+
+
+
+}
diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/DataVerify.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/DataVerify.java
new file mode 100644
index 000000000..7ad74af98
--- /dev/null
+++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/DataVerify.java
@@ -0,0 +1,76 @@
+package com.njcn.device.pq.pojo.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.njcn.db.bo.BaseEntity;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ *
+ *
+ *
+ *
+ * @author cdf
+ * @since 2025-03-26
+ */
+@Getter
+@Setter
+@TableName("pq_data_verify")
+public class DataVerify {
+
+
+ /**
+ * 监测点id
+ */
+ private String lineId;
+
+ /**
+ * 异常数据时间
+ */
+ private LocalDateTime time;
+
+ /**
+ * 数据类型(最大值:max、最小值:min、平均值:avg、95值:cp95)
+ */
+ private String valueType;
+
+ /**
+ * 相别:"A" "B" "C" "ABC" "T"
+ */
+ private String phasicType;
+
+ /**
+ * 指标code
+ */
+ private String indexCode;
+
+ /**
+ * 指标名称
+ */
+ private String indexName;
+
+ /**
+ * 指标表名
+ */
+ private String indexTable;
+
+ /**
+ * 异常值
+ */
+ private BigDecimal abnormalValue;
+
+ /**
+ * 指标上限
+ */
+ private BigDecimal minValue;
+
+ /**
+ * 指标下限
+ */
+ private BigDecimal maxValue;
+
+
+}
diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java
new file mode 100644
index 000000000..80970d7ef
--- /dev/null
+++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java
@@ -0,0 +1,17 @@
+package com.njcn.device.pq.pojo.vo.dataClean;
+
+import lombok.Data;
+
+/**
+ * @Author: cdf
+ * @CreateTime: 2025-03-26
+ * @Description: 异常测点
+ */
+@Data
+public class VerifyMonitorVO {
+
+ private Integer runNum;
+
+ private Integer abnormalNum;
+
+}
diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/AbnormalDataController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/AbnormalDataController.java
new file mode 100644
index 000000000..ea00d13e9
--- /dev/null
+++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/AbnormalDataController.java
@@ -0,0 +1,9 @@
+package com.njcn.device.pq.controller;
+
+/**
+ * @Author: cdf
+ * @CreateTime: 2025-03-26
+ * @Description: 异常数据清洗
+ */
+public class AbnormalDataController {
+}
diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java
new file mode 100644
index 000000000..39f4c6930
--- /dev/null
+++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java
@@ -0,0 +1,69 @@
+package com.njcn.device.pq.controller;
+
+
+import com.njcn.common.pojo.annotation.OperateInfo;
+import com.njcn.common.pojo.enums.common.LogEnum;
+import com.njcn.common.pojo.enums.response.CommonResponseEnum;
+import com.njcn.common.pojo.response.HttpResult;
+import com.njcn.common.utils.HttpResultUtil;
+import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam;
+import com.njcn.device.pq.pojo.vo.AlarmStrategyVO;
+import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO;
+import com.njcn.device.pq.service.IDataVerifyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import com.njcn.web.controller.BaseController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * 异常数据功能
+ *
+ *
+ * @author cdf
+ * @since 2025-03-26
+ */
+@RestController
+@RequestMapping("/dataVerify")
+@RequiredArgsConstructor
+@Api(tags = "异常数据功能")
+public class DataVerifyController extends BaseController {
+
+ private final IDataVerifyService iDataVerifyService;
+
+
+ /**
+ * 获取异常监测点相关信息
+ */
+ @OperateInfo(info = LogEnum.BUSINESS_COMMON)
+ @PostMapping("/getMonitorVerifyData")
+ @ApiOperation("获取异常监测点相关信息")
+ public HttpResult getMonitorVerifyData(@RequestBody MonitorBaseParam monitorBaseParam){
+ String methodDescribe = getMethodDescribe("getMonitorVerifyData");
+ VerifyMonitorVO verifyMonitorVO = iDataVerifyService.getMonitorVerifyData(monitorBaseParam);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, verifyMonitorVO, methodDescribe);
+ }
+
+
+ /**
+ * 获取时间范围异常测点数量
+ */
+ @OperateInfo(info = LogEnum.BUSINESS_COMMON)
+ @PostMapping("/getRangeAbnormalMonitor")
+ @ApiOperation("获取异常监测点相关信息")
+ public HttpResult>> getRangeAbnormalMonitor(@RequestBody MonitorBaseParam monitorBaseParam){
+ String methodDescribe = getMethodDescribe("getRangeAbnormalMonitor");
+ List