diff --git a/README.md b/README.md
index 1ed46dd..5f2a4b7 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
.pom文件,yml文件整合
.删除不需要的私有化定制代码
.本地队列驱动优化
- .移除[changshu]模块
+ .移除[qingyuan]模块
.移除 老旧的[gateway]模块
.[publicorg]模块 有涉及设备管理相关代码,暂时保留
diff --git a/application/pom.xml b/application/pom.xml
index d45a2d4..4372fe7 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -137,6 +137,10 @@
com.thing.modules
filter-rule
+
+ com.thing.modules
+ qingyuan
+
com.thing.modules
cqc-service
diff --git a/application/src/main/resources/application.yml b/application/src/main/resources/application.yml
index bc695bb..c4fc54a 100644
--- a/application/src/main/resources/application.yml
+++ b/application/src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
- port: 18080
+ port: 8080
servlet:
context-path: /thing
spring:
@@ -62,7 +62,7 @@ database:
# 数据源及mybatis、mybatis-flex配置
mybatis-flex:
#是否开启审计日志打印
- auditEnable: false
+ auditEnable: true
#mapper 包扫描路径
typeAliasesPackage: com.thing.**.mapper
#mapper 扫描路径
@@ -82,14 +82,21 @@ mybatis-flex:
#物管理数据源
pg-thing:
type: com.zaxxer.hikari.HikariDataSource
- url: jdbc:postgresql://127.0.0.1:25432/pub_guowang_v1
+ url: jdbc:postgresql://127.0.0.1:15432/thing
driver-class-name: org.postgresql.Driver
username: postgres
password: sddt8888
#遥测数据数据眼
pg-tskv:
type: com.zaxxer.hikari.HikariDataSource
- url: jdbc:postgresql://127.0.0.1:25432/pub_guowang_v1
+ url: jdbc:postgresql://127.0.0.1:15432/thing
+ driver-class-name: org.postgresql.Driver
+ username: postgres
+ password: sddt8888
+ systemCollect:
+ # 指定为HikariDataSource
+ type: com.zaxxer.hikari.HikariDataSource
+ url: jdbc:postgresql://192.168.188.184:5432/systemCollect
driver-class-name: org.postgresql.Driver
username: postgres
password: sddt8888
diff --git a/common/core/src/main/java/com/thing/common/core/event/SimulateSocketEvent.java b/common/core/src/main/java/com/thing/common/core/event/SimulateSocketEvent.java
new file mode 100644
index 0000000..bf7bd47
--- /dev/null
+++ b/common/core/src/main/java/com/thing/common/core/event/SimulateSocketEvent.java
@@ -0,0 +1,32 @@
+package com.thing.common.core.event;
+
+
+import com.thing.common.data.dto.QueueMsgDTO;
+import com.thing.common.data.event.AbstractQueueEvent;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @author zhenghh. 2023-03-14
+ **/
+public class SimulateSocketEvent extends AbstractQueueEvent {
+
+
+ @Serial
+ private static final long serialVersionUID = -7524682936528507783L;
+
+ public SimulateSocketEvent(Object source, List list) {
+ super(source, list);
+ }
+
+// /**
+// * 事件类型
+// *
+// * @return type
+// */
+// @Override
+// public QueueEventType getEventType() {
+// return QueueEventType.SOCKET;
+// }
+}
diff --git a/modules/pom.xml b/modules/pom.xml
index eb93403..cf42015 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -21,6 +21,8 @@
calculation
mock
fix
+ qingyuan
+
publicorg
alarm
filter-rule
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/controller/AlertController.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/controller/AlertController.java
new file mode 100644
index 0000000..0efbc62
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/controller/AlertController.java
@@ -0,0 +1,103 @@
+package com.thing.qingyuan.alert.controller;
+
+import com.thing.qingyuan.alert.dto.AlertDTO;
+import com.thing.qingyuan.alert.service.AlertService;
+import com.thing.common.core.annotation.LogOperation;
+import com.thing.common.core.constants.Constant;
+import com.thing.common.core.validator.AssertUtils;
+import com.thing.common.core.validator.ValidatorUtils;
+import com.thing.common.core.validator.group.AddGroup;
+import com.thing.common.core.validator.group.DefaultGroup;
+import com.thing.common.core.validator.group.UpdateGroup;
+import com.thing.common.core.web.response.PageData;
+import com.thing.common.core.web.response.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* 告警记录
+*
+* @author xc
+* @since 3.0 2024-01-31
+*/
+@RestController
+@RequestMapping("alert")
+@Tag(name="告警记录")
+@RequiredArgsConstructor
+public class AlertController {
+
+ private final AlertService alertService;
+
+ @GetMapping("page")
+ @Operation(summary="分页")
+ @Parameters({
+ @Parameter(name = Constant.PAGE, description = "当前页码,从1开始") ,
+ @Parameter(name = Constant.LIMIT, description = "每页显示记录数") ,
+ @Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
+ @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)"),
+ @Parameter(name = "name", description = "告警名称"),
+ @Parameter(name = "level", description = "告警等级"),
+ @Parameter(name = "status", description = "处理状态"),
+ @Parameter(name = "startTime", description = "告警开始时间窗口"),
+ @Parameter(name = "endTime", description = "告警结束时间窗口"),
+ @Parameter(name = "plantIds", description = "光伏场站id列表"),
+ })
+ public Result> page(@RequestParam Map params){
+ PageData page = alertService.handlePage(params);
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{id}")
+ @Operation(summary="信息")
+ public Result get(@PathVariable("id") Long id){
+ AlertDTO data = alertService.getByIdAs(id, AlertDTO.class);
+ return new Result().ok(data);
+ }
+
+ @PostMapping
+ @Operation(summary="保存")
+ @LogOperation("保存")
+ public Result save(@RequestBody AlertDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+ alertService.saveDto(dto);
+ return new Result<>();
+ }
+
+ @PutMapping
+ @Operation(summary="修改")
+ @LogOperation("修改")
+ public Result update(@RequestBody AlertDTO dto){
+ //效验数据
+ ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+ alertService.updateDto(dto);
+ return new Result<>();
+ }
+
+ @DeleteMapping
+ @Operation(summary="删除")
+ @LogOperation("删除")
+ public Result delete(@RequestBody Long[] ids){
+ //效验数据
+ AssertUtils.isArrayEmpty(ids, "id");
+ alertService.batchDelete(ids);
+ return new Result<>();
+ }
+
+ @GetMapping("export")
+ @Operation(summary="导出")
+ @LogOperation("导出")
+ public void export( @RequestParam Map params, HttpServletResponse response) throws Exception {
+ List list = alertService.listAs(params, AlertDTO.class);
+ //ExcelUtils.exportExcelToTarget(response, null, "告警记录", list, AlertExcel.class);
+ }
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/dto/AlertDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/dto/AlertDTO.java
new file mode 100644
index 0000000..dd5638b
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/dto/AlertDTO.java
@@ -0,0 +1,70 @@
+package com.thing.qingyuan.alert.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+* 告警记录
+*
+* @author xc
+* @since 3.0 2024-01-31
+*/
+@Data
+@Schema( name= "告警记录")
+public class AlertDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "主键")
+ private Long plantAlertId;
+ @Schema(description = "电站id")
+ private Long plantId;
+ @Schema(description = "电站名称")
+ private String plantName;
+ @Schema(description = "设备id")
+ private Long deviceId;
+ @Schema(description = "设备名称")
+ private String deviceName;
+ @Schema(description = "状态id:1.未处理;2.已处理;3.已恢复")
+ private Integer status;
+ @Schema(description = "状态文本:1.未处理;2.已处理;3.已恢复")
+ private String statusLabel;
+ @Schema(description = "采集器sn")
+ private String collectorSn;
+ @Schema(description = "逆变器sn")
+ private String deviceSn;
+ @Schema(description = "报警等级id: 01.故障 02.警告 03.提示")
+ private Integer alertLevel;
+ @Schema(description = "报警等级文本: 01.故障 02.警告 03.提示")
+ private String alertLevelLabel;
+ @Schema(description = "报警名称")
+ private String alertName;
+ @Schema(description = "报警代码")
+ private String alertCode;
+ @Schema(description = "报警影响面")
+ private Integer alertEffect;
+ @Schema(description = "报警影响面文本")
+ private String alertEffectLabel;
+ @Schema(description = "报警发生时间")
+ private String startTimeOrigin;
+ @Schema(description = "报警发生时间")
+ private String startTime;
+ @Schema(description = "报警恢复时间")
+ private String endTimeOrigin;
+ @Schema(description = "报警恢复时间")
+ private String endTime;
+ @Schema(description = "报警发生时间")
+ private String startTimeForCharts;
+ @Schema(description = "报警恢复时间")
+ private String endTimeForCharts;
+ @Schema(description = "持续时间")
+ private String duration;
+ @Schema(description = "拟解决方案")
+ private String solution;
+ @Schema(description = "时区")
+ private Integer timeZoneOffset;
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/entity/AlertEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/entity/AlertEntity.java
new file mode 100644
index 0000000..adb7c50
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/entity/AlertEntity.java
@@ -0,0 +1,113 @@
+package com.thing.qingyuan.alert.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 告警记录
+ *
+ * @author xc
+ * @since 3.0 2024-01-31
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@Table("alert")
+public class AlertEntity implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @Id
+ private Long plantAlertId;
+ /**
+ * 电站id
+ */
+ private Long plantId;
+ /**
+ * 设备id
+ */
+ private Long deviceId;
+ /**
+ * 状态id:1.未处理;2.已处理;3.已恢复
+ */
+ private Integer status;
+ /**
+ * 状态文本:1.未处理;2.已处理;3.已恢复
+ */
+ private String statusLabel;
+ /**
+ * 采集器sn
+ */
+ private String collectorSn;
+ /**
+ * 逆变器sn
+ */
+ private String deviceSn;
+ /**
+ * 报警等级id: 01.故障 02.警告 03.提示
+ */
+ private Integer alertLevel;
+ /**
+ * 报警等级文本: 01.故障 02.警告 03.提示
+ */
+ private String alertLevelLabel;
+ /**
+ * 报警名称
+ */
+ private String alertName;
+ /**
+ * 报警代码
+ */
+ private String alertCode;
+ /**
+ * 报警影响面
+ */
+ private Integer alertEffect;
+ /**
+ * 报警影响面文本
+ */
+ private String alertEffectLabel;
+ /**
+ * 报警发生时间
+ */
+ private String startTimeOrigin;
+ /**
+ * 报警发生时间
+ */
+ private String startTime;
+ /**
+ * 报警恢复时间
+ */
+ private String endTimeOrigin;
+ /**
+ * 报警恢复时间
+ */
+ private String endTime;
+ /**
+ * 报警发生时间
+ */
+ private String startTimeForCharts;
+ /**
+ * 报警恢复时间
+ */
+ private String endTimeForCharts;
+ /**
+ * 持续时间
+ */
+ private String duration;
+ /**
+ * 拟解决方案
+ */
+ private String solution;
+ /**
+ * 时区
+ */
+ private Integer timeZoneOffset;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/excel/AlertExcel.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/excel/AlertExcel.java
new file mode 100644
index 0000000..89102b5
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/excel/AlertExcel.java
@@ -0,0 +1,64 @@
+package com.thing.qingyuan.alert.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+/**
+ * 告警记录
+ *
+ * @author xc
+ * @since 3.0 2024-01-31
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class AlertExcel {
+ @ExcelProperty(value = "主键", index = 0)
+ private Long plantAlertId;
+ @ExcelProperty(value = "电站id", index = 1)
+ private Long plantId;
+ @ExcelProperty(value = "设备id", index = 2)
+ private Long deviceId;
+ @ExcelProperty(value = "状态id:1.未处理;2.已处理;3.已恢复", index = 3)
+ private Integer status;
+ @ExcelProperty(value = "状态文本:1.未处理;2.已处理;3.已恢复", index = 4)
+ private String statusLabel;
+ @ExcelProperty(value = "采集器sn", index = 5)
+ private String collectorSn;
+ @ExcelProperty(value = "逆变器sn", index = 6)
+ private String deviceSn;
+ @ExcelProperty(value = "报警等级id: 01.故障 02.警告 03.提示", index = 7)
+ private Integer alertLevel;
+ @ExcelProperty(value = "报警等级文本: 01.故障 02.警告 03.提示", index = 8)
+ private String alertLevelLabel;
+ @ExcelProperty(value = "报警名称", index = 9)
+ private String alertName;
+ @ExcelProperty(value = "报警代码", index = 10)
+ private String alertCode;
+ @ExcelProperty(value = "报警影响面", index = 11)
+ private Integer alertEffect;
+ @ExcelProperty(value = "报警影响面文本", index = 12)
+ private String alertEffectLabel;
+ @ExcelProperty(value = "报警发生时间", index = 13)
+ private String startTimeOrigin;
+ @ExcelProperty(value = "报警发生时间", index = 14)
+ private String startTime;
+ @ExcelProperty(value = "报警恢复时间", index = 15)
+ private String endTimeOrigin;
+ @ExcelProperty(value = "报警恢复时间", index = 16)
+ private String endTime;
+ @ExcelProperty(value = "报警发生时间", index = 17)
+ private String startTimeForCharts;
+ @ExcelProperty(value = "报警恢复时间", index = 18)
+ private String endTimeForCharts;
+ @ExcelProperty(value = "持续时间", index = 19)
+ private String duration;
+ @ExcelProperty(value = "拟解决方案", index = 20)
+ private String solution;
+ @ExcelProperty(value = "时区", index = 21)
+ private Integer timeZoneOffset;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/mapper/AlertMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/mapper/AlertMapper.java
new file mode 100644
index 0000000..eaf0bf8
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/mapper/AlertMapper.java
@@ -0,0 +1,18 @@
+package com.thing.qingyuan.alert.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.alert.entity.AlertEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* 告警记录
+*
+* @author xc
+* @since 3.0 2024-01-31
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface AlertMapper extends PowerBaseMapper {
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/AlertService.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/AlertService.java
new file mode 100644
index 0000000..622afd0
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/AlertService.java
@@ -0,0 +1,19 @@
+package com.thing.qingyuan.alert.service;
+
+import com.thing.qingyuan.alert.dto.AlertDTO;
+import com.thing.qingyuan.alert.entity.AlertEntity;
+import com.thing.common.core.web.response.PageData;
+import com.thing.common.orm.service.IBaseService;
+
+import java.util.Map;
+
+/**
+ * 告警记录
+ *
+ * @author xc
+ * @since 3.0 2024-01-31
+ */
+public interface AlertService extends IBaseService {
+
+ PageData handlePage(Map params);
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/impl/AlertServiceImpl.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/impl/AlertServiceImpl.java
new file mode 100644
index 0000000..afc3c5e
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/alert/service/impl/AlertServiceImpl.java
@@ -0,0 +1,97 @@
+package com.thing.qingyuan.alert.service.impl;
+
+import cn.hutool.core.map.MapUtil;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.thing.qingyuan.alert.dto.AlertDTO;
+import com.thing.qingyuan.alert.entity.AlertEntity;
+import com.thing.qingyuan.alert.mapper.AlertMapper;
+import com.thing.qingyuan.alert.service.AlertService;
+import com.thing.qingyuan.basedevice.entity.DeviceEntity;
+import com.thing.qingyuan.basedevice.service.IotDeviceService;
+import com.thing.qingyuan.manageboard.entity.PlantEntity;
+import com.thing.qingyuan.manageboard.service.PlantService;
+import com.thing.common.core.web.response.PageData;
+import com.thing.common.orm.service.impl.BaseServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.thing.qingyuan.alert.entity.table.AlertEntityTableDef.ALERT_ENTITY;
+
+/**
+ * 告警记录
+ *
+ * @author xc
+ * @since 3.0 2024-01-31
+ */
+@Service
+@RequiredArgsConstructor
+public class AlertServiceImpl extends BaseServiceImpl
+ implements AlertService {
+
+ private final PlantService plantService;
+ private final IotDeviceService deviceService;
+
+ @Override
+ public QueryWrapper getWrapper(Map params) {
+ QueryWrapper wrapper = new QueryWrapper();
+ String alertName = MapUtil.getStr(params, "name");
+ Integer alertLevel = MapUtil.getInt(params, "level");
+ String statusLabel = MapUtil.getStr(params, "status");
+ String startTime = MapUtil.getStr(params, "startTime");
+ String endTime = MapUtil.getStr(params, "endTime");
+ String plantIds = MapUtil.getStr(params, "plantIds");
+
+ wrapper.eq(AlertEntity::getAlertName, alertName, StringUtils.isNotBlank(alertName))
+ .eq(AlertEntity::getAlertLevel, alertLevel, Objects.nonNull(alertLevel))
+ .eq(AlertEntity::getStatusLabel, statusLabel, StringUtils.isNotBlank(statusLabel));
+
+ if(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)){
+ startTime += " UTC+08:00";
+ endTime += " UTC+08:00";
+ wrapper.and(ALERT_ENTITY.START_TIME.between(startTime, endTime)
+ .or(ALERT_ENTITY.END_TIME.between(startTime, endTime)));
+ }
+
+ if (StringUtils.isNotBlank(plantIds)) {
+ List plantIdList =
+ Arrays.stream(plantIds.split(","))
+ .map(Long::valueOf)
+ .toList();
+ wrapper.in(AlertEntity::getPlantId, plantIdList);
+ }
+ wrapper.isNotNull(AlertEntity::getStartTimeOrigin);
+ return wrapper;
+ }
+
+ @Override
+ public PageData handlePage(Map params) {
+ PageData pageData = getPageData(params, AlertDTO.class);
+ List list = pageData.getList();
+ if (list.isEmpty()) {
+ return pageData;
+ }
+ Set plantIds = list.stream().map(AlertDTO::getPlantId).collect(Collectors.toSet());
+ Set deviceIds = list.stream().map(AlertDTO::getDeviceId).collect(Collectors.toSet());
+ Map plantMap =
+ plantService.getMapper().selectListByIds(plantIds).stream()
+ .collect(
+ Collectors.toMap(
+ PlantEntity::getPlantId, PlantEntity::getPlantName));
+ Map deviceMap =
+ deviceService.getMapper().selectListByIds(deviceIds).stream()
+ .filter(e -> Objects.nonNull(e.getAlias()))
+ .collect(
+ Collectors.toMap(
+ DeviceEntity::getDeviceId, DeviceEntity::getAlias));
+ list.forEach(
+ item -> {
+ item.setPlantName(plantMap.get(item.getPlantId()));
+ item.setDeviceName(deviceMap.get(item.getDeviceId()));
+ });
+ return pageData;
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/controller/DeviceController.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/controller/DeviceController.java
new file mode 100644
index 0000000..046b757
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/controller/DeviceController.java
@@ -0,0 +1,108 @@
+//package com.thing.qingyuan.basedevice.controller;
+//
+//import com.thing.qingyuan.basedevice.dto.DeviceDTO;
+//import com.thing.qingyuan.basedevice.service.IotDeviceService;
+//import com.thing.common.core.annotation.LogOperation;
+//import com.thing.common.core.constants.Constant;
+//import com.thing.common.core.validator.AssertUtils;
+//import com.thing.common.core.validator.ValidatorUtils;
+//import com.thing.common.core.validator.group.AddGroup;
+//import com.thing.common.core.validator.group.DefaultGroup;
+//import com.thing.common.core.validator.group.UpdateGroup;
+//import com.thing.common.core.web.response.PageData;
+//import com.thing.common.core.web.response.Result;
+//import io.swagger.v3.oas.annotations.Operation;
+//import io.swagger.v3.oas.annotations.Parameter;
+//import io.swagger.v3.oas.annotations.Parameters;
+//import io.swagger.v3.oas.annotations.tags.Tag;
+//import jakarta.servlet.http.HttpServletResponse;
+//import lombok.RequiredArgsConstructor;
+//import org.springframework.web.bind.annotation.*;
+//
+//import java.util.List;
+//import java.util.Map;
+//
+///**
+// * 设备信息表
+// *
+// * @author xc
+// * @since 3.0 2024-01-30
+// */
+//@RestController
+//@RequestMapping("v1/device/info")
+//@Tag(name = "设备信息表")
+//@RequiredArgsConstructor
+//public class DeviceController {
+//
+// private final IotDeviceService iotDeviceService;
+//
+// @GetMapping("page")
+// @Operation(summary = "分页")
+// @Parameters({
+// @Parameter(name = Constant.PAGE, description = "当前页码,从1开始"),
+// @Parameter(name = Constant.LIMIT, description = "每页显示记录数"),
+// @Parameter(name = Constant.ORDER_FIELD, description = "排序字段"),
+// @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)")
+// })
+// public Result> page(@RequestParam Map params) {
+// PageData page = iotDeviceService.getPageData(params, DeviceDTO.class);
+// return new Result>().ok(page);
+// }
+//
+// @GetMapping("{id}")
+// @Operation(summary = "信息")
+// public Result get(@PathVariable("id") Long id) {
+// DeviceDTO data = iotDeviceService.getByIdAs(id, DeviceDTO.class);
+// return new Result().ok(data);
+// }
+//
+// @PostMapping
+// @Operation(summary = "保存")
+// @LogOperation("保存")
+// public Result save(@RequestBody DeviceDTO dto) {
+// //效验数据
+// ValidatorUtils.validateEntity(dto, AddGroup.class, DefaultGroup.class);
+// iotDeviceService.saveDto(dto);
+// return new Result<>();
+// }
+//
+// @PutMapping
+// @Operation(summary = "修改")
+// @LogOperation("修改")
+// public Result update(@RequestBody DeviceDTO dto) {
+// //效验数据
+// ValidatorUtils.validateEntity(dto, UpdateGroup.class, DefaultGroup.class);
+// iotDeviceService.updateDto(dto);
+// return new Result<>();
+// }
+//
+// @DeleteMapping
+// @Operation(summary = "删除")
+// @LogOperation("删除")
+// public Result delete(@RequestBody Long[] ids) {
+// //效验数据
+// AssertUtils.isArrayEmpty(ids, "id");
+// iotDeviceService.batchDelete(ids);
+// return new Result<>();
+// }
+//
+// @GetMapping("export")
+// @Operation(summary = "导出")
+// @LogOperation("导出")
+// public void export(@RequestParam Map params, HttpServletResponse response) throws Exception {
+// List list = iotDeviceService.listAs(params, DeviceDTO.class);
+// //ExcelUtils.exportExcelToTarget(response, null, "设备信息表", list, DeviceExcel.class);
+// }
+//
+// @GetMapping("{plantId}/{type}")
+// @Operation(summary = "根据电站id和类型查询 1.采集器\n" +
+// "2.逆变器\n" +
+// "3.电表\n" +
+// "4.EPM\n" +
+// "5.气象仪")
+// public Result> getDeviceByType(@PathVariable("plantId") Long plantId,@PathVariable("type") Integer type) {
+// List deviceDTOS = iotDeviceService.findByPlantId(plantId, type);
+// return new Result>().ok(deviceDTOS);
+// }
+//
+//}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/dto/DeviceDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/dto/DeviceDTO.java
new file mode 100644
index 0000000..6d08a45
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/dto/DeviceDTO.java
@@ -0,0 +1,53 @@
+package com.thing.qingyuan.basedevice.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 设备信息表
+ *
+ * @author xc
+ * @since 3.0 2024-01-30
+ */
+@Data
+@Schema(name = "设备信息表")
+public class DeviceDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "设备ID")
+ private Long deviceId;
+ @Schema(description = "设备类型: 1.采集器 2.逆变器 3.电表 4.EPM 5.气象仪")
+ private Integer deviceType;
+ @Schema(description = "设备类型2: 与 productKey及deviceType2 关联")
+ private Integer deviceType2;
+ @Schema(description = "设备SN 逆变器sn")
+ private String deviceSn;
+ @Schema(description = "设备首次上电日期")
+ private String firstReportTime;
+ @Schema(description = "设备状态: 01.正常 02.离线 3.报警 4.故障 5.自定义报警 逆变器状态")
+ private Integer status;
+ @Schema(description = "产品代码 ")
+ private String productKey;
+ @Schema(description = "设备当前实时关联的电站ID")
+ private Long plantId;
+ @Schema(description = "设备最后上电日期")
+ private String lastReportTime;
+ @Schema(description = "设备上级连接父设备")
+ private Long upDeviceId;
+ @Schema(description = "记录创建时间")
+ private String createTime;
+ @Schema(description = "父设备sn 采集器sn")
+ private String upDeviceSn;
+ @Schema(description = "01.正常 02.离线 3.报警 4.故障 5.自定义报警 采集器状态 ")
+ private Integer upStatus;
+ @Schema(description = "01.正常 02.离线 3.报警 4.故障 5.自定义报警 采集器状态 ")
+ private String upAlias;
+ @Schema(description = "设备别名")
+ private String alias;
+ @Schema(description = "网络状态")
+ private String netWorkType="4G";
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/entity/DeviceEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/entity/DeviceEntity.java
new file mode 100644
index 0000000..1410f3e
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/entity/DeviceEntity.java
@@ -0,0 +1,82 @@
+package com.thing.qingyuan.basedevice.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 设备信息表
+ *
+ * @author xc
+ * @since 3.0 2024-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Table(value = "device",dataSource = "systemCollect")
+public class DeviceEntity implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备ID
+ */
+ @Id
+ private Long deviceId;
+ /**
+ * 设备类型:
+ * 1.采集器
+ * 2.逆变器
+ * 3.电表
+ * 4.EPM
+ * 5.气象仪
+ */
+ private Integer deviceType;
+ /**
+ * 设备类型2: 与 productKey及deviceType2 关联
+ */
+ private Integer deviceType2;
+ /**
+ * 设备SN
+ */
+ private String deviceSn;
+ /**
+ * 设备首次上电日期
+ */
+ private String firstReportTime;
+ /**
+ * 设备状态: 01.正常 02.离线 3.报警 4.故障 5.自定义报警
+ */
+ private Integer status;
+ /**
+ * 产品代码
+ */
+ private String productKey;
+ /**
+ * 设备当前实时关联的电站ID
+ */
+ private Long plantId;
+ /**
+ * 设备最后上电日期
+ */
+ private String lastReportTime;
+ /**
+ * 设备上级连接父设备
+ */
+ private Long upDeviceId;
+ /**
+ * 记录创建时间
+ */
+ private String createTime;
+ /**
+ * 父设备sn
+ */
+ private String upDeviceSn;
+ /**
+ * 设备别名
+ */
+ private String alias;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/excel/DeviceExcel.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/excel/DeviceExcel.java
new file mode 100644
index 0000000..1d14758
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/excel/DeviceExcel.java
@@ -0,0 +1,46 @@
+package com.thing.qingyuan.basedevice.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+/**
+ * 设备信息表
+ *
+ * @author xc
+ * @since 3.0 2024-01-30
+ */
+@Data
+@ContentRowHeight(20)
+@HeadRowHeight(20)
+@ColumnWidth(25)
+public class DeviceExcel {
+ @ExcelProperty(value = "设备ID", index = 0)
+ private Long deviceId;
+ @ExcelProperty(value = "设备类型:1.采集器2.逆变器3.电表4.EPM5.气象仪", index = 1)
+ private Integer deviceType;
+ @ExcelProperty(value = "设备类型2: 与 productKey及deviceType2 关联", index = 2)
+ private Integer deviceType2;
+ @ExcelProperty(value = "设备SN", index = 3)
+ private String deviceSn;
+ @ExcelProperty(value = "设备首次上电日期", index = 4)
+ private String firstReportTime;
+ @ExcelProperty(value = "设备状态: 01.正常 02.离线 3.报警 4.故障 5.自定义报警", index = 5)
+ private Integer status;
+ @ExcelProperty(value = "产品代码 ", index = 6)
+ private String productKey;
+ @ExcelProperty(value = "设备当前实时关联的电站ID", index = 7)
+ private Long plantId;
+ @ExcelProperty(value = "设备最后上电日期", index = 8)
+ private String lastReportTime;
+ @ExcelProperty(value = "设备上级连接父设备", index = 9)
+ private Long upDeviceId;
+ @ExcelProperty(value = "记录创建时间", index = 10)
+ private String createTime;
+ @ExcelProperty(value = "父设备sn", index = 11)
+ private String upDeviceSn;
+ @ExcelProperty(value = "设备别名", index = 12)
+ private String alias;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/mapper/DeviceMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/mapper/DeviceMapper.java
new file mode 100644
index 0000000..b14572a
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/mapper/DeviceMapper.java
@@ -0,0 +1,18 @@
+package com.thing.qingyuan.basedevice.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.basedevice.entity.DeviceEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* 设备信息表
+*
+* @author xc
+* @since 3.0 2024-01-30
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface DeviceMapper extends PowerBaseMapper {
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/IotDeviceService.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/IotDeviceService.java
new file mode 100644
index 0000000..c02d912
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/IotDeviceService.java
@@ -0,0 +1,18 @@
+package com.thing.qingyuan.basedevice.service;
+
+import com.thing.qingyuan.basedevice.dto.DeviceDTO;
+import com.thing.qingyuan.basedevice.entity.DeviceEntity;
+import com.thing.common.orm.service.IBaseService;
+
+import java.util.List;
+
+/**
+ * 设备信息表
+ *
+ * @author xc
+ * @since 3.0 2024-01-30
+ */
+public interface IotDeviceService extends IBaseService {
+ List findByPlantId(Long plantId,Integer type);
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/impl/IotDeviceServiceImpl.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/impl/IotDeviceServiceImpl.java
new file mode 100644
index 0000000..8363906
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/basedevice/service/impl/IotDeviceServiceImpl.java
@@ -0,0 +1,36 @@
+package com.thing.qingyuan.basedevice.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.mybatisflex.core.query.QueryWrapper;
+import com.thing.qingyuan.basedevice.dto.DeviceDTO;
+import com.thing.qingyuan.basedevice.entity.DeviceEntity;
+import com.thing.qingyuan.basedevice.mapper.DeviceMapper;
+import com.thing.qingyuan.basedevice.service.IotDeviceService;
+import com.thing.common.orm.service.impl.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 设备信息表
+ *
+ * @author xc
+ * @since 3.0 2024-01-30
+ */
+@Service("IotDeviceServiceImpl")
+public class IotDeviceServiceImpl extends BaseServiceImpl implements IotDeviceService {
+
+ @Override
+ public QueryWrapper getWrapper(Map params) {
+ QueryWrapper wrapper = new QueryWrapper();
+ return wrapper;
+ }
+
+
+ @Override
+ public List findByPlantId(Long plantId,Integer type) {
+ QueryWrapper queryWrapper = QueryWrapper.create().eq(DeviceEntity::getPlantId, plantId).eq(DeviceEntity::getDeviceType,type, ObjectUtil::isNotNull);
+ return mapper.selectListByQueryAs(queryWrapper,DeviceDTO.class);
+ }
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/config/StationProperties.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/config/StationProperties.java
new file mode 100644
index 0000000..295d37f
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/config/StationProperties.java
@@ -0,0 +1,41 @@
+package com.thing.qingyuan.chargeStation.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author SiYang
+ * @date 2024/01/29 14:17
+ * @description 充电站配置属性
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "qingyuan.charge-station")
+public class StationProperties {
+
+ private Long relationId;
+
+ private List operators;
+
+ @Data
+ public static class Operator {
+ private String id;
+ private String name;
+ }
+
+ public String getOperatorNameById(String id) {
+ Operator operator = getOperatorById(id);
+ return Objects.isNull(operator) ? null : operator.getName();
+ }
+
+ private Operator getOperatorById(String id) {
+ return operators.stream()
+ .filter(e -> Objects.equals(id, e.getId()))
+ .findFirst()
+ .orElse(null);
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeOrderHeadController.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeOrderHeadController.java
new file mode 100644
index 0000000..943f188
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeOrderHeadController.java
@@ -0,0 +1,65 @@
+package com.thing.qingyuan.chargeStation.controller;
+
+import com.thing.common.core.constants.Constant;
+import com.thing.common.core.web.response.PageData;
+import com.thing.common.core.web.response.Result;
+import com.thing.qingyuan.chargeStation.dto.ChargeOrderHeadDTO;
+import com.thing.qingyuan.chargeStation.service.ChargeOrderHeadService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+* 充电桩订单头
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-23
+*/
+@RestController
+@RequestMapping("chargeStation/order/head")
+@Tag(name="充电桩订单头")
+@RequiredArgsConstructor
+public class ChargeOrderHeadController {
+
+ private final ChargeOrderHeadService chargeOrderHeadService;
+
+ @GetMapping("page")
+ @Operation(summary="分页")
+ @Parameters({
+ @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true) ,
+ @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true) ,
+ @Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
+ @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)"),
+ @Parameter(name = Constant.BEGIN_TIME, description = "开始时间"),
+ @Parameter(name = Constant.END_TIME, description = "结束时间"),
+ @Parameter(name = "startChargeSeq", description = "订单号"),
+ @Parameter(name = "stationId", description = "充电站编码"),
+ @Parameter(name = "equipmentId", description = "充电桩编码"),
+ @Parameter(name = "connectorId", description = "充电枪编码"),
+ })
+ public Result> page(@Parameter(hidden = true) @RequestParam Map params){
+ String order = StringUtils.isBlank((String) params.get(Constant.ORDER)) ? "desc" : (String) params.get(Constant.ORDER);
+ String orderField = StringUtils.isBlank((String) params.get(Constant.ORDER_FIELD)) ? "start_time" : (String) params.get(Constant.ORDER_FIELD);
+ params.put(Constant.ORDER, order);
+ params.put(Constant.ORDER_FIELD, orderField);
+ PageData page = chargeOrderHeadService.handlePage(params);
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("{startChargeSeq}")
+ @Operation(summary="充电详情")
+ @Parameters({
+ @Parameter(name = "startChargeSeq", description = "订单号"),
+ })
+ public Result get(@PathVariable("startChargeSeq") String startChargeSeq){
+ ChargeOrderHeadDTO data = chargeOrderHeadService.getDetails(startChargeSeq);
+ return new Result().ok(data);
+ }
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeStatisticController.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeStatisticController.java
new file mode 100644
index 0000000..51f27a8
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/ChargeStatisticController.java
@@ -0,0 +1,44 @@
+package com.thing.qingyuan.chargeStation.controller;
+
+import com.thing.qingyuan.chargeStation.dto.ChargeStatisticReportResp;
+import com.thing.qingyuan.chargeStation.dto.ChargeStatisticRequest;
+import com.thing.qingyuan.chargeStation.service.ChargeStatisticService;
+import com.thing.common.core.web.response.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+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 java.util.List;
+
+/**
+ * 充电统计
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-23
+ */
+@RestController
+@RequestMapping("chargeStation/statistic")
+@Tag(name = "充电统计")
+@RequiredArgsConstructor
+public class ChargeStatisticController {
+
+ private final ChargeStatisticService service;
+
+ @PostMapping("report")
+ @Operation(summary = "充电统计报表")
+ public Result> page(@RequestBody ChargeStatisticRequest request) {
+ List data = service.getReport(request);
+ return new Result>().ok(data);
+ }
+
+ @PostMapping("report/export")
+ @Operation(summary="充电统计报表导出")
+ public void export(@RequestBody ChargeStatisticRequest request, HttpServletResponse response) {
+ service.export(request, response);
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/StationInfoController.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/StationInfoController.java
new file mode 100644
index 0000000..976b412
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/controller/StationInfoController.java
@@ -0,0 +1,91 @@
+package com.thing.qingyuan.chargeStation.controller;
+
+import cn.hutool.core.map.MapUtil;
+import com.thing.qingyuan.chargeStation.dto.IdNameDTO;
+import com.thing.qingyuan.chargeStation.dto.StationDeviceDetail;
+import com.thing.qingyuan.chargeStation.dto.StationInfoDTO;
+import com.thing.qingyuan.chargeStation.dto.StationSimpleInfo;
+import com.thing.qingyuan.chargeStation.service.StationInfoService;
+import com.thing.common.core.constants.Constant;
+import com.thing.common.core.web.response.PageData;
+import com.thing.common.core.web.response.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+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;
+import java.util.Map;
+
+/**
+ * 充电站信息
+ *
+ * @author ssy 2337720667@qq.com
+ * @since 3.0 2024-01-23
+ */
+@RestController
+@RequestMapping("chargeStation/station")
+@Tag(name = "充电站信息")
+@RequiredArgsConstructor
+public class StationInfoController {
+
+ private final StationInfoService stationInfoService;
+
+ @GetMapping("page")
+ @Operation(summary = "分页")
+ @Parameters({
+ @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true),
+ @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true),
+ @Parameter(name = Constant.ORDER_FIELD, description = "排序字段"),
+ @Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)"),
+ @Parameter(name = "areaCode", description = "区域编码"),
+ @Parameter(name = "operatorId", description = "运营商id"),
+ @Parameter(name = "keyword", description = "充电站名称关键字"),
+ })
+ public Result> page(@Parameter(hidden = true) @RequestParam Map params) {
+ params.putIfAbsent(Constant.ORDER_FIELD, "station_id");
+ PageData page = stationInfoService.handlePage(params);
+ return new Result>().ok(page);
+ }
+
+ @GetMapping("simple/list")
+ @Operation(summary="简要信息列表")
+ public Result> simpleList(){
+ List list = stationInfoService.simpleList();
+ return new Result>().ok(list);
+ }
+
+ @GetMapping("pile/or/gun/idName")
+ @Operation(summary="充电桩或充电枪的id-name列表")
+ @Parameters({
+ @Parameter(name = "type", description = "pile:充电桩, gun:充电枪"),
+ @Parameter(name = "pid", description = "上级id"),
+ })
+ public Result> getIdNameList(@Parameter(hidden = true) @RequestParam Map params) {
+ List list = stationInfoService.getIdNameList(params);
+ return new Result>().ok(list);
+ }
+
+ @GetMapping("details")
+ @Operation(summary = "信息")
+ @Parameters({
+ @Parameter(name = "stationId", description = "充电站编码(id)"),
+ })
+ public Result getDetails(@Parameter(hidden = true) @RequestParam Map params) {
+ String stationId = MapUtil.getStr(params, "stationId");
+ StationDeviceDetail data = stationInfoService.getDetails(stationId);
+ return new Result().ok(data);
+ }
+
+ @GetMapping("generate/thing/config")
+ @Operation(summary = "一键生成物模型、物实体、物指标、物关系、数据源配置")
+ public Result get() {
+ stationInfoService.generateThingConfig();
+ return new Result<>();
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderDetailsDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderDetailsDTO.java
new file mode 100644
index 0000000..e147ffc
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderDetailsDTO.java
@@ -0,0 +1,84 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import com.thing.common.core.utils.DateTimeUtils;
+import com.thing.common.data.proto.QueueProto;
+import com.thing.common.data.proto.QueueProto.DataProto;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+* 充电桩订单明细
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-23
+*/
+@Data
+@Schema(description = "充电桩订单明细")
+public class ChargeOrderDetailsDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private Long id;
+ @Schema(description = "充电订单号;运营商ID+唯一编号")
+ private String startChargeSeq;
+ @Schema(description = "充电设备接口编码")
+ private String connectorId;
+ @Schema(description = "结束时间;格式,yyyy-MM-dd HH: mm: ss")
+ private String endTime;
+ @Schema(description = "开始时间")
+ private String startTime;
+ @Schema(description = "A相电流")
+ private BigDecimal currentA;
+ @Schema(description = "B相电流")
+ private BigDecimal currentB;
+ @Schema(description = "C相电流")
+ private BigDecimal currentC;
+ @Schema(description = "A相电压")
+ private BigDecimal voltageA;
+ @Schema(description = "B相电压")
+ private BigDecimal voltageB;
+ @Schema(description = "C相电压")
+ private BigDecimal voltageC;
+ @Schema(description = "电池剩余电量,单位:%")
+ private BigDecimal soc;
+ @Schema(description = "时段充电量,单位:度(kwh)")
+ private BigDecimal totalPower;
+
+ public List toProtoDataList() {
+ List dataProtoList = new ArrayList<>();
+ Long ts = DateTimeUtils.convertTimeToLong(endTime);
+ dataProtoList.add(toProtoData(connectorId, "A8", currentA, ts));
+ dataProtoList.add(toProtoData(connectorId, "A9", currentB, ts));
+ dataProtoList.add(toProtoData(connectorId, "A10", currentC, ts));
+ dataProtoList.add(toProtoData(connectorId, "A1", voltageA, ts));
+ dataProtoList.add(toProtoData(connectorId, "A2", voltageB, ts));
+ dataProtoList.add(toProtoData(connectorId, "A3", voltageC, ts));
+ dataProtoList.add(toProtoData(connectorId, "A203", soc, ts));
+ dataProtoList.add(toProtoData(connectorId, "A229", totalPower, ts));
+ return dataProtoList.stream().filter(Objects::nonNull).collect(Collectors.toList());
+ }
+
+ private DataProto toProtoData(String thingCode, String key, BigDecimal val, Long ts) {
+ if(Objects.isNull(val)){
+ return null;
+ }
+ return DataProto.newBuilder()
+ .setTskvProto(
+ QueueProto.TsKvProto.newBuilder()
+ .setThingCode(thingCode)
+ .setKey(key)
+ .setVal(val.toPlainString())
+ .setTs(ts)
+ .build())
+ .build();
+ }
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderHeadDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderHeadDTO.java
new file mode 100644
index 0000000..e396a48
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeOrderHeadDTO.java
@@ -0,0 +1,83 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import com.thing.qingyuan.chargeStation.entity.ChargeOrderDetailsEntity;
+import com.thing.common.core.utils.DateTimeUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+* 充电桩订单头
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-23
+*/
+@Data
+@Accessors(chain = true)
+@Schema(description = "充电桩订单头")
+public class ChargeOrderHeadDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "充电订单号;运营商ID+唯一编号")
+ private String startChargeSeq;
+
+ @Schema(description = "充电站id")
+ private String stationId;
+ @Schema(description = "充电站名称")
+ private String stationName;
+ @Schema(description = "充电桩id")
+ private String equipmentId;
+ @Schema(description = "充电桩名称")
+ private String equipmentName;
+ @Schema(description = "充电枪id")
+ private String connectorId;
+ @Schema(description = "充电枪名称")
+ private String connectorName;
+
+ @Schema(description = "开始充电时间;格式,yyyy-MM-dd HH: mm: ss")
+ private String startTime;
+ @Schema(description = "结束充电时间;格式,yyyy-MM-dd HH: mm: ss")
+ private String endTime;
+
+ @Schema(description = "累计充电量;单位:度, 小数点后2位")
+ private BigDecimal totalPower;
+ @Schema(description = "总电费;单位:元, 小数点后2位")
+ private BigDecimal elecMoney;
+ @Schema(description = "总服务费;单位:元, 小数点后2位")
+ private BigDecimal seviceMoney;
+ @Schema(description = "累计总金额;单位:元, 小数点后2位")
+ private BigDecimal totalMoney;
+
+ @Schema(description = "充电结束原因;0: 用户手动停止充电; 1:客户归属地运营商平台停止充电; 2: BMS停止充电; 3: 充电机设备故障; 4:连接器断开; 5~99: 自定义")
+ private Integer stopReason;
+ @Schema(description = "时段数N;范围:0~32")
+ private Integer sumPeriod;
+
+ @Schema(description = "充电订单状态;1:启动中; 2:充电中; 3:停止中; 4:已结束; 5:未知")
+ private Integer startChargeSeqStat;
+
+
+ @Schema(description = "订单详情: 电池电量(%)、A相电流、B相电流、C相电流 ...")
+ private List details;
+
+ public Long getDuration(){
+ return Objects.isNull(endTime)
+ ? System.currentTimeMillis() - getStartTs()
+ : getEndTs() - getStartTs();
+ }
+
+ public Long getStartTs(){
+ return DateTimeUtils.convertTimeToLong(startTime);
+ }
+
+ public Long getEndTs(){
+ return DateTimeUtils.convertTimeToLong(endTime);
+ }
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticReportResp.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticReportResp.java
new file mode 100644
index 0000000..a4f2867
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticReportResp.java
@@ -0,0 +1,84 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import com.thing.common.core.utils.DateTimeUtils;
+import com.thing.common.data.tskv.TsKvDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.TreeMap;
+
+/**
+ * @author SiYang
+ * @date 2024/01/31 17:31
+ * @description 充电统计报表数据
+ */
+@Data
+@Accessors(chain = true)
+public class ChargeStatisticReportResp {
+ @Schema(description = "物id")
+ private Long thingId;
+
+ @Schema(description = "物名称")
+ private String thingName;
+
+ @Schema(description = "物编码")
+ private String thingCode;
+
+ @Schema(description = "属性名称")
+ private String attrName;
+
+ @Schema(description = "属性编码")
+ private String attrCode;
+
+ @Schema(description = "属性单位")
+ private String unit;
+
+ @Schema(description = "时间类型")
+ private String timeType;
+
+ @Schema(description = "合计数据")
+ private BigDecimal total;
+
+ @Schema(description = "数据")
+ private Map data;
+
+ public ChargeStatisticReportResp initData(List timeList) {
+ if (Objects.isNull(data)) {
+ data = new TreeMap<>();
+ }
+ timeList.forEach(t -> data.put(DateTimeUtils.parse(t), null));
+ return this;
+ }
+
+ public ChargeStatisticReportResp fillData(List tskvList) {
+ if(CollectionUtils.isEmpty(tskvList)){
+ return this;
+ }
+ if (Objects.isNull(data)) {
+ data = new TreeMap<>();
+ }
+ tskvList.forEach(tskv -> data.put(tskv.getTs(), tskv.getVal()));
+ return this;
+ }
+
+ public ChargeStatisticReportResp calculateTotal() {
+ BigDecimal total =
+ data.values().stream()
+ .filter(Objects::nonNull)
+ .map(
+ dataStr ->
+ BigDecimal.valueOf(Double.parseDouble(dataStr))
+ .setScale(2, RoundingMode.HALF_UP))
+ .reduce(BigDecimal::add)
+ .orElse(BigDecimal.ZERO);
+ return this.setTotal(total);
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticRequest.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticRequest.java
new file mode 100644
index 0000000..a66a5ed
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ChargeStatisticRequest.java
@@ -0,0 +1,94 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import com.thing.common.core.exception.SysException;
+import com.thing.common.core.utils.DateTimeUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author SiYang
+ * @date 2024/01/31 17:16
+ * @description 充电统计请求
+ */
+@Data
+@Schema(description = "充电统计请求参数")
+public class ChargeStatisticRequest {
+ @Schema(description = "关系id")
+ private Long rootId;
+
+ @Schema(description = "顶级物id列表")
+ private List rootThingIds;
+
+ @Schema(description = "物id列表")
+ private List thingIds;
+
+ @Schema(description = "报表类型=> 充电量: 1; 充电时长: 2; 充电次数: 3")
+ private Integer reportType;
+
+ @Schema(description = "时间类型:day ,month, year, any")
+ private String timeType;
+
+ @Schema(description = "开始时间")
+ private String beginTime;
+
+ @Schema(description = "结束时间")
+ private String endTime;
+
+ public String getAttrType() {
+ return switch (timeType) {
+ case "day" -> "hh";
+ case "month", "any" -> "dd";
+ case "year" -> "mm";
+ default -> throw new SysException(
+ "unSupport timeType, pls choose from [month, year, any]");
+ };
+ }
+
+ /** 充电量: A29; 充电时长: A201; 充电次数: A202 */
+ public String getBaseAttrCode(){
+ return switch (reportType) {
+ case 1 -> "A29";
+ case 2 -> "A201";
+ case 3 -> "A202";
+ default -> throw new SysException(
+ "unSupport reportType, pls choose from [1, 2, 3]");
+ };
+ }
+
+ public String getAttrCode() {
+ return getBaseAttrCode() + getAttrType();
+ }
+
+ public Long getStartTs() {
+ return DateTimeUtils.convertTimeToLong(beginTime);
+ }
+
+ public Long getEndTs() {
+ return DateTimeUtils.convertTimeToLong(endTime);
+ }
+
+ public List generateAllDateTime() {
+ List dateTimeList = new ArrayList<>();
+ LocalDateTime begin = getBeginDateTime().withHour(0).withMinute(0).withSecond(0).withNano(0);
+ LocalDateTime end = getEndDateTime();
+ while (begin.isBefore(end) || begin.isEqual(end)) {
+ dateTimeList.add(begin);
+ begin = "year".equals(timeType) ? begin.plusMonths(1) : begin.plusDays(1);
+ }
+ return dateTimeList;
+ }
+
+ private LocalDateTime getBeginDateTime() {
+ return DateTimeUtils.parseDateTime(beginTime);
+ }
+
+ private LocalDateTime getEndDateTime() {
+ LocalDateTime dateTime = DateTimeUtils.parseDateTime(endTime);
+ LocalDateTime currentDateTime = LocalDateTime.now();
+ return dateTime.isBefore(currentDateTime) ? dateTime : currentDateTime;
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorInfoDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorInfoDTO.java
new file mode 100644
index 0000000..f670f56
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorInfoDTO.java
@@ -0,0 +1,64 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电枪
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-29
+ */
+@Data
+@Schema(description = "充电枪")
+public class ConnectorInfoDTO implements Serializable {
+ @Serial private static final long serialVersionUID = 1L;
+
+ @Schema(description = "充电设备接口编码")
+ private String connectorId;
+
+ private String couplerType;
+
+ @Schema(description = "额定电压下限")
+ private Integer voltageLowerLimits;
+
+ private String qrCode;
+
+ @Schema(
+ description =
+ "充电设备接口类型内唯 1:家用插座(模式2);2: 交流接口插座(模式3, 连接方式B);3:交流接口插头(带枪线,模式3,连接方式C);4:直流5: 无线充电座; 6:其他")
+ private Integer connectorType;
+
+ @Schema(description = "额定电压上限")
+ private Integer voltageUpperLimits;
+
+ @Schema(description = "家标准1: 2011: 2: 2015")
+ private Integer nationalStandard;
+
+ @Schema(description = "充电设备接口名称")
+ private String connectorName;
+
+ private Integer ratedCurrent;
+
+ @Schema(description = "额定电流")
+ private BigDecimal current;
+
+ @Schema(description = "额定功率")
+ private BigDecimal power;
+
+ @Schema(description = "充电桩Id")
+ private String equipmentId;
+
+ @Schema(description = "充电设备接口状态 0:离网;1:空闲;2:占用(未充电);3:占用(充电中); 4:占用(预约锁定); 255:故障")
+ private Integer status;
+
+ @Schema(description = "地锁状态 0: 未知;10: 已解锁;50: 已上锁")
+ private Integer lockStatus;
+
+ @Schema(description = "车位状态 0:未知;10:空闲;50:占用")
+ private Integer parkStatus;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorStatusInfo.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorStatusInfo.java
new file mode 100644
index 0000000..7a187ad
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/ConnectorStatusInfo.java
@@ -0,0 +1,18 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+
+@Data
+@Schema(description = "充电枪统计信息")
+public class ConnectorStatusInfo {
+
+ @Schema(description = "状态")
+ private String status;
+ @Schema(description = "数量")
+ private Integer num;
+
+
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/EquipmentInfoDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/EquipmentInfoDTO.java
new file mode 100644
index 0000000..9130099
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/EquipmentInfoDTO.java
@@ -0,0 +1,64 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+* 充电桩
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-29
+*/
+@Data
+@Accessors(chain = true)
+@Schema(description = "充电桩")
+public class EquipmentInfoDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private String equipmentApplication;
+ private Integer equipmentStatus;
+ @Schema(description = "设备生产商名称")
+ private String manufacturerName;
+ private String openDate;
+ private BigDecimal equipmentPower;
+ @Schema(description = "设备编码")
+ private String equipmentId;
+ @Schema(description = "设备生产商组织机 构代码")
+ private String manufacturerId;
+ private Integer nationalStandard;
+ @Schema(description = "充电设备经度")
+ private BigDecimal equipmentLng;
+ private String openForBusinessDate;
+ @Schema(description = "充电枪数量")
+ private Integer gunNum;
+ @Schema(description = "设备类型1:直流设备; 2:交流设备;3:交直流一体设备;4:无线设备;5:其他")
+ private Integer equipmentType;
+ @Schema(description = "充电设备纬度")
+ private BigDecimal equipmentLat;
+ private BigDecimal voltage;
+ private Integer newNationalStandard;
+ @Schema(description = "充电设备名称")
+ private String equipmentName;
+ @Schema(description = "设备生产日期")
+ private String productionDate;
+ @Schema(description = "设备型号")
+ private String equipmentModel;
+ private BigDecimal current;
+ @Schema(description = "充电设备总功率单位:kW")
+ private BigDecimal power;
+ private String stationId;
+
+ public EquipmentInfoDTO add(EquipmentInfoDTO another) {
+ if (Objects.isNull(another)) return this;
+ return setGunNum(gunNum + another.getGunNum())
+ .setEquipmentPower(equipmentPower.add(another.getEquipmentPower()))
+ .setPower(power.add(another.getPower()));
+ }
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/IdNameDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/IdNameDTO.java
new file mode 100644
index 0000000..6b676a6
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/IdNameDTO.java
@@ -0,0 +1,11 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class IdNameDTO {
+ private String id;
+ private String name;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/SimpleThingRelationDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/SimpleThingRelationDTO.java
new file mode 100644
index 0000000..0e67a9e
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/SimpleThingRelationDTO.java
@@ -0,0 +1,17 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author SiYang
+ * @date 2024/01/30 16:14
+ * @description 极简物关系
+ */
+@Data
+@AllArgsConstructor
+public class SimpleThingRelationDTO {
+ private String fromCode;
+ private String toCode;
+ private String toName;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationDeviceDetail.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationDeviceDetail.java
new file mode 100644
index 0000000..f6a287c
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationDeviceDetail.java
@@ -0,0 +1,26 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author SiYang
+ * @date 2024/01/29 13:29
+ * @description 充电站的设备详情,包含充电桩、充电枪
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class StationDeviceDetail {
+ /** 充电站id */
+ private String stationId;
+
+ /** 充电桩列表 */
+ private List pileList;
+
+ /** 充电枪列表 */
+ private List gunList;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationInfoDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationInfoDTO.java
new file mode 100644
index 0000000..2a464c0
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationInfoDTO.java
@@ -0,0 +1,86 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+* 充电站信息
+*
+* @author ssy 2337720667@qq.com
+* @since 3.0 2024-01-23
+*/
+@Data
+@Schema(description = "充电站信息")
+public class StationInfoDTO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "填写内容为参照GB/T2260 2007 ")
+ private String areaCode;
+ @Schema(description = "详细地址 ")
+ private String address;
+ @Schema(description = "能够联系场站工作人员进行协助的联系电话")
+ private String stationTel;
+ @Schema(description = "平台服务电话, 例如400的电话")
+ private String serviceTel;
+ @Schema(description = "1:公共; 50:个人;100:公交(专用);101:环卫(专用);102:物流(专用);103:出租车(专用);255:其他")
+ private Integer stationType;
+ @Schema(description = ":未知; 1:建设中:5:关闭下线;6:维护中;50:正常使用")
+ private Integer stationStatus;
+ @Schema(description = "可停放进行充电的车位总数,默认: 0未知")
+ private Integer parkNums;
+ @Schema(description = "GCJ-02坐标系")
+ private BigDecimal stationLng;
+ @Schema(description = "GCJ-02坐标系")
+ private BigDecimal stationLat;
+ @Schema(description = "描述性文字, 用千引导车主找到充电车位")
+ private String siteGuide;
+ @Schema(description = "1:居民区; 2:公共机构;3:企事业单位;4:写字楼;5:工业园区;6:交通枢纽;7:大型文体设施;8:城市绿地;9:大型建筑配建停车场;10:路边停车位;11:城际高速服务区;255:其他")
+ private Integer construction;
+ @Schema(description = "描述该站点接受的车大小以及类型, 如大巳、 物流车、 私家乘用车、 出租车等")
+ private String matchCars;
+ @Schema(description = "车位楼层以及数擢信息")
+ private String parkInfo;
+ @Schema(description = "营业时间描述")
+ private String busineHours;
+ @Schema(description = "充电费描述")
+ private String electricityFee;
+ @Schema(description = "服务费率描述")
+ private String serviceFee;
+ @Schema(description = "停车费率描述")
+ private String parkFee;
+ @Schema(description = "支付方式:刷卡、线上、现金。其中电子钱包类卡为刷卡,身份鉴权卡、微信/支付宝、APP为线上 ")
+ private String payment;
+ @Schema(description = "充电设备是否需要提前预约后才能使用。0为不支持预约; 1 为支持预约。不填默认为0")
+ private Integer supportOrder;
+ @Schema(description = "其他备注信息")
+ private String remark;
+ @Schema(description = "充电站Id 接口文档没有但是接口有")
+ private String stationId;
+ @Schema(description = "运营商id")
+ private String operatorId;
+ @Schema(description = "运营商名称")
+ private String operatorName;
+ @Schema(description = "设备所有者id")
+ private String equipmentOwnerId;
+ @Schema(description = "充电站名称")
+ private String stationName;
+ @Schema(description = "国家")
+ private String countryCode;
+ @Schema(description = "省")
+ private String province;
+ @Schema(description = "市")
+ private String city;
+ @Schema(description = "区")
+ private String area;
+
+ @Schema(description = "装机功率: sum(充电桩功率)")
+ private Double totalPilePower;
+ @Schema(description = "调节功率")
+ private Double regulatingPower;
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationOrderAgg.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationOrderAgg.java
new file mode 100644
index 0000000..6b4582f
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationOrderAgg.java
@@ -0,0 +1,81 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import com.thing.common.data.proto.QueueProto;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author SiYang
+ * @date 2024/01/23 15:54
+ * @description 充电站订单汇总数据
+ * 充电量: A29 totalPower
+ * 充电时长: A201 endTime - startTime
+ * 充电次数: A202 count(order)
+ * 充电金额: A204 totalMoney
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+public class StationOrderAgg {
+ /** 设备编号: 站(stationId), 桩(equipmentId), 枪(connectorId) */
+ private String deviceCode;
+
+ /** 汇总充电金额:A204xx */
+ private BigDecimal fee = BigDecimal.ZERO;
+
+ /** 汇总充电电量:A29xx */
+ private BigDecimal energy = BigDecimal.ZERO;
+
+ /** 汇总充电次数:A202xx */
+ private Integer count = 0;
+
+ /** 汇总充电时长:A201xx */
+ private Long duration = 0L;
+
+ public StationOrderAgg(String deviceCode) {
+ this.deviceCode = deviceCode;
+ }
+
+ public StationOrderAgg add(ChargeOrderHeadDTO order) {
+ if (Objects.isNull(order)) return this;
+ return setFee(fee.add(order.getTotalMoney()))
+ .setEnergy(energy.add(order.getTotalPower()))
+ .setCount(count + 1)
+ .setDuration(duration + order.getDuration());
+ }
+
+ public StationOrderAgg add(StationOrderAgg another) {
+ if (Objects.isNull(another)) return this;
+ return setFee(fee.add(another.getFee()))
+ .setEnergy(energy.add(another.getEnergy()))
+ .setCount(count + another.getCount())
+ .setDuration(duration + another.getDuration());
+ }
+
+ public List toProtoData(Long ts, String suffix) {
+ List list = new ArrayList<>();
+ list.add(toProtoData("A204" + suffix, fee.toPlainString(), ts));
+ list.add(toProtoData("A29" + suffix, energy.toPlainString(), ts));
+ list.add(toProtoData("A202" + suffix, count.toString(), ts));
+ list.add(toProtoData("A201" + suffix, duration.toString(), ts));
+ return list;
+ }
+
+ private QueueProto.DataProto toProtoData(String key, String val, Long ts) {
+ return QueueProto.DataProto.newBuilder()
+ .setTskvProto(
+ QueueProto.TsKvProto.newBuilder()
+ .setThingCode(deviceCode)
+ .setKey(key)
+ .setVal(val)
+ .setTs(ts)
+ .build())
+ .build();
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleDTO.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleDTO.java
new file mode 100644
index 0000000..3485d52
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleDTO.java
@@ -0,0 +1,43 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电站信息
+ *
+ * @author ssy 2337720667@qq.com
+ * @since 3.0 2024-01-23
+ */
+@Data
+@Schema(description = "充电站简要信息")
+public class StationSimpleDTO {
+ @Schema(description = "充电站id")
+ private String stationId;
+
+ @Schema(description = "充电站名称")
+ private String stationName;
+
+ @Schema(description = "经度")
+ private BigDecimal stationLng;
+
+ @Schema(description = "纬度")
+ private BigDecimal stationLat;
+
+ @Schema(description = "充电枪总数")
+ private Integer totalGunCount;
+
+ @Schema(description = "离线枪数量")
+ private Integer offLineCount;
+
+ @Schema(description = "空闲枪数量")
+ private Integer freeCount;
+
+ @Schema(description = "正在充电的枪数量")
+ private Integer inChargingCount;
+
+ @Schema(description = "故障枪数量")
+ private Integer errorCount;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleInfo.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleInfo.java
new file mode 100644
index 0000000..cede21c
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/dto/StationSimpleInfo.java
@@ -0,0 +1,28 @@
+package com.thing.qingyuan.chargeStation.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @author SiYang
+ * @date 2024/01/29 13:54
+ * @description 充电站简化信息:用于下拉查询
+ */
+@Data
+@Accessors(chain = true)
+@Schema(description = "充电站简化信息")
+public class StationSimpleInfo {
+ @Schema(description = "充电站id ")
+ private String stationId;
+ @Schema(description = "充电站名称 ")
+ private String stationName;
+ @Schema(description = "地区编码 ")
+ private String areaCode;
+ @Schema(description = "地区名称 ")
+ private String areaName;
+ @Schema(description = "运营商id ")
+ private String operatorId;
+ @Schema(description = "运营商名称 ")
+ private String operatorName;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderDetailsEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderDetailsEntity.java
new file mode 100644
index 0000000..567e1b4
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderDetailsEntity.java
@@ -0,0 +1,81 @@
+package com.thing.qingyuan.chargeStation.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电桩订单明细
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@Table("charge_details")
+public class ChargeOrderDetailsEntity implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @Id
+ private Long id;
+
+ /**
+ * 充电订单号;运营商ID+唯一编号
+ * @see ChargeOrderHeadEntity#startChargeSeq
+ */
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ private String connectorId;
+ /**
+ * 结束时间;格式,yyyy-MM-dd HH: mm: ss
+ */
+ private String endTime;
+ /**
+ * 开始时间
+ */
+ private String startTime;
+ /**
+ * A相电流
+ */
+ private BigDecimal currentA;
+ /**
+ * B相电流
+ */
+ private BigDecimal currentB;
+ /**
+ * C相电流
+ */
+ private BigDecimal currentC;
+ /**
+ * A相电压
+ */
+ private BigDecimal voltageA;
+ /**
+ * B相电压
+ */
+ private BigDecimal voltageB;
+ /**
+ * C相电压
+ */
+ private BigDecimal voltageC;
+ /**
+ * 电池剩余电量,单位:%
+ */
+ private BigDecimal soc;
+ /**
+ * 时段充电量,单位:度(kwh)
+ */
+ private BigDecimal totalPower;
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderHeadEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderHeadEntity.java
new file mode 100644
index 0000000..0e7c898
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ChargeOrderHeadEntity.java
@@ -0,0 +1,70 @@
+package com.thing.qingyuan.chargeStation.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电桩订单头
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@Table("notification_charge_order_info")
+public class ChargeOrderHeadEntity implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 充电订单号;运营商ID+唯一编号
+ */
+ @Id
+ private String startChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ private String connectorId;
+ /**
+ * 开始充电时间;格式,yyyy-MM-dd HH: mm: ss
+ */
+ private String startTime;
+ /**
+ * 结束充电时间;格式,yyyy-MM-dd HH: mm: ss
+ */
+ private String endTime;
+ /**
+ * 累计充电量;单位:度, 小数点后2位
+ */
+ private BigDecimal totalPower;
+ /**
+ * 总电费;单位:元, 小数点后2位
+ */
+ private BigDecimal elecMoney;
+ /**
+ * 总服务费;单位:元, 小数点后2位
+ */
+ private BigDecimal seviceMoney;
+ /**
+ * 累计总金额;单位:元, 小数点后2位
+ */
+ private BigDecimal totalMoney;
+ /**
+ * 充电结束原因;0: 用户手动停止充电; 1:客户归属地运营商平台停止充电; 2: BMS停止充电; 3: 充电机设备故障; 4:连接器断开; 5~99: 自定义
+ */
+ private Integer stopReason;
+ /**
+ * 时段数N;范围:0~32
+ */
+ private Integer sumPeriod;
+ /**
+ * 充电订单状态;1:启动中; 2:充电中; 3:停止中; 4:已结束; 5:未知
+ */
+ private Integer startChargeSeqStat;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ConnectorInfoEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ConnectorInfoEntity.java
new file mode 100644
index 0000000..ea0bc30
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/ConnectorInfoEntity.java
@@ -0,0 +1,66 @@
+package com.thing.qingyuan.chargeStation.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电枪
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-29
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Table("connector_info")
+public class ConnectorInfoEntity implements Serializable {
+ @Serial private static final long serialVersionUID = 1L;
+
+ /** 充电设备接口编码 */
+ @Id private String connectorId;
+
+ private String couplerType;
+
+ /** 额定电压下限 */
+ private Integer voltageLowerLimits;
+
+ private String qrCode;
+
+ /** 充电设备接口类型内唯 1:家用插座(模式2);2: 交流接口插座(模式3, 连接方式B);3:交流接口插头(带枪线,模式3,连接方式C);4:直流5: 无线充电座; 6:其他 */
+ private Integer connectorType;
+
+ /** 额定电压上限 */
+ private Integer voltageUpperLimits;
+
+ /** 家标准1: 2011: 2: 2015 */
+ private Integer nationalStandard;
+
+ /** 充电设备接口名称 */
+ private String connectorName;
+
+ private Integer ratedCurrent;
+
+ /** 额定电流 */
+ private BigDecimal current;
+
+ /** 额定功率 */
+ private BigDecimal power;
+
+ private String equipmentId;
+
+ /** 充电设备接口状态 0:离网;1:空闲;2:占用(未充电);3:占用(充电中); 4:占用(预约锁定); 255:故障 */
+ private Integer status;
+
+ /** 地锁状态 0: 未知;10: 已解锁;50: 已上锁 */
+ private Integer lockStatus;
+
+ /** 车位状态 0:未知;10:空闲;50:占用 */
+ private Integer parkStatus;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/EquipmentInfoEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/EquipmentInfoEntity.java
new file mode 100644
index 0000000..37d8570
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/EquipmentInfoEntity.java
@@ -0,0 +1,80 @@
+package com.thing.qingyuan.chargeStation.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电桩
+ *
+ * @author system system@lrd.com
+ * @since 5.1 2024-01-29
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@Table("equipment_info")
+public class EquipmentInfoEntity implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 设备编码
+ */
+ @Id
+ private String equipmentId;
+ private String equipmentApplication;
+ private Integer equipmentStatus;
+ /**
+ * 设备生产商名称
+ */
+ private String manufacturerName;
+ private String openDate;
+ private BigDecimal equipmentPower;
+ /**
+ * 设备生产商组织机 构代码
+ */
+ private String manufacturerId;
+ private Integer nationalStandard;
+ /**
+ * 充电设备经度
+ */
+ private BigDecimal equipmentLng;
+ private String openForBusinessDate;
+ /**
+ * 充电枪数量
+ */
+ private Integer gunNum;
+ /**
+ * 设备类型1:直流设备;2:交流设备;3:交直流一体设备;4:无线设备;5:其他
+ */
+ private Integer equipmentType;
+ /**
+ * 充电设备纬度
+ */
+ private BigDecimal equipmentLat;
+ private BigDecimal voltage;
+ private Integer newNationalStandard;
+ /**
+ * 充电设备名称
+ */
+ private String equipmentName;
+ /**
+ * 设备生产日期
+ */
+ private String productionDate;
+ /**
+ * 设备型号
+ */
+ private String equipmentModel;
+ private BigDecimal current;
+ /**
+ * 充电设备总功率单位:kW
+ */
+ private BigDecimal power;
+ private String stationId;
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/StationInfoEntity.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/StationInfoEntity.java
new file mode 100644
index 0000000..d2a9d94
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/entity/StationInfoEntity.java
@@ -0,0 +1,105 @@
+package com.thing.qingyuan.chargeStation.entity;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 充电站信息
+ *
+ * @author ssy 2337720667@qq.com
+ * @since 3.0 2024-01-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Table("station_info")
+public class StationInfoEntity implements Serializable {
+ @Serial private static final long serialVersionUID = 1L;
+
+ /** 填写内容为参照GB/T2260 2007 */
+ private String areaCode;
+
+ /** 详细地址 */
+ private String address;
+
+ /** 能够联系场站工作人员进行协助的联系电话 */
+ private String stationTel;
+
+ /** 平台服务电话, 例如400的电话 */
+ private String serviceTel;
+
+ /** 1:公共;50:个人;100:公交(专用);101:环卫(专用);102:物流(专用);103:出租车(专用);255:其他 */
+ private Integer stationType;
+
+ /** :未知;1:建设中:5:关闭下线;6:维护中;50:正常使用 */
+ private Integer stationStatus;
+
+ /** 可停放进行充电的车位总数,默认: 0未知 */
+ private Integer parkNums;
+
+ /** GCJ-02坐标系 */
+ private BigDecimal stationLng;
+
+ /** GCJ-02坐标系 */
+ private BigDecimal stationLat;
+
+ /** 描述性文字, 用千引导车主找到充电车位 */
+ private String siteGuide;
+
+ /**
+ * 1:居民区;2:公共机构;3:企事业单位;4:写字楼;5:工业园区;6:交通枢纽;7:大型文体设施;8:城市绿地;9:大型建筑配建停车场;10:路边停车位;11:城际高速服务区;255:其他
+ */
+ private Integer construction;
+
+ /** 描述该站点接受的车大小以及类型, 如大巳、 物流车、 私家乘用车、 出租车等 */
+ private String matchCars;
+
+ /** 车位楼层以及数擢信息 */
+ private String parkInfo;
+
+ /** 营业时间描述 */
+ private String busineHours;
+
+ /** 充电费描述 */
+ private String electricityFee;
+
+ /** 服务费率描述 */
+ private String serviceFee;
+
+ /** 停车费率描述 */
+ private String parkFee;
+
+ /** 支付方式:刷卡、线上、现金。其中电子钱包类卡为刷卡,身份鉴权卡、微信/支付宝、APP为线上 */
+ private String payment;
+
+ /** 充电设备是否需要提前预约后才能使用。0为不支持预约; 1 为支持预约。不填默认为0 */
+ private Integer supportOrder;
+
+ /** 其他备注信息 */
+ private String remark;
+
+ /** 充电站Id 接口文档没有但是接口有 */
+ @Id
+ private String stationId;
+
+ /** 运营商id */
+ private String operatorId;
+
+ /** 设备所属方id */
+ private String equipmentOwnerId;
+ /** 充电站名称 */
+ private String stationName;
+ /** 充电站国家代码 */
+ private String countryCode;
+ /** 省 */
+ private String province;
+ /** 市 */
+ private String city;
+ /** 区 */
+ private String area;
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/excel/ChargeStatisticExcel.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/excel/ChargeStatisticExcel.java
new file mode 100644
index 0000000..1c334c1
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/excel/ChargeStatisticExcel.java
@@ -0,0 +1,106 @@
+package com.thing.qingyuan.chargeStation.excel;
+
+ import com.thing.qingyuan.chargeStation.dto.ChargeStatisticReportResp;
+import com.thing.common.core.annotation.CustomExcel;
+import com.thing.common.core.annotation.CustomExcelCollection;
+import com.thing.common.core.utils.DateTimeUtils;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author SiYang
+ * @date 2024/02/01 14:17
+ * @description 充电统计
+ */
+@Data
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ChargeStatisticExcel {
+
+ @CustomExcel(name = "结构", width = 25)
+ private String thingName;
+
+ private String attrName;
+
+ private String attrUnit;
+
+ @CustomExcel(columnNameGenerator = "dataColNameGenerator", width = 15, orderNum = 1)
+ private String total;
+
+ @CustomExcelCollection
+ private List data;
+
+ @SuppressWarnings("unused")
+ private String dataColNameGenerator() {
+ return attrName + "(" + attrUnit + ")";
+ }
+
+ public static List convert(List sources) {
+ if (CollectionUtils.isEmpty(sources)) {
+ return Collections.emptyList();
+ }
+ return sources.stream()
+ .map(
+ source -> {
+ Map dataMap = source.getData();
+ List dataList = new ArrayList<>();
+ dataMap.forEach(
+ (k, v) ->
+ dataList.add(
+ new TsVal()
+ .setTs(DateTimeUtils.parseDateTime(k))
+ .setTimeType(source.getTimeType())
+ .setVal(Optional.ofNullable(v).orElse("--"))));
+ return new ChargeStatisticExcel()
+ .setThingName(source.getThingName() + source.getAttrCode())
+ .setAttrName(source.getAttrName())
+ .setAttrUnit(source.getUnit())
+ .setTotal(source.getTotal().toString())
+ .setData(dataList);
+ })
+ .collect(Collectors.toList());
+ }
+
+ @Data
+ @Accessors(chain = true)
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class TsVal {
+ private String timeType;
+
+ private LocalDateTime ts;
+
+ @CustomExcel(columnNameGenerator = "dataColNameGenerator", width = 12, orderGenerator = "colOrderGenerator")
+ private String val;
+
+ @SuppressWarnings("unused")
+ private String dataColNameGenerator() {
+ return switch (timeType) {
+ case "month" -> ts.getDayOfMonth() + "日";
+ case "year" -> ts.getMonthValue() + "月";
+ default -> null;
+ };
+ }
+
+ @SuppressWarnings("unused")
+ private int colOrderGenerator(){
+ int orderNum = 2;
+ switch (timeType) {
+ case "month" -> orderNum += (31 - ts.getDayOfMonth());
+ case "year" -> orderNum += (12 - ts.getMonthValue());
+ default -> {
+ }
+ }
+ return orderNum;
+ }
+
+ }
+}
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderDetailsMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderDetailsMapper.java
new file mode 100644
index 0000000..1dd44cd
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderDetailsMapper.java
@@ -0,0 +1,23 @@
+package com.thing.qingyuan.chargeStation.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.chargeStation.dto.ChargeOrderDetailsDTO;
+import com.thing.qingyuan.chargeStation.entity.ChargeOrderDetailsEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* 充电桩订单明细
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-23
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface ChargeOrderDetailsMapper extends PowerBaseMapper {
+
+ List getLatestDetails(@Param("start") String start, @Param("end") String end);
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderHeadMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderHeadMapper.java
new file mode 100644
index 0000000..768e1b2
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ChargeOrderHeadMapper.java
@@ -0,0 +1,18 @@
+package com.thing.qingyuan.chargeStation.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.chargeStation.entity.ChargeOrderHeadEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* 充电桩订单头
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-23
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface ChargeOrderHeadMapper extends PowerBaseMapper {
+
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ConnectorInfoMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ConnectorInfoMapper.java
new file mode 100644
index 0000000..bf27f0b
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/ConnectorInfoMapper.java
@@ -0,0 +1,32 @@
+package com.thing.qingyuan.chargeStation.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.chargeStation.dto.ConnectorStatusInfo;
+import com.thing.qingyuan.chargeStation.entity.ConnectorInfoEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* 充电枪
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-29
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface ConnectorInfoMapper extends PowerBaseMapper {
+
+
+
+ List getStatusByStationId(String stationId);
+
+
+ Integer getCountByStationIds(List stationIds);
+
+ List getStatusByStationIds(List stationIds);
+
+ List simpleList(@Param("stationId") String stationId);
+}
\ No newline at end of file
diff --git a/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/EquipmentInfoMapper.java b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/EquipmentInfoMapper.java
new file mode 100644
index 0000000..a56713a
--- /dev/null
+++ b/modules/qingyuan/src/main/java/com/thing/qingyuan/chargeStation/mapper/EquipmentInfoMapper.java
@@ -0,0 +1,24 @@
+package com.thing.qingyuan.chargeStation.mapper;
+
+import com.mybatisflex.annotation.UseDataSource;
+import com.thing.qingyuan.chargeStation.entity.EquipmentInfoEntity;
+import com.thing.common.orm.mapper.PowerBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+* 充电桩
+*
+* @author system system@lrd.com
+* @since 5.1 2024-01-29
+*/
+@Mapper
+@UseDataSource("systemCollect")
+public interface EquipmentInfoMapper extends PowerBaseMapper {
+
+ List