diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/WlRecordParam.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/WlRecordParam.java
new file mode 100644
index 0000000..ab944b7
--- /dev/null
+++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/param/WlRecordParam.java
@@ -0,0 +1,100 @@
+package com.njcn.csdevice.pojo.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * 类的介绍:
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/1 19:18
+ */
+@Data
+public class WlRecordParam {
+
+ @ApiModelProperty("方案、测试项名称")
+ @NotBlank(message = "名称不可为空")
+ private String itemName;
+
+ @ApiModelProperty("描述")
+ private String describe;
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Record extends WlRecordParam {
+
+ @ApiModelProperty("工程名称")
+ private String gcName;
+
+ @ApiModelProperty("统计间隔")
+ @NotNull(message = "统计间隔不可为空")
+ private Integer statisticalInterval;
+
+ @ApiModelProperty("电压等级")
+ @NotNull(message = "电压等级不可为空")
+ private String voltageLevel;
+
+ @ApiModelProperty("电压接线方式(星型、角型、V型)")
+ @NotNull(message = "电压接线方式不可为空")
+ private String volConType;
+
+ @ApiModelProperty("电流接线方式(正常、合成IB、合成IC)")
+ @NotNull(message = "电流接线方式不可为空")
+ private String curConSel;
+
+ @ApiModelProperty("基准短路容量(MVA)")
+ @NotNull(message = "基准短路容量不可为空")
+ private Float capacitySscb;
+
+ @ApiModelProperty("最小短路容量(MVA)")
+ @NotNull(message = "最小短路容量不可为空")
+ private Float capacitySscmin;
+
+ @ApiModelProperty("供电设备容量(MVA)")
+ @NotNull(message = "供电设备容量不可为空")
+ private Float capacitySt;
+
+ @ApiModelProperty("用户协议容量(MVA)")
+ @NotNull(message = "用户协议容量不可为空")
+ private Float capacitySi;
+
+ @ApiModelProperty("PT变比")
+ @NotNull(message = "PT变比不可为空")
+ private Integer pt;
+
+ @ApiModelProperty("CT变比")
+ @NotNull(message = "CT变比不可为空")
+ private Integer ct;
+
+ @ApiModelProperty("测试项监测位置")
+ @NotNull(message = "测试项监测位置不可为空")
+ private String location;
+
+ @ApiModelProperty("数据类型(0:方案 1:测试项)")
+ @NotNull(message = "数据类型不可为空")
+ private Integer type;
+
+ @ApiModelProperty("状态(0:删除 1:正常)")
+ @NotNull(message = "状态不可为空")
+ private Integer state;
+
+ @ApiModelProperty("测试项集合ID")
+ private List list;
+ }
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class UpdateRecord extends Record {
+
+ @ApiModelProperty("id")
+ @NotNull(message = "id")
+ private String id;
+ }
+
+}
diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/CsLinePO.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/CsLinePO.java
index bcff67c..dba8c62 100644
--- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/CsLinePO.java
+++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/CsLinePO.java
@@ -81,4 +81,6 @@ public class CsLinePO extends BaseEntity {
@TableField(value = "clDid")
private Integer clDid;
+ @TableField(value = "device_id")
+ private String deviceId;
}
\ No newline at end of file
diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/WlRecord.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/WlRecord.java
new file mode 100644
index 0000000..99bf492
--- /dev/null
+++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/po/WlRecord.java
@@ -0,0 +1,156 @@
+package com.njcn.csdevice.pojo.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.njcn.db.bo.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 方案、测试项表
+ *
+ *
+ * @author xuyang
+ * @since 2024-04-01
+ */
+@Getter
+@Setter
+@TableName("wl_record")
+public class WlRecord extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * uuid
+ */
+ private String id;
+
+ /**
+ * 方案id
+ */
+ private String pId;
+
+ /**
+ * 方案、测试项名称
+ */
+ private String itemName;
+
+ /**
+ * 工程名称
+ */
+ private String gcName;
+
+ /**
+ * 装置id
+ */
+ private String devId;
+
+ /**
+ * 监测点id
+ */
+ private String lineId;
+
+ /**
+ * 统计间隔
+ */
+ private Integer statisticalInterval;
+
+ /**
+ * PT变比
+ */
+ private Integer pt;
+
+ /**
+ * CT变比
+ */
+ private Integer ct;
+
+ /**
+ * 电压等级
+ */
+ private String voltageLevel;
+
+ /**
+ * 基准短路容量(MVA)
+ */
+ private Float capacitySscb;
+
+ /**
+ * 最小短路容量(MVA)
+ */
+ private Float capacitySscmin;
+
+ /**
+ * 供电设备容量(MVA)
+ */
+ private Float capacitySt;
+
+ /**
+ * 用户协议容量(MVA)
+ */
+ private Float capacitySi;
+
+ /**
+ * 电压接线方式(星型、角型、V型)
+ */
+ private String volConType;
+
+ /**
+ * 电流接线方式(正常、合成IB、合成IC)
+ */
+ private String curConSel;
+
+ /**
+ * 测试起始时间
+ */
+ private LocalDateTime startTime;
+
+ /**
+ * 测试结束时间
+ */
+ private LocalDateTime endTime;
+
+ /**
+ * 测试项监测位置
+ */
+ private String location;
+
+ /**
+ * 数据类型(0:方案 1:测试项)
+ */
+ private Integer type;
+
+ /**
+ * 状态(0:删除 1:正常)
+ */
+ private Integer state;
+
+ /**
+ * 描述
+ */
+ private String describe;
+
+ /**
+ * 创建用户
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 更新用户
+ */
+ private String updateBy;
+
+ /**
+ * 更新时间
+ */
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordTreeVo.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordTreeVo.java
new file mode 100644
index 0000000..c35a2e6
--- /dev/null
+++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordTreeVo.java
@@ -0,0 +1,52 @@
+package com.njcn.csdevice.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 类的介绍:方案树、测试项树
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/2 10:23
+ */
+@Data
+public class RecordTreeVo {
+
+ @ApiModelProperty("方案id")
+ private String schemeId;
+
+ @ApiModelProperty("方案名称")
+ private String name;
+
+ @ApiModelProperty("下层数据")
+ private List children;
+
+ @Data
+ @EqualsAndHashCode(callSuper = true)
+ public static class Children extends RecordTreeVo {
+
+ @ApiModelProperty("id")
+ private String id;
+
+ @ApiModelProperty("名称")
+ private String recordName;
+
+ @ApiModelProperty("设备MAC")
+ private String devMac;
+
+ @ApiModelProperty("监测点名称")
+ private String lineName;
+
+ @ApiModelProperty("测试项开始时间")
+ private LocalDateTime startTime;
+
+ @ApiModelProperty("测试项结束时间")
+ private LocalDateTime endTime;
+ }
+
+}
diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordVo.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordVo.java
new file mode 100644
index 0000000..833e0ce
--- /dev/null
+++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/vo/RecordVo.java
@@ -0,0 +1,74 @@
+package com.njcn.csdevice.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 类的介绍: 测试项详情表
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/1 20:10
+ */
+@Data
+public class RecordVo {
+
+ @ApiModelProperty("测试项id")
+ private String id;
+
+ @ApiModelProperty("测试项名称")
+ private String recordName;
+
+ @ApiModelProperty("设备名称")
+ private String devName;
+
+ @ApiModelProperty("设备MAC")
+ private String devMac;
+
+ @ApiModelProperty("监测点名称")
+ private String lineName;
+
+ @ApiModelProperty("数据起始时间")
+ private LocalDateTime startTime;
+
+ @ApiModelProperty("数据结束时间")
+ private LocalDateTime endTime;
+
+ @ApiModelProperty("测试位置")
+ private String location;
+
+ @ApiModelProperty("数据类型")
+ private Integer type;
+
+ @ApiModelProperty("统计间隔")
+ private Integer statisticalInterval;
+
+ @ApiModelProperty("PT变比")
+ private Integer pt;
+
+ @ApiModelProperty("CT变比")
+ private Integer ct;
+
+ @ApiModelProperty("CT变比")
+ private String voltageLevel;
+
+ @ApiModelProperty("基准短路容量")
+ private Float capacitySscb;
+
+ @ApiModelProperty("最小短路容量")
+ private Float capacitySscmin;
+
+ @ApiModelProperty("供电设备容量")
+ private Float capacitySt;
+
+ @ApiModelProperty("用户协议容量")
+ private Float capacitySi;
+
+ @ApiModelProperty("电压接线方式")
+ private String volConType;
+
+ @ApiModelProperty("电流接线方式")
+ private String curConSel;
+}
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/scheme/WlRecordController.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/scheme/WlRecordController.java
new file mode 100644
index 0000000..322ea08
--- /dev/null
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/controller/scheme/WlRecordController.java
@@ -0,0 +1,171 @@
+package com.njcn.csdevice.controller.scheme;
+
+
+import com.njcn.common.pojo.annotation.OperateInfo;
+import com.njcn.common.pojo.constant.OperateType;
+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.common.utils.LogUtil;
+import com.njcn.csdevice.pojo.param.WlRecordParam;
+import com.njcn.csdevice.pojo.po.WlRecord;
+import com.njcn.csdevice.pojo.vo.RecordTreeVo;
+import com.njcn.csdevice.pojo.vo.RecordVo;
+import com.njcn.csdevice.service.IWlRecordService;
+import com.njcn.web.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ * 方案、测试项表 前端控制器
+ *
+ *
+ * @author xuyang
+ * @since 2024-04-01
+ */
+@Validated
+@Slf4j
+@RestController
+@RequestMapping("/wlRecord")
+@Api(tags = "方案测试项管理")
+@AllArgsConstructor
+public class WlRecordController extends BaseController {
+
+ private final IWlRecordService wlRecordService;
+
+ /**
+ * 新增方案、测试项
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
+ @PostMapping("/add")
+ @ApiOperation("新增方案或测试项")
+ @ApiImplicitParam(name = "list", value = "测试项集合", required = true)
+ public HttpResult add(@RequestBody @Validated List list) {
+ String methodDescribe = getMethodDescribe("add");
+ try {
+ LogUtil.njcnDebug(log, "{},新增的测试项集合为:{}", methodDescribe, list);
+ wlRecordService.add(list);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
+ }
+ }
+
+ /**
+ * 修改方案
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
+ @PostMapping("/update")
+ @ApiOperation("修改方案")
+ @ApiImplicitParam(name = "list", value = "测试项集合", required = true)
+ public HttpResult update(@RequestBody @Validated List list) {
+ String methodDescribe = getMethodDescribe("update");
+ try {
+ LogUtil.njcnDebug(log, "{},修改的测试项集合为:{}", methodDescribe, list);
+ wlRecordService.update(list);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
+ }
+ }
+
+ /**
+ * 根据方案查询测试项信息
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
+ @PostMapping("/getRecordById")
+ @ApiOperation("通过方案id查询所属测试项")
+ @ApiImplicitParam(name = "id", value = "用户id", required = true)
+ public HttpResult> getRecordById(@RequestParam @Validated String id) {
+ String methodDescribe = getMethodDescribe("getRecordById");
+ try {
+ LogUtil.njcnDebug(log, "{},测试项id为:{}", methodDescribe, id);
+ List result = wlRecordService.getRecordById(id);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
+ }
+ }
+
+ /**
+ * 查询所有测试项信息
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
+ @PostMapping("/listRecord")
+ @ApiOperation("查询所有测试项信息")
+ public HttpResult> listRecord() {
+ String methodDescribe = getMethodDescribe("listRecord");
+ try {
+ LogUtil.njcnDebug(log, "{}", methodDescribe);
+ List result = wlRecordService.getRecordTree();
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
+ }
+ }
+
+ /**
+ * 两层方案树
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.ADD)
+ @PostMapping("/schemeTree")
+ @ApiOperation("两层方案树")
+ public HttpResult> getSchemeTree() {
+ String methodDescribe = getMethodDescribe("getSchemeTree");
+ try {
+ LogUtil.njcnDebug(log, "{}", methodDescribe);
+ List result = wlRecordService.getSchemeTree();
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
+ }
+ }
+
+ /**
+ * 删除方案
+ * @param id 方案、测试项id
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.DELETE)
+ @DeleteMapping("/delete")
+ @ApiOperation("删除方案")
+ @ApiImplicitParam(name = "id", value = "方案id", required = true)
+ public HttpResult delete(@RequestParam @Validated String id) {
+ String methodDescribe = getMethodDescribe("delete");
+ try {
+ LogUtil.njcnDebug(log, "{},方案id为:{}", methodDescribe, id);
+ wlRecordService.delete(id);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
+ }
+ }
+
+ /**
+ * 根据测试项id查询测试项详细信息
+ */
+ @OperateInfo(info = LogEnum.SYSTEM_COMMON, operateType = OperateType.DELETE)
+ @DeleteMapping("/detailById")
+ @ApiOperation("根据id获取测试项详情")
+ @ApiImplicitParam(name = "id", value = "测试项id", required = true)
+ public HttpResult getDetailById(@RequestParam @Validated String id) {
+ String methodDescribe = getMethodDescribe("getRecordById");
+ try {
+ LogUtil.njcnDebug(log, "{},测试项id为:{}", methodDescribe, id);
+ WlRecord wlRecord = wlRecordService.getDataById(id);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, wlRecord, methodDescribe);
+ } catch (Exception e) {
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
+ }
+ }
+
+}
+
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/WlRecordMapper.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/WlRecordMapper.java
new file mode 100644
index 0000000..ec4db6d
--- /dev/null
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/WlRecordMapper.java
@@ -0,0 +1,40 @@
+package com.njcn.csdevice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.njcn.csdevice.pojo.po.WlRecord;
+import com.njcn.csdevice.pojo.vo.RecordVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ *
+ * 方案、测试项表 Mapper 接口
+ *
+ *
+ * @author xuyang
+ * @since 2024-04-01
+ */
+public interface WlRecordMapper extends BaseMapper {
+
+ /**
+ * 根据方案id查询所属的测试项
+ * @param id
+ * @return
+ */
+ List listRecord(@Param("id") String id);
+
+ /**
+ * 查询所有的测试项
+ * @return
+ */
+ List getAllRecord();
+
+ /**
+ * 查询所有的方案和测试项
+ * @return
+ */
+ List getAll();
+
+
+}
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsLinePOMapper.xml b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsLinePOMapper.xml
index 923a6d6..c8f49b2 100644
--- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsLinePOMapper.xml
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/CsLinePOMapper.xml
@@ -24,16 +24,13 @@
\ No newline at end of file
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml
new file mode 100644
index 0000000..f71614a
--- /dev/null
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/mapper/mapping/WlRecordMapper.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IWlRecordService.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IWlRecordService.java
new file mode 100644
index 0000000..67cf49c
--- /dev/null
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/IWlRecordService.java
@@ -0,0 +1,70 @@
+package com.njcn.csdevice.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.njcn.csdevice.pojo.param.WlRecordParam;
+import com.njcn.csdevice.pojo.po.WlRecord;
+import com.njcn.csdevice.pojo.vo.RecordTreeVo;
+import com.njcn.csdevice.pojo.vo.RecordVo;
+
+import java.util.List;
+
+/**
+ *
+ * 方案、测试项表 服务类
+ *
+ *
+ * @author xuyang
+ * @since 2024-04-01
+ */
+public interface IWlRecordService extends IService {
+
+ /**
+ * 批量新增方案或测试项
+ * @param list
+ * @return
+ */
+ void add(List list);
+
+ /**
+ * 批量修改方案信息
+ * @param list
+ * @return
+ */
+ void update(List list);
+
+ /**
+ * 根据方案查询测试项信息
+ * @param id
+ * @return
+ */
+ List getRecordById(String id);
+
+ /**
+ * 查询所有测试项信息,用于方案添加测试项
+ * @param
+ * @return
+ */
+ List getRecordTree();
+
+ /**
+ * 获取方案树
+ * @param
+ * @return
+ */
+ List getSchemeTree();
+
+ /**
+ * 删除方案
+ * @param
+ * @return
+ */
+ void delete(String id);
+
+ /**
+ * 根据测试项id查询测试项详情
+ * @return
+ */
+ WlRecord getDataById(String id);
+
+}
diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java
index d2125c0..c83b080 100644
--- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java
+++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsEquipmentDeliveryServiceImpl.java
@@ -10,6 +10,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.client.naming.utils.CollectionUtils;
+import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -31,6 +32,7 @@ import com.njcn.csdevice.utils.ExcelStyleUtil;
import com.njcn.db.constant.DbConstant;
import com.njcn.oss.constant.OssPath;
import com.njcn.oss.utils.FileStorageUtil;
+import com.njcn.redis.pojo.enums.AppRedisKey;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.enums.DicDataEnum;
@@ -96,7 +98,7 @@ public class CsEquipmentDeliveryServiceImpl extends ServiceImpl
+ * 方案、测试项表 服务实现类
+ *
+ *
+ * @author xuyang
+ * @since 2024-04-01
+ */
+@Service
+public class WlRecordServiceImpl extends ServiceImpl implements IWlRecordService {
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void add(List list) {
+ List insertList = new ArrayList<>();
+ list.forEach(item->{
+ String id = IdUtil.simpleUUID();
+ WlRecord wlRecord = new WlRecord();
+ BeanUtils.copyProperties(item, wlRecord);
+ wlRecord.setId(id);
+ insertList.add(wlRecord);
+ if (CollUtil.isNotEmpty(item.getList())){
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(WlRecord::getPId, id)
+ .in(WlRecord::getId,item.getList());
+ this.update(lambdaUpdateWrapper);
+ }
+ });
+ this.saveBatch(insertList);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(List list) {
+ List updateList = new ArrayList<>();
+ list.forEach(item->{
+ WlRecord wlRecord = new WlRecord();
+ BeanUtils.copyProperties(item, wlRecord);
+ updateList.add(wlRecord);
+ if (CollUtil.isNotEmpty(item.getList())){
+ //先将方案绑定的测试项去除,然后再根据传递的数据绑定
+ LambdaUpdateWrapper lambdaUpdateWrapper1 = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper1.set(WlRecord::getPId, null)
+ .in(WlRecord::getId,item.getList());
+ this.update(lambdaUpdateWrapper1);
+ LambdaUpdateWrapper lambdaUpdateWrapper2 = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper2.set(WlRecord::getPId, item.getId())
+ .in(WlRecord::getId,item.getList());
+ this.update(lambdaUpdateWrapper2);
+ }
+ });
+ this.updateBatchById(updateList);
+ }
+
+ @Override
+ public List getRecordById(String id) {
+ return this.baseMapper.listRecord(id);
+ }
+
+ @Override
+ public List getRecordTree() {
+ List result = new ArrayList<>();
+ Optional.ofNullable(this.baseMapper.getAllRecord())
+ .ifPresent(list -> list.stream()
+ .collect(Collectors.groupingBy(RecordVo::getDevName))
+ .forEach((devName, records) -> {
+ List childrenList = records.stream()
+ .map(this::mapToChildren)
+ .collect(Collectors.toList());
+ RecordTreeVo vo = new RecordTreeVo();
+ vo.setName(devName);
+ vo.setChildren(childrenList);
+ result.add(vo);
+ }));
+ return result;
+ }
+
+ @Override
+ public List getSchemeTree() {
+ List result = new ArrayList<>();
+ List list = this.baseMapper.getAll();
+ // 过滤出方案数据和测试项数据
+ List schemes = list.stream().filter(item -> item.getType() == 0).collect(Collectors.toList());
+ List testItems = list.stream().filter(item -> item.getType() == 1).collect(Collectors.toList());
+ if (CollUtil.isNotEmpty(schemes)){
+ // 遍历方案数据
+ for (RecordVo scheme : schemes) {
+ RecordTreeVo vo = new RecordTreeVo();
+ vo.setSchemeId(scheme.getId());
+ vo.setName(scheme.getRecordName());
+ if (CollUtil.isNotEmpty(testItems)){
+ // 将测试项数据映射为子节点列表
+ List childrenList = testItems.stream()
+ .map(item -> {
+ RecordTreeVo.Children children = new RecordTreeVo.Children();
+ children.setId(item.getId());
+ String name = item.getDevName() + "-" + item.getLocation() + "(" + item.getStartTime() + "~" + item.getEndTime() + ")";
+ children.setRecordName(name);
+ return children;
+ })
+ .collect(Collectors.toList());
+ vo.setChildren(childrenList);
+ result.add(vo);
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void delete(String id) {
+ LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+ lambdaUpdateWrapper.set(WlRecord::getState,0)
+ .eq(WlRecord::getId, id)
+ .eq(WlRecord::getType, 0);
+ this.update(lambdaUpdateWrapper);
+ }
+
+ @Override
+ public WlRecord getDataById(String id) {
+ return lambdaQuery().eq(WlRecord::getId, id)
+ .eq(WlRecord::getType,1)
+ .eq(WlRecord::getState, 1)
+ .one();
+ }
+
+ private RecordTreeVo.Children mapToChildren(RecordVo record) {
+ RecordTreeVo.Children children = new RecordTreeVo.Children();
+ BeanUtils.copyProperties(record, children);
+ return children;
+ }
+
+}
diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/AbnormalDataParam.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/AbnormalDataParam.java
new file mode 100644
index 0000000..3a2fb58
--- /dev/null
+++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/param/AbnormalDataParam.java
@@ -0,0 +1,28 @@
+package com.njcn.csharmonic.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 类的介绍:
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/3 14:06
+ */
+@Data
+public class AbnormalDataParam {
+
+ @ApiModelProperty("指标名称")
+ private String targetName;
+
+ @ApiModelProperty("起始时间")
+ private String startTime;
+
+ @ApiModelProperty("结束时间")
+ private String endTime;
+
+ @ApiModelProperty("模糊搜索内容")
+ private String content;
+
+}
diff --git a/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/AnomalousDataVo.java b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/AnomalousDataVo.java
new file mode 100644
index 0000000..80cd283
--- /dev/null
+++ b/cs-harmonic/cs-harmonic-api/src/main/java/com/njcn/csharmonic/pojo/vo/AnomalousDataVo.java
@@ -0,0 +1,50 @@
+package com.njcn.csharmonic.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 类的介绍:数据清洗功能展示类
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/3 14:15
+ */
+@Data
+public class AnomalousDataVo {
+
+ @ApiModelProperty("设备名称")
+ private String devName;
+
+ @ApiModelProperty("方案名称")
+ private String planName;
+
+ @ApiModelProperty("测试项名称")
+ private String itemName;
+
+ @ApiModelProperty("设备MAC")
+ private String devMac;
+
+ @ApiModelProperty("监测点名称")
+ private String lineName;
+
+ @ApiModelProperty("指标名称")
+ private String targetName;
+
+ @ApiModelProperty("相别")
+ private String phasicType;
+
+ @ApiModelProperty("数据类型")
+ private String valueType;
+
+ @ApiModelProperty("数据时间")
+ private LocalDateTime dataTime;
+
+ @ApiModelProperty("指标数据")
+ private Double data;
+
+ @ApiModelProperty("正常范围")
+ private String normalRange;
+}
diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/AnomalousDataController.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/AnomalousDataController.java
new file mode 100644
index 0000000..964841e
--- /dev/null
+++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/controller/AnomalousDataController.java
@@ -0,0 +1,81 @@
+package com.njcn.csharmonic.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.csharmonic.param.AbnormalDataParam;
+import com.njcn.csharmonic.pojo.vo.AnomalousDataVo;
+import com.njcn.csharmonic.service.AnomalousDataService;
+import com.njcn.event.file.pojo.dto.WaveDataDTO;
+import com.njcn.web.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 类的介绍:数据清洗控制层
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/3 13:56
+ */
+@Slf4j
+@RestController
+@RequestMapping("/clean")
+@Api(tags = "数据清洗")
+@AllArgsConstructor
+public class AnomalousDataController extends BaseController {
+
+ private final AnomalousDataService anomalousDataService;
+
+ @OperateInfo(info = LogEnum.BUSINESS_COMMON)
+ @GetMapping("/getAbnormalData")
+ @ApiOperation("查询装置异常指标数据")
+ @ApiImplicitParam(name = "param", value = "参数实体", required = true)
+ public HttpResult> getAbnormalData(@RequestParam AbnormalDataParam param) {
+ String methodDescribe = getMethodDescribe("getAbnormalData");
+ List result = anomalousDataService.getAbnormalData(param);
+ return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AnomalousDataService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AnomalousDataService.java
new file mode 100644
index 0000000..29ef09b
--- /dev/null
+++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AnomalousDataService.java
@@ -0,0 +1,12 @@
+package com.njcn.csharmonic.service;
+
+import com.njcn.csharmonic.param.AbnormalDataParam;
+import com.njcn.csharmonic.pojo.vo.AnomalousDataVo;
+
+import java.util.List;
+
+public interface AnomalousDataService {
+
+ List getAbnormalData(AbnormalDataParam param);
+
+}
diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/AnomalousDataServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/AnomalousDataServiceImpl.java
new file mode 100644
index 0000000..95370e5
--- /dev/null
+++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/AnomalousDataServiceImpl.java
@@ -0,0 +1,24 @@
+package com.njcn.csharmonic.service.impl;
+
+import com.njcn.csharmonic.param.AbnormalDataParam;
+import com.njcn.csharmonic.pojo.vo.AnomalousDataVo;
+import com.njcn.csharmonic.service.AnomalousDataService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 类的介绍:
+ *
+ * @author xuyang
+ * @version 1.0.0
+ * @createTime 2024/4/3 14:15
+ */
+@Service
+public class AnomalousDataServiceImpl implements AnomalousDataService {
+
+ @Override
+ public List getAbnormalData(AbnormalDataParam param) {
+ return null;
+ }
+}