diff --git a/ems-admin/pom.xml b/ems-admin/pom.xml index ed00efc..33dacfd 100644 --- a/ems-admin/pom.xml +++ b/ems-admin/pom.xml @@ -39,8 +39,9 @@ - mysql - mysql-connector-java + com.mysql + mysql-connector-j + 8.0.33 diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsAlarmRecordsController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsAlarmRecordsController.java new file mode 100644 index 0000000..e3fc301 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsAlarmRecordsController.java @@ -0,0 +1,58 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.core.page.TableDataInfo; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.domain.vo.AlarmRecordListRequestVo; +import com.xzzn.ems.domain.vo.AlarmRecordListResponseVo; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 单站监控-故障告警 + * + * @author xzzn + */ +@RestController +@RequestMapping("/ems/siteAlarm") +public class EmsAlarmRecordsController extends BaseController +{ + + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + + /** + * 获取告警详情列表 + */ + @GetMapping("/getAlarmDetailList") + public TableDataInfo getAlarmDetailList(AlarmRecordListRequestVo requestVo) + { + startPage(); + List list = iEmsAlarmRecordsService.getAlarmRecordDetailList(requestVo); + return getDataTable(list); + } + + /** + * 生成工单 + */ + @PostMapping("/createTicketNo") + public AjaxResult createTicketNo(@RequestBody EmsAlarmRecords emsAlarmRecords) + { + Long id = emsAlarmRecords.getId(); + if (id == null) { + return error("告警id不能为空"); + } + String ticketNo= iEmsAlarmRecordsService.createTicketNo(id,getUserId()); + if (StringUtils.isNotEmpty(ticketNo) && ticketNo.contains("T")) { + return AjaxResult.success("操作成功", ticketNo); + } else { + return error(ticketNo); + } + } + +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsEnergyPriceConfigController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsEnergyPriceConfigController.java new file mode 100644 index 0000000..0117d6f --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsEnergyPriceConfigController.java @@ -0,0 +1,82 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; + +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; +import com.xzzn.common.core.page.TableDataInfo; + +/** + * 电价配置Controller + * + * @author xzzn + * @date 2025-09-28 + */ +@RestController +@RequestMapping("/ems/energyPriceConfig") +public class EmsEnergyPriceConfigController extends BaseController +{ + @Autowired + private IEmsEnergyPriceConfigService emsEnergyPriceConfigService; + + /** + * 查询电价配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(String siteId, String startTime,String endTime) + { + List list = emsEnergyPriceConfigService.selectEmsEnergyPriceConfigList(siteId,startTime,endTime); + return getDataTable2(list); + } + + /** + * 获取电价配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(emsEnergyPriceConfigService.selectEmsEnergyPriceConfigById(id)); + } + + /** + * 新增电价配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "电价配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EnergyPriceVo priceVo) + { + return toAjax(emsEnergyPriceConfigService.insertEmsEnergyPriceConfig(priceVo)); + } + + /** + * 修改电价配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "电价配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EnergyPriceVo priceVo) + { + return toAjax(emsEnergyPriceConfigService.updateEmsEnergyPriceConfig(priceVo)); + } + + /** + * 删除电价配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "电价配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emsEnergyPriceConfigService.deleteEmsEnergyPriceConfigByIds(ids)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsFaultProtectionPlanController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsFaultProtectionPlanController.java new file mode 100644 index 0000000..58e0570 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsFaultProtectionPlanController.java @@ -0,0 +1,107 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.xzzn.ems.service.IEmsFaultProtectionPlanService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; +import com.xzzn.common.utils.poi.ExcelUtil; +import com.xzzn.common.core.page.TableDataInfo; + +/** + * 故障告警保护方案Controller + * + * @author xzzn + * @date 2025-10-22 + */ +@RestController +@RequestMapping("/ems/protectPlan") +public class EmsFaultProtectionPlanController extends BaseController +{ + @Autowired + private IEmsFaultProtectionPlanService emsFaultProtectionPlanService; + + /** + * 查询故障告警保护方案列表 + */ + @PreAuthorize("@ss.hasPermi('system:plan:list')") + @GetMapping("/list") + public TableDataInfo list(EmsFaultProtectionPlan emsFaultProtectionPlan) + { + startPage(); + List list = emsFaultProtectionPlanService.selectEmsFaultProtectionPlanList(emsFaultProtectionPlan); + return getDataTable(list); + } + + /** + * 导出故障告警保护方案列表 + */ + @PreAuthorize("@ss.hasPermi('system:plan:export')") + @Log(title = "故障告警保护方案", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EmsFaultProtectionPlan emsFaultProtectionPlan) + { + List list = emsFaultProtectionPlanService.selectEmsFaultProtectionPlanList(emsFaultProtectionPlan); + ExcelUtil util = new ExcelUtil(EmsFaultProtectionPlan.class); + util.exportExcel(response, list, "故障告警保护方案数据"); + } + + /** + * 获取故障告警保护方案详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:plan:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(emsFaultProtectionPlanService.selectEmsFaultProtectionPlanById(id)); + } + + /** + * 新增故障告警保护方案 + */ + @PreAuthorize("@ss.hasPermi('system:plan:add')") + @Log(title = "故障告警保护方案", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EmsFaultProtectionPlan emsFaultProtectionPlan) + { + emsFaultProtectionPlan.setCreateBy(getUsername()); + return toAjax(emsFaultProtectionPlanService.insertEmsFaultProtectionPlan(emsFaultProtectionPlan)); + } + + /** + * 修改故障告警保护方案 + */ + @PreAuthorize("@ss.hasPermi('system:plan:edit')") + @Log(title = "故障告警保护方案", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmsFaultProtectionPlan emsFaultProtectionPlan) + { + emsFaultProtectionPlan.setUpdateBy(getUsername()); + return toAjax(emsFaultProtectionPlanService.updateEmsFaultProtectionPlan(emsFaultProtectionPlan)); + } + + /** + * 删除故障告警保护方案 + */ + @PreAuthorize("@ss.hasPermi('system:plan:remove')") + @Log(title = "故障告警保护方案", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emsFaultProtectionPlanService.deleteEmsFaultProtectionPlanByIds(ids)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsGeneralQueryController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsGeneralQueryController.java new file mode 100644 index 0000000..107e835 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsGeneralQueryController.java @@ -0,0 +1,78 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.ems.domain.vo.*; +import com.xzzn.ems.service.IGeneralQueryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * 综合查询 + * + */ +@RestController +@RequestMapping("/ems/generalQuery") +public class EmsGeneralQueryController extends BaseController{ + + @Autowired + private IGeneralQueryService iGeneralQueryService; + + /** + * 获取设备枚举 + */ + @GetMapping("/getAllDeviceCategory") + public AjaxResult getDeviceCategory() + { + // 获取所有枚举的信息 + List> deviceCategoryList = new ArrayList<>(); + for (DeviceCategory category : DeviceCategory.values()) { + Map categoryMap = new HashMap<>(); + categoryMap.put("name", category.getInfo()); + categoryMap.put("code", category.getCode()); + deviceCategoryList.add(categoryMap); + } + return success(deviceCategoryList); + } + + /** + * 点位模糊查询 + */ + @PostMapping("/pointFuzzyQuery") + public AjaxResult pointFuzzyQuery(@RequestBody PointNameRequest request) + { + return success(iGeneralQueryService.getPointNameList(request)); + } + + /** + * 根据点位查询点位数据变化 + */ + @PostMapping("/getPointValueList") + public AjaxResult getPointValueList(@RequestBody PointNameRequest request) + { + List result = new ArrayList<>(); + try { + result = iGeneralQueryService.getPointValueList(request); + } catch (Exception e) { + logger.error("",e); + return error("报错请重试!"); + } + return success(result); + } + + /** + * 获取设备枚举 + */ + @GetMapping("/getAllBatteryIdsBySites/{siteIds}") + public AjaxResult getAllBatteryIdsBySites(@PathVariable String[] siteIds) + { + return success(iGeneralQueryService.getAllBatteryIdsBySites(siteIds)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsHomePageController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsHomePageController.java index 6aa2e3f..23cca2d 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsHomePageController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsHomePageController.java @@ -34,9 +34,13 @@ public class EmsHomePageController extends BaseController{ * 首页看板数据 */ @GetMapping("/dataList") - public AjaxResult list() + public AjaxResult list() throws Exception { - return success(homePageService.getHomePageDataList()); + try { + return success(homePageService.getHomePageDataList()); + } catch (Exception e) { + return error(e.getMessage()); + } } /** diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsMqttTopicConfigController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsMqttTopicConfigController.java new file mode 100644 index 0000000..5dc661d --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsMqttTopicConfigController.java @@ -0,0 +1,106 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.domain.EmsMqttTopicConfig; +import com.xzzn.ems.service.IEmsMqttTopicConfigService; +import com.xzzn.common.utils.poi.ExcelUtil; +import com.xzzn.common.core.page.TableDataInfo; + +/** + * 站点topic配置Controller + * + * @author xzzn + * @date 2025-11-06 + */ +@RestController +@RequestMapping("/ems/mqttConfig") +public class EmsMqttTopicConfigController extends BaseController +{ + @Autowired + private IEmsMqttTopicConfigService emsMqttTopicConfigService; + + /** + * 查询站点topic配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(EmsMqttTopicConfig emsMqttTopicConfig) + { + startPage(); + List list = emsMqttTopicConfigService.selectEmsMqttTopicConfigList(emsMqttTopicConfig); + return getDataTable(list); + } + + /** + * 导出站点topic配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:export')") + @Log(title = "站点topic配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EmsMqttTopicConfig emsMqttTopicConfig) + { + List list = emsMqttTopicConfigService.selectEmsMqttTopicConfigList(emsMqttTopicConfig); + ExcelUtil util = new ExcelUtil(EmsMqttTopicConfig.class); + util.exportExcel(response, list, "站点topic配置数据"); + } + + /** + * 获取站点topic配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(emsMqttTopicConfigService.selectEmsMqttTopicConfigById(id)); + } + + /** + * 新增站点topic配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "站点topic配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EmsMqttTopicConfig emsMqttTopicConfig) + { + emsMqttTopicConfig.setCreateBy(getUsername()); + return toAjax(emsMqttTopicConfigService.insertEmsMqttTopicConfig(emsMqttTopicConfig)); + } + + /** + * 修改站点topic配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "站点topic配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmsMqttTopicConfig emsMqttTopicConfig) + { + emsMqttTopicConfig.setUpdateBy(getUsername()); + return toAjax(emsMqttTopicConfigService.updateEmsMqttTopicConfig(emsMqttTopicConfig)); + } + + /** + * 删除站点topic配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "站点topic配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emsMqttTopicConfigService.deleteEmsMqttTopicConfigByIds(ids)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsPointMatchController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsPointMatchController.java new file mode 100644 index 0000000..8441650 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsPointMatchController.java @@ -0,0 +1,88 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointMatchExportVo; +import com.xzzn.ems.domain.vo.DevicePointMatchVo; +import com.xzzn.ems.domain.vo.ImportPointDataRequest; +import com.xzzn.ems.service.IEmsPointMatchService; +import com.xzzn.common.utils.poi.ExcelUtil; +import org.springframework.web.multipart.MultipartFile; + +/** + * 点位匹配Controller + * + * @author xzzn + * @date 2025-11-04 + */ +@RestController +@RequestMapping("/ems/pointMatch") +public class EmsPointMatchController extends BaseController +{ + @Autowired + private IEmsPointMatchService emsPointMatchService; + + /** + * 导出点位匹配列表 + */ + @PreAuthorize("@ss.hasPermi('system:match:export')") + @Log(title = "点位匹配", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EmsPointMatch emsPointMatch) + { + List list = emsPointMatchService.selectEmsPointMatchList(emsPointMatch); + ExcelUtil util = new ExcelUtil<>(DevicePointMatchExportVo.class); + util.exportExcel(response, list, "点位匹配数据"); + } + + /** + * 上传点位清单 + * @param file + * @param updateSupport + * @return + * @throws Exception + */ + @PreAuthorize("@ss.hasPermi('system:user:import')") + @Log(title = "点位匹配", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception + { + ExcelUtil util = new ExcelUtil(EmsPointMatch.class); + List pointMatcheList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = emsPointMatchService.importPoint(pointMatcheList, updateSupport, operName); + return success(message); + } + + /** + * 上传设备的点位清单 + * @param request + * @return + * @throws Exception + */ + @PreAuthorize("@ss.hasPermi('system:user:import')") + @Log(title = "点位匹配", businessType = BusinessType.IMPORT) + @PostMapping("/importDataByDevice") + public void importDataByDevice(@Valid ImportPointDataRequest request, HttpServletResponse response) { + List list = emsPointMatchService.importDataByDevice(request, getUsername()); + if (CollectionUtils.isNotEmpty(list)) { + ExcelUtil util = new ExcelUtil<>(DevicePointMatchVo.class); + util.exportExcel(response, list, "点位匹配数据"); + } + } + +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteConfigController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteConfigController.java new file mode 100644 index 0000000..aec2ad4 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteConfigController.java @@ -0,0 +1,205 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.annotation.Log; +import com.xzzn.common.config.RuoYiConfig; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.core.page.TableDataInfo; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.common.utils.file.FileUploadUtils; +import com.xzzn.common.utils.file.MimeTypeUtils; +import com.xzzn.ems.domain.EmsSiteSetting; +import com.xzzn.ems.domain.vo.DeviceUpdateRequest; +import com.xzzn.ems.domain.vo.DevicesSettingVo; +import com.xzzn.ems.domain.vo.PointDataRequest; +import com.xzzn.ems.domain.vo.PointQueryResponse; +import com.xzzn.ems.domain.vo.SiteDeviceListVo; +import com.xzzn.ems.service.IEmsDeviceSettingService; +import com.xzzn.ems.service.IEmsSiteService; + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + * + * 站点配置 + * + */ +@RestController +@RequestMapping("/ems/siteConfig") +public class EmsSiteConfigController extends BaseController{ + + @Autowired + private IEmsSiteService iEmsSiteService; + + @Autowired + private IEmsDeviceSettingService iEmsDeviceSettingService; + + /** + * 获取站点列表 + */ + @GetMapping("/getSiteInfoList") + public TableDataInfo getSiteInfoList(@RequestParam String siteName, @RequestParam String startTime, @RequestParam String endTime) + { + startPage(); + List list = iEmsSiteService.getAllSiteInfoList(siteName,startTime,endTime); + return getDataTable(list); + } + + /** + * 获取设备列表-分页 + */ + @GetMapping("/getDeviceInfoList") + public TableDataInfo getDeviceInfoList(@RequestParam(value = "siteId", required = false) String siteId, + @RequestParam(value = "deviceCategory", required = false) String deviceCategory) + { + startPage(); + List list = iEmsSiteService.getAllDeviceListNoDisp(siteId, deviceCategory); + + return getDataTable(list); + } + + /** + * 获取设备详细信息 + */ + @GetMapping("/getDeviceDetailInfo") + public AjaxResult getDeviceDetailInfo(@RequestParam Long id) + { + return success(iEmsDeviceSettingService.getDeviceDetailInfo(id)); + } + + /** + * 获取设备列表-不分页 + */ + @GetMapping("/getDeviceList") + public AjaxResult getDeviceInfoList2(@RequestParam String siteId) + { + return success(iEmsSiteService.getAllDeviceList(siteId, null)); + } + + /** + * 获取所有设备类别 + */ + @GetMapping("/getDeviceCategory") + public AjaxResult getDeviceCategory() + { + return success(iEmsDeviceSettingService.getDeviceCategory()); + } + + /** + * 新增设备 + */ + @PostMapping("/addDevice") + public AjaxResult addDevice(@RequestBody DevicesSettingVo devicesSetting) + { + int result = iEmsDeviceSettingService.addDevice(devicesSetting); + if (result > 0) { + return AjaxResult.success(result); + } else { + return AjaxResult.error("该设备已存在"); + } + } + + /** + * 上传设备图片 + */ + @PostMapping("/uploadDeviceImg") + public AjaxResult uploadDeviceImg(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) { + String avatar = FileUploadUtils.upload(RuoYiConfig.getDevicePath(), file, MimeTypeUtils.IMAGE_EXTENSION); + + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + return ajax; + } + return error("上传图片异常,请联系管理员"); + } + + /** + * 修改Modbus设备配置 + */ + @PostMapping("/updateDevice") + public AjaxResult updateDevice(@RequestBody DevicesSettingVo emsDevicesSetting) + { + int result = iEmsDeviceSettingService.updateDevice(emsDevicesSetting); + if (result > 0) { + return AjaxResult.success(result); + } else if (result == -1) { + return AjaxResult.error("数据不存在"); + } else if (result == -2) { + return AjaxResult.error("该设备已存在"); + } + return AjaxResult.success(result); + } + + /** + * 删除Modbus设备配置 + */ + @DeleteMapping("/deleteService/{id}") + public AjaxResult deleteService(@PathVariable Long id) + { + return toAjax(iEmsDeviceSettingService.deleteEmsDevicesSettingById(id)); + } + + /** + * 单个站点单个设备点位查询-点位清单 + */ + @GetMapping("/getDevicePointList") + public TableDataInfo getDevicePointList(@Validated PointDataRequest request) + { + List result = iEmsDeviceSettingService.getSingleSiteDevicePoints(request); + return getDataTable2(result); + } + + /** + * 获取指定站点下的所有设备类别 + */ + @GetMapping("/getSiteAllDeviceCategory") + public AjaxResult getSiteAllDeviceCategory(String siteId) + { + return success(iEmsDeviceSettingService.getSiteAllDeviceCategory(siteId)); + } + + /** + * 根据设备类别获取父类的设备id + */ + @GetMapping("/getParentDeviceId") + public AjaxResult getParentDeviceId(@RequestParam String siteId, @RequestParam String deviceCategory) + { + return success(iEmsSiteService.getParentCategoryDeviceId(siteId, deviceCategory)); + } + + /** + * 获取指定站点下的指定设备类型的设备 + */ + @GetMapping("/getDeviceListBySiteAndCategory") + public AjaxResult getDeviceListBySiteAndCategory(String siteId,String deviceCategory) + { + return success(iEmsDeviceSettingService.getDeviceListBySiteAndCategory(siteId, deviceCategory)); + } + + /** + * PCS设备开关机 + */ +// @PreAuthorize("@ss.hasPermi('system:device:onAndOff')") + @Log(title = "开关机", businessType = BusinessType.UPDATE) + @PostMapping("/updateDeviceStatus") + public AjaxResult updateDeviceStatus(@Valid @RequestBody DeviceUpdateRequest request) + { + return success(iEmsDeviceSettingService.updateDeviceStatus(request)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMapController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMapController.java index 4c39286..4c69b9d 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMapController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMapController.java @@ -2,7 +2,7 @@ package com.xzzn.web.controller.ems; import com.xzzn.common.core.controller.BaseController; import com.xzzn.common.core.domain.AjaxResult; -import com.xzzn.ems.service.IEmsSiteService; +import com.xzzn.ems.domain.vo.DateSearchRequest; import com.xzzn.ems.service.IHomePageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController; /** * -// * 站点地图 + * 站点地图 * */ @RestController @@ -26,9 +26,22 @@ public class EmsSiteMapController extends BaseController{ * 获取某个站点基本信息 */ @GetMapping("/getSingleSiteBaseInfo") - public AjaxResult getSingleSiteBaseInfo(@RequestParam Long siteId) + public AjaxResult getSingleSiteBaseInfo(@RequestParam String siteId) { return success(homePageService.getSingleSiteBaseInfo(siteId)); } + /** + * 获取某个站点7天充放电数据 + */ + @GetMapping("/getSevenChargeData") + public AjaxResult getSevenChargeData(DateSearchRequest request) + { + String siteId = request.getSiteId(); + if(siteId == null || siteId.isEmpty()) { + return error("站点必传"); + } + return success(homePageService.getSevenChargeData(request)); + } + } diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java index 67a683a..3e959f5 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java @@ -2,10 +2,22 @@ package com.xzzn.web.controller.ems; import com.xzzn.common.core.controller.BaseController; import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.core.page.TableDataInfo; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.vo.BMSBatteryDataList; +import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.RunningGraphRequest; +import com.xzzn.ems.domain.vo.SiteBatteryDataList; +import com.xzzn.ems.service.IEmsSiteService; +import com.xzzn.ems.service.IEmsStatsReportService; import com.xzzn.ems.service.ISingleSiteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; +import java.util.List; + /** * * 单站监控 @@ -17,12 +29,16 @@ public class EmsSiteMonitorController extends BaseController{ @Autowired private ISingleSiteService iSingleSiteService; + @Autowired + private IEmsSiteService iEmsSiteService; + @Autowired + private IEmsStatsReportService iemsStatsReportService; /** * 获取单站首页数据 */ @GetMapping("/homeView") - public AjaxResult getSingleSiteViewInfo(@RequestParam Long siteId) + public AjaxResult getSingleSiteViewInfo(@RequestParam String siteId) { return success(iSingleSiteService.getSiteMonitorDataVo(siteId)); } @@ -31,7 +47,7 @@ public class EmsSiteMonitorController extends BaseController{ * 单站监控-设备监控-实时运行头部数据 */ @GetMapping("/runningHeadInfo") - public AjaxResult getRunningHeadInfo(@RequestParam Long siteId) + public AjaxResult getRunningHeadInfo(@RequestParam String siteId) { return success(iSingleSiteService.getSiteRunningHeadInfo(siteId)); } @@ -39,17 +55,35 @@ public class EmsSiteMonitorController extends BaseController{ /** * 单站监控-设备监控-实时运行曲线图数据 */ - @GetMapping("/runningGraph") - public AjaxResult getRunningGraph(@RequestParam Long siteId) + @GetMapping("/runningGraph/storagePower") + public AjaxResult getRunningGraphStorage(RunningGraphRequest request) { - return success(iSingleSiteService.getRunningGraph(siteId)); + return success(iSingleSiteService.getRunningGraphStorage(request)); + } + + @GetMapping("/runningGraph/pcsMaxTemp") + public AjaxResult getRunningGraphPcsMaxTemp(RunningGraphRequest request) + { + return success(iSingleSiteService.getRunningGraphPcsMaxTemp(request)); + } + + @GetMapping("/runningGraph/batteryAveSoc") + public AjaxResult getRunningGraphBatterySoc(RunningGraphRequest request) + { + return success(iSingleSiteService.getRunningGraphBatterySoc(request)); + } + + @GetMapping("/runningGraph/batteryAveTemp") + public AjaxResult getRunningGraphBatteryTemp(RunningGraphRequest request) + { + return success(iSingleSiteService.getRunningGraphBatteryTemp(request)); } /** * 单站监控-设备监控-PCS */ @GetMapping("/getPcsDetailInfo") - public AjaxResult getPcsDetailInfo(@RequestParam Long siteId) + public AjaxResult getPcsDetailInfo(@RequestParam String siteId) { return success(iSingleSiteService.getPcsDetailInfo(siteId)); } @@ -58,7 +92,7 @@ public class EmsSiteMonitorController extends BaseController{ * 单站监控-设备监控-BMS总览 */ @GetMapping("/getBMSOverView") - public AjaxResult getBMSOverView(@RequestParam Long siteId) + public AjaxResult getBMSOverView(@RequestParam String siteId) { return success(iSingleSiteService.getBMSOverView(siteId)); } @@ -67,7 +101,7 @@ public class EmsSiteMonitorController extends BaseController{ * 单站监控-设备监控-BMS电池簇 */ @GetMapping("/getBMSBatteryCluster") - public AjaxResult getBMSBatteryCluster(@RequestParam Long siteId) + public AjaxResult getBMSBatteryCluster(@RequestParam String siteId) { return success(iSingleSiteService.getBMSBatteryCluster(siteId)); } @@ -76,26 +110,122 @@ public class EmsSiteMonitorController extends BaseController{ * 获取所有电池堆 */ @GetMapping("/getStackNameList") - public AjaxResult getStackNameList(@RequestParam Long siteId) + public AjaxResult getStackNameList(@RequestParam String siteId) { - return success(iSingleSiteService.getBMSBatteryCluster(siteId)); + return success(iEmsSiteService.getAllStackInfo(siteId)); + } + + /** + * 获取所有pcs + */ + @GetMapping("/getPcsNameList") + public AjaxResult getPcsNameList(@RequestParam String siteId) + { + return success(iEmsSiteService.getAllPcsInfo(siteId)); } /** * 获取所有电池簇 */ @GetMapping("/getClusterNameList") - public AjaxResult getClusterNameList(@RequestParam Long siteId) + public AjaxResult getClusterNameList(@RequestParam String siteId, @RequestParam String stackDeviceId) { - return success(iSingleSiteService.getBMSBatteryCluster(siteId)); + return success(iEmsSiteService.getAllClusterInfo(siteId, stackDeviceId)); } /** * 液冷设备参数 */ @GetMapping("/getCoolingDataList") - public AjaxResult getCoolingDataList(@RequestParam Long siteId) + public AjaxResult getCoolingDataList(@RequestParam String siteId) { return success(iSingleSiteService.getCoolingDataList(siteId)); } + + /** + * 获取电池簇下面的单体电池数据 + */ + @GetMapping("/getClusterDataInfoList") + public TableDataInfo getClusterDataInfoList(@RequestParam String clusterDeviceId,@RequestParam String siteId, + @RequestParam String stackDeviceId,@RequestParam String batteryId) + { + startPage(); + SiteBatteryDataList siteBatteryDataList = new SiteBatteryDataList(); + // 簇最大最小单体id数据 + List clusterBatteryDataList = iSingleSiteService.getClusterBatteryList(siteId,stackDeviceId,clusterDeviceId); + siteBatteryDataList.setClusterList(clusterBatteryDataList); + // 单体电池数据 + List List = iSingleSiteService.getClusterDataInfoList(clusterDeviceId,siteId,stackDeviceId,batteryId); + // 对batteryList进行分页处理 + List batteryList = paginateList(List); + siteBatteryDataList.setBatteryList(batteryList); + + // 封装分页信息 + TableDataInfo pageInfo = new TableDataInfo(); + pageInfo.setTotal(List.size()); + pageInfo.setRows(Arrays.asList(siteBatteryDataList)); + pageInfo.setCode(0); + pageInfo.setMsg("查询成功"); + return pageInfo; + } + + /** + * 单个单体电池曲线图 + */ + @GetMapping("/getSingleBatteryData") + public AjaxResult getSingleBatteryData(DateSearchRequest requestVo) + { + return success(iemsStatsReportService.getSingleBatteryData(requestVo)); + } + + /** + * 电表数据 + */ + @GetMapping("/getAmmeterDataList") + public AjaxResult getAmmeterDataList(@RequestParam String siteId) + { + return success(iSingleSiteService.getAmmeterDataList(siteId)); + } + + /** + * 动环数据 + */ + @GetMapping("/getDhDataList") + public AjaxResult getDhDataList(@RequestParam String siteId) + { + return success(iSingleSiteService.getDhDataList(siteId)); + } + + /** + * 消防数据 + */ + @GetMapping("/getXfDataList") + public AjaxResult getXfDataList(@RequestParam String siteId) + { + return success(iSingleSiteService.getXfDataList(siteId)); + } + + /** + * EMS数据 + */ + @GetMapping("/getEmsDataList") + public AjaxResult getEmsDataList(@RequestParam String siteId) + { + return success(iSingleSiteService.getEmsDataList(siteId)); + } + + /** + * 单站监控-首页-点位展示 + * 储能功率、电网功率、负荷功率、光伏功率 + * SOC、SOH、电池平均温度 + */ + @GetMapping("/getPointData") + public AjaxResult getPointData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId())) { + return success(iSingleSiteService.getPointData(requestVo)); + } else { + return error("缺少必传项"); + } + } } diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java new file mode 100644 index 0000000..330ecb0 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java @@ -0,0 +1,179 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.core.page.TableDataInfo; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.vo.AmmeterRevenueStatisListVo; +import com.xzzn.ems.domain.vo.AmmeterStatisListVo; +import com.xzzn.ems.domain.vo.ClusterStatisListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.StatisAmmeterDateRequest; +import com.xzzn.ems.domain.vo.StatisClusterDateRequest; +import com.xzzn.ems.service.IEmsStatsReportService; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 单站监控-统计报表 + * + * @author xzzn + */ +@RestController +@RequestMapping("/ems/statsReport") +public class EmsStatisticalReportController extends BaseController +{ + + @Autowired + private IEmsStatsReportService ieEmsStatsReportService; + + /** + * 概率统计-收益指标查询 + */ + @GetMapping("/getRevenueData") + public AjaxResult getRevenueData(DateSearchRequest requestVo) + { + return success(null); + } + + /** + * 概率统计-电量指标查询 + */ + @GetMapping("/getElectricData") + public AjaxResult getElectricData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId())) { + return success(ieEmsStatsReportService.getElectricDataResult(requestVo)); + } else { + return error("站点id必传"); + } + } + + /** + * 概率统计-PCS曲线 + */ + @GetMapping("/getPCSData") + public AjaxResult getPCSData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId())&& + !StringUtils.isEmpty(requestVo.getDataType())) { + return success(ieEmsStatsReportService.getPCSDataResult(requestVo)); + } else { + return error("缺少必传项"); + } + } + + /** + * 概率统计-电池堆曲线 + */ + @GetMapping("/getStackData") + public AjaxResult getStackData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId()) && + !StringUtils.isEmpty(requestVo.getDataType())) { + return success(ieEmsStatsReportService.getStackDataResult(requestVo)); + } else { + return error("缺少必传项"); + } + } + + /** + * 概率统计-电池温度等数据 + */ + @GetMapping("/getClusterData") + public TableDataInfo getClusterData(StatisClusterDateRequest requestVo) + { + startPage(); + List dataList = new ArrayList<>(); + if (!StringUtils.isEmpty(requestVo.getStackId()) && + !StringUtils.isEmpty(requestVo.getClusterId())) { + dataList = ieEmsStatsReportService.getClusterDataResult(requestVo); + return getDataTable(dataList); + } else { + return getDataTable(dataList); + } + } + + /** + * 概率统计-获取站点下所有电表 + */ + @GetMapping("/getLoadNameList") + public AjaxResult getLoadNameList(String siteId) + { + if (!StringUtils.isEmpty(siteId)) { + return success(ieEmsStatsReportService.getLoadNameList(siteId)); + } else { + return error("缺少必传项"); + } + } + + /** + * 概率统计-电表报表 + */ + @GetMapping("/getAmmeterData") + public TableDataInfo getAmmeterData(StatisAmmeterDateRequest requestVo) + { + startPage(); + List dataList = ieEmsStatsReportService.getAmmeterDataResult(requestVo); + return getDataTable(dataList); + } + + /** + * 导出电表报表 + */ + @PreAuthorize("@ss.hasPermi('system:ammeterData:export')") + @Log(title = "电表报表", businessType = BusinessType.EXPORT) + @PostMapping("/exportAmmeterData") + public void exportAmmeterData(HttpServletResponse response, StatisAmmeterDateRequest requestVo) + { + ieEmsStatsReportService.exportAmmeterData(response, requestVo); + } + + /** + * 概率统计-电表收益报表 + */ + @GetMapping("/getAmmeterRevenueData") + public TableDataInfo getAmmeterRevenueData(StatisAmmeterDateRequest requestVo) + { + startPage(); + List dataList = ieEmsStatsReportService.getAmmeterRevenueDataResult(requestVo); + return getDataTable(dataList); + } + + /** + * 导出收益报表 + */ + @PreAuthorize("@ss.hasPermi('system:ammeterRevenueData:export')") + @Log(title = "收益报表", businessType = BusinessType.EXPORT) + @PostMapping("/exportAmmeterRevenueData") + public void exportAmmeterRevenueData(HttpServletResponse response, StatisAmmeterDateRequest requestVo) + { + ieEmsStatsReportService.exportAmmeterRevenueData(response, requestVo); + } + + /** + * 概率统计-功率曲线 + */ + @GetMapping("/getPowerData") + public AjaxResult getPowerData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId())) { + return success(ieEmsStatsReportService.getPowerDataList(requestVo)); + } else { + return error("缺少必传项"); + } + } + +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyController.java new file mode 100644 index 0000000..4c3435e --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyController.java @@ -0,0 +1,76 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyRunning; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.ems.service.IEmsStrategyService; + +/** + * 策略Controller + * + * @author xzzn + * @date 2025-07-10 + */ +@RestController +@RequestMapping("/system/strategyRunning") +public class EmsStrategyController extends BaseController +{ + @Autowired + private IEmsStrategyService emsStrategyService; + + /** + * 获取站点策略配置 + */ + @GetMapping("/list") + public AjaxResult list(String siteId) { + return success(emsStrategyService.selectEmsStrategyRunningList(siteId)); + } + /** + * 停止策略 + */ + @GetMapping(value = "/stop") + public AjaxResult stop(Long id) + { + return toAjax(emsStrategyService.stopRunningStrategy(id)); + } + + /** + * 获取主策略列表 + */ + @GetMapping(value = "/getMainStrategyList") + public AjaxResult getMainStrategyList() + { + return success(emsStrategyService.getMainStrategyList()); + } + + /** + * 获取辅助策略列表 + */ + @GetMapping(value = "/getAuxStrategyList") + public AjaxResult getAuxStrategyList() + { + return success(emsStrategyService.getAuxStrategyList()); + } + + /** + * 配置策略 + */ + @PostMapping(value = "/configStrategy") + public AjaxResult configStrategy(@RequestBody EmsStrategyRunning emsStrategyRunning) + { + if (emsStrategyRunning.getMainStrategyId() == null + || StringUtils.isEmpty(emsStrategyRunning.getSiteId())){ + return error("缺少必填字段"); + } + emsStrategyRunning.setCreateBy(getUsername()); + emsStrategyRunning.setUpdateBy(getUsername()); + int result = emsStrategyService.configStrategy(emsStrategyRunning); + if (result == -1){ + return error("不支持重复添加"); + } + return success(result); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyCurveController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyCurveController.java new file mode 100644 index 0000000..6761295 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyCurveController.java @@ -0,0 +1,113 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.domain.EmsStrategyCurve; +import com.xzzn.ems.service.IEmsStrategyCurveService; +import com.xzzn.common.utils.poi.ExcelUtil; + +/** + * 策曲线Controller + * + * @author xzzn + * @date 2025-07-11 + */ +@RestController +@RequestMapping("/strategy/curve") +public class EmsStrategyCurveController extends BaseController +{ + @Autowired + private IEmsStrategyCurveService emsStrategyCurveService; + + /** + * 查询策曲线列表 + */ + @PreAuthorize("@ss.hasPermi('system:curve:list')") + @GetMapping("/list") + public AjaxResult list(EmsStrategyCurve emsStrategyCurve) + { + return success(emsStrategyCurveService.selectEmsStrategyCurveList(emsStrategyCurve)); + } + + /** + * 导出策曲线列表 + */ + @PreAuthorize("@ss.hasPermi('system:curve:export')") + @Log(title = "策曲线", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, EmsStrategyCurve emsStrategyCurve) + { + List list = emsStrategyCurveService.selectEmsStrategyCurveList(emsStrategyCurve); + ExcelUtil util = new ExcelUtil(EmsStrategyCurve.class); + util.exportExcel(response, list, "策曲线数据"); + } + + /** + * 获取策曲线详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:curve:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(emsStrategyCurveService.selectEmsStrategyCurveById(id)); + } + + /** + * 新增策曲线 + */ + @PreAuthorize("@ss.hasPermi('system:curve:add')") + @Log(title = "策曲线", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EmsStrategyCurve emsStrategyCurve) + { + return toAjax(emsStrategyCurveService.insertEmsStrategyCurve(emsStrategyCurve)); + } + + /** + * 修改策曲线 + */ + @PreAuthorize("@ss.hasPermi('system:curve:edit')") + @Log(title = "策曲线", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmsStrategyCurve emsStrategyCurve) + { + return toAjax(emsStrategyCurveService.updateEmsStrategyCurve(emsStrategyCurve)); + } + + /** + * 删除策曲线 + */ + @PreAuthorize("@ss.hasPermi('system:curve:remove')") + @Log(title = "策曲线", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emsStrategyCurveService.deleteEmsStrategyCurveByIds(ids)); + } + + /** + * 获取策略曲线图数据 + */ + @GetMapping("/curveList") + public AjaxResult getCurveList(EmsStrategyTemp tempConfig) + { + return success(emsStrategyCurveService.getStrategyCurveList(tempConfig)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTempController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTempController.java new file mode 100644 index 0000000..b8a5071 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTempController.java @@ -0,0 +1,94 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.ems.domain.vo.StrategyTempConfigRequest; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.service.IEmsStrategyTempService; + +/** + * 模板Controller + * + * @author xzzn + * @date 2025-07-11 + */ +@RestController +@RequestMapping("/strategy/temp") +public class EmsStrategyTempController extends BaseController +{ + @Autowired + private IEmsStrategyTempService emsStrategyTempService; + + /** + * 根据策略id站点id获取所有模板名称 + */ + @GetMapping("/getTempNameList") + public AjaxResult getTempNameList(Long strategyId, String siteId) + { + return success(emsStrategyTempService.getTempNameList(strategyId, siteId)); + } + + /** + * 获取单个模板时间配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:temp:list')") + @GetMapping("/list") + public AjaxResult list(String templateId) + { + return success(emsStrategyTempService.selectEmsStrategyTempList(templateId)); + } + + /** + * 新增模板及时间配置 + */ + @PreAuthorize("@ss.hasPermi('system:temp:add')") + @Log(title = "模板", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody StrategyTempConfigRequest requestVo) + { + boolean result = emsStrategyTempService.addNewTempAndTimeConfig(requestVo); + if (result) { + return success(); + } else { + return AjaxResult.error("新增失败请重试!"); + } + } + + /** + * 修改模板 + */ + @PreAuthorize("@ss.hasPermi('system:temp:edit')") + @Log(title = "模板", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody StrategyTempConfigRequest requestVo) + { + boolean result = emsStrategyTempService.updateEmsStrategyTemp(requestVo); + if (result) { + return success(); + } else { + return AjaxResult.error("更新失败,请重试!"); + } + } + + /** + * 删除模板 + */ + @PreAuthorize("@ss.hasPermi('system:temp:remove')") + @Log(title = "模板", businessType = BusinessType.DELETE) + @DeleteMapping("/{templateId}") + public AjaxResult remove(@PathVariable String templateId) + { + return success(emsStrategyTempService.deleteStrategyTempById(templateId)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTimeConfigController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTimeConfigController.java new file mode 100644 index 0000000..ad20c48 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStrategyTimeConfigController.java @@ -0,0 +1,93 @@ +package com.xzzn.web.controller.ems; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.xzzn.common.annotation.Log; +import com.xzzn.common.core.controller.BaseController; +import com.xzzn.common.core.domain.AjaxResult; +import com.xzzn.common.enums.BusinessType; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.service.IEmsStrategyTimeConfigService; + +/** + * 时间配置Controller + * + * @author xzzn + * @date 2025-07-11 + */ +@RestController +@RequestMapping("/strategy/timeConfig") +public class EmsStrategyTimeConfigController extends BaseController +{ + @Autowired + private IEmsStrategyTimeConfigService emsStrategyTimeConfigService; + + /** + * 查询时间配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public AjaxResult list(EmsStrategyTimeConfig emsStrategyTimeConfig) + { + return success(emsStrategyTimeConfigService.getStrategyTimeList(emsStrategyTimeConfig)); + } + + /** + * 获取时间配置详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(emsStrategyTimeConfigService.selectEmsStrategyTimeConfigById(id)); + } + + /** + * 新增时间配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "时间配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody List emsStrategyTimeConfigList) + { + boolean result = emsStrategyTimeConfigService.insertEmsStrategyTimeConfig(emsStrategyTimeConfigList); + if (result){ + return success(); + }else { + return error("编辑失败请重试!"); + } + + } + + /** + * 修改时间配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "时间配置", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmsStrategyTimeConfig emsStrategyTimeConfig) + { + return toAjax(emsStrategyTimeConfigService.updateEmsStrategyTimeConfig(emsStrategyTimeConfig)); + } + + /** + * 删除时间配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "时间配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(emsStrategyTimeConfigService.deleteEmsStrategyTimeConfigByIds(ids)); + } +} diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsTicketController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsTicketController.java index 38e393d..d7e1e29 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsTicketController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsTicketController.java @@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse; import com.xzzn.common.utils.poi.ExcelUtil; import com.xzzn.ems.domain.EmsTicket; +import com.xzzn.ems.domain.vo.TicketListVo; import com.xzzn.ems.service.IEmsTicketService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -40,10 +41,10 @@ public class EmsTicketController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:ticket:list')") @GetMapping("/list") - public TableDataInfo list(EmsTicket emsTicket) + public TableDataInfo list(Long[] status) { startPage(); - List list = emsTicketService.selectEmsTicketList(emsTicket); + List list = emsTicketService.getAllTicketList(status); return getDataTable(list); } @@ -102,4 +103,15 @@ public class EmsTicketController extends BaseController { return toAjax(emsTicketService.deleteEmsTicketByIds(ids)); } + + /** + * 废弃工单 + */ + @PreAuthorize("@ss.hasPermi('system:ticket:delete')") + @Log(title = "工单主", businessType = BusinessType.DELETE) + @PostMapping("/drop") + public AjaxResult drop(@RequestBody EmsTicket emsTicket) + { + return toAjax(emsTicketService.dropEmsTicketById(emsTicket.getId())); + } } diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java new file mode 100644 index 0000000..ff74aa9 --- /dev/null +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java @@ -0,0 +1,295 @@ +package com.xzzn.web.controller.ems; + +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.TopicHandleType; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsMqttTopicConfig; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.service.IDDSDataProcessService; +import com.xzzn.ems.service.IDeviceDataProcessService; +import com.xzzn.ems.service.IEmsMqttMessageService; +import com.xzzn.ems.service.IEmsStrategyService; +import com.xzzn.ems.service.IFXXAlarmDataProcessService; +import com.xzzn.ems.service.IFXXDataProcessService; +import com.xzzn.ems.service.IMqttSyncLogService; +import com.xzzn.framework.manager.MqttLifecycleManager; +import com.xzzn.framework.web.service.MqttPublisher; +import com.xzzn.framework.web.service.MqttSubscriber; + +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.apache.commons.collections4.CollectionUtils; +import org.eclipse.paho.client.mqttv3.IMqttMessageListener; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MqttMessageController implements MqttPublisher, MqttSubscriber { + + private static final Logger log = LoggerFactory.getLogger(MqttMessageController.class); + + + private final MqttLifecycleManager mqttLifecycleManager; + + @Autowired + private IEmsMqttMessageService emsMqttMessageService; + + @Autowired + private IFXXDataProcessService fXXDataProcessService; + + @Autowired + private IDDSDataProcessService dDSDataProcessService; + + @Autowired + private IDeviceDataProcessService deviceDataProcessService; + + @Autowired + private IFXXAlarmDataProcessService fXXAlarmDataProcessService; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private IEmsStrategyService emsStrategyService; + @Autowired + private IMqttSyncLogService iMqttSyncLogService; + + @Autowired + private RedisCache redisCache; + + @Autowired + public MqttMessageController(MqttLifecycleManager mqttLifecycleManager) { + this.mqttLifecycleManager = mqttLifecycleManager; + } + + @PostConstruct + public void init() { + List topicConfigList = emsMqttTopicConfigMapper.selectEmsMqttTopicConfigList(null); + + if (CollectionUtils.isEmpty (topicConfigList)) { + log.info ("未查询到任何 MQTT 主题配置,跳过订阅"); + return; + } + + for (EmsMqttTopicConfig topicConfig : topicConfigList) { + String topic = topicConfig.getMqttTopic(); + if (StringUtils.isEmpty(topic)) { + log.info ("主题配置 ID:" +topicConfig.getId() +"的 mqttTopic 为空,跳过订阅"); + continue; + } + + int qos = topicConfig.getQos() == null ? 1 : topicConfig.getQos(); + if (qos < 0 || qos > 2) { + log.info ("主题:" + topic +"的 QoS值"+ qos + "不合法,自动调整为1"); + qos = 1; + } + + IMqttMessageListener listener = getMqttListenerByTopic(topic, topicConfig.getHandleType()); + subscribe(topic, qos, listener); + } + // 订阅奉贤系统状态主题 + /*subscribe("021_FXX_01_UP", 1, this::handleDeviceData); + subscribe("021_FXX_01_RECALL", 1, this::handleDeviceData); + subscribe("021_FXX_01_DOWN", 1, this::handleDeviceData); + subscribe("021_FXX_01", 1, this::handleSystemStatus); + subscribe("021_FXX_01_ALARM_UP", 1, this::handleAlarmData); + + // 订阅电动所系统状态主题 + subscribe("021_DDS_01_UP", 1, this::handleDeviceData); + subscribe("021_DDS_01_RECALL", 1, this::handleDeviceData); + subscribe("021_DDS_01_DOWN", 1, this::handleDeviceData); + subscribe("021_DDS_01", 1, this::handleSystemStatus);*/ + + } + + private IMqttMessageListener getMqttListenerByTopic(String topic, String handleType) { + TopicHandleType topicHandleType = TopicHandleType.getEnumByCode(handleType); + switch (topicHandleType) { + case DEVICE: + return this::handleDeviceData; + case DEVICE_ALARM: + return this::handleAlarmData; + case STRATEGY: + if (topic.equals("FAULT_PROTECTION_PLAN_UP")) { + return this::handleFaultProtPlanData; + } else if (topic.equals("FAULT_ALARM_RECORD_UP")) { + return this::handleFaultAlarmData; + } else if (topic.equals("FAULT_PLAN_ISSUE_UP")) { + return this::handleFaultPlanIssueData; + } else if (topic.equals("DEVICE_CHANGE_LOG_UP")) { + return this::handleDeviceChangeLogData; + } else { + return this::handleStrategyData; + } + default: + log.warn("Unknown handle type: " + handleType + ", using default handler"); + return this::handleSystemStatus; + } + } + + // 处理系统状态消息 + private void handleSystemStatus(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[SYSTEM] Status update: " + payload); + + try { + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + + } catch (Exception e) { + log.error("Failed to process system status message: " + e.getMessage(), e); + } + } + + // 处理设备数据 + private void handleDeviceData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + log.error("[DEVICE] data: " + payload); + try { + // 业务处理逻辑 +// if (topic.startsWith("021_DDS")) { +// dDSDataProcessService.handleDdsData(payload); +// } else if (topic.startsWith("021_FXX")) { +// fXXDataProcessService.handleFxData(payload); +// } + deviceDataProcessService.handleDeviceData(payload, getSiteIdByTopic(topic)); + + emsMqttMessageService.insertMqttOriginalMessage(topic, payload); + } catch (Exception e) { + log.error("Failed to process device data message: " + e.getMessage(), e); + } + + } + + // 处理告警数据 + private void handleAlarmData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[DEVICE] data: " + payload); + try { + // 业务处理逻辑 +// if (topic.startsWith("021_FXX")) { +// fXXAlarmDataProcessService.handleFxAlarmData(payload); +// } + deviceDataProcessService.handleAlarmData(payload, getSiteIdByTopic(topic)); + + emsMqttMessageService.insertMqttOriginalMessage(topic, payload); + } catch (Exception e) { + e.printStackTrace(); + log.error("Failed to process device alarm data message: " + e.getMessage(), e); + } + + } + + private String getSiteIdByTopic(String topic) { + String siteId = redisCache.getCacheObject(RedisKeyConstants.SITE_ID + topic); + if (StringUtils.isEmpty(siteId)) { + EmsMqttTopicConfig topicConfig = emsMqttTopicConfigMapper.selectOneByTopic(topic); + siteId = topicConfig.getSiteId(); + redisCache.setCacheObject(RedisKeyConstants.SITE_ID + topic, siteId); + } + log.info("当前处理数据站点:" + siteId + ",topic: " + topic); + return siteId; + } + + // 处理运行策略数据:云端-本地 + private void handleStrategyData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[处理运行策略数据] data: " + payload); + try { + // 业务处理逻辑 + iMqttSyncLogService.handleMqttStrategyData(payload); + + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + } catch (Exception e) { + log.error("Failed to process strategy data message: " + e.getMessage(), e); + } + } + + // 处理设备保护告警策略数据:云端-本地 + private void handleFaultProtPlanData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[处理设备保护告警策略数据] data: " + payload); + try { + // 业务处理逻辑 + iMqttSyncLogService.handleMqttPlanData(payload); + + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + } catch (Exception e) { + log.error("Failed to process fault plan data message: " + e.getMessage(), e); + } + } + + // 处理保护策略告警信息:本地-云端 + private void handleFaultAlarmData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[处理本地保护策略告警信息到云端] data: " + payload); + try { + // 业务处理逻辑 + iMqttSyncLogService.handleFaultAlarmData(payload); + + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + } catch (Exception e) { + log.error("Failed to process fault plan alarm data message: " + e.getMessage(), e); + } + } + + // 处理保护策略下发日志:本地-云端 + private void handleFaultPlanIssueData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[处理本地保护策略下发日志到云端] data: " + payload); + try { + // 业务处理逻辑 + iMqttSyncLogService.handleFaultPlanIssueData(payload); + + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + } catch (Exception e) { + log.error("Failed to process fault plan issue log message: " + e.getMessage(), e); + } + } + + // 处理设备状态变更日志:本地-云端 + private void handleDeviceChangeLogData(String topic, MqttMessage message) { + String payload = new String(message.getPayload()); + System.out.println("[处理本地的保护策略告警信息到云端] data: " + payload); + try { + // 业务处理逻辑 + iMqttSyncLogService.handleDeviceChangeLogData(payload); + + emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + } catch (Exception e) { + log.error("Failed to process device change log message: " + e.getMessage(), e); + } + } + + @Override + public void publish(String topic, String message) throws MqttException { + mqttLifecycleManager.publish(topic, message, 0); + } + + @Override + public void publish(String topic, String message, int qos) throws MqttException { + mqttLifecycleManager.publish(topic, message, qos); + } + + @Override + public void subscribe(String topic, int qos, IMqttMessageListener listener) { + mqttLifecycleManager.subscribe(topic, qos, listener); + + + } + + // 发送设备控制命令 + public void sendDeviceCommand(String deviceId, String command) { + try { + String topic = "devices/" + deviceId + "/commands"; + publish(topic, command, 1); + } catch (MqttException e) { + System.err.println("Failed to send command to device " + deviceId); + } + } + +} \ No newline at end of file diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/system/SysUserController.java b/ems-admin/src/main/java/com/xzzn/web/controller/system/SysUserController.java index ffe93bb..842620f 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/system/SysUserController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/system/SysUserController.java @@ -3,6 +3,8 @@ package com.xzzn.web.controller.system; import java.util.List; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; + +import com.xzzn.system.service.impl.SysUserServiceImpl; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -52,6 +54,8 @@ public class SysUserController extends BaseController @Autowired private ISysPostService postService; + @Autowired + private SysUserServiceImpl sysUserServiceImpl; /** * 获取用户列表 @@ -253,4 +257,13 @@ public class SysUserController extends BaseController { return success(deptService.selectDeptTreeList(dept)); } + + /** + * 获取所有用户 + */ + @GetMapping("/getAllUser") + public AjaxResult getAllUser(SysUser user) + { + return success(userService.selectUserList(user)); + } } diff --git a/ems-admin/src/main/resources/application-druid.yml b/ems-admin/src/main/resources/application-druid.yml index 3c7fe20..6408036 100644 --- a/ems-admin/src/main/resources/application-druid.yml +++ b/ems-admin/src/main/resources/application-druid.yml @@ -1,61 +1,61 @@ -# 数据源配置 -spring: - datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - druid: - # 主库数据源 - master: - url: jdbc:mysql://122.51.194.184:13306/setri_ems?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: ems - password: 12345678 - # 从库数据源 - slave: - # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: - # 初始连接数 - initialSize: 5 - # 最小连接池数量 - minIdle: 10 - # 最大连接池数量 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置连接超时时间 - connectTimeout: 30000 - # 配置网络超时时间 - socketTimeout: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 300000 - # 配置一个连接在池中最大生存的时间,单位是毫秒 - maxEvictableIdleTimeMillis: 900000 - # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - webStatFilter: - enabled: true - statViewServlet: - enabled: true - # 设置白名单,不填则允许所有访问 - allow: - url-pattern: /druid/* - # 控制台管理用户名和密码 - login-username: xzzn - login-password: 123456 - filter: - stat: - enabled: true - # 慢SQL记录 - log-slow-sql: true - slow-sql-millis: 1000 - merge-sql: true - wall: - config: - multi-statement-allow: true \ No newline at end of file +## 数据源配置 +#spring: +# datasource: +# type: com.alibaba.druid.pool.DruidDataSource +# driverClassName: com.mysql.cj.jdbc.Driver +# druid: +# # 主库数据源 +# master: +# url: jdbc:mysql://122.51.194.184:13306/setri_ems?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: ems +# password: 12345678 +# # 从库数据源 +# slave: +# # 从数据源开关/默认关闭 +# enabled: false +# url: +# username: +# password: +# # 初始连接数 +# initialSize: 5 +# # 最小连接池数量 +# minIdle: 10 +# # 最大连接池数量 +# maxActive: 20 +# # 配置获取连接等待超时的时间 +# maxWait: 60000 +# # 配置连接超时时间 +# connectTimeout: 30000 +# # 配置网络超时时间 +# socketTimeout: 60000 +# # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 +# timeBetweenEvictionRunsMillis: 60000 +# # 配置一个连接在池中最小生存的时间,单位是毫秒 +# minEvictableIdleTimeMillis: 300000 +# # 配置一个连接在池中最大生存的时间,单位是毫秒 +# maxEvictableIdleTimeMillis: 900000 +# # 配置检测连接是否有效 +# validationQuery: SELECT 1 FROM DUAL +# testWhileIdle: true +# testOnBorrow: false +# testOnReturn: false +# webStatFilter: +# enabled: true +# statViewServlet: +# enabled: true +# # 设置白名单,不填则允许所有访问 +# allow: +# url-pattern: /druid/* +# # 控制台管理用户名和密码 +# login-username: xzzn +# login-password: 123456 +# filter: +# stat: +# enabled: true +# # 慢SQL记录 +# log-slow-sql: true +# slow-sql-millis: 1000 +# merge-sql: true +# wall: +# config: +# multi-statement-allow: true \ No newline at end of file diff --git a/ems-admin/src/main/resources/application-local.yml b/ems-admin/src/main/resources/application-local.yml new file mode 100644 index 0000000..7654dc9 --- /dev/null +++ b/ems-admin/src/main/resources/application-local.yml @@ -0,0 +1,207 @@ +# 项目相关配置 +xzzn: + # 名称 + name: EMS + # 版本 + version: 0.0.1 + # 版权年份 + copyrightYear: 2025 + # 文件路径 示例( Windows配置D:/xzzn/uploadPath,Linux配置 /home/xzzn/uploadPath) + profile: ../uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8089 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.xzzn: info + org.springframework: warn + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: 127.0.0.1 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: 12345678 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 数据源配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://127.0.0.1:3306/setri_ems?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: ems + password: Aa112211! + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: xzzn + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.xzzn.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +mqtt: + broker.url: tcp://121.5.164.6:1883 + client.id: ems-cloud + username: dmbroker + password: qwer1234 + connection-timeout: 15 + keep-alive-interval: 30 + automatic-reconnect: true + topic: 021_DDS_01_UP + siteId: 021_DDS_01 + +modbus: + pool: + max-total: 20 + max-idle: 10 + min-idle: 3 + poll: + interval: "0 */5 * * * *" # 5分钟间隔 + timeout: 30000 # 30秒超时 diff --git a/ems-admin/src/main/resources/application-prod.yml b/ems-admin/src/main/resources/application-prod.yml new file mode 100644 index 0000000..fee9ed4 --- /dev/null +++ b/ems-admin/src/main/resources/application-prod.yml @@ -0,0 +1,207 @@ +# 项目相关配置 +xzzn: + # 名称 + name: EMS + # 版本 + version: 0.0.1 + # 版权年份 + copyrightYear: 2025 + # 文件路径 示例( Windows配置D:/xzzn/uploadPath,Linux配置 /home/xzzn/uploadPath) + profile: /home/xzzn/uploadPath + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: math + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8089 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.xzzn: info + org.springframework: warn + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: 172.17.0.9 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: 12345678 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 数据源配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://172.17.0.13:3306/setri_ems?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: ems + password: Aa112211! + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: xzzn + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.xzzn.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* + +mqtt: + broker.url: tcp://121.5.164.6:1883 + client.id: ems-cloud + username: dmbroker + password: qwer1234 + connection-timeout: 15 + keep-alive-interval: 30 + automatic-reconnect: true + topic: + siteId: + +modbus: + pool: + max-total: 20 + max-idle: 10 + min-idle: 3 + poll: + interval: "0 */5 * * * *" # 5分钟间隔 + timeout: 30000 # 30秒超时 diff --git a/ems-admin/src/main/resources/application.yml b/ems-admin/src/main/resources/application.yml index 58d7acb..cf6c040 100644 --- a/ems-admin/src/main/resources/application.yml +++ b/ems-admin/src/main/resources/application.yml @@ -34,7 +34,7 @@ server: # 日志配置 logging: level: - com.xzzn: debug + com.xzzn: info org.springframework: warn # 用户配置 @@ -87,6 +87,66 @@ spring: max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms + # 数据源配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://122.51.194.184:13306/setri_ems?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: ems + password: 12345678 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: xzzn + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true # token配置 token: @@ -127,3 +187,23 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* + +mqtt: + broker.url: tcp://122.51.194.184:1883 + client.id: ems-cloud + username: dmbroker + password: qwer1234 + connection-timeout: 15 + keep-alive-interval: 30 + automatic-reconnect: true + topic: + siteId: + +modbus: + pool: + max-total: 20 + max-idle: 10 + min-idle: 3 + poll: + interval: "0 */5 * * * *" # 5分钟间隔 + timeout: 30000 # 30秒超时 diff --git a/ems-common/pom.xml b/ems-common/pom.xml index 393c33e..c28364f 100644 --- a/ems-common/pom.xml +++ b/ems-common/pom.xml @@ -119,6 +119,12 @@ javax.servlet-api + + + com.infiniteautomation + modbus4j + + - \ No newline at end of file + diff --git a/ems-common/src/main/java/com/xzzn/common/annotation/SyncAfterInsert.java b/ems-common/src/main/java/com/xzzn/common/annotation/SyncAfterInsert.java new file mode 100644 index 0000000..49b6d85 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/annotation/SyncAfterInsert.java @@ -0,0 +1,11 @@ +package com.xzzn.common.annotation; + +import java.lang.annotation.*; + +/** + * 标记:调用insert后需要同步数据到其他服务器 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SyncAfterInsert { +} \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/config/RuoYiConfig.java b/ems-common/src/main/java/com/xzzn/common/config/RuoYiConfig.java index 39db47a..d56e411 100644 --- a/ems-common/src/main/java/com/xzzn/common/config/RuoYiConfig.java +++ b/ems-common/src/main/java/com/xzzn/common/config/RuoYiConfig.java @@ -119,4 +119,12 @@ public class RuoYiConfig { return getProfile() + "/upload"; } + + /** + * 获取头像上传路径 + */ + public static String getDevicePath() + { + return getProfile() + "/device"; + } } diff --git a/ems-common/src/main/java/com/xzzn/common/constant/Constants.java b/ems-common/src/main/java/com/xzzn/common/constant/Constants.java index c594319..9757912 100644 --- a/ems-common/src/main/java/com/xzzn/common/constant/Constants.java +++ b/ems-common/src/main/java/com/xzzn/common/constant/Constants.java @@ -170,4 +170,9 @@ public class Constants */ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework", "org.apache", "com.xzzn.common.utils.file", "com.xzzn.common.config", "com.xzzn.generator" }; + + /** + * 昨日充放电最晚数据有效期 + */ + public static final Integer DATE_VALID_TIME = 1; } diff --git a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java new file mode 100644 index 0000000..82c0a75 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java @@ -0,0 +1,125 @@ +package com.xzzn.common.constant; + +/** + * 数据存储 Redis key 常量 + * + * @author xzzn + */ +public class RedisKeyConstants +{ + /** + * pcs数据 redis key + */ + public static final String PCS = "PCS_"; + + /** + * pcs branch数据 redis key + */ + public static final String BRANCH = "BRANCH_"; + + /** + * stack电池堆数据 redis key + */ + public static final String STACK = "STACK_"; + + /** + * cluster电池簇数据 redis key + */ + public static final String CLUSTER = "CLUSTER_"; + + /** + * battery单体电池数据 redis key + */ + public static final String BATTERY = "BATTERY_"; + + /** + * 电表数据 redis key + */ + public static final String AMMETER = "AMMETER_"; + + /** + * 动环数据 redis key + */ + public static final String DH = "DH_"; + + /** + * 消防数据 redis key + */ + public static final String XF = "XF_"; + + /** + * 电池组 redis key + */ + public static final String GROUP = "GROUP_"; + + /** + * BMSD原始数据 redis key + */ + public static final String ORIGINAL_BMSD = "BMSD_"; + + /** + * 冷却数据 redis key + */ + public static final String COOLING = "COOLING_"; + + /** + * EMS数据 redis key + */ + public static final String EMS = "EMS_"; + + /** + * 点位匹配数据 redis key + */ + public static final String POINT_MATCH = "POINT_MATCH_"; + + /** + * 点位枚举匹配数据 redis key + */ + public static final String POINT_ENUM_MATCH = "POINT_ENUM_MATCH_"; + + /** + * topic对应站点ID redis key + */ + public static final String SITE_ID = "SITE_ID_"; + + /** + * 存放单个设备同步过来的原始数据-最晚一次数据 + */ + public static final String ORIGINAL_MQTT_DATA = "MQTT_"; + + /** + * 存放单个设备同步过来的告警点位原始数据-最晚一次数据 + */ + public static final String ORIGINAL_MQTT_DATA_ALARM = "MQTT_ALARM_"; + + /** 存放订阅失败告警信息 */ + public static final String TOPIC_FAILED_ALRAM_RECORD = "topic_failed_"; + /** topic 内没有数据设备维度告警 */ + public static final String TOPIC_EMPTY_ALARM_RECORD = "topic_empty_"; + /** modbus读取 没有数据设备维度告警 */ + public static final String MODBUS_EMPTY_ALARM_RECORD = "modbus_empty_"; + /** modbus读取 设备离线告警 */ + public static final String MODBUS_OFFLINE_ALARM_RECORD = "modbus_offline_"; + + /** 设备信息初始化 */ + public static final String INIT_DEVICE_INFO = "init_device_info"; + /** 告警匹配信息 */ + public static final String ALARM_MATCH_INFO = "alarm_message_info"; + + /** 现有的告警数据 */ + public static final String LATEST_ALARM_RECORD = "LATEST_ALARM_RECORD"; + + /** 预存电价时间配置 */ + public static final String ENERGY_PRICE_TIME = "energy_price_time_"; + + /** dds昨日累计总收益 */ + public static final String DDS_TOTAL_REVENUE = "total_revenue_"; + /** fx实时总收益和当日实时收益 */ + public static final String FXX_REALTIME_REVENUE = "realtime_revenue_"; + + /** 每个设备最新数据-设置失效时间-判断是否正常同步数据 */ + public static final String SYNC_DATA= "SYNC_DATA_"; + + /** 每个设备最新数据-设置失效时间-判断是否正常同步数据 */ + public static final String SYNC_DATA_ALARM = "SYNC_DATA_ALARM_"; +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/controller/BaseController.java b/ems-common/src/main/java/com/xzzn/common/core/controller/BaseController.java index c3f46a6..6d1fb1b 100644 --- a/ems-common/src/main/java/com/xzzn/common/core/controller/BaseController.java +++ b/ems-common/src/main/java/com/xzzn/common/core/controller/BaseController.java @@ -1,6 +1,8 @@ package com.xzzn.common.core.controller; import java.beans.PropertyEditorSupport; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; import org.slf4j.Logger; @@ -199,4 +201,76 @@ public class BaseController { return getLoginUser().getUsername(); } + + /** + * 手动处理分页 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable2(List list) + { + // 1. 处理原列表为null的情况,避免空指针 + List targetList = (list == null) ? Collections.emptyList() : list; + List subList; + + // 2. 获取分页参数 + PageDomain pageDomain = TableSupport.buildPageRequest(); + int pageNum = pageDomain.getPageNum(); + int pageSize = pageDomain.getPageSize(); + + // 3. 判断分页参数是否有效(pageNum和pageSize均为正数时才分页) + if (pageNum > 0 && pageSize > 0) { + // 计算起始索引(确保不小于0) + int startIndex = Math.max((pageNum - 1) * pageSize, 0); + + // 关键修复:若起始索引已超出列表大小,直接返回空列表 + if (startIndex >= targetList.size()) { + subList = Collections.emptyList(); + } else { + // 计算结束索引(不超过列表大小,且不小于起始索引) + int endIndex = Math.min(startIndex + pageSize, targetList.size()); + endIndex = Math.max(endIndex, startIndex); // 防止endIndex < startIndex + + // 截取子列表(转换为新ArrayList,避免视图依赖) + subList = new ArrayList<>(targetList.subList(startIndex, endIndex)); + } + } else { + // 分页参数无效时,返回全部数据 + subList = new ArrayList<>(targetList); + } + + // 4. 封装返回结果 + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(subList); + rspData.setTotal(targetList.size()); + return rspData; + } + + /** + * 通用分页工具方法 + */ + protected List paginateList(List sourceList) { + if (sourceList == null || sourceList.isEmpty()) { + return new ArrayList<>(); + } + // 分页梳理 + PageDomain pageDomain = TableSupport.buildPageRequest(); + int pageNum = pageDomain.getPageNum(); + int pageSize = pageDomain.getPageSize(); + int startIndex = 0; + int endIndex = sourceList.size(); + if (pageNum > 0 && pageSize > 0) { + // 计算起始索引(处理页码小于1的情况) + startIndex = Math.max((pageNum - 1) * pageSize, 0); + // 计算结束索引(处理超出列表长度的情况) + endIndex = Math.min(startIndex + pageSize, sourceList.size()); + } + // 防止越界 + if (startIndex >= sourceList.size()) { + return Collections.emptyList(); + } + // 截取分页数据 + return sourceList.subList(startIndex, endIndex); + } } diff --git a/ems-common/src/main/java/com/xzzn/common/core/domain/entity/SysUser.java b/ems-common/src/main/java/com/xzzn/common/core/domain/entity/SysUser.java index ad21f2a..02e87a6 100644 --- a/ems-common/src/main/java/com/xzzn/common/core/domain/entity/SysUser.java +++ b/ems-common/src/main/java/com/xzzn/common/core/domain/entity/SysUser.java @@ -92,6 +92,8 @@ public class SysUser extends BaseEntity /** 角色ID */ private Long roleId; + private String belongSite; + public SysUser() { @@ -310,6 +312,14 @@ public class SysUser extends BaseEntity this.roleId = roleId; } + public String getBelongSite() { + return belongSite; + } + + public void setBelongSite(String belongSite) { + this.belongSite = belongSite; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -332,7 +342,7 @@ public class SysUser extends BaseEntity .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) - .append("dept", getDept()) + .append("belongSite", getBelongSite()) .toString(); } } diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/Modbus4jConnectionManager.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/Modbus4jConnectionManager.java new file mode 100644 index 0000000..ec5f7a4 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/Modbus4jConnectionManager.java @@ -0,0 +1,111 @@ +package com.xzzn.common.core.modbus; + +import com.serotonin.modbus4j.ModbusFactory; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.ip.IpParameters; +import com.xzzn.common.core.modbus.domain.DeviceConfig; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Modbus连接管理器 + * 使用长连接模式,维护连接缓存,复用已有连接 + */ +@Component +public class Modbus4jConnectionManager { + private static final Logger logger = LoggerFactory.getLogger(Modbus4jConnectionManager.class); + + private final ModbusFactory modbusFactory = new ModbusFactory(); + + private final Map connectionCache = new ConcurrentHashMap<>(); + + /** + * 获取或创建连接(长连接模式) + */ + public ModbusMaster borrowMaster(DeviceConfig config) throws Exception { + String key = buildConnectionKey(config); + ModbusMaster master = connectionCache.get(key); + + if (master == null) { + synchronized (this) { + master = connectionCache.get(key); + if (master == null) { + master = createNewConnection(config); + connectionCache.put(key, master); + logger.info("创建新Modbus长连接: {}:{}", config.getHost(), config.getPort()); + } + } + } + + + return master; + } + + /** + * 归还连接(长连接模式,不关闭) + */ + public void returnMaster(DeviceConfig config, ModbusMaster master) { + } + + /** + * 废弃连接(发生异常时关闭并移除) + */ + public void invalidateMaster(DeviceConfig config, ModbusMaster master) { + String key = buildConnectionKey(config); + connectionCache.remove(key); + destroyMaster(master, config); + logger.warn("废弃并移除Modbus连接: {}:{}", config.getHost(), config.getPort()); + } + + private ModbusMaster createNewConnection(DeviceConfig config) throws Exception { + IpParameters params = new IpParameters(); + params.setHost(config.getHost()); + params.setPort(config.getPort()); + params.setEncapsulated(false); + + ModbusMaster master = modbusFactory.createTcpMaster(params, true); + master.init(); + + return master; + } + + private void destroyMaster(ModbusMaster master, DeviceConfig config) { + if (master != null) { + try { + master.destroy(); + logger.debug("已关闭Modbus连接: {}:{}", config.getHost(), config.getPort()); + } catch (Exception e) { + logger.warn("关闭Modbus连接异常: {}:{}", config.getHost(), config.getPort(), e); + } + } + } + + private String buildConnectionKey(DeviceConfig config) { + return config.getHost() + ":" + config.getPort(); + } + + /** + * 关闭所有连接 + */ + public void closeAllConnections() { + for (Map.Entry entry : connectionCache.entrySet()) { + try { + if (entry.getValue() != null) { + entry.getValue().destroy(); + } + } catch (Exception e) { + logger.warn("关闭Modbus连接异常: {}", entry.getKey(), e); + } + } + connectionCache.clear(); + logger.info("已关闭所有Modbus连接"); + } + +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/ModbusProcessor.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/ModbusProcessor.java new file mode 100644 index 0000000..1ea73d9 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/ModbusProcessor.java @@ -0,0 +1,486 @@ +package com.xzzn.common.core.modbus; + +import com.alibaba.fastjson2.JSON; +import com.serotonin.modbus4j.BatchRead; +import com.serotonin.modbus4j.BatchResults; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.code.DataType; +import com.serotonin.modbus4j.exception.ErrorResponseException; +import com.serotonin.modbus4j.exception.ModbusTransportException; +import com.serotonin.modbus4j.locator.BaseLocator; +import com.serotonin.modbus4j.msg.WriteCoilRequest; +import com.serotonin.modbus4j.msg.WriteCoilResponse; +import com.serotonin.modbus4j.msg.WriteCoilsRequest; +import com.serotonin.modbus4j.msg.WriteCoilsResponse; +import com.serotonin.modbus4j.msg.WriteRegisterRequest; +import com.serotonin.modbus4j.msg.WriteRegisterResponse; +import com.serotonin.modbus4j.msg.WriteRegistersRequest; +import com.serotonin.modbus4j.msg.WriteRegistersResponse; +import com.xzzn.common.core.modbus.domain.DeviceConfig; +import com.xzzn.common.core.modbus.domain.TagConfig; +import com.xzzn.common.core.modbus.domain.WriteTagConfig; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.ModBusType; +import com.xzzn.common.enums.RegisterType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import static com.xzzn.common.enums.RegisterType.COIL; +import static com.xzzn.common.enums.RegisterType.DISCRETE_INPUT; + +@Service +public class ModbusProcessor { + + private static final Logger logger = LoggerFactory.getLogger(ModbusProcessor.class); + @Value("${modbus.read-timeout:8000}") + private int readTimeout; + @Value("${modbus.write-timeout:5000}") + private int writeTimeout; + @Value("${modbus.read-retries:1}") + private int readRetries; + @Value("${modbus.write-retries:1}") + private int writeRetries; + + @Autowired + private RedisCache redisCache; + @Autowired + private Modbus4jConnectionManager connectionManager; + + public boolean writeDataToDevice(DeviceConfig config) { + logger.info("writeDataToDevice: {}", JSON.toJSONString(config)); + ModbusMaster master = null; + boolean result = false; + boolean hasError = false; + try { + master = connectionManager.borrowMaster(config); + master.setTimeout(writeTimeout); + master.setRetries(0); + result = writeTagValue(master, config, config.getWriteTags()); + } catch (Exception e) { + logger.error("Failed to borrow connection or write to devices '{}'", config.getDeviceName(), e); + hasError = true; + } + finally { + if (master != null) { + if (hasError) { + // 发生异常时废弃连接,下次重新创建 + connectionManager.invalidateMaster(config, master); + } else { + // 正常时归还连接 + connectionManager.returnMaster(config, master); + } + } + } + return result; + } + + public boolean writeDataToDeviceWithRetry(DeviceConfig config) { + logger.info("writeDataToDevice: {}", JSON.toJSONString(config)); + ModbusMaster master = null; + boolean result; + + try { + master = connectionManager.borrowMaster(config); + master.setTimeout(writeTimeout); // 设置超时时间 + master.setRetries(0); + + // 使用重试装饰器 + ModbusMaster finalMaster = master; + result = RetryableModbusOperation.executeWithRetry(() -> { + return writeTagValue(finalMaster, config, config.getWriteTags()); + }, writeRetries); // 最大重试次数由配置控制 + + } catch (Exception e) { + logger.error("Failed to borrow connection or write to devices '{}'", config.getDeviceName(), e); + result = false; + } finally { + if (master != null) { + connectionManager.returnMaster(config, master); + } + } + return result; + } + + public boolean writeTagValue(ModbusMaster master, DeviceConfig config, List tags) { + tags.forEach(tag -> { + Map type = ModBusType.REGISTER_TYPE; + int firstDigit = Integer.parseInt(tag.getAddress().substring(0, 1)); + int address = convertAddress(tag.getAddress()); + RegisterType registerType = type.get(firstDigit); + logger.info("Register type: {}, address: {}, firstDigit: {}", registerType, tag.getAddress(), firstDigit); + switch (registerType) { + case COIL: { + boolean result = writeCoilRequest(master, config.getSlaveId(), address, Boolean.parseBoolean(String.valueOf(tag.getValue()))); + tag.setWrite(result); + break; + } + case HOLDING_REGISTER: { + Number value = Double.parseDouble(String.valueOf(tag.getValue())); + double doubleValue = value.doubleValue(); + // 检查是否在16位有符号整数范围内 + if (doubleValue < -32768 || doubleValue > 32767) { + logger.warn("Value {} out of range for 16-bit signed register at address {}", doubleValue, address); + } + boolean result = writeRegisterRequest(master, config.getSlaveId(), address, (int) doubleValue); + tag.setWrite(result); + break; + } + default: + logger.error("Unsupported register type: {}", registerType); + break; + } + }); + + List collect = tags.stream().filter(tag -> !Objects.equals(tag.isWrite(), true)).collect(Collectors.toList()); + if (!collect.isEmpty()) { + return false; + } + return true; + } + + public static boolean writeCoilRequest(ModbusMaster master, int slaveId, int address, boolean value) { + try { + WriteCoilRequest request = new WriteCoilRequest(slaveId, address, value); + WriteCoilResponse response = (WriteCoilResponse)master.send(request); + if (response.isException()) { + logger.info("Write coil failed: " + response.getExceptionMessage()); + } else { + logger.info("Write coil successful"); + return true; + } + } catch (Exception e) { + logger.error("Failed to write coil value '{}' to address '{}'", value, address, e); + } + return false; + } + + public static void writeCoilsRequest(ModbusMaster master, int slaveId, int address, boolean[] values) { + try { + WriteCoilsRequest request = new WriteCoilsRequest(slaveId, address, values); + WriteCoilsResponse response = (WriteCoilsResponse)master.send(request); + if (response.isException()) { + logger.info("Write coils failed: " + response.getExceptionMessage()); + } else { + logger.info("Write coils successful"); + } + } catch (Exception e) { + logger.error("Failed to write coils value '{}' to address '{}'", values, address, e); + } + } + + public static boolean writeRegisterRequest(ModbusMaster master, int slaveId, int address, int value) { + try { + WriteRegisterRequest request = new WriteRegisterRequest(slaveId, address, value); + WriteRegisterResponse response = (WriteRegisterResponse)master.send(request); + if (response.isException()) { + logger.info("Write register failed: " + response.getExceptionMessage()); + } else { + logger.info("Write register successful"); + return true; + } + } catch (Exception e) { + logger.error("Failed to write register value '{}' to address '{}'", value, address, e); + } + return false; + } + + public static void writeRegistersRequest(ModbusMaster master, int slaveId, int address, short[] values) { + try { + WriteRegistersRequest request = new WriteRegistersRequest(slaveId, address, values); + WriteRegistersResponse response = (WriteRegistersResponse)master.send(request); + if (response.isException()) { + logger.info("Write registers failed: " + response.getExceptionMessage()); + } else { + logger.info("Write registers successful"); + } + } catch (Exception e) { + logger.error("Failed to write registers value '{}' to address '{}'", values, address, e); + } + } + + public static void setCoilValue(ModbusMaster master, int slaveId, int address, int value) { + // 写入单个线圈(从站ID, 地址, 布尔值) + BaseLocator coilLocator = BaseLocator.coilStatus(slaveId, address); + try { + // 写入布尔值到线圈 + master.setValue(coilLocator, value); + logger.info("set coil successful"); + } catch (ModbusTransportException | ErrorResponseException e) { + logger.error("Failed to set coil value '{}' to address '{}'", value, address, e); + } + } + + public static void setRegisterValue(ModbusMaster master, int slaveId, int address, int value) { + // 写入单个保持寄存器(从站, 地址, 16位整数) + BaseLocator holdingLocator = BaseLocator.holdingRegister(slaveId, address, DataType.TWO_BYTE_INT_SIGNED); + try { + // 写入整数值到保持寄存器 + master.setValue(holdingLocator, value); + logger.info("set register successful"); + } catch (ModbusTransportException | ErrorResponseException e) { + logger.error("Failed to set register value '{}' to address '{}'", value, address, e); + } + } + + public ModbusMaster borrowMaster(DeviceConfig config) throws Exception { + ModbusMaster master = connectionManager.borrowMaster(config); + // 设置了Modbus通信的超时时间为5000毫秒(5秒)。当主设备与从设备通信时,若在5秒内未收到响应,则认为通信超时并抛出异常。这有助于避免长时间等待无响应的设备。 + master.setTimeout(readTimeout); + master.setRetries(readRetries); + return master; + } + + public Map readDataFromDevice(DeviceConfig config, ModbusMaster master) { + Map deviceData = new HashMap<>(); + boolean hasError = false; + try { + BatchResults results = readTagValues(master, config.getSlaveId(), config.getTags()); + for (TagConfig tag : config.getTags()) { + if (Objects.equals(tag.getDataType(), "FOUR_BYTE_FLOAT_DBCA")){ + Object value = results.getValue(tag.getKey()); + value = convertValueToFloat(value); + deviceData.put(tag.getKey(), value); + }else { + deviceData.put(tag.getKey(), results.getValue(tag.getKey())); + } + } + } catch (Exception e) { + logger.error("Failed read from devices '{}'", config.getDeviceName(), e); + hasError = true; + } + finally { + if (master != null) { + if (hasError) { + // 发生异常时废弃连接,下次重新创建 + connectionManager.invalidateMaster(config, master); + } else { + // 正常时归还连接 + connectionManager.returnMaster(config, master); + } + } + } + return deviceData; + } + + private Object readTagValue(ModbusMaster master, int slaveId, TagConfig tag) throws Exception { + Object value; + Map type = ModBusType.REGISTER_TYPE; + Map DATA_LENGTH = ModBusType.LENGTH; + int firstDigit = Integer.parseInt(tag.getAddress().substring(0, 1)); + int address = 0; + int addressLength = tag.getAddress().length(); + int exp = (int) Math.pow(10, addressLength-1); + if (firstDigit != 0){ + int digit = Integer.parseInt(tag.getAddress()); + address = digit % (exp); + }else { + address = Integer.parseInt(tag.getAddress()); + } + RegisterType registerType = type.get(firstDigit); + int dataLength = DATA_LENGTH.get(tag.getDataType()); + // 增加配置校验和警告 + if ((Objects.equals(registerType, COIL) || Objects.equals(registerType, DISCRETE_INPUT))) { + logger.warn("Configuration warning for tag '{}': ModBusType is {} but DataType is {}. DataType should be BOOLEAN. Proceeding with BOOLEAN read.", + tag.getKey(), registerType, tag.getDataType()); + } + try { + switch (registerType) { + case COIL: { + + BaseLocator loc = BaseLocator.coilStatus(slaveId, address); + value = master.getValue(loc); + logger.info("读取线圈{}成功: {}",tag.getAddress(), value); + break; + } + case DISCRETE_INPUT: { + BaseLocator loc = BaseLocator.inputStatus(slaveId, address); + value = master.getValue(loc); + logger.info("读取输入{}成功: {}",tag.getAddress(), value); + break; + } + case HOLDING_REGISTER: { + if (dataLength == 28){ + BaseLocator locator = BaseLocator.holdingRegister(slaveId, address, 4); + value = master.getValue(locator); + //将 value 转换为二进制数据 + value = convertValueToFloat(value); + }else{ + BaseLocator locator = BaseLocator.holdingRegister(slaveId, address, dataLength); + value = master.getValue(locator); + } + logger.info("读取保持寄存器{}成功: {}",tag.getAddress(), value); + break; + } + case INPUT_REGISTER: { + BaseLocator locator = BaseLocator.inputRegister(slaveId, address, dataLength); + value= master.getValue(locator); + logger.info("读取输入寄存器{}成功: {}",tag.getAddress(), value); + + + break; + } + default: + logger.error("Unsupported register type: {}", registerType); + value = null; + break; + } + }catch (Exception e){ + logger.error("Failed to read tag '{}'", tag.getKey(), e); + value = null; + } + return value; + } + + + private BatchResults readTagValues(ModbusMaster master, int slaveId, List tags) throws Exception { + try { + BatchResults results = sendBatchRead(master, slaveId, tags); + logBatchResults(tags, results); + return results; + } catch (Exception e){ + if (isTimeoutException(e)) { + logger.warn("批量读取超时,尝试降级为单点读取,slaveId: {}", slaveId); + BatchResults fallback = new BatchResults<>(); + for (TagConfig tag : tags) { + Object value = readTagValue(master, slaveId, tag); + fallback.addResult(tag.getKey(), value); + } + logBatchResults(tags, fallback); + return fallback; + } + logger.error("Failed to read master '{}'", slaveId, e); + throw new Exception(e); + } + } + + private BatchResults sendBatchRead(ModbusMaster master, int slaveId, List tags) throws Exception { + BatchRead batch = new BatchRead<>(); + tags.forEach(tag -> { + Map type = ModBusType.REGISTER_TYPE; + Map DATA_LENGTH = ModBusType.LENGTH; + int firstDigit = Integer.parseInt(tag.getAddress().substring(0, 1)); + int address = 0; + int addressLength = tag.getAddress().length(); + int exp = (int) Math.pow(10, addressLength - 1); + if (firstDigit != 0) { + int digit = Integer.parseInt(tag.getAddress()); + address = digit % (exp); + } else { + address = Integer.parseInt(tag.getAddress()); + } + RegisterType registerType = type.get(firstDigit); + int dataLength = DATA_LENGTH.get(tag.getDataType()); + switch (registerType) { + case COIL: { + BaseLocator loc = BaseLocator.coilStatus(slaveId, address); + batch.addLocator(tag.getKey(), loc); + break; + } + case DISCRETE_INPUT: { + BaseLocator loc = BaseLocator.inputStatus(slaveId, address); + batch.addLocator(tag.getKey(), loc); + break; + } + case HOLDING_REGISTER: { + if (dataLength == 28) { + BaseLocator locator = BaseLocator.holdingRegister(slaveId, address, 4); + batch.addLocator(tag.getKey(), locator); + } else { + BaseLocator loc = BaseLocator.holdingRegister(slaveId, address, dataLength); + batch.addLocator(tag.getKey(), loc); + } + break; + } + case INPUT_REGISTER: { + BaseLocator loc = BaseLocator.inputRegister(slaveId, address, dataLength); + batch.addLocator(tag.getKey(), loc); + break; + } + } + }); + + return master.send(batch); + } + + private void logBatchResults(List tags, BatchResults results) { + List logInfoList = new ArrayList<>(); + for (TagConfig tag : tags) { + StringBuilder logInfo = new StringBuilder(); + logInfo.append(tag.getAddress()); + if (tag.getBit() != null) { + logInfo.append("(").append(tag.getBit()).append("):"); + } else { + logInfo.append(":"); + } + logInfo.append(results.getValue(tag.getKey())); + logInfoList.add(logInfo.toString()); + } + logger.info("批处理读取寄存器成功: {}", JSON.toJSONString(logInfoList)); + } + + private boolean isTimeoutException(Throwable e) { + Throwable current = e; + while (current != null) { + if (current instanceof com.serotonin.modbus4j.sero.messaging.TimeoutException) { + return true; + } + current = current.getCause(); + } + return false; + } + + public static float convertValueToFloat(Object value) { + if (!(value instanceof Number)) { + throw new IllegalArgumentException("Input must be a Number"); + } + + int intValue = ((Number) value).intValue(); + String binaryData = Integer.toBinaryString(intValue); + + // 补足32位二进制字符串 + if (binaryData.length() < 32) { + binaryData = String.format("%32s", binaryData).replace(' ', '0'); + } + + // 分割为4个字节并重组为 dcba 格式 + byte[] reorderedBytes = new byte[4]; + for (int i = 0; i < 4; i++) { + int start = i * 8; + String byteStr = binaryData.substring(start, start + 8); + reorderedBytes[3 - i] = (byte) Integer.parseInt(byteStr, 2); + } + + // 使用 ByteBuffer 提高可读性和安全性 + return Float.intBitsToFloat( + java.nio.ByteBuffer.wrap(reorderedBytes).getInt() + ); + } + + /** 转换寄存器地址 */ + public static int convertAddress(String address) { + if (StringUtils.isBlank(address)) { + return 0; + } + int firstDigit = Integer.parseInt(address.substring(0, 1)); + int addressLength = address.length(); + int exp = (int) Math.pow(10, addressLength-1); + if (firstDigit != 0){ + int digit = Integer.parseInt(address); + return digit % (exp); + } else { + return Integer.parseInt(address); + } + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/PooledModbusMasterFactory.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/PooledModbusMasterFactory.java new file mode 100644 index 0000000..9e77cd2 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/PooledModbusMasterFactory.java @@ -0,0 +1,58 @@ +package com.xzzn.common.core.modbus; + + +import com.serotonin.modbus4j.ModbusFactory; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.ip.IpParameters; + +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; + +public class PooledModbusMasterFactory extends BasePooledObjectFactory { + + private final String host; + private final int port; + + public PooledModbusMasterFactory(String host, int port) { + this.host = host; + this.port = port; + } + + @Override + public ModbusMaster create() throws Exception { + IpParameters params = new IpParameters(); + params.setHost(this.host); + params.setPort(this.port); + params.setEncapsulated(false); + + ModbusMaster master = new ModbusFactory().createTcpMaster(params, true); + master.init(); + return master; + } + + @Override + public PooledObject wrap(ModbusMaster master) { + return new DefaultPooledObject<>(master); + } + + @Override + public void destroyObject(PooledObject p) throws Exception { + if (p.getObject() != null) { + p.getObject().destroy(); + } + super.destroyObject(p); + } + + @Override + public boolean validateObject(PooledObject p) { + // testConnectivity() 方法在 modbus4j 中不存在。 + // 一个真正的验证需要执行一次读操作,但这需要 slaveId,而工厂是通用的,不知道 slaveId。 + // 因此,我们使用一个较弱的验证,只检查 master 对象是否已初始化。 + // 这无法检测到被远程设备断开的连接,错误将在实际读取操作中被捕获。 + if (p.getObject() == null) { + return false; + } + return p.getObject().isInitialized(); + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/RetryableModbusOperation.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/RetryableModbusOperation.java new file mode 100644 index 0000000..b2732ee --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/RetryableModbusOperation.java @@ -0,0 +1,37 @@ +package com.xzzn.common.core.modbus; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Modbus重试 + * + */ +public class RetryableModbusOperation { + private static final Logger logger = LoggerFactory.getLogger(RetryableModbusOperation.class); + + public interface ModbusOperation { + T execute() throws Exception; + } + + public static T executeWithRetry(ModbusOperation operation, int maxRetries) { + int retryCount = 0; + Exception lastException = null; + + while (retryCount <= maxRetries) { + try { + return operation.execute(); + } catch (Exception e) { + lastException = e; + retryCount++; + if (retryCount <= maxRetries) { + logger.info("Operation failed, retrying... (Attempt {})", retryCount); + } + } + } + + logger.error("Max retries ({}) reached. Last error: {}", maxRetries, + lastException != null ? lastException.getMessage() : "Unknown"); + throw new RuntimeException("Operation failed after " + maxRetries + " retries", lastException); + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java new file mode 100644 index 0000000..8033721 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java @@ -0,0 +1,106 @@ +package com.xzzn.common.core.modbus.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "modbus") +public class ModbusProperties { + + private PoolConfig pool = new PoolConfig(); + private TimeoutConfig timeout = new TimeoutConfig(); + + public PoolConfig getPool() { + return pool; + } + + public void setPool(PoolConfig pool) { + this.pool = pool; + } + + public TimeoutConfig getTimeout() { + return timeout; + } + + public void setTimeout(TimeoutConfig timeout) { + this.timeout = timeout; + } + + public static class PoolConfig { + private int maxTotal = 20; + private int maxIdle = 10; + private int minIdle = 3; + private long maxWait = 5000; + private long timeBetweenEvictionRuns = 30000; + private long minEvictableIdleTime = 60000; + + public int getMaxTotal() { + return maxTotal; + } + + public void setMaxTotal(int maxTotal) { + this.maxTotal = maxTotal; + } + + public int getMaxIdle() { + return maxIdle; + } + + public void setMaxIdle(int maxIdle) { + this.maxIdle = maxIdle; + } + + public int getMinIdle() { + return minIdle; + } + + public void setMinIdle(int minIdle) { + this.minIdle = minIdle; + } + + public long getMaxWait() { + return maxWait; + } + + public void setMaxWait(long maxWait) { + this.maxWait = maxWait; + } + + public long getTimeBetweenEvictionRuns() { + return timeBetweenEvictionRuns; + } + + public void setTimeBetweenEvictionRuns(long timeBetweenEvictionRuns) { + this.timeBetweenEvictionRuns = timeBetweenEvictionRuns; + } + + public long getMinEvictableIdleTime() { + return minEvictableIdleTime; + } + + public void setMinEvictableIdleTime(long minEvictableIdleTime) { + this.minEvictableIdleTime = minEvictableIdleTime; + } + } + + public static class TimeoutConfig { + private int read = 10000; + private int write = 5000; + + public int getRead() { + return read; + } + + public void setRead(int read) { + this.read = read; + } + + public int getWrite() { + return write; + } + + public void setWrite(int write) { + this.write = write; + } + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/DeviceConfig.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/DeviceConfig.java new file mode 100644 index 0000000..cbcc2ce --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/DeviceConfig.java @@ -0,0 +1,91 @@ +package com.xzzn.common.core.modbus.domain; + + +import java.util.List; + + +public class DeviceConfig { + + + private String deviceNumber; + private String deviceName; + private String host; + private int port; + private long time; + private int slaveId; + private boolean enabled; + private List tags; + private List writeTags; + + public String getDeviceNumber() { + return deviceNumber; + } + + public void setDeviceNumber(String deviceNumber) { + this.deviceNumber = deviceNumber; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public int getSlaveId() { + return slaveId; + } + + public void setSlaveId(int slaveId) { + this.slaveId = slaveId; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public List getWriteTags() { + return writeTags; + } + + public void setWriteTags(List writeTags) { + this.writeTags = writeTags; + } +} \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/TagConfig.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/TagConfig.java new file mode 100644 index 0000000..7e5c3d2 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/TagConfig.java @@ -0,0 +1,78 @@ +package com.xzzn.common.core.modbus.domain; + + + +public class TagConfig { + private String key; + private String des; + private String address; + private String dataType; + private float a; + private float k; + private float b; + private Integer bit; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getDes() { + return des; + } + + public void setDes(String des) { + this.des = des; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public float getA() { + return a; + } + + public void setA(float a) { + this.a = a; + } + + public float getK() { + return k; + } + + public void setK(float k) { + this.k = k; + } + + public float getB() { + return b; + } + + public void setB(float b) { + this.b = b; + } + + public Integer getBit() { + return bit; + } + + public void setBit(Integer bit) { + this.bit = bit; + } +} \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/WriteTagConfig.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/WriteTagConfig.java new file mode 100644 index 0000000..2a60fc4 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/domain/WriteTagConfig.java @@ -0,0 +1,31 @@ +package com.xzzn.common.core.modbus.domain; + +public class WriteTagConfig { + private Object value; + private String address; + private boolean isWrite; + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public boolean isWrite() { + return isWrite; + } + + public void setWrite(boolean write) { + isWrite = write; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/core/redis/RedisCache.java b/ems-common/src/main/java/com/xzzn/common/core/redis/RedisCache.java index 3a55f42..b234b47 100644 --- a/ems-common/src/main/java/com/xzzn/common/core/redis/RedisCache.java +++ b/ems-common/src/main/java/com/xzzn/common/core/redis/RedisCache.java @@ -7,10 +7,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.BoundSetOperations; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; /** @@ -243,6 +241,18 @@ public class RedisCache return redisTemplate.opsForHash().multiGet(key, hKeys); } + /** + * 删除Hash中的多条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteAllCacheMapValue(final String key, final Object[] hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + /** * 删除Hash中的某条数据 * @@ -255,6 +265,18 @@ public class RedisCache return redisTemplate.opsForHash().delete(key, hKey) > 0; } + + /** + * 批量往Hash中存入数据 + * + * @param key Redis键 + * @param value 值 + */ + public void setAllCacheMapValue(final String key, final Map value) + { + redisTemplate.opsForHash().putAll(key, value); + } + /** * 获得缓存的基本对象列表 * @@ -265,4 +287,89 @@ public class RedisCache { return redisTemplate.keys(pattern); } + + /** + * 删除list + * + * @param key Redis键 + * @return 对象列表 + */ + public boolean deleteList(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 批量缓存 + * @param cacheMap + */ + public void multiSet(final Map cacheMap) + { + + redisTemplate.opsForValue().multiSet(cacheMap); + } + + /** + * 批量设置键值对,并为每个键设置相同的过期时间 + * @param keyValueMap 键值对集合 + * @param timeout 过期时间 + * @param unit 时间单位 + */ + public void multiSetWithExpire(Map keyValueMap, long timeout, TimeUnit unit) { + if (keyValueMap.isEmpty()) { + return; // 空集合直接返回 + } + + // 使用Redis管道批量执行命令 + redisTemplate.executePipelined(new SessionCallback() { + @Override + public Object execute(RedisOperations operations) throws DataAccessException { + // 循环处理每个键值对 + for (Map.Entry entry : keyValueMap.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + + // 1. 设置键值对 + operations.opsForValue().set(key, value); + // 2. 设置过期时间 + operations.expire(key, timeout, unit); + } + return null; // 管道操作无需返回值 + } + }); + } + + /** + * 删除指定站点的所有历史测试数据缓存(最精准) + * @param testSiteId 测试数据所属的站点ID(如"test-site-001") + */ + public void deleteTestCacheBySite(String testSiteId) { + System.out.println("开删除缓存redis:" + testSiteId + ""); + if (testSiteId == null || testSiteId.isEmpty()) { + return; + } + + // 构造键前缀:测试站点ID开头的所有缓存键(无论粒度和时间) + String pattern = testSiteId + "_*"; + deleteCacheByPattern(pattern); + } + + /** + * 根据键前缀批量删除缓存(核心方法) + * @param pattern 键匹配模式(支持Redis的通配符:*表示任意字符,?表示单个字符) + */ + public void deleteCacheByPattern(String pattern) { + try { + // 1. 查找所有匹配的键(注意:keys命令在大数据量时可能阻塞Redis,建议生产环境用scan) + Set keys = redisTemplate.keys(pattern); + if (keys == null || keys.isEmpty()) { + return; + } + + // 2. 批量删除匹配的键 + long deleteCount = redisTemplate.delete(keys); + System.out.println("删除缓存数据:" + deleteCount + ""); + } catch (Exception e) { + } + } } diff --git a/ems-common/src/main/java/com/xzzn/common/enums/AlarmLevelStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/AlarmLevelStatus.java new file mode 100644 index 0000000..c71d631 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/AlarmLevelStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * alarm-告警等级 + * + * @author xzzn + */ +public enum AlarmLevelStatus +{ + WARNING("A", "提示"), GENERAL("B", "一般"), SERIOUS("C", "严重"), EMERGENCY("D", "紧急"); + + private final String code; + private final String info; + + AlarmLevelStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/AlarmStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/AlarmStatus.java new file mode 100644 index 0000000..62cc7cb --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/AlarmStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * alarm-告警状态 + * + * @author xzzn + */ +public enum AlarmStatus +{ + WAITING("0", "待处理"), DONE("1", "已处理"),PROCESSING("2", "处理中"); + + private final String code; + private final String info; + + AlarmStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/AmmeterCategory.java b/ems-common/src/main/java/com/xzzn/common/enums/AmmeterCategory.java new file mode 100644 index 0000000..47c8bd6 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/AmmeterCategory.java @@ -0,0 +1,36 @@ +package com.xzzn.common.enums; + +/** + * ammeter-电表数据类别 + * + * @author xzzn + */ +public enum AmmeterCategory +{ + CURRENT_FORWARD_ACTIVE("1", "当前正向有功电能"), + CURRENT_FORWARD_REACTIVE("2", "当前正向无功电能"), + CURRENT_REVERSE_ACTIVE("3", "当前反向有功电能"), + CURRENT_REVERSE_REACTIVE("4", "当前反向无功电能"), + A_POWER("3", "A相功率"), + B_POWER("4", "B相功率"), + C_POWER("5", "C相功率"); + + private final String code; + private final String info; + + AmmeterCategory(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/BranchStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/BranchStatus.java new file mode 100644 index 0000000..cda7b2f --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/BranchStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * pcs-branch-支路状态 + * + * @author xzzn + */ +public enum BranchStatus +{ + STANDBY("0", "备用"), NORMAL("1", "正常"), SWITCHING("2", "切换中"); + + private final String code; + private final String info; + + BranchStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/ChargeStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/ChargeStatus.java new file mode 100644 index 0000000..96b67c4 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/ChargeStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * 充电状态&放电状态 + * + * @author xzzn + */ +public enum ChargeStatus +{ + CHARGING("1", "充电"), STANDBY("2", "待机"), DISCHARGING("3", "放电"); + + private final String code; + private final String info; + + ChargeStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/CommunicationStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/CommunicationStatus.java new file mode 100644 index 0000000..07ddf60 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/CommunicationStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * device-通信状态 + * + * @author xzzn + */ +public enum CommunicationStatus +{ + OK("0", "正常"), SUSPEND("1", "通信中断") ,EXCEPTION("2", "异常"); + + private final String code; + private final String info; + + CommunicationStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/ControlModeStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/ControlModeStatus.java new file mode 100644 index 0000000..3e17f14 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/ControlModeStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * pcs-控制模式 + * + * @author xzzn + */ +public enum ControlModeStatus +{ + REMOTE("0", "远程"), LOCAL("1", "本地"); + + private final String code; + private final String info; + + ControlModeStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/CostType.java b/ems-common/src/main/java/com/xzzn/common/enums/CostType.java new file mode 100644 index 0000000..19632bb --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/CostType.java @@ -0,0 +1,42 @@ +package com.xzzn.common.enums; + +/** + * 电量类型 + */ +public enum CostType +{ + PEAK("peak", "尖"), + HIGH("high", "峰"), + FLAT("flat", "平"), + VALLEY("valley", "谷"), + ; + + private final String code; + private final String info; + + CostType(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public static CostType getEnumByCode(String code) + { + for (CostType costType : CostType.values()) { + if (costType.code.equals(code)) { + return costType; + } + } + return null; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/DeviceCategory.java b/ems-common/src/main/java/com/xzzn/common/enums/DeviceCategory.java new file mode 100644 index 0000000..faf6363 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/DeviceCategory.java @@ -0,0 +1,86 @@ +package com.xzzn.common.enums; + +import org.apache.xmlbeans.impl.common.NameUtil; + +import java.util.HashMap; +import java.util.Map; + +/** + * device-设备类别 + * + * @author xzzn + */ +public enum DeviceCategory +{ + PCS("PCS", "PCS设备", null), + BRANCH("BRANCH", "PCS分支设备", PCS), + STACK("STACK", "电池堆", null), + CLUSTER("CLUSTER", "电池簇", STACK), + BATTERY("BATTERY", "单体电池", CLUSTER), + AMMETER("AMMETER", "电表", null), + COOLING("COOLING", "冷却", null), + DH("DH", "动环", null), + XF("XF", "消防", null), + BATTERY_GROUP("BATTERY_GROUP", "电池组", null), + EMS("EMS", "EMS设备", null),; + + private final String code; + private final String info; + private final DeviceCategory parentCategory; + + DeviceCategory(String code, String info, DeviceCategory parentCategory) + { + this.code = code; + this.info = info; + this.parentCategory = parentCategory; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public DeviceCategory getParentCategory() + { + return parentCategory; + } + // 缓存info与code的映射(优化查询效率) + private static final Map INFO_CODE_MAP = new HashMap<>(); + + // 静态块初始化缓存 + static { + for (DeviceCategory category : DeviceCategory.values()) { + INFO_CODE_MAP.put(category.info, category.code); + } + } + + // 通过info获取code的方法 + public static String getCodeByInfo(String info) { + return INFO_CODE_MAP.get(info); // 从缓存中直接获取,效率高 + } + + // 通过code获取父类code + // 根据字符串编码查找对应的枚举 + public static DeviceCategory fromCode(String code) { + for (DeviceCategory category : values()) { + if (category.code.equalsIgnoreCase(code)) { // 忽略大小写,增强兼容性 + return category; + } + } + return null; + } + + public static String getInfoByCode(String code) { + for (DeviceCategory category : DeviceCategory.values()) { + if (category.code.equals(code)) { + return category.info; + } + } + return null; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/DeviceRunningStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/DeviceRunningStatus.java new file mode 100644 index 0000000..299bcf1 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/DeviceRunningStatus.java @@ -0,0 +1,32 @@ +package com.xzzn.common.enums; + +/** + * device-通信状态 + * + * @author xzzn + */ +public enum DeviceRunningStatus +{ + OFFLINE("0", "离线"), + ONLINE("1", "在线"); + + private final String code; + private final String info; + + DeviceRunningStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/DeviceType.java b/ems-common/src/main/java/com/xzzn/common/enums/DeviceType.java new file mode 100644 index 0000000..6270cdd --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/DeviceType.java @@ -0,0 +1,20 @@ +package com.xzzn.common.enums; + +/** + * device-设备类型 + * + * @author xzzn + */ + +public enum DeviceType +{ + /** + * 网络设备 + */ + TCP, + + /** + * 串口设备 + */ + RTU +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/GridStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/GridStatus.java new file mode 100644 index 0000000..e64ec8a --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/GridStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * pcs-并网状态 + * + * @author xzzn + */ +public enum GridStatus +{ + GRID("0", "并网"), NOTGRID("1", "未并网"); + + private final String code; + private final String info; + + GridStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/ModBusType.java b/ems-common/src/main/java/com/xzzn/common/enums/ModBusType.java new file mode 100644 index 0000000..39bb3d8 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/ModBusType.java @@ -0,0 +1,55 @@ +package com.xzzn.common.enums; + +import com.serotonin.modbus4j.code.DataType; + +import java.util.HashMap; +import java.util.Map; + + +public class ModBusType { + + + public static final Map REGISTER_TYPE = new HashMap(); + public static final Map LENGTH = new HashMap(); + + + + static { + REGISTER_TYPE.put(0, RegisterType.COIL); + REGISTER_TYPE.put(1, RegisterType.DISCRETE_INPUT); + REGISTER_TYPE.put(4, RegisterType.HOLDING_REGISTER); + REGISTER_TYPE.put(3, RegisterType.INPUT_REGISTER); + + + LENGTH.put("BINARY",DataType.BINARY); + LENGTH.put("TWO_BYTE_INT_UNSIGNED",DataType.TWO_BYTE_INT_UNSIGNED); + LENGTH.put("TWO_BYTE_INT_SIGNED",DataType.TWO_BYTE_INT_SIGNED); + LENGTH.put("TWO_BYTE_INT_UNSIGNED_SWAPPED",DataType.TWO_BYTE_INT_UNSIGNED_SWAPPED); + LENGTH.put("TWO_BYTE_INT_SIGNED_SWAPPED",DataType.TWO_BYTE_INT_SIGNED_SWAPPED); + LENGTH.put("FOUR_BYTE_INT_UNSIGNED",DataType.FOUR_BYTE_INT_UNSIGNED); + LENGTH.put("FOUR_BYTE_INT_SIGNED",DataType.FOUR_BYTE_INT_SIGNED); + LENGTH.put("FOUR_BYTE_INT_UNSIGNED_SWAPPED",DataType.FOUR_BYTE_INT_UNSIGNED_SWAPPED); + LENGTH.put("FOUR_BYTE_INT_SIGNED_SWAPPED",DataType.FOUR_BYTE_INT_SIGNED_SWAPPED); + LENGTH.put("FOUR_BYTE_INT_UNSIGNED_SWAPPED_SWAPPED",DataType.FOUR_BYTE_INT_UNSIGNED_SWAPPED_SWAPPED); + LENGTH.put("FOUR_BYTE_INT_SIGNED_SWAPPED_SWAPPED",DataType.FOUR_BYTE_INT_SIGNED_SWAPPED_SWAPPED); + LENGTH.put("FOUR_BYTE_FLOAT",DataType.FOUR_BYTE_FLOAT); + LENGTH.put("FOUR_BYTE_FLOAT_SWAPPED",DataType.FOUR_BYTE_FLOAT_SWAPPED); + LENGTH.put("FOUR_BYTE_FLOAT_SWAPPED_INVERTED",DataType.FOUR_BYTE_FLOAT_SWAPPED_INVERTED); + LENGTH.put("EIGHT_BYTE_INT_UNSIGNED",DataType.EIGHT_BYTE_INT_UNSIGNED); + LENGTH.put("EIGHT_BYTE_INT_SIGNED",DataType.EIGHT_BYTE_INT_SIGNED); + LENGTH.put("EIGHT_BYTE_INT_UNSIGNED_SWAPPED",DataType.EIGHT_BYTE_INT_UNSIGNED_SWAPPED); + LENGTH.put("EIGHT_BYTE_INT_SIGNED_SWAPPED",DataType.EIGHT_BYTE_INT_SIGNED_SWAPPED); + LENGTH.put("EIGHT_BYTE_FLOAT",DataType.EIGHT_BYTE_FLOAT); + LENGTH.put("EIGHT_BYTE_FLOAT_SWAPPED",DataType.EIGHT_BYTE_FLOAT_SWAPPED); + LENGTH.put("TWO_BYTE_BCD",DataType.TWO_BYTE_BCD); + LENGTH.put("FOUR_BYTE_BCD",DataType.FOUR_BYTE_BCD); + LENGTH.put("FOUR_BYTE_BCD_SWAPPED",DataType.FOUR_BYTE_BCD_SWAPPED); + LENGTH.put("CHAR",DataType.CHAR); + LENGTH.put("VARCHAR",DataType.VARCHAR); + + LENGTH.put("FOUR_BYTE_FLOAT_DBCA",28); + + + + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/PointType.java b/ems-common/src/main/java/com/xzzn/common/enums/PointType.java new file mode 100644 index 0000000..fe6da19 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/PointType.java @@ -0,0 +1,45 @@ +package com.xzzn.common.enums; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 设备点位类型 + */ +public enum PointType +{ + YES(1, "是"), + NO(0, "否"); + + private final Integer code; + private final String info; + + private static final Map CODE_NAME_MAP = new HashMap<>(PointType.values().length); + + static { + Arrays.stream(PointType.values()).forEach(record -> { + CODE_NAME_MAP.put(record.code, record.info); + }); + } + + PointType(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public String getInfoByCode(Integer code) { + return CODE_NAME_MAP.get(code); + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/ProtPlanStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/ProtPlanStatus.java new file mode 100644 index 0000000..588cb5e --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/ProtPlanStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * 告警保护方案状态 + * + * @author xzzn + */ +public enum ProtPlanStatus +{ + STOP(0L, "未启用"), RUNNING(1L, "已启用"); + + private final Long code; + private final String info; + + ProtPlanStatus(Long code, String info) + { + this.code = code; + this.info = info; + } + + public Long getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/RegisterType.java b/ems-common/src/main/java/com/xzzn/common/enums/RegisterType.java new file mode 100644 index 0000000..1c9e3a8 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/RegisterType.java @@ -0,0 +1,8 @@ +package com.xzzn.common.enums; + +public enum RegisterType { + COIL, + DISCRETE_INPUT, + HOLDING_REGISTER, + INPUT_REGISTER +} \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SdcLimitType.java b/ems-common/src/main/java/com/xzzn/common/enums/SdcLimitType.java new file mode 100644 index 0000000..d7a60f6 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SdcLimitType.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * strategy模板-sdc限制 + * + * @author xzzn + */ +public enum SdcLimitType +{ + OFF("0", "关"), ON("1", "开"); + + private final String code; + private final String info; + + SdcLimitType(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java b/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java new file mode 100644 index 0000000..958f06a --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java @@ -0,0 +1,67 @@ +package com.xzzn.common.enums; + +/** + * + */ +public enum SiteDevice +{ + /** + * 电池堆 + */ + BMSD, + + /** + * 电池簇 + */ + BMSC, + + /** + * PCS设备 + */ + PCS, + + /** + * 电表-总表 + */ + LOAD, + + /** + * 电表-光伏电表 + */ + METEGF, + + /** + * 电表-储能电表 + */ + METE, + + /** + * 电表-储能电表 + */ + METE0, + + /** + * 动环 + */ + donghuan, + + /** + * 动环 + */ + DH, + + /** + * 消防 + */ + XF, + + /** + * 中水冷却 + */ + ZSLQ, + + /** + * EMS + */ + EMS +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SiteEnum.java b/ems-common/src/main/java/com/xzzn/common/enums/SiteEnum.java new file mode 100644 index 0000000..78b0b90 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SiteEnum.java @@ -0,0 +1,31 @@ +package com.xzzn.common.enums; + +/** + * device-设备类型 + * + * @author xzzn + */ + +public enum SiteEnum +{ + DDS("021_DDS_01", "电动所内部"), FX("021_FXX_01", "奉贤西部污水处理厂"); + + private final String code; + private final String info; + + SiteEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SocLimit.java b/ems-common/src/main/java/com/xzzn/common/enums/SocLimit.java new file mode 100644 index 0000000..a1846e0 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SocLimit.java @@ -0,0 +1,32 @@ +package com.xzzn.common.enums; + +/** + * SOC限制 (%) 1 = 开,0 = 关 + * + * @author xzzn + */ +public enum SocLimit +{ + OFF(0, "关"), + ON(1, "开"), + ; + + private final Integer code; + private final String info; + + SocLimit(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/StrategyStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/StrategyStatus.java new file mode 100644 index 0000000..ed3b256 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/StrategyStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * strategy-策略状态 + * + * @author xzzn + */ +public enum StrategyStatus +{ + NOT_ENABLED("0", "未启用"), RUNNING("1", "已运行"),SUSPENDED("2", "已暂停"), DISABLE("3", "禁用"),DELETE("4", "删除"); + + private final String code; + private final String info; + + StrategyStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SwitchStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/SwitchStatus.java new file mode 100644 index 0000000..1b07779 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SwitchStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * pcs-开关状态 + * + * @author xzzn + */ +public enum SwitchStatus +{ + CLOSED("0", "闭合"), DISCONNECT("1", "断开"), FAULT_DISCONNECT("2", "故障断开"); + + private final String code; + private final String info; + + SwitchStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/TicketStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/TicketStatus.java new file mode 100644 index 0000000..caad78d --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/TicketStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * ticket - 工单状态 + * + * @author xzzn + */ +public enum TicketStatus +{ + WAITING("1", "待处理"), PROCESSING("2", "处理中"),DONE("3", "已处理"); + + private final String code; + private final String info; + + TicketStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java b/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java new file mode 100644 index 0000000..deedc64 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java @@ -0,0 +1,39 @@ +package com.xzzn.common.enums; + +/** + * MQTT主题处理类型未知类型 + */ +public enum TopicHandleType { + DEVICE("DEVICE", "设备数据"), + DEVICE_ALARM("DEVICE_ALARM", "设备告警数据"), + STRATEGY("STRATEGY", "策略数据"), + SYSTEM("SYSTEM", "系统数据"), + ; + + private final String code; + private final String info; + + TopicHandleType(String code, String info) { + this.code = code; + this.info = info; + } + + public String getName() { + return code; + } + + public String getInfo() { + return info; + } + + // 根据名称查找枚举 + public static TopicHandleType getEnumByCode(String code) { + for (TopicHandleType type : values()) { + if (type.getName().equals(code)) { + return type; + } + } + // 默认返回SYSTEM + return SYSTEM; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/WorkStatus.java b/ems-common/src/main/java/com/xzzn/common/enums/WorkStatus.java new file mode 100644 index 0000000..155d915 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/WorkStatus.java @@ -0,0 +1,30 @@ +package com.xzzn.common.enums; + +/** + * pcs-工作状态 + * + * @author xzzn + */ +public enum WorkStatus +{ + NORMAL("0", "运行"), STOP("1", "停机"), ABNORMAL("2", "故障"); + + private final String code; + private final String info; + + WorkStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/YesOrNo.java b/ems-common/src/main/java/com/xzzn/common/enums/YesOrNo.java new file mode 100644 index 0000000..adda8ac --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/YesOrNo.java @@ -0,0 +1,33 @@ +package com.xzzn.common.enums; + +public enum YesOrNo +{ + YES(1, "是", "Y"), + NO(0, "否", "N"); + + private final Integer code; + private final String info; + private final String value; + + YesOrNo(Integer code, String info, String value) + { + this.code = code; + this.info = info; + this.value = value; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public String getValue() + { + return value; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/utils/DataUtils.java b/ems-common/src/main/java/com/xzzn/common/utils/DataUtils.java new file mode 100644 index 0000000..73fad56 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/utils/DataUtils.java @@ -0,0 +1,39 @@ +package com.xzzn.common.utils; + + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DataUtils { + private static final Logger log = LoggerFactory.getLogger(DataUtils.class); + + public static String getJSONFromFile(InputStream inputStream) { + BufferedReader bufferReader = null; + StringBuffer stringBuffer = new StringBuffer(); + try { + InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); + bufferReader = new BufferedReader(inputStreamReader); + stringBuffer = new StringBuffer(); + String lineData = null; + while ((lineData = bufferReader.readLine()) != null) { + stringBuffer.append(lineData); + } + } catch (Exception e) { + log.warn("getJSONFromFile error", e); + } finally { + if (null != bufferReader) { + try { + bufferReader.close(); + inputStream.close(); + } catch (Exception e) { + log.warn("getJSONFromFile error", e); + } + } + } + return stringBuffer.toString(); + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/utils/DateUtils.java b/ems-common/src/main/java/com/xzzn/common/utils/DateUtils.java index 7e04abb..bfcd82d 100644 --- a/ems-common/src/main/java/com/xzzn/common/utils/DateUtils.java +++ b/ems-common/src/main/java/com/xzzn/common/utils/DateUtils.java @@ -8,8 +8,14 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Calendar; import java.util.Date; +import java.util.TimeZone; + import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.logging.LogFactory; /** * 时间工具类 @@ -18,6 +24,8 @@ import org.apache.commons.lang3.time.DateFormatUtils; */ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + private static final org.apache.commons.logging.Log log = LogFactory.getLog(DateUtils.class); + public static String YYYY = "yyyy"; public static String YYYY_MM = "yyyy-MM"; @@ -28,6 +36,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public static String YYYYMMDD = "yyyyMMdd"; + + public static String YYYY_MM_DD_HH_MM_00 = "yyyy-MM-dd HH:mm:00"; + + private static final DateTimeFormatter DAY_INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter MIN_HOUR_INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", @@ -144,6 +159,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); } + /** + * 计算相差分钟 + */ + public static int differentMinutesByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 60))); + } + /** * 计算时间差 * @@ -188,4 +211,258 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + + public static Long getNowMonthLong() { + Calendar calendar = Calendar.getInstance(); + long month = (long) calendar.get(Calendar.MONTH) + 1; // 月份从0开始,所以要加1 + return month; + } + public static Long getNowDayLong() { + Calendar calendar = Calendar.getInstance(); + long date = calendar.get(Calendar.DAY_OF_MONTH); // 月份从0开始,所以要加1 + return date; + } + + // LocalDateTime 转 Date(带时区) + public static Date convertToDate(LocalDateTime localDateTime) { + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zonedDateTime.toInstant()); + } + + /** + * 获取昨天的日期,格式为yyyy-MM-dd 23:59:59 + * @return 昨天的日期字符串 + */ + public static String getYesterdayDate() { + // 获取今天的日期 + LocalDate today = LocalDate.now(); + // 减去一天得到昨天 + LocalDate yesterday = today.minusDays(1); + // 将日期转换为LocalDateTime,并设置时间为23:59:59 + LocalDateTime yesterdayEndTime = yesterday.atTime(23, 59, 59); + // 定义日期格式化器 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); + // 格式化并返回 + return yesterdayEndTime.format(formatter); + } + + /** + * 校验传入日期是否今天 + * @param dataDate + * @return + */ + public static boolean checkIsToday(String dataDate) { + boolean flag = false; + Calendar calendar = Calendar.getInstance(); + int todayMonth = calendar.get(Calendar.MONTH) + 1; + int todayDay = calendar.get(Calendar.DAY_OF_MONTH); + if (StringUtils.isNotEmpty(dataDate)){ + String[] pcsDateArray = dataDate.split("-"); + if (todayMonth == Integer.parseInt(pcsDateArray[1]) && + todayDay == Integer.parseInt(pcsDateArray[2])) { + flag = true; + } + } + return flag; + } + + /** + * 将时间转换为月份(YYYY-MM) + */ + public static String formatMonth(LocalDateTime time) { + return time.format(DateTimeFormatter.ofPattern("yyyy-MM")); + } + + /** + * 增加 LocalDateTime ==> String + */ + public static String convertToString(LocalDateTime time) { + return time.format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS)); + } + + /** + * 将输入时间调整到下一分钟的整点(秒数强制为00) + * 例如:2026-09-03 18:34:49 -> 2026-09-03 18:35:00 + * @param timeStr 输入时间字符串(支持yyyy-MM-dd HH:mm:ss格式) + * @return 调整后的时间字符串(yyyy-MM-dd HH:mm:00) + * @throws ParseException 时间格式错误时抛出 + */ + public static String adjustToNextMinute(String timeStr) throws ParseException { + // 1. 解析原始时间(使用包含秒数的格式) + SimpleDateFormat fullFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); + Date originalDate = fullFormat.parse(timeStr); + + // 2. 使用Calendar调整时间 + Calendar cal = Calendar.getInstance(); + cal.setTime(originalDate); + + // 3. 如果当前秒数大于0,自动进1分钟(否则保持当前分钟) + if (cal.get(Calendar.SECOND) > 0) { + cal.add(Calendar.MINUTE, 1); // 分钟+1 + } + + // 4. 强制设置秒数和毫秒为0 + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + // 5. 格式化为目标字符串 + return new SimpleDateFormat(YYYY_MM_DD_HH_MM_00).format(cal.getTime()); + } + + /** + * 将"yyyy-MM-dd"字符串转换为Date类型的"yyyy-MM-dd 23:59:59" + */ + public static Date adjustToEndOfDay(String dateStr) { + // 1. 解析字符串为LocalDate(仅日期) + LocalDate localDate = LocalDate.parse(dateStr, DAY_INPUT_FORMATTER); + + // 2. 补充时间为23:59:59,转换为LocalDateTime + LocalDateTime localDateTime = localDate.atTime(23, 59, 59); + + // 3. 转换为Date类型(兼容旧API) + return Date.from( + localDateTime.atZone(TimeZone.getDefault().toZoneId()) // 适配系统时区 + .toInstant() + ); + } + + /** + * 将 "yyyy-MM-dd HH:mm:ss" 字符串转换为Date类型的"yyyy-MM-dd HH:00:00" + */ + public static Date adjustToStartOfHour(String inputTime) { + // 1. 解析输入字符串为LocalDateTime(包含日期和小时、分钟) + LocalDateTime inputLdt = LocalDateTime.parse(inputTime, MIN_HOUR_INPUT_FORMATTER); + + // 2. 调整分钟为00,秒为00(保留日期和小时不变) + LocalDateTime adjustedLdt = inputLdt + .withMinute(00) // 强制设为00分 + .withSecond(00); // 强制设为00秒 + + // 3. 转换为Date类型(适配旧API) + return Date.from( + adjustedLdt.atZone(TimeZone.getDefault().toZoneId()) // 适配系统时区 + .toInstant() + ); + } + + /** + * 将 "yyyy-MM-dd HH:mm:ss" 字符串转换为Date类型的"yyyy-MM-dd HH:mm:00" + */ + public static Date adjustToStartOfMinutes(String inputTime) { + // 1. 解析输入字符串为LocalDateTime(包含日期和小时、分钟) + LocalDateTime inputLdt = LocalDateTime.parse(inputTime, MIN_HOUR_INPUT_FORMATTER); + + // 2. 调整分钟为00,秒为00(保留日期和小时不变) + LocalDateTime adjustedLdt = inputLdt + .withSecond(00); // 强制设为00秒 + + // 3. 转换为Date类型(适配旧API) + return Date.from( + adjustedLdt.atZone(TimeZone.getDefault().toZoneId()) // 适配系统时区 + .toInstant() + ); + } + + /** + * 将时间转换为月份(YYYY-MM-DD HH:mm:00) + */ + public static Date timeConvertToDate(LocalDateTime time) { + String dateStr = convertToString(time); + return dateTime(YYYY_MM_DD_HH_MM_SS,dateStr); + } + + /** + * 增加 Date ==> LocalDateTime + */ + public static LocalDateTime toLocalDateTime(Date date) + { + if (date == null) { + return null; + } + + // 1. Date → LocalDateTime(保留原始时间) + LocalDateTime dateTime = date.toInstant() + .atZone(TimeZone.getDefault().toZoneId()) // 关联时区 + .toLocalDateTime(); + return dateTime; + } + + // 时间戳转时间 + public static Date convertUpdateTime(Long updateTime) { + if (updateTime == null) { + return null; + } + + // 兼容10位(秒级)和13位(毫秒级) + int length = String.valueOf(updateTime).length(); + if (length == 10) { // 10位秒级 -> 转换为毫秒级 + updateTime *= 1000; + } else if (length != 13) { // 既不是10位也不是13位,视为非法 + System.err.println("时间戳格式错误,必须是10位(秒)或13位(毫秒)"); + return null; + } + + // 3. 转换为Date + return new Date(updateTime); + } + + /** + * 获取昨天的日期,格式为yyyy-MM-dd + * @return 昨天的日期字符串 + */ + public static String getYesterdayDayString() { + // 获取今天的日期 + LocalDate today = LocalDate.now(); + // 减去一天得到昨天 + LocalDate yesterday = today.minusDays(1); + // 定义日期格式化器 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD); + // 格式化并返回 + return yesterday.format(formatter); + } + + /** + * 获取日期的开始时间 + * @param dateString 格式为yyyy-MM-dd的日期字符串 + * @return 日期的开始时间字符串 + */ + public static String getDayBeginString(String dateString) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + // 解析日期字符串 + LocalDate date = LocalDate.parse(dateString, formatter); + + // 创建时间段的开始时间 00:00:00 + LocalDateTime startTime = date.atTime(LocalTime.MIN); + + return convertToString(startTime); + } catch (DateTimeParseException e) { + log.info("Error parsing date: " + e.getMessage()); + } + + return dateString + " 00:00:00"; + } + + /** + * 获取日期的结束时间 + * @param dateString 格式为yyyy-MM-dd的日期字符串 + * @return 日期的结束时间字符串 + */ + public static String getDayEndString(String dateString) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + // 解析日期字符串 + LocalDate date = LocalDate.parse(dateString, formatter); + + // 创建时间段的结束时间 23:59:59 + LocalDateTime endTime = date.atTime(LocalTime.MAX); + + return convertToString(endTime); + } catch (DateTimeParseException e) { + log.info("Error parsing date: " + e.getMessage()); + } + + return dateString + " 23:59:59"; + } + } diff --git a/ems-common/src/main/java/com/xzzn/common/utils/MapUtils.java b/ems-common/src/main/java/com/xzzn/common/utils/MapUtils.java new file mode 100644 index 0000000..cb1fc03 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/utils/MapUtils.java @@ -0,0 +1,44 @@ +package com.xzzn.common.utils; + +import java.util.Map; + +public class MapUtils { + /** + * 从Map中获取值并转为Integer(适配tinyint字段) + * @param map 数据源Map + * @param key 字段名 + * @return 转换后的Integer,默认返回0(可根据业务调整默认值) + */ + public static Integer getInteger(Map map, String key) { + // 1. 处理Map为null或key不存在的情况 + if (map == null || !map.containsKey(key)) { + return 0; + } + // 2. 获取原始值 + Object value = map.get(key); + if (value == null) { + return 0; + } + // 3. 转换为Integer(处理常见类型) + if (value instanceof Integer) { + return (Integer) value; + } else if (value instanceof Long) { + // 若Map中存的是Long(如JSON解析时数字默认转为Long) + return ((Long) value).intValue(); + } else if (value instanceof String) { + // 若值是字符串类型(如"1") + try { + return Integer.parseInt((String) value); + } catch (NumberFormatException e) { + // 字符串无法转数字,返回默认值 + return 0; + } + } else if (value instanceof Boolean) { + // 特殊情况:布尔值转整数(true→1,false→0) + return (Boolean) value ? 1 : 0; + } else { + // 其他不支持的类型,返回默认值 + return 0; + } + } +} \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java b/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java index bf29afe..eb30675 100644 --- a/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java +++ b/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java @@ -1,14 +1,17 @@ package com.xzzn.common.utils; +import com.xzzn.common.constant.Constants; +import com.xzzn.common.core.text.StrFormatter; + +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; + import org.springframework.util.AntPathMatcher; -import com.xzzn.common.constant.Constants; -import com.xzzn.common.core.text.StrFormatter; /** * 字符串工具类 @@ -719,4 +722,49 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } return sb.toString(); } + + + public static BigDecimal getBigDecimal(Object s){ + BigDecimal result; + try { + result = new BigDecimal(s.toString()); + } catch (Exception e) { + return BigDecimal.ZERO; + } + return result; + } + + public static Long getLong(Object s){ + Long result; + try { + result = Long.parseLong(s.toString()); + } catch (Exception e) { + return Long.parseLong("0"); + } + return result; + } + + public static String getString(Object s){ + if (s == null) return null; + String result; + try { + result = String.valueOf(s); + } catch (Exception e) { + return "0"; + } + return result; + } + + // 补全三位数字(返回字符串) + public static String fillThreeDigits(String value) { + if (value == null || value.trim().isEmpty()) { + return "000"; + } + try { + int num = Integer.parseInt(value.trim()); + return String.format("%03d", num); + } catch (NumberFormatException e) { + return value; + } + } } \ No newline at end of file diff --git a/ems-framework/pom.xml b/ems-framework/pom.xml index bc71b9a..19221ff 100644 --- a/ems-framework/pom.xml +++ b/ems-framework/pom.xml @@ -46,7 +46,20 @@ + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + + + org.springframework.retry + spring-retry + + + + io.github.resilience4j + resilience4j-annotations + com.github.oshi @@ -60,5 +73,4 @@ - \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/DeviceChangeLogAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/DeviceChangeLogAspect.java new file mode 100644 index 0000000..7b5c608 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/DeviceChangeLogAspect.java @@ -0,0 +1,97 @@ +package com.xzzn.framework.aspectj; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsDeviceChangeLog; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.UUID; + +/** + * 设备运行状态变更日志同步 + * 本地 - 云端 + */ +@Aspect +@Component +public class DeviceChangeLogAspect { + + private static final Log logger = LogFactory.getLog(DeviceChangeLogAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "DEVICE_CHANGE_LOG_UP"; + private static final String TABLE_NAME = "ems_device_change_log"; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + + // 定义切点:拦截策略相关表的Mapper方法 + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsDeviceChangeLogMapper.insertEmsDeviceChangeLog(..)) && args(insertEntity)) ") + public void insertPointCut(EmsDeviceChangeLog insertEntity) { + logger.info("【新增设备运行状态变更日志】DeviceChangeLogAspect 实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsDeviceChangeLog insertEntity, Integer result) { + logger.info("【新增设备运行状态变更日志下发数据切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String operateType = "INSERT"; + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,siteId); + + try { + // 数据转换 + String content = objectMapper.writeValueAsString(insertEntity); + message.setContent(content); + + // mqtt同步到云端 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject(siteId); + message.setTarget("CLOUD"); + return message; + } +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanAlarmAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanAlarmAspect.java new file mode 100644 index 0000000..f7096c7 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanAlarmAspect.java @@ -0,0 +1,104 @@ +package com.xzzn.framework.aspectj; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.UUID; + +/** + * 本地保护告警信息同步云端 + * 本地 - 云端 + * @author xzzn + */ +@Aspect +@Component +public class FaultPlanAlarmAspect +{ + + private static final Log logger = LogFactory.getLog(FaultPlanAlarmAspect.class); + + private static final ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private MqttPublisher mqttPublisher; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + + private static final String MQTT_TOPIC = "FAULT_ALARM_RECORD_UP"; + private static final String TABLE_NAME = "ems_alarm_records"; + // 切入点:拦截所有添加了@SyncAfterInsert注解的方法 + @Pointcut("@annotation(com.xzzn.common.annotation.SyncAfterInsert)") + public void syncInsertPointcut() {} + + // 方法执行成功后同步数据 + @AfterReturning(pointcut = "syncInsertPointcut()", returning = "result") + public void afterInsert(JoinPoint joinPoint, Integer result) { + logger.info("【新增保护策略告警数据切面进入成功】"); + if (result == 0) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 获取参数中的EmsAlarmRecords对象 + Object[] args = joinPoint.getArgs(); + EmsAlarmRecords alarmRecords = null; + for (Object arg : args) { + if (arg instanceof EmsAlarmRecords) { + alarmRecords = (EmsAlarmRecords) arg; + break; + } + } + if (alarmRecords == null) { + return; + } + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject("INSERT", alarmRecords.getSiteId()); + try { + // 同步内容 + String content = objectMapper.writeValueAsString(alarmRecords); + message.setContent(content); + + // 发布到MQTT主题-同步到云端 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject(siteId); + message.setTarget("CLOUD"); + return message; + } +} diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanIssueAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanIssueAspect.java new file mode 100644 index 0000000..c23842f --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultPlanIssueAspect.java @@ -0,0 +1,98 @@ +package com.xzzn.framework.aspectj; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsFaultIssueLog; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 保护告警方案下发日志同步 + * 本地 - 云端 + */ +@Aspect +@Component +public class FaultPlanIssueAspect { + + private static final Log logger = LogFactory.getLog(FaultPlanIssueAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "FAULT_PLAN_ISSUE_UP"; + private static final String TABLE_NAME = "ems_fault_issue_log"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + + // 定义切点:拦截策略相关表的Mapper方法 + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsFaultIssueLogMapper.insertEmsFaultIssueLog(..)) && args(insertEntity)) ") + public void insertPointCut(EmsFaultIssueLog insertEntity) { + logger.info("【新增保护告警策略下发数据】FaultPlanIssueAspect 实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsFaultIssueLog insertEntity, Integer result) { + logger.info("【新增保护告警策略下发数据切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String operateType = "INSERT"; + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,siteId); + + try { + // 数据转换 + String content = objectMapper.writeValueAsString(insertEntity); + message.setContent(content); + + // mqtt同步到云端 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject(siteId); + message.setTarget("CLOUD"); + return message; + } +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultProtPlanAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultProtPlanAspect.java new file mode 100644 index 0000000..45ead76 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/FaultProtPlanAspect.java @@ -0,0 +1,277 @@ +package com.xzzn.framework.aspectj; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 设备保护告警方案同步 + * 云端 - 本地 + */ +@Aspect +@Component +public class FaultProtPlanAspect { + private static final Log logger = LogFactory.getLog(FaultProtPlanAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "FAULT_PROTECTION_PLAN_UP"; + private static final String TABLE_NAME = "ems_fault_protection_plan"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private EmsFaultProtectionPlanMapper emsFaultProtectionPlanMapper; + + // 用ThreadLocal暂存删除前的对象 + private ThreadLocal beforeDeleteThreadLocal = new ThreadLocal<>(); + @Before("execution(* com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper.deleteEmsFaultProtectionPlanByIds(..)) && args(ids)") + public void beforeDelete(JoinPoint joinPoint, Long[] ids) { + // 获取删除的id + Object[] args = joinPoint.getArgs(); + if (args == null || args.length == 0) { + return; + } + Long[] id = (Long[]) args[0]; + + // 查询删除前的数据 + EmsFaultProtectionPlan faultInfo = emsFaultProtectionPlanMapper.selectEmsFaultProtectionPlanById(id[0]); + beforeDeleteThreadLocal.set(faultInfo); // 暂存 + } + + // 定义切点:拦截策略相关表的Mapper方法 + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper.insertEmsFaultProtectionPlan(..)) && args(insertEntity)) ") + public void insertPointCut(EmsFaultProtectionPlan insertEntity) { + logger.info("【新增设备保护告警】FaultProtPlanAspect 实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper.updateEmsFaultProtectionPlan(..)) && args(updateEntity)) ") + public void updatePointCut(EmsFaultProtectionPlan updateEntity) { + logger.info("【更新设备保护告警】FaultProtPlanAspect 实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper.deleteEmsFaultProtectionPlanByIds(..)) && args(ids)) ") + public void deletePointCut(Long[] ids) { + logger.info("【删除设备保护告警】FaultProtPlanAspect 实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsFaultProtectionPlan insertEntity, Integer result) { + logger.info("【新增设备保护告警切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,siteId); + + try { + // 数据转换 + String content = convertEntityToJson(insertEntity); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + @AfterReturning(pointcut = "updatePointCut(updateEntity)", returning = "result") + public void afterUpdate(JoinPoint joinPoint, EmsFaultProtectionPlan updateEntity, Integer result) { + logger.info("【更新设备保护告警切面进入成功】"); + if (result == 0 || updateEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = updateEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,siteId); + + try { + // 数据转换 + String content = convertEntityToJson(updateEntity); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + @AfterReturning(pointcut = "deletePointCut(id)", returning = "result") + public void afterDelete(JoinPoint joinPoint, Long[] id, Integer result) { + logger.info("【删除设备保护告警切面进入成功】"); + if (result == 0 || id == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + + // 从ThreadLocal中获取删除前的对象 + EmsFaultProtectionPlan faultInfo = beforeDeleteThreadLocal.get(); + if (faultInfo == null) { + return; + } + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,faultInfo.getSiteId()); + + try { + // 数据转换 + String content = convertEntityToJson(faultInfo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject("CLOUD"); + message.setTarget(siteId); + return message; + } + + // 从方法名判断操作类型(示例:insert→INSERT,update→UPDATE,delete→DELETE) + private String getOperateType(String methodName) { + if (methodName.startsWith("insert")) return "INSERT"; + if (methodName.startsWith("stop")) return "STOP"; + if (methodName.startsWith("update") || methodName.startsWith("stop")) return "UPDATE"; + if (methodName.startsWith("delete")) return "DELETE"; + return "UNKNOWN"; + } + + // 从方法参数提取数据(示例:若参数是实体类,转成Map) + private Map extractDataFromParams(Object[] args) { + // 实际需反射获取实体类的字段和值(如id、name等) + Map data = new HashMap<>(); + if (args == null || args.length == 0) { + return data; + } + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg == null) { + continue; // 跳过null参数 + } + + // 处理基本类型/包装类/字符串(直接作为值存入,key为"param0"、"param1"等) + if (isBasicType(arg.getClass())) { + String key = "param" + i; // 基本类型参数用"param0"、"param1"作为key + data.put(key, arg); + } else { + Map beanMap = beanToMap(arg); + data.putAll(beanMap); // 合并实体类的字段到结果Map + } + } + + return data; + } + + /** + * 判断是否为基本类型或包装类或字符串 + */ + private boolean isBasicType(Class clazz) { + return clazz.isPrimitive() // 基本类型(int、long、boolean等) + || clazz == String.class // 字符串 + || Number.class.isAssignableFrom(clazz) // 数字包装类(Integer、Long等) + || clazz == Boolean.class; // 布尔包装类 + } + + /** + * 将实体类转换为Map(字段名为key,字段值为value) + */ + private Map beanToMap(Object bean) { + Map map = new HashMap<>(); + if (bean == null) { + return map; + } + + // 方式1:使用BeanMap(简洁高效) + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key.toString(), beanMap.get(key)); + } + + return map; + } + + // 在方法中转换 + public String convertEntityToJson(EmsFaultProtectionPlan insertEntity) throws Exception { + if (insertEntity == null) { + return null; // 空对象返回空JSON + } + + // 将实体类转换为JSON字符串 + return objectMapper.writeValueAsString(insertEntity); + } + + +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/RateLimiterAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/RateLimiterAspect.java index 857add2..9ade61c 100644 --- a/ems-framework/src/main/java/com/xzzn/framework/aspectj/RateLimiterAspect.java +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/RateLimiterAspect.java @@ -25,7 +25,7 @@ import com.xzzn.common.utils.ip.IpUtils; * @author xzzn */ @Aspect -@Component +@Component("customRateLimiterAspect") public class RateLimiterAspect { private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyRunningSyncAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyRunningSyncAspect.java new file mode 100644 index 0000000..4beb204 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyRunningSyncAspect.java @@ -0,0 +1,272 @@ +package com.xzzn.framework.aspectj; + +import com.alibaba.fastjson2.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.domain.vo.StrategyRunningVo; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.EmsStrategyRunningMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.stereotype.Component; + +/** + * 策略运行切面同步 + * 云端 - 本地 + */ +@Aspect +@Component +public class StrategyRunningSyncAspect { + + private static final Logger logger = LoggerFactory.getLogger(StrategyRunningSyncAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "EMS_STRATEGY_UP"; + private static final String TABLE_NAME = "ems_strategy_running"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private EmsStrategyRunningMapper emsStrategyRunningMapper; + + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.stopEmsStrategyRunning(..)) && args(id)) ") + public void stopPointCut(Long id) { + logger.info("【停止策略切面】StrategyAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.insertEmsStrategyRunning(..)) && args(insertEntity)) ") + public void insertPointCut(EmsStrategyRunning insertEntity) { + logger.info("【新增策略切面】StrategyAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.updateEmsStrategyRunning(..)) && args(updateEntity)) ") + public void updatePointCut(EmsStrategyRunning updateEntity) { + logger.info("【更新策略切面】StrategyAspect 被实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "updatePointCut(updateEntity)", returning = "result") + public void afterUpdate(JoinPoint joinPoint, EmsStrategyRunning updateEntity, Integer result) { + logger.info("【更新策略切面进入成功】"); + if (result == 0 || updateEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = updateEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType,siteId); + + try { + // 数据转换 + List runningVos = emsStrategyRunningMapper.getRunningList(siteId); + if (runningVos == null || runningVos.size() == 0) { + return; + } + StrategyRunningVo runningVo = runningVos.get(0); + String content = objectMapper.writeValueAsString(runningVo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsStrategyRunning insertEntity, Integer result) { + logger.info("【新增策略切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 数据转换 + List runningVos = emsStrategyRunningMapper.getRunningList(siteId); + if (runningVos == null || runningVos.size() == 0) { + return; + } + StrategyRunningVo runningVo = runningVos.get(0); + String content = objectMapper.writeValueAsString(runningVo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + @AfterReturning(pointcut = "stopPointCut(id)", returning = "result") + public void afterStop(JoinPoint joinPoint, Long id, Integer result) { + logger.info("【停止策略切面进入成功】"); + if (result == 0 || id == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + EmsStrategyRunning emsStrategyRunning = emsStrategyRunningMapper.selectEmsStrategyRunningById(id); + String siteId = emsStrategyRunning==null ? null : emsStrategyRunning.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 数据转换 + Map idMap = new HashMap<>(); + idMap.put("id", id); // 手动将参数值映射到"id"字段 + String content = JSON.toJSONString(idMap); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject("CLOUD"); + message.setTarget(siteId); + return message; + } + // 从方法名判断操作类型(示例:insert→INSERT,update→UPDATE,delete→DELETE) + private String getOperateType(String methodName) { + if (methodName.startsWith("insert")) return "INSERT"; + if (methodName.startsWith("stop")) return "STOP"; + if (methodName.startsWith("update") || methodName.startsWith("stop")) return "UPDATE"; + if (methodName.startsWith("delete")) return "DELETE"; + return "UNKNOWN"; + } + + // 从方法参数提取数据(示例:若参数是实体类,转成Map) + private Map extractDataFromParams(Object[] args) { + // 实际需反射获取实体类的字段和值(如id、name等) + Map data = new HashMap<>(); + if (args == null || args.length == 0) { + return data; + } + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg == null) { + continue; // 跳过null参数 + } + + // 处理基本类型/包装类/字符串(直接作为值存入,key为"param0"、"param1"等) + if (isBasicType(arg.getClass())) { + String key = "param" + i; // 基本类型参数用"param0"、"param1"作为key + data.put(key, arg); + } else { + Map beanMap = beanToMap(arg); + data.putAll(beanMap); // 合并实体类的字段到结果Map + } + } + + return data; + } + + /** + * 判断是否为基本类型或包装类或字符串 + */ + private boolean isBasicType(Class clazz) { + return clazz.isPrimitive() // 基本类型(int、long、boolean等) + || clazz == String.class // 字符串 + || Number.class.isAssignableFrom(clazz) // 数字包装类(Integer、Long等) + || clazz == Boolean.class; // 布尔包装类 + } + + /** + * 将实体类转换为Map(字段名为key,字段值为value) + */ + private Map beanToMap(Object bean) { + Map map = new HashMap<>(); + if (bean == null) { + return map; + } + + // 方式1:使用BeanMap(简洁高效) + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key.toString(), beanMap.get(key)); + } + + return map; + } + + // 在方法中转换 + public String convertEntityToJson(EmsStrategyRunning insertEntity) throws Exception { + if (insertEntity == null) { + return null; // 空对象返回空JSON + } + + // 将实体类转换为JSON字符串 + return objectMapper.writeValueAsString(insertEntity); + } + + +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTempSyncAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTempSyncAspect.java new file mode 100644 index 0000000..88ab79d --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTempSyncAspect.java @@ -0,0 +1,261 @@ +package com.xzzn.framework.aspectj; + +import com.alibaba.fastjson2.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.common.utils.bean.BeanUtils; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.domain.vo.SyncStrategyTempVo; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.EmsStrategyMapper; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.stereotype.Component; + +/** + * 策略模板数据同步 + * 云端 - 本地 + */ +@Aspect +@Component +public class StrategyTempSyncAspect { + + private static final Logger logger = LoggerFactory.getLogger(StrategyTempSyncAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "EMS_STRATEGY_UP"; + private static final String TABLE_NAME = "ems_strategy_temp"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private EmsStrategyMapper emsStrategyMapper; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + + // 用ThreadLocal暂存删除前的对象 + private ThreadLocal beforeDeleteThreadLocal = new ThreadLocal<>(); + @Before("execution(* com.xzzn.ems.mapper.EmsStrategyTempMapper.deleteTempByTempId(..)) && args(templateId)") + public void beforeDelete(JoinPoint joinPoint, String templateId) { + // 查询删除前的数据-仅存一获取siteId + List tempList = emsStrategyTempMapper.selectStrategyTempByTempId(templateId); + if (tempList != null && tempList.size() > 0) { + beforeDeleteThreadLocal.set(tempList.get(0)); // 暂存 + } + } + + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyTempMapper.deleteTempByTempId(..)) && args(templateId)) ") + public void deletePointCut(String templateId) { + logger.info("【删除策略模版切面】StrategyTempSyncAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyTempMapper.insertEmsStrategyTemp(..)) && args(insertEntity)) ") + public void insertPointCut(EmsStrategyTemp insertEntity) { + logger.info("【新增策略模版切面】StrategyTempSyncAspect 被实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsStrategyTemp insertEntity, Integer result) { + logger.info("【新增策略切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 校验策略id是否存在 + Long strategyId = insertEntity.getStrategyId(); + if (strategyId == null) { + return; + } + // 数据转换 + SyncStrategyTempVo tempVo = convertEntity(insertEntity); + String content = JSON.toJSONString(tempVo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + private SyncStrategyTempVo convertEntity(EmsStrategyTemp insertEntity) { + SyncStrategyTempVo tempVo = new SyncStrategyTempVo(); + BeanUtils.copyProperties(insertEntity, tempVo); + EmsStrategy strategy = emsStrategyMapper.selectEmsStrategyById(insertEntity.getStrategyId()); + if (strategy != null) { + tempVo.setStrategyName(strategy.getStrategyName()); + tempVo.setStrategyType(strategy.getStrategyType()); + } + return tempVo; + } + + @AfterReturning(pointcut = "deletePointCut(templateId)", returning = "result") + public void afterDelete(JoinPoint joinPoint, String templateId, Integer result) { + logger.info("【删除策略模版切面进入成功】"); + if (result == 0 || StringUtils.isEmpty(templateId)) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + // 从ThreadLocal中获取删除前的对象 + EmsStrategyTemp strategyTemp = beforeDeleteThreadLocal.get(); + String siteId = ""; + if (strategyTemp != null) { + siteId = strategyTemp.getSiteId(); + } + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 数据转换 + Map idMap = new HashMap<>(); + idMap.put("templateId", templateId); // 手动将参数值映射到"id"字段 + String content = JSON.toJSONString(idMap); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject("CLOUD"); + message.setTarget(siteId); + return message; + } + // 从方法名判断操作类型(示例:insert→INSERT,update→UPDATE,delete→DELETE) + private String getOperateType(String methodName) { + if (methodName.startsWith("insert")) return "INSERT"; + if (methodName.startsWith("stop")) return "STOP"; + if (methodName.startsWith("update") || methodName.startsWith("stop")) return "UPDATE"; + if (methodName.startsWith("delete")) return "DELETE"; + return "UNKNOWN"; + } + + // 从方法参数提取数据(示例:若参数是实体类,转成Map) + private Map extractDataFromParams(Object[] args) { + // 实际需反射获取实体类的字段和值(如id、name等) + Map data = new HashMap<>(); + if (args == null || args.length == 0) { + return data; + } + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg == null) { + continue; // 跳过null参数 + } + + // 处理基本类型/包装类/字符串(直接作为值存入,key为"param0"、"param1"等) + if (isBasicType(arg.getClass())) { + String key = "param" + i; // 基本类型参数用"param0"、"param1"作为key + data.put(key, arg); + } else { + Map beanMap = beanToMap(arg); + data.putAll(beanMap); // 合并实体类的字段到结果Map + } + } + + return data; + } + + /** + * 判断是否为基本类型或包装类或字符串 + */ + private boolean isBasicType(Class clazz) { + return clazz.isPrimitive() // 基本类型(int、long、boolean等) + || clazz == String.class // 字符串 + || Number.class.isAssignableFrom(clazz) // 数字包装类(Integer、Long等) + || clazz == Boolean.class; // 布尔包装类 + } + + /** + * 将实体类转换为Map(字段名为key,字段值为value) + */ + private Map beanToMap(Object bean) { + Map map = new HashMap<>(); + if (bean == null) { + return map; + } + + // 方式1:使用BeanMap(简洁高效) + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key.toString(), beanMap.get(key)); + } + + return map; + } + + // 在方法中转换 + public String convertEntityToJson(EmsStrategyRunning insertEntity) throws Exception { + if (insertEntity == null) { + return null; // 空对象返回空JSON + } + + // 将实体类转换为JSON字符串 + return objectMapper.writeValueAsString(insertEntity); + } + + +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTimeConfigSyncAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTimeConfigSyncAspect.java new file mode 100644 index 0000000..988e8b3 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategyTimeConfigSyncAspect.java @@ -0,0 +1,241 @@ +package com.xzzn.framework.aspectj; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.common.utils.bean.BeanUtils; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.domain.MqttSyncLog; +import com.xzzn.ems.domain.vo.SyncStrategyTimeConfigVo; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.EmsStrategyMapper; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.stereotype.Component; + +/** + * 策略时间配置同步 + * 云端 - 本地 + */ +@Aspect +@Component +public class StrategyTimeConfigSyncAspect { + + private static final Logger logger = LoggerFactory.getLogger(StrategyTimeConfigSyncAspect.class); + @Autowired + private MqttPublisher mqttPublisher; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String MQTT_TOPIC = "EMS_STRATEGY_UP"; + private static final String TABLE_NAME = "ems_strategy_temp"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private EmsStrategyMapper emsStrategyMapper; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyTimeConfigMapper.insertEmsStrategyTimeConfig(..)) && args(insertEntity)) ") + public void insertPointCut(EmsStrategyTimeConfig insertEntity) { + logger.info("【新增策略模版时间配置切面】StrategyTimeConfigSyncAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyTimeConfigMapper.updateEmsStrategyTimeConfig(..)) && args(updateEntity)) ") + public void updatePointCut(EmsStrategyTimeConfig updateEntity) { + logger.info("【更新策略模版时间配置切面】StrategyTimeConfigSyncAspect 被实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsStrategyTimeConfig insertEntity, Integer result) { + logger.info("【新增策略模版时间切面进入成功】"); + if (result == 0 || insertEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = insertEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 校验策略id是否存在 + Long strategyId = insertEntity.getStrategyId(); + if (strategyId == null) { + return; + } + // 数据转换 + SyncStrategyTimeConfigVo timeConfigVo = convertEntity(insertEntity); + String content = objectMapper.writeValueAsString(timeConfigVo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + private SyncStrategyTimeConfigVo convertEntity(EmsStrategyTimeConfig insertEntity) { + SyncStrategyTimeConfigVo timeConfigVo = new SyncStrategyTimeConfigVo(); + BeanUtils.copyProperties(insertEntity, timeConfigVo); + EmsStrategy strategy = emsStrategyMapper.selectEmsStrategyById(insertEntity.getStrategyId()); + if (strategy != null) { + timeConfigVo.setStrategyName(strategy.getStrategyName()); + timeConfigVo.setStrategyType(strategy.getStrategyType()); + } + return timeConfigVo; + } + + @AfterReturning(pointcut = "updatePointCut(updateEntity)", returning = "result") + public void afterUpdate(JoinPoint joinPoint, EmsStrategyTimeConfig updateEntity, Integer result) { + logger.info("【删除策略模版切面进入成功】"); + if (result == 0 || updateEntity == null) { + return; + } + // 校验是否配置监听topic-监听则不发布 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(MQTT_TOPIC); + if (!StringUtils.isEmpty(topic)) { + return; + } + + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String siteId = updateEntity.getSiteId(); + + // 构建日志同步消息 + MqttSyncLog message = createMessageObject(operateType, siteId); + + try { + // 数据转换 + SyncStrategyTimeConfigVo timeConfigVo = convertEntity(updateEntity); + String content = objectMapper.writeValueAsString(timeConfigVo); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(MQTT_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncLogMapper.insertMqttSyncLog(message); + } + + // 构建同步信息 + private MqttSyncLog createMessageObject(String operateType, String siteId) { + MqttSyncLog message = new MqttSyncLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(TABLE_NAME); + message.setCreateTime(new Date()); + message.setTopic(MQTT_TOPIC); + message.setStatus("SUCCESS"); + message.setSyncObject("CLOUD"); + message.setTarget(siteId); + return message; + } + // 从方法名判断操作类型(示例:insert→INSERT,update→UPDATE,delete→DELETE) + private String getOperateType(String methodName) { + if (methodName.startsWith("insert")) return "INSERT"; + if (methodName.startsWith("stop")) return "STOP"; + if (methodName.startsWith("update") || methodName.startsWith("stop")) return "UPDATE"; + if (methodName.startsWith("delete")) return "DELETE"; + return "UNKNOWN"; + } + + // 从方法参数提取数据(示例:若参数是实体类,转成Map) + private Map extractDataFromParams(Object[] args) { + // 实际需反射获取实体类的字段和值(如id、name等) + Map data = new HashMap<>(); + if (args == null || args.length == 0) { + return data; + } + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg == null) { + continue; // 跳过null参数 + } + + // 处理基本类型/包装类/字符串(直接作为值存入,key为"param0"、"param1"等) + if (isBasicType(arg.getClass())) { + String key = "param" + i; // 基本类型参数用"param0"、"param1"作为key + data.put(key, arg); + } else { + Map beanMap = beanToMap(arg); + data.putAll(beanMap); // 合并实体类的字段到结果Map + } + } + + return data; + } + + /** + * 判断是否为基本类型或包装类或字符串 + */ + private boolean isBasicType(Class clazz) { + return clazz.isPrimitive() // 基本类型(int、long、boolean等) + || clazz == String.class // 字符串 + || Number.class.isAssignableFrom(clazz) // 数字包装类(Integer、Long等) + || clazz == Boolean.class; // 布尔包装类 + } + + /** + * 将实体类转换为Map(字段名为key,字段值为value) + */ + private Map beanToMap(Object bean) { + Map map = new HashMap<>(); + if (bean == null) { + return map; + } + + // 方式1:使用BeanMap(简洁高效) + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key.toString(), beanMap.get(key)); + } + + return map; + } + + // 在方法中转换 + public String convertEntityToJson(EmsStrategyRunning insertEntity) throws Exception { + if (insertEntity == null) { + return null; // 空对象返回空JSON + } + + // 将实体类转换为JSON字符串 + return objectMapper.writeValueAsString(insertEntity); + } + + +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/config/ApplicationConfig.java b/ems-framework/src/main/java/com/xzzn/framework/config/ApplicationConfig.java index 7202f41..5248c05 100644 --- a/ems-framework/src/main/java/com/xzzn/framework/config/ApplicationConfig.java +++ b/ems-framework/src/main/java/com/xzzn/framework/config/ApplicationConfig.java @@ -13,8 +13,9 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy; * @author xzzn */ @Configuration -// 表示通过aop框架暴露该代理对象,AopContext能够访问 -@EnableAspectJAutoProxy(exposeProxy = true) +// proxyTargetClass = true表示使用cglib代理,false表示jdk动态代理 +// exposeProxy = true表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true) // 指定要扫描的Mapper类的包的路径 @MapperScan("com.xzzn.**.mapper") public class ApplicationConfig diff --git a/ems-framework/src/main/java/com/xzzn/framework/config/AsyncConfig.java b/ems-framework/src/main/java/com/xzzn/framework/config/AsyncConfig.java new file mode 100644 index 0000000..f0271d7 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/config/AsyncConfig.java @@ -0,0 +1,49 @@ +/* +package com.xzzn.framework.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@EnableAsync +public class AsyncConfig { + + @Bean("modbusTaskExecutor") + public Executor taskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(5); + executor.setMaxPoolSize(10); + executor.setQueueCapacity(100); + executor.setKeepAliveSeconds(300); + executor.setThreadNamePrefix("ModbusPoller-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } + + */ +/** + * 策略下方定时任务 + *//* + + */ +/*@Bean("strategyTaskExecutor") + public Executor strategyTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(5); + executor.setMaxPoolSize(10); + executor.setQueueCapacity(100); + executor.setKeepAliveSeconds(300); + executor.setThreadNamePrefix("StrategyPoller-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + }*//* + +} +*/ diff --git a/ems-framework/src/main/java/com/xzzn/framework/config/MqttConfig.java b/ems-framework/src/main/java/com/xzzn/framework/config/MqttConfig.java new file mode 100644 index 0000000..53cd2d5 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/config/MqttConfig.java @@ -0,0 +1,31 @@ +package com.xzzn.framework.config; + +import com.xzzn.framework.config.properties.MqttProperties; +import org.eclipse.paho.client.mqttv3.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +@Configuration +public class MqttConfig { + private static final Logger logger = LoggerFactory.getLogger(MqttConfig.class); + + @Resource + private MqttProperties mqttProperties; + @Bean + public MqttConnectOptions mqttConnectOptions() { + MqttConnectOptions options = new MqttConnectOptions(); + options.setServerURIs(new String[]{mqttProperties.getBrokerUrl()}); + if (!mqttProperties.getUsername().isEmpty()) options.setUserName(mqttProperties.getUsername()); + if (!mqttProperties.getPassword().isEmpty()) options.setPassword(mqttProperties.getPassword().toCharArray()); + options.setConnectionTimeout(mqttProperties.getConnectionTimeout()); + options.setKeepAliveInterval(mqttProperties.getKeepAliveInterval()); + options.setAutomaticReconnect(mqttProperties.isAutomaticReconnect()); + options.setCleanSession(true); + return options; + } + +} diff --git a/ems-framework/src/main/java/com/xzzn/framework/config/properties/MqttProperties.java b/ems-framework/src/main/java/com/xzzn/framework/config/properties/MqttProperties.java new file mode 100644 index 0000000..41bb162 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/config/properties/MqttProperties.java @@ -0,0 +1,84 @@ +package com.xzzn.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MqttProperties { + @Value("${mqtt.broker.url}") + private String brokerUrl; + + @Value("${mqtt.client.id:}") + private String clientId; + + @Value("${mqtt.username:}") + private String username; + + @Value("${mqtt.password:}") + private String password; + + @Value("${mqtt.connection-timeout:10}") + private int connectionTimeout; + + @Value("${mqtt.keep-alive-interval:60}") + private int keepAliveInterval; + + @Value("${mqtt.automatic-reconnect:true}") + private boolean automaticReconnect; + + public String getBrokerUrl() { + return brokerUrl; + } + + public void setBrokerUrl(String brokerUrl) { + this.brokerUrl = brokerUrl; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getConnectionTimeout() { + return connectionTimeout; + } + + public void setConnectionTimeout(int connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + public int getKeepAliveInterval() { + return keepAliveInterval; + } + + public void setKeepAliveInterval(int keepAliveInterval) { + this.keepAliveInterval = keepAliveInterval; + } + + public boolean isAutomaticReconnect() { + return automaticReconnect; + } + + public void setAutomaticReconnect(boolean automaticReconnect) { + this.automaticReconnect = automaticReconnect; + } +} diff --git a/ems-framework/src/main/java/com/xzzn/framework/manager/MqttLifecycleManager.java b/ems-framework/src/main/java/com/xzzn/framework/manager/MqttLifecycleManager.java new file mode 100644 index 0000000..b4c05ce --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/manager/MqttLifecycleManager.java @@ -0,0 +1,162 @@ +package com.xzzn.framework.manager; + +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.SmartLifecycle; +import org.springframework.stereotype.Component; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class MqttLifecycleManager implements ApplicationRunner, SmartLifecycle, MqttCallback { + + private final MqttConnectOptions connectOptions; + private final IEmsAlarmRecordsService iEmsAlarmRecordsService; + private MqttClient mqttClient; + private volatile boolean running = false; + + // 存储订阅关系: topic -> (listener, qos) + private final ConcurrentHashMap subscriptions = new ConcurrentHashMap<>(); + + @Autowired + public MqttLifecycleManager(MqttConnectOptions connectOptions, IEmsAlarmRecordsService iEmsAlarmRecordsService) { + this.connectOptions = connectOptions; + this.iEmsAlarmRecordsService = iEmsAlarmRecordsService; + } + + // Spring Boot 启动完成后执行 + @Override + public void run(ApplicationArguments args) throws Exception { + start(); + } + + @Override + public void start() { + if (running) return; + + try { + String clientId = connectOptions.getUserName() + "-" + System.currentTimeMillis(); + mqttClient = new MqttClient( + connectOptions.getServerURIs()[0], + clientId, + new MemoryPersistence() + ); + + mqttClient.setCallback(this); + mqttClient.connect(connectOptions); + + // 重连后自动重新订阅 + resubscribeAll(); + + running = true; + System.out.println("MQTT client connected to: " + connectOptions.getServerURIs()[0]); + } catch (MqttException e) { + System.err.println("MQTT connection failed: " + e.getMessage()); + // 添加重试逻辑 + } + } + + @Override + public void stop() { + if (mqttClient != null && mqttClient.isConnected()) { + try { + mqttClient.disconnect(); + mqttClient.close(); + } catch (MqttException e) { + System.err.println("Error disconnecting MQTT client: " + e.getMessage()); + } + } + running = false; + } + + @Override + public boolean isRunning() { + return running; + } + + // MQTT 回调方法 + @Override + public void connectionLost(Throwable cause) { + System.err.println("MQTT connection lost: " + cause.getMessage()); + running = false; + // 自动重连由 MqttConnectOptions 处理 + } + + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + SubscriptionInfo info = subscriptions.get(topic); + if (info != null && info.getListener() != null) { + info.getListener().messageArrived(topic, message); + } + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + // 消息发布完成处理 + } + + // 订阅方法 + public void subscribe(String topic, int qos, IMqttMessageListener listener) { + try { + if (mqttClient != null && mqttClient.isConnected()) { + mqttClient.subscribe(topic, qos); + } + subscriptions.put(topic, new SubscriptionInfo(listener, qos)); + } catch (MqttException e) { + System.err.println("Subscribe failed: " + e.getMessage()); + // 订阅失败-增加告警 + iEmsAlarmRecordsService.addSubFailedAlarmRecord(topic); + } + // 订阅成功了-校验是否存在未处理或者处理中的订阅失败信息 + iEmsAlarmRecordsService.checkFailedRecord(topic); + } + + // 发布方法 + public void publish(String topic, String payload, int qos) throws MqttException { + if (mqttClient != null && mqttClient.isConnected()) { + MqttMessage message = new MqttMessage(payload.getBytes()); + message.setQos(qos); + mqttClient.publish(topic, message); + } else { + throw new MqttException(MqttException.REASON_CODE_CLIENT_NOT_CONNECTED); + } + } + + // 重新订阅所有主题 + private void resubscribeAll() { + if (mqttClient == null || !mqttClient.isConnected()) return; + + subscriptions.forEach((topic, info) -> { + try { + mqttClient.subscribe(topic, info.getQos()); + } catch (MqttException e) { + System.err.println("Resubscribe failed for topic: " + topic); + } + }); + } + + // 订阅信息内部类 + private static class SubscriptionInfo { + private final IMqttMessageListener listener; + private final int qos; + + public SubscriptionInfo(IMqttMessageListener listener, int qos) { + this.listener = listener; + this.qos = qos; + } + + public IMqttMessageListener getListener() { + return listener; + } + + public int getQos() { + return qos; + } + } +} \ No newline at end of file diff --git a/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttPublisher.java b/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttPublisher.java new file mode 100644 index 0000000..927d44e --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttPublisher.java @@ -0,0 +1,8 @@ +package com.xzzn.framework.web.service; + +import org.eclipse.paho.client.mqttv3.MqttException; + +public interface MqttPublisher { + void publish(String topic, String message) throws MqttException; + void publish(String topic, String message, int qos) throws MqttException; +} diff --git a/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttSubscriber.java b/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttSubscriber.java new file mode 100644 index 0000000..bf2c3be --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/web/service/MqttSubscriber.java @@ -0,0 +1,7 @@ +package com.xzzn.framework.web.service; + +import org.eclipse.paho.client.mqttv3.IMqttMessageListener; + +public interface MqttSubscriber { + void subscribe(String topic, int qos, IMqttMessageListener listener); +} \ No newline at end of file diff --git a/ems-quartz/pom.xml b/ems-quartz/pom.xml index 791c25d..df521b7 100644 --- a/ems-quartz/pom.xml +++ b/ems-quartz/pom.xml @@ -34,6 +34,10 @@ com.xzzn ems-common + + com.xzzn + ems-framework + diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java b/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java new file mode 100644 index 0000000..128a2ca --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java @@ -0,0 +1,33 @@ +package com.xzzn.quartz.config; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.annotation.PreDestroy; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Modbus操作执行器配置 + * 所有Modbus读写操作必须通过此单线程执行器串行执行,避免并发访问导致通讯故障 + */ +@Configuration +public class ModbusExecutorConfig { + + private final ExecutorService modbusExecutor = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "modbus-io-thread"); + t.setDaemon(false); + return t; + }); + + @Bean(name = "modbusExecutor") + public ExecutorService modbusExecutor() { + return modbusExecutor; + } + + @PreDestroy + public void shutdown() { + modbusExecutor.shutdown(); + } +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/config/ScheduledTask.java b/ems-quartz/src/main/java/com/xzzn/quartz/config/ScheduledTask.java new file mode 100644 index 0000000..867ac1e --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/config/ScheduledTask.java @@ -0,0 +1,34 @@ +package com.xzzn.quartz.config; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.springframework.stereotype.Component; + +@Component +public class ScheduledTask { + + + private ScheduledExecutorService executor = Executors.newScheduledThreadPool(10); + private final Map> futureMap = new ConcurrentHashMap<>(); + + public void startTask(String deviceId, Runnable task, long period) { + stopTask(deviceId); // 如果已有同ID任务在运行,先停止 + ScheduledFuture future = executor.scheduleAtFixedRate(task, 0, period, TimeUnit.MILLISECONDS); + futureMap.put(deviceId, future); + } + + public void stopTask(String deviceId) { + ScheduledFuture future = futureMap.get(deviceId); + if (future != null && !future.isDone()) { + future.cancel(true); + } + futureMap.remove(deviceId); + } + + +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/task/ModbusPoller.java b/ems-quartz/src/main/java/com/xzzn/quartz/task/ModbusPoller.java new file mode 100644 index 0000000..97be991 --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/task/ModbusPoller.java @@ -0,0 +1,343 @@ +package com.xzzn.quartz.task; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.serotonin.modbus4j.ModbusMaster; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.modbus.ModbusProcessor; +import com.xzzn.common.core.modbus.domain.DeviceConfig; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.DeviceRunningStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.impl.DeviceDataProcessServiceImpl; +import com.xzzn.framework.manager.MqttLifecycleManager; +import com.xzzn.framework.web.service.MqttPublisher; +import com.xzzn.quartz.config.ScheduledTask; +import com.xzzn.quartz.domain.SysJob; +import com.xzzn.quartz.service.ISysJobService; +import com.xzzn.quartz.util.CronUtils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.eclipse.paho.client.mqttv3.MqttException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +/** + * 轮询设备-通过modbus协议读取数据 + */ +@Component("modbusPoller") +public class ModbusPoller { + private static final Logger log = LoggerFactory.getLogger(ModbusPoller.class); + + private final MqttLifecycleManager mqttLifecycleManager; + private final ScheduledTask scheduledTask; + private final ObjectMapper objectMapper = new ObjectMapper(); + private final Map deviceFailureCounts = new ConcurrentHashMap<>(); + private final AtomicBoolean polling = new AtomicBoolean(false); + + @Resource(name = "modbusExecutor") + private ExecutorService modbusExecutor; + + @Autowired + private ModbusProcessor modbusProcessor; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + + @Autowired + private ISysJobService iSysJobService; + @Autowired + private DeviceDataProcessServiceImpl deviceDataProcessServiceImpl; + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private RedisCache redisCache; + @Autowired + private MqttPublisher mqttPublisher; + + @Value("${mqtt.topic}") + private String topic; + @Value("${mqtt.siteId}") + private String siteId; + + @Autowired + public ModbusPoller(MqttLifecycleManager mqttLifecycleManager, ScheduledTask scheduledTask) { + this.mqttLifecycleManager = mqttLifecycleManager; + this.scheduledTask = scheduledTask; + } + + public void pollAllDevices() { + if (!polling.compareAndSet(false, true)) { + log.warn("上一次轮询尚未完成,本次轮询跳过"); + return; + } + Path devicesDir = Paths.get(System.getProperty("user.dir"), "devices"); + if (!Files.exists(devicesDir)) { + log.error("Devices目录不存在: {}", devicesDir); + polling.set(false); + return; + } + + List jsonFiles = null; + try { + jsonFiles = Files.list(devicesDir) + .filter(path -> path.toString().endsWith(".json")) + .collect(Collectors.toList()); + } catch (IOException e) { + log.error("modbusPoller.loadConfigs 获取设备配置文件失败: {}", devicesDir, e); + polling.set(false); + return; + } + + // 按主机IP分组(同一网关的不同端口也归为一组,避免并发访问导致Connection Reset) + Map> groupedByHost = new HashMap<>(); + for (Path filePath : jsonFiles) { + DeviceConfig config = null; + try { + config = objectMapper.readValue(filePath.toFile(), DeviceConfig.class); + } catch (IOException e) { + log.error("modbusPoller.loadConfigs 解析设备配置文件失败: {}", filePath, e); + continue; + } + if (config.isEnabled()) { + // 只按主机IP分组,确保同一网关的所有端口串行访问 + String hostKey = config.getHost(); + groupedByHost.computeIfAbsent(hostKey, k -> new ArrayList<>()).add(config); + } + } + + // 使用单线程 executor 串行执行所有主机的 Modbus 操作 + // 将所有主机的设备按顺序串行处理,避免任何并发访问 + Future future = modbusExecutor.submit(() -> { + for (Map.Entry> entry : groupedByHost.entrySet()) { + String hostKey = entry.getKey(); + List configs = entry.getValue(); + for (DeviceConfig config : configs) { + try { + scheduledStart(config); + // 每次读取后等待200ms,给Modbus网关足够的处理时间 + Thread.sleep(200); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + log.warn("Modbus轮询被中断"); + return; + } catch (Exception e) { + log.error("采集设备数据异常: {}", config.getDeviceName(), e); + } + } + log.info("采集设备数据{}轮询任务执行完成", hostKey); + } + }); + try { + future.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("Modbus轮询任务等待中断"); + } catch (Exception e) { + log.error("Modbus轮询任务执行异常", e); + } finally { + polling.set(false); + } + } + + public void scheduledStart(DeviceConfig config) { + if (config.isEnabled()) { + log.info("Reading data from devices: {}", config.getDeviceName()); + + // 带重试的读取,最多重试2次 + Map data = readWithRetry(config, 2); + + List rawValuEmptyList = new ArrayList<>(); + // 在这里处理采集到的数据空 + config.getTags().forEach(tag -> { + Object rawValue = data.get(tag.getKey()); + if (rawValue != null) { + float value = 0; + if (rawValue instanceof Number) { + value = ((Number) rawValue).floatValue(); // 安全地转换为 float + } else { + log.error("tag:{},无法将数据转换为数字: {}", tag.getKey(), rawValue); + } + value = tag.getA() * value * value + tag.getK() * value + tag.getB(); + + int intValue = (int) value; + if (tag.getBit() != null) { + log.info("tag:{},bit:{},value:{}", tag.getKey(), tag.getBit(), value); + String binary = Integer.toBinaryString(intValue); + data.put(tag.getKey(), binary); + } else { + data.put(tag.getKey(), value); + } + } else { +// data.put(tag.getKey(), rawValue); +// log.warn("tag:{},数据为空: {}", tag.getKey(), rawValue); + rawValuEmptyList.add("tag: " + tag.getKey() + ",数据为空: " + rawValue); + } + }); + if (!rawValuEmptyList.isEmpty()) { + log.warn("设备 {} 数据为空: {}", config.getDeviceName(), JSON.toJSONString(rawValuEmptyList)); + } + log.info("Data from {}: {}", config.getDeviceName(), data); + String deviceNumber = config.getDeviceNumber(); + //处理数据并发送MQTT消息、保存Redis数据和数据入库 + processingData(data, deviceNumber); + } + } + + /** + * 带重试的读取方法 + */ + private Map readWithRetry(DeviceConfig config, int maxRetries) { + Map data = new HashMap<>(); + + for (int attempt = 0; attempt <= maxRetries; attempt++) { + try { + ModbusMaster master = modbusProcessor.borrowMaster(config); + data = modbusProcessor.readDataFromDevice(config, master); + + // 如果读取成功(有数据),直接返回 + if (!data.isEmpty()) { + if (attempt > 0) { + log.info("设备 {} 第 {} 次重试成功", config.getDeviceName(), attempt); + } + return data; + } + + // 读取返回空数据,等待后重试 + if (attempt < maxRetries) { + log.warn("设备 {} 读取返回空数据,等待1秒后重试 ({}/{})", + config.getDeviceName(), attempt + 1, maxRetries); + Thread.sleep(1000); + } + } catch (Exception e) { + log.error("设备 {} 读取异常 ({}/{}): {}", + config.getDeviceName(), attempt + 1, maxRetries, e.getMessage()); + + if (attempt < maxRetries) { + try { + Thread.sleep(1000); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + break; + } + } + } + } + + // 所有重试都失败 + log.error("设备 {} 读取失败,已重试 {} 次", config.getDeviceName(), maxRetries); + return data; + } + + private void processingData(Map data, String deviceNumber) { + if (CollectionUtils.isEmpty(data)) { + // 增加失败计数 + int failureCount = deviceFailureCounts.getOrDefault(deviceNumber, 0) + 1; + deviceFailureCounts.put(deviceNumber, failureCount); + + log.warn("设备 {} 数据读取失败,当前连续失败次数: {}", deviceNumber, failureCount); + + // 连续6次失败触发报警 + if (failureCount >= 6) { + addDeviceOfflineRecord(siteId, deviceNumber); + log.error("设备 {} 连续 {} 次未读取到数据,触发报警", deviceNumber, failureCount); + } + return; + } + + // 数据读取成功,重置计数器 + deviceFailureCounts.remove(deviceNumber); + // 读取到数据后告警自恢复 + deleteDeviceOfflineRecord(siteId, deviceNumber); + + // 发送MQTT消息、保存Redis数据和数据入库 + Long timestamp = System.currentTimeMillis(); + JSONObject json = new JSONObject(); + json.put("Data", data); + json.put("timestamp", timestamp); + json.put("Device", deviceNumber); + sendMqttMsg(json); + saveRedisData(json, deviceNumber); + saveDataToDatabase(data, deviceNumber, timestamp); + } + + public void sendMqttMsg(JSONObject json) { + try { + mqttPublisher.publish(topic, Collections.singletonList(json).toString(), 0); + } catch (MqttException e) { + log.error("MQTT消息发布失败: {}, reason code: {}", json.toJSONString(), e.getReasonCode() ,e); + } + log.info("已发送数据: {}", json.toJSONString()); + } + + + public void saveRedisData(JSONObject obj, String deviceNumber) { + try { + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceNumber, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据和保护策略查询 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA + siteId + "_" + deviceNumber, obj, 1, TimeUnit.MINUTES); + log.info("数据已成功存储在Redis: {}", deviceNumber); + } catch (Exception e) { + log.error("无法在设备的Redis中存储数据: {}", deviceNumber, e); + } + } + + private void saveDataToDatabase(Map data, String deviceNumber, Long timestamp) { + deviceDataProcessServiceImpl.processingDeviceData(siteId, deviceNumber, JSON.toJSONString(data), DateUtils.convertUpdateTime(timestamp)); + } + + //处理设备连接失败的情况,更新设备状态为离线,添加报警记录 + private void addDeviceOfflineRecord(String siteId, String deviceNumber) { + updateDeviceStatus(siteId, deviceNumber, DeviceRunningStatus.OFFLINE.getCode()); + iEmsAlarmRecordsService.addDeviceOfflineRecord(siteId, deviceNumber); + } + + //处理设备读取到数据的情况,更新设备状态为在线,报警记录自恢复 + private void deleteDeviceOfflineRecord(String siteId, String deviceNumber) { + updateDeviceStatus(siteId, deviceNumber, DeviceRunningStatus.ONLINE.getCode()); + iEmsAlarmRecordsService.deleteDeviceOfflineRecord(siteId, deviceNumber); + } + + // 更新设备状态为在线或离线 + private void updateDeviceStatus(String siteId, String deviceNumber, String deviceStatus) { + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceNumber, siteId); + if (emsDevicesSetting != null && !Objects.equals(emsDevicesSetting.getDeviceStatus(), deviceStatus)) { + emsDevicesSetting.setDeviceStatus(deviceStatus); + emsDevicesSettingMapper.updateEmsDevicesSetting(emsDevicesSetting); + } + } + + private int getScheduledTaskInterval() { + SysJob query = new SysJob(); + query.setInvokeTarget("modbusPoller.pollAllDevices"); + List sysJobs = iSysJobService.selectJobList(query); + return Math.toIntExact(CronUtils.getNextExecutionIntervalMillis(sysJobs.get(0).getCronExpression())); + } + +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/task/ProtectionPlanTask.java b/ems-quartz/src/main/java/com/xzzn/quartz/task/ProtectionPlanTask.java new file mode 100644 index 0000000..9842bf4 --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/task/ProtectionPlanTask.java @@ -0,0 +1,482 @@ +package com.xzzn.quartz.task; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.annotation.SyncAfterInsert; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.AlarmLevelStatus; +import com.xzzn.common.enums.AlarmStatus; +import com.xzzn.common.enums.ProtPlanStatus; +import com.xzzn.common.enums.StrategyStatus; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsFaultIssueLog; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.vo.ProtectionPlanVo; +import com.xzzn.ems.domain.vo.ProtectionSettingVo; +import com.xzzn.ems.mapper.EmsAlarmRecordsMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsFaultIssueLogMapper; +import com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper; +import com.xzzn.ems.mapper.EmsStrategyRunningMapper; +import com.xzzn.ems.service.IEmsFaultProtectionPlanService; +import com.xzzn.common.core.modbus.ModbusProcessor; +import com.xzzn.common.core.modbus.domain.DeviceConfig; +import com.xzzn.common.core.modbus.domain.WriteTagConfig; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +/** + * 告警保护方案轮询 + * + * @author xzzn + */ +@Component("protectionPlanTask") +public class ProtectionPlanTask { + private static final Logger logger = LoggerFactory.getLogger(ProtectionPlanTask.class); + @Resource(name = "scheduledExecutorService") + private ScheduledExecutorService scheduledExecutorService; + @Autowired + private IEmsFaultProtectionPlanService iEmsFaultProtectionPlanService; + @Autowired + private EmsAlarmRecordsMapper emsAlarmRecordsMapper; + @Autowired + private EmsStrategyRunningMapper emsStrategyRunningMapper; + @Autowired + private EmsFaultProtectionPlanMapper emsFaultProtectionPlanMapper; + @Autowired + private RedisCache redisCache; + private static final ObjectMapper objectMapper = new ObjectMapper(); + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private ModbusProcessor modbusProcessor; + @Autowired + private EmsFaultIssueLogMapper emsFaultIssueLogMapper; + + public ProtectionPlanTask(IEmsFaultProtectionPlanService iEmsFaultProtectionPlanService) { + this.iEmsFaultProtectionPlanService = iEmsFaultProtectionPlanService; + } + + public void pollPlanList() { + Long planId = 0L; + try { + // 获取所有方案,轮询 + List planList = iEmsFaultProtectionPlanService.selectEmsFaultProtectionPlanList(null); + + for (EmsFaultProtectionPlan plan : planList) { + planId = plan.getId(); + String siteId = plan.getSiteId(); + if (StringUtils.isEmpty(siteId)) { + return; + } + // 保护前提 + String protectionSettings = plan.getProtectionSettings(); + final List protSettings = objectMapper.readValue( + protectionSettings, + new TypeReference>() {} + ); + if (protSettings == null) { + return; + } + + // 处理告警保护方案 + boolean isHighLevel = dealWithProtectionPlan(plan, protSettings); + if (isHighLevel) { + // 触发最高故障等级-结束循环 + return; + } + } + } catch (Exception e) { + logger.error("轮询失败,方案id为:{}", planId, e); + } + } + + // 处理告警保护方案-返回触发下发方案时是否最高等级 + // 需要同步云端 + @SyncAfterInsert + private boolean dealWithProtectionPlan(EmsFaultProtectionPlan plan, List protSettings) { + logger.info("<轮询保护方案> 站点:{},方案ID:{}", plan.getSiteId(), plan.getId()); + boolean isHighLevel = false; + + String siteId = plan.getSiteId(); + final Integer isAlertAlarm = plan.getIsAlert(); + final Long status = plan.getStatus(); + // 看方案是否启用,走不同判断 + if (Objects.equals(status, ProtPlanStatus.STOP.getCode())) { + logger.info("<方案未启用> 站点:{},方案ID:{}", siteId, plan.getId()); + // 未启用,获取方案的故障值与最新数据判断是否需要下发方案 + if(checkIsNeedIssuedPlan(protSettings, siteId)){ + if("3".equals(plan.getFaultLevel())){ + isHighLevel = true;//最高故障等级 + } + // 延时 + final int faultDelay = plan.getFaultDelaySeconds().intValue(); + ScheduledFuture delayTask = scheduledExecutorService.schedule(() -> { + // 延时后再次确认是否仍满足触发条件(防止期间状态变化) + if (checkIsNeedIssuedPlan(protSettings, siteId)) { + // 判断是否需要生成告警 + if (isAlertAlarm == 1) { + logger.info("<生成告警> 方案ID:{},站点:{}", plan.getId(), siteId); + EmsAlarmRecords alarmRecords = addAlarmRecord(siteId,plan.getFaultName(), + getAlarmLevel(plan.getFaultLevel())); + emsAlarmRecordsMapper.insertEmsAlarmRecords(alarmRecords); + } + + // 是否有保护方案,有则通过modbus连接设备下发方案 + String protPlanJson = plan.getProtectionPlan(); + if (protPlanJson != null && !protPlanJson.isEmpty() && !"[]".equals(protPlanJson)) { + logger.info("<下发保护方案> 方案内容:{}", protPlanJson); + executeProtectionActions(protPlanJson,siteId,plan.getId(),plan.getFaultLevel()); // 执行Modbus指令 + } + + // 更新方案状态为“已启用” + logger.info("<方案已启用> 方案ID:{}", plan.getId()); + plan.setStatus(ProtPlanStatus.RUNNING.getCode()); + emsFaultProtectionPlanMapper.updateEmsFaultProtectionPlan(plan); + + // 更新该站点策略为暂停状态 + updateStrategyRunningStatus(siteId, StrategyStatus.SUSPENDED.getCode()); + } + }, faultDelay, TimeUnit.SECONDS); + } + } else { + logger.info("<方案已启用> 站点:{},方案ID:{}", siteId, plan.getId()); + // 已启用,则获取方案的释放值与最新数据判断是否需要取消方案 + if(checkIsNeedCancelPlan(protSettings, siteId)){ + // 延时, + int releaseDelay = plan.getReleaseDelaySeconds().intValue(); + ScheduledFuture delayTask = scheduledExecutorService.schedule(() -> { + // 判断是否已存在未处理告警,有着取消 + if(isAlertAlarm == 1){ + logger.info("<取消告警>"); + EmsAlarmRecords emsAlarmRecords = emsAlarmRecordsMapper.getFailedRecord(siteId, + plan.getFaultName(),getAlarmLevel(plan.getFaultLevel())); + if(emsAlarmRecords != null){ + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + } + } + // 更新方案状态为“未启用” + logger.info("<方案变更为未启用> 方案ID:{}", plan.getId()); + plan.setStatus(ProtPlanStatus.STOP.getCode()); + plan.setUpdateBy("system"); + emsFaultProtectionPlanMapper.updateEmsFaultProtectionPlan(plan); + // 更新该站点策略为启用状态 + updateStrategyRunningStatus(siteId, StrategyStatus.RUNNING.getCode()); + }, releaseDelay, TimeUnit.SECONDS); + } + } + + return isHighLevel; + } + + // 下发保护方案 + private void executeProtectionActions(String protPlanJson, String siteId, Long planId, Integer faultLevel){ + final List protPlanList; + try { + protPlanList = objectMapper.readValue( + protPlanJson, + new TypeReference>() {} + ); + if (protPlanList == null) { + return; + } + + // 遍历保护方案 + for (ProtectionPlanVo plan : protPlanList) { + if (StringUtils.isEmpty(plan.getDeviceId()) || StringUtils.isEmpty(plan.getPoint())) { + return; + } + // 给设备发送指令记录日志,并同步云端 + EmsFaultIssueLog faultIssueLog = createLogEntity(plan,siteId); + faultIssueLog.setLogLevel(faultLevel); + emsFaultIssueLogMapper.insertEmsFaultIssueLog(faultIssueLog); + + // 通过modbus连接设备,发送数据 + executeSinglePlan(plan,siteId); + } + + + } catch (Exception e) { + logger.error("下发保护方案失败,方案id为:", planId, e); + } + } + + private EmsFaultIssueLog createLogEntity(ProtectionPlanVo plan,String siteId) { + EmsFaultIssueLog faultIssueLog = new EmsFaultIssueLog(); + faultIssueLog.setLogId(UUID.randomUUID().toString()); + faultIssueLog.setLogTime(new Date()); + faultIssueLog.setSiteId(siteId); + faultIssueLog.setDeviceId(plan.getDeviceId()); + faultIssueLog.setPoint(plan.getPoint()); + faultIssueLog.setValue(plan.getValue()); + faultIssueLog.setCreateBy("sys"); + faultIssueLog.setCreateTime(new Date()); + return faultIssueLog; + } + + private void executeSinglePlan(ProtectionPlanVo plan, String siteId) throws Exception { + String deviceId = plan.getDeviceId(); + // 获取设备地址信息 + EmsDevicesSetting device = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + if (device == null || StringUtils.isEmpty(device.getIpAddress()) || device.getIpPort()==null) { + logger.warn("设备信息不完整,deviceId:{}", deviceId); + return; + } + + // 构建设备配置 + DeviceConfig config = new DeviceConfig(); + config.setHost(device.getIpAddress()); + config.setPort(device.getIpPort().intValue()); + config.setSlaveId(device.getSlaveId().intValue()); + config.setDeviceName(device.getDeviceName()); + config.setDeviceNumber(device.getDeviceId()); + + // 构建写入标签配置 + WriteTagConfig writeTag = new WriteTagConfig(); + writeTag.setAddress(plan.getPoint()); + writeTag.setValue(plan.getValue()); + + List writeTags = new ArrayList<>(); + writeTags.add(writeTag); + config.setWriteTags(writeTags); + + // 写入数据到设备 + boolean success = modbusProcessor.writeDataToDeviceWithRetry(config); + + if (!success) { + logger.error("写入失败,设备地址:{}", device.getIpAddress()); + } + } + + // 校验释放值是否取消方案 + private boolean checkIsNeedCancelPlan(List protSettings, String siteId) { + BigDecimal releaseValue = BigDecimal.ZERO; + + StringBuilder conditionSb = new StringBuilder(); + for (int i = 0; i < protSettings.size(); i++) { + ProtectionSettingVo vo = protSettings.get(i); + String deviceId = vo.getDeviceId(); + String point = vo.getPoint(); + releaseValue = vo.getFaultValue(); + if(StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(point) || releaseValue == null + || StringUtils.isEmpty(vo.getReleaseOperator())){ + return false; + } + // 获取点位最新值 + BigDecimal lastPointValue = getPointLastValue(deviceId, point, siteId); + logger.info("checkIsNeedCancelPlan 点位:{},最新值:{},比较方式:{},释放值:{}", point, lastPointValue, vo.getReleaseOperator(), releaseValue); + if(lastPointValue == null){ + return false; + } + + // 拼接校验语句-最新值+比较方式+故障值+与下一点位关系(最后一个条件后不加关系) + conditionSb.append(lastPointValue).append(vo.getReleaseOperator()).append(releaseValue); + if (i < protSettings.size() - 1) { + String relation = vo.getRelationNext(); + conditionSb.append(" ").append(relation).append(" "); + } + + } + // 执行比较语句 + return executeWithParser(conditionSb.toString()); + } + + // 校验故障值是否需要下发方案 + private boolean checkIsNeedIssuedPlan(List protSettings, String siteId) { + BigDecimal faultValue = BigDecimal.ZERO; + + StringBuilder conditionSb = new StringBuilder(); + for (int i = 0; i < protSettings.size(); i++) { + ProtectionSettingVo vo = protSettings.get(i); + String deviceId = vo.getDeviceId(); + String point = vo.getPoint(); + faultValue = vo.getFaultValue(); + if(StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(point) || faultValue == null + || StringUtils.isEmpty(vo.getFaultOperator())){ + return false; + } + // 获取点位最新值 + BigDecimal lastPointValue = getPointLastValue(deviceId, point, siteId); + logger.info("checkIsNeedIssuedPlan 点位:{},最新值:{},比较方式:{},故障值:{}", point, lastPointValue, vo.getFaultOperator(), faultValue); + if(lastPointValue == null){ + return false; + } + + // 拼接校验语句-最新值+比较方式+故障值+与下一点位关系(最后一个条件后不加关系) + conditionSb.append(lastPointValue).append(vo.getFaultOperator()).append(faultValue); + if (i < protSettings.size() - 1) { + String relation = vo.getRelationNext(); + conditionSb.append(" ").append(relation).append(" "); + } + + } + // 执行比较语句 + return executeWithParser(conditionSb.toString()); + } + + private BigDecimal getPointLastValue(String deviceId, String point, String siteId) { + JSONObject mqttJson = redisCache.getCacheObject(RedisKeyConstants.SYNC_DATA + siteId + "_" + deviceId); + if(mqttJson == null){ + return null; + } + String jsonData = mqttJson.get("Data").toString(); + if(StringUtils.isEmpty(jsonData)){ + return null; + } + Map obj = JSON.parseObject(jsonData, new com.alibaba.fastjson2.TypeReference>() {}); + return StringUtils.getBigDecimal(obj.get(point)); + } + + // 更新站点策略为启用 + private void updateStrategyRunningStatus(String siteId, String status) { + // 获取是否有正在运行的策略,如果有则不更改 + EmsStrategyRunning query = new EmsStrategyRunning(); + query.setSiteId(siteId); + query.setStatus(StrategyStatus.RUNNING.getCode().equals(status) ? StrategyStatus.SUSPENDED.getCode() : StrategyStatus.RUNNING.getCode()); + List strategyRunningList = emsStrategyRunningMapper.selectEmsStrategyRunningList(query); + if (CollectionUtils.isNotEmpty(strategyRunningList)) { + // 获取已存在并且状态为:未启用和已暂停的最晚一条策略,更新为已启用 + strategyRunningList.forEach(emsStrategyRunning -> { + emsStrategyRunning.setStatus(status); + emsStrategyRunningMapper.updateEmsStrategyRunning(emsStrategyRunning); + }); + } + } + + // 更新站点策略为启用 + private void updateStrategyRunning(String siteId) { + // 获取是否有正在运行的策略,如果有则不更改 + EmsStrategyRunning emsStrategyRunning = emsStrategyRunningMapper.getRunningStrategy(siteId); + if (emsStrategyRunning == null) { + // 获取已存在并且状态为:未启用和已暂停的最晚一条策略,更新为已启用 + emsStrategyRunning = emsStrategyRunningMapper.getPendingStrategy(siteId); + emsStrategyRunning.setStatus(StrategyStatus.RUNNING.getCode()); + emsStrategyRunningMapper.updateEmsStrategyRunning(emsStrategyRunning); + } + } + + private EmsAlarmRecords addAlarmRecord(String siteId, String content,String level) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + emsAlarmRecords.setSiteId(siteId); + emsAlarmRecords.setAlarmContent(content); + emsAlarmRecords.setAlarmLevel(level); + emsAlarmRecords.setAlarmStartTime(new Date()); + emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode()); + emsAlarmRecords.setDeviceType("TCP"); + emsAlarmRecords.setCreateBy("system"); + emsAlarmRecords.setCreateTime(new Date()); + return emsAlarmRecords; + } + + // 故障等级-告警等级匹配 + private String getAlarmLevel(Integer faultLevel) { + if (ObjectUtils.isEmpty(faultLevel) || faultLevel < 1 || faultLevel > 3) { + logger.warn("非法故障等级:{},默认返回普通告警", faultLevel); + return AlarmLevelStatus.EMERGENCY.getCode(); + } + switch (faultLevel) { + case 1: return AlarmLevelStatus.GENERAL.getCode(); + case 2: return AlarmLevelStatus.SERIOUS.getCode(); + case 3: return AlarmLevelStatus.EMERGENCY.getCode(); + default: + logger.error("未匹配的故障等级:{}", faultLevel); + return AlarmLevelStatus.EMERGENCY.getCode(); + } + } + + // 自定义表达式解析器(仅支持简单运算符和逻辑关系) + public boolean executeWithParser(String conditionStr) { + if (conditionStr == null || conditionStr.isEmpty()) { + return false; + } + + // 1. 拆分逻辑关系(提取 && 或 ||) + List logicRelations = new ArrayList<>(); + Pattern logicPattern = Pattern.compile("(&&|\\|\\|)"); + Matcher logicMatcher = logicPattern.matcher(conditionStr); + while (logicMatcher.find()) { + logicRelations.add(logicMatcher.group()); + } + + // 2. 拆分原子条件(如 "3.55>3.52") + String[] atomicConditions = logicPattern.split(conditionStr); + + // 3. 解析每个原子条件并计算结果 + List atomicResults = new ArrayList<>(); + Pattern conditionPattern = Pattern.compile("(\\d+\\.?\\d*)\\s*([><]=?|==)\\s*(\\d+\\.?\\d*)"); + for (String atomic : atomicConditions) { + Matcher matcher = conditionPattern.matcher(atomic.trim()); + if (!matcher.matches()) { + logger.error("无效的原子条件:{}", atomic); + return false; + } + double left = Double.parseDouble(matcher.group(1)); // 左值(最新值) + String operator = matcher.group(2); // 运算符 + double right = Double.parseDouble(matcher.group(3)); // 右值(故障值) + + // 执行比较 + boolean result; + switch (operator) { + case ">": + result = left > right; + break; + case ">=": + result = left >= right; + break; + case "<": + result = left < right; + break; + case "<=": + result = left <= right; + break; + case "==": + result = left == right; + break; + default: + result = false; + break; + } + atomicResults.add(result); + } + + // 4. 组合原子结果(根据逻辑关系) + boolean finalResult = atomicResults.get(0); + for (int i = 0; i < logicRelations.size(); i++) { + String relation = logicRelations.get(i); + boolean nextResult = atomicResults.get(i+1); + if ("&&".equals(relation)) { + finalResult = finalResult && nextResult; + } else if ("||".equals(relation)) { + finalResult = finalResult || nextResult; + } + } + return finalResult; + } +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java b/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java new file mode 100644 index 0000000..be613db --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/task/StrategyPoller.java @@ -0,0 +1,494 @@ +package com.xzzn.quartz.task; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.xzzn.common.core.modbus.ModbusProcessor; +import com.xzzn.common.core.modbus.domain.DeviceConfig; +import com.xzzn.common.core.modbus.domain.WriteTagConfig; +import com.xzzn.common.enums.ChargeStatus; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.SiteDevice; +import com.xzzn.common.enums.SocLimit; +import com.xzzn.common.enums.WorkStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsPcsSetting; +import com.xzzn.ems.domain.EmsStrategyLog; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.domain.vo.StrategyRunningVo; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsPcsSettingMapper; +import com.xzzn.ems.mapper.EmsStrategyLogMapper; +import com.xzzn.ems.mapper.EmsStrategyRunningMapper; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import com.xzzn.ems.mapper.EmsStrategyTimeConfigMapper; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component("strategyPoller") +public class StrategyPoller { + private static final Logger logger = LoggerFactory.getLogger(StrategyPoller.class); + + private static final ConcurrentHashMap strategyLocks = new ConcurrentHashMap<>(); + + // SOC 上下限值,默认为0%-100% + private static final BigDecimal SOC_DOWN = new BigDecimal(0); + private static final BigDecimal SOC_UP = new BigDecimal(100); + // 逆变器功率下限值,默认为30kW + private static final BigDecimal ANTI_REVERSE_THRESHOLD = new BigDecimal(30); + // 逆变器下限值范围,默认为20% + private static final BigDecimal ANTI_REVERSE_RANGE_PERCENT = new BigDecimal(20); + // 逆变器功率上限值,默认为100kW + private static final BigDecimal ANTI_REVERSE_UP = new BigDecimal(100); + // PCS功率降幅,默认为10% + private static final BigDecimal ANTI_REVERSE_POWER_DOWN_PERCENT = new BigDecimal(10); + + @Autowired + private EmsStrategyRunningMapper emsStrategyRunningMapper; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + @Autowired + private EmsStrategyTimeConfigMapper emsStrategyTimeConfigMapper; + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesMapper; + @Autowired + private EmsPcsSettingMapper emsPcsSettingMapper; + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsStrategyLogMapper emsStrategyLogMapper; + @Autowired + private ModbusProcessor modbusProcessor; + + @Resource(name = "modbusExecutor") + private ExecutorService modbusExecutor; + + public void pollAllDevices() { + logger.info("开始执行运行策略数据轮询..."); + List strategyRunningVoList = emsStrategyRunningMapper.getPendingPollerStrategy(null); + strategyRunningVoList.forEach(strategyVo -> { + Long strategyId = strategyVo.getId(); + if (strategyLocks.putIfAbsent(strategyId, true) == null) { + // 使用共享的modbusExecutor串行执行,避免与ModbusPoller并发访问导致通讯故障 + modbusExecutor.submit(() -> { + try { + processData(strategyVo); + } catch (Exception e) { + logger.error("运行策略{}轮询异常", strategyVo.getId(), e); + } finally { + logger.info("运行策略{}轮询任务执行完成,释放锁", strategyVo.getId()); + strategyLocks.remove(strategyId); + } + }); + } else { + logger.info("策略{}已在处理中,跳过重复执行", strategyId); + } + }); + } + // 处理获取到的运行策略数据,modbus发送指定的命令控制设备 + private void processData(StrategyRunningVo strategyVo) { + logger.info("运行策略数据处理开始"); + // 根据运行策略获取主副策略的模板数据 + Long mainStrategyId = strategyVo.getMainStrategyId(); + Long auxStrategyId = strategyVo.getAuxStrategyId(); + String siteId = strategyVo.getSiteId(); + // 处理主策略数据 + if (mainStrategyId != null && StringUtils.isNotBlank(siteId)) { + dealStrategyCurveData(mainStrategyId, siteId); + } + // 处理副策略数据 + if (auxStrategyId != null && StringUtils.isNotBlank(siteId)) { + dealStrategyCurveData(auxStrategyId, siteId); + } + + logger.info("运行策略轮询处理结束"); + } + + private void dealStrategyCurveData(Long strategyId, String siteId) { + // 1.获取当前策略的所有模板 + List> temps = emsStrategyTempMapper.getTempNameList(strategyId, siteId); + if (CollectionUtils.isEmpty(temps)) { + logger.info("当前站点: {}, 策略: {} 没有模板数据", siteId, strategyId); + return; + } + for (Map temp : temps) { + // 2.查询当月配置的运行策略 + String tempId = temp.get("templateId"); + int month = LocalDateTime.now().getMonthValue(); + List timeConfigs = emsStrategyTimeConfigMapper.getTimeConfigByTempIdAndMonth(tempId, month); + if (CollectionUtils.isEmpty(timeConfigs)) { + continue; + } + logger.info("当前站点: {}, 策略: {}, {}月配置模版:{}", siteId, strategyId, month, tempId); + // 3.查询当月配置的运行策略时间阶段数据 + List powerConfig = emsStrategyTempMapper.selectStrategyTempByTempId(tempId); + if (CollectionUtils.isEmpty(powerConfig)) { + logger.info("当前站点: {}, 策略: {}, 模版:{} 未配置数据", siteId, strategyId, tempId); + continue; + } + // 4.遍历时间段数据,判断当前时间是否在时间段内,在时间段内的进行处理 + for (EmsStrategyTemp emsStrategyTemp : powerConfig) { + if (emsStrategyTemp.getStartTime() == null || emsStrategyTemp.getEndTime() == null) { + logger.info("当前站点: {}, 策略: {}, 模版:{} 未配置时间阶段数据", siteId, strategyId, tempId); + continue; + } + // 判断当前时间是否在时间段内 + if (!isTimeInRange(LocalTime.now(), emsStrategyTemp.getStartTime(), emsStrategyTemp.getEndTime())) { + logger.info("当前站点: {}, 策略: {}, 时间段:{} 不在时间段内", siteId, strategyId, emsStrategyTemp.getStartTime() + "-" + emsStrategyTemp.getEndTime()); + continue; + } + // 查询PCS设备信息 + EmsDevicesSetting queryDevices = new EmsDevicesSetting(); + queryDevices.setSiteId(siteId); + queryDevices.setDeviceCategory(DeviceCategory.PCS.getCode()); + List pcsDeviceList = emsDevicesMapper.selectEmsDevicesSettingList(queryDevices); + if (CollectionUtils.isEmpty(pcsDeviceList)) { + logger.info("当前站点: {} 未配置PCS设备", siteId); + continue; + } + // 判断SOC上下限 + if (isSocInRange(emsStrategyTemp)) { + BigDecimal avgChargeDischargePower = emsStrategyTemp.getChargeDischargePower().divide(new BigDecimal(pcsDeviceList.size())); + for (EmsDevicesSetting pcsDevice : pcsDeviceList) { + EmsPcsSetting pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(pcsDevice.getId()); + if (pcsSetting == null || pcsSetting.getClusterNum() < 1) { + logger.info("当前站点: {}, PCS设备: {} 未获取电池簇数量", siteId, pcsDevice.getDeviceId()); + continue; + } + // 功率默认放大10倍,平均功率值,根据电池簇数量进行平均分配 + avgChargeDischargePower = avgChargeDischargePower.multiply(new BigDecimal(10)).divide(new BigDecimal(pcsSetting.getClusterNum())); + // 根据充电状态,处理数据 + if (ChargeStatus.CHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) { + // 发送Modbus命令控制设备-充电 + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.CHARGING, avgChargeDischargePower, emsStrategyTemp, false, null); + } else if (ChargeStatus.DISCHARGING.getCode().equals(emsStrategyTemp.getChargeStatus())) { + boolean needAntiReverseFlow = false; + Integer powerDownType = null; + BigDecimal chargeDischargePower = avgChargeDischargePower; + // 查询策略运行日志 + EmsStrategyLog lastStrategyLog = getLastStrategyLog(pcsDevice.getDeviceId(), emsStrategyTemp); + if (lastStrategyLog != null) { + // 如果当前时间段已经进入待机状态,则不处理 + if (ChargeStatus.STANDBY.getCode().equals(lastStrategyLog.getChargeStatus())) { + continue; + } + chargeDischargePower = lastStrategyLog.getChargeDischargePower(); + powerDownType = lastStrategyLog.getPowerDownType(); + } + + // 查询电网电表的正向有功功率,36kW-50kW范围内,稳定运行,低于36kW,降功率,高于50kW,增加功率 + EmsAmmeterData emsAmmeterData = emsAmmeterDataMapper.getLastData(emsStrategyTemp.getSiteId(), SiteDevice.LOAD.name()); + if (emsAmmeterData == null || emsAmmeterData.getTotalActivePower() == null) { + logger.info("当前站点: {}, 未获取到最新电表数据", emsStrategyTemp.getSiteId()); + } else { + // 判断是否需要防逆流 + needAntiReverseFlow = isNeedAntiReverseFlow(emsAmmeterData.getTotalActivePower()); + BigDecimal power = avgChargeDischargePower.multiply(ANTI_REVERSE_POWER_DOWN_PERCENT).divide(new BigDecimal(100)); + if (needAntiReverseFlow) { + // 降功率 + chargeDischargePower = chargeDischargePower.subtract(power); + powerDownType = 0; + } else { + // 判断是否需要增加功率, + if (powerDownType != null && emsAmmeterData.getTotalActivePower().compareTo(ANTI_REVERSE_UP) > 0) { + if (chargeDischargePower.compareTo(avgChargeDischargePower) == 0) { + // 功率增加到平均值则停止 + continue; + } + // 增加功率 + chargeDischargePower = chargeDischargePower.add(power); + powerDownType = 1; + needAntiReverseFlow = true; + } + } + } + + if (BigDecimal.ZERO.compareTo(chargeDischargePower) == 0) { + // 如果已经降功率到0,则设备直接待机 + // 发送Modbus命令控制设备-待机 + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, needAntiReverseFlow, powerDownType); + } else { + // 发送Modbus命令控制设备-放电 + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.DISCHARGING, chargeDischargePower, emsStrategyTemp, needAntiReverseFlow, powerDownType); + } + } else { + // 发送Modbus命令控制设备-待机 + sendModbusCommand(Collections.singletonList(pcsDevice), pcsSetting, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false, null); + } + } + } else { + // 发送Modbus命令控制设备-待机 + sendModbusCommand(pcsDeviceList, null, ChargeStatus.STANDBY, BigDecimal.ZERO, emsStrategyTemp, false, null); + } + } + + } + } + + + private void saveStrategyLog(String deviceId, BigDecimal chargeDischargePower, String chargeStatus, + EmsStrategyTemp strategyTemp, boolean needAntiReverseFlow, Integer powerDownType) { + EmsStrategyLog log = new EmsStrategyLog(); + log.setStrategyId(strategyTemp.getStrategyId()); + log.setTemplateId(strategyTemp.getTemplateId()); + log.setSiteId(strategyTemp.getSiteId()); + log.setDeviceId(deviceId); + log.setStartTime(strategyTemp.getStartTime()); + log.setEndTime(strategyTemp.getEndTime()); + log.setChargeDischargePower(chargeDischargePower); + log.setChargeStatus(chargeStatus); + log.setExecutionDate(DateUtils.toDate(LocalDateTime.now())); + log.setAntiReverse(needAntiReverseFlow ? 1 : 0); + log.setPowerDownType(powerDownType); + emsStrategyLogMapper.insertEmsStrategyLog(log); + } + + private List getStrategyLog(String deviceId, String chargeStatus, + EmsStrategyTemp strategyTemp, boolean needAntiReverseFlow) { + EmsStrategyLog query = new EmsStrategyLog(); + query.setStrategyId(strategyTemp.getStrategyId()); + query.setTemplateId(strategyTemp.getTemplateId()); + query.setSiteId(strategyTemp.getSiteId()); + query.setDeviceId(deviceId); + query.setStartTime(strategyTemp.getStartTime()); + query.setEndTime(strategyTemp.getEndTime()); + query.setChargeStatus(chargeStatus); + query.setExecutionDate(DateUtils.toDate(LocalDateTime.now())); + query.setAntiReverse(needAntiReverseFlow ? 1 : 0); + return emsStrategyLogMapper.selectEmsStrategyLogList(query); + } + + private EmsStrategyLog getLastStrategyLog(String deviceId, EmsStrategyTemp strategyTemp) { + EmsStrategyLog query = new EmsStrategyLog(); + query.setStrategyId(strategyTemp.getStrategyId()); + query.setTemplateId(strategyTemp.getTemplateId()); + query.setSiteId(strategyTemp.getSiteId()); + query.setDeviceId(deviceId); + query.setStartTime(strategyTemp.getStartTime()); + query.setEndTime(strategyTemp.getEndTime()); + query.setExecutionDate(DateUtils.toDate(LocalDateTime.now())); + return emsStrategyLogMapper.getLastStrategyLog(query); + } + + private boolean isNeedAntiReverseFlow(BigDecimal totalActivePower) { + // 获取当前设定的防逆流阈值(30kW) + BigDecimal threshold = ANTI_REVERSE_THRESHOLD; + // 计算20%范围的上限(36kW) + BigDecimal upperLimit = threshold.multiply(ANTI_REVERSE_RANGE_PERCENT).divide(new BigDecimal(100)).add(threshold); + + // 判断电网电表正向有功功率是否小于36kW(接近30kW的20%范围) + return totalActivePower.compareTo(upperLimit) < 0; + } + + public List getSwitchDeviceWriteTags(EmsPcsSetting pcsSetting, String workStatus) { + List writeTags = new ArrayList<>(); + BigDecimal power; + + if (WorkStatus.NORMAL.getCode().equals(workStatus)) { + // 开机先发送开机指令再发送有功功率给定值 + WriteTagConfig writeTag = new WriteTagConfig(); + writeTag.setAddress(pcsSetting.getPointAddress()); + writeTag.setValue(pcsSetting.getStartCommand()); + writeTags.add(writeTag); + + power = pcsSetting.getStartPower(); + } else { + // 关机 + power = pcsSetting.getStopPower(); + } + + JSONArray array = JSON.parseArray(pcsSetting.getClusterPointAddress()); + for (int i = 0; i < pcsSetting.getClusterNum(); i++) { + Object clusterPointAddress = array.get(i); + WriteTagConfig clusterWriteTag = new WriteTagConfig(); + clusterWriteTag.setAddress(String.valueOf(clusterPointAddress)); + // 电池簇PCS有功功率给定默认置0 + if (power == null) { + power = BigDecimal.ZERO; + } + clusterWriteTag.setValue(power); + writeTags.add(clusterWriteTag); + } + if (WorkStatus.STOP.getCode().equals(workStatus)) { + // 关机先发送有功功率给定值再发送关机指令 + WriteTagConfig writeTag = new WriteTagConfig(); + writeTag.setAddress(pcsSetting.getPointAddress()); + writeTag.setValue(pcsSetting.getStopCommand()); + writeTags.add(writeTag); + } + return writeTags; + } + + public List getWriteTags(EmsPcsSetting pcsSetting, BigDecimal chargeDischargePower) { + List writeTags = new ArrayList<>(); + JSONArray array = JSON.parseArray(pcsSetting.getClusterPointAddress()); + for (int i = 0; i < pcsSetting.getClusterNum(); i++) { + Object clusterPointAddress = array.get(i); + WriteTagConfig clusterWriteTag = new WriteTagConfig(); + clusterWriteTag.setAddress(String.valueOf(clusterPointAddress)); + clusterWriteTag.setValue(chargeDischargePower); + writeTags.add(clusterWriteTag); + } + return writeTags; + } + + public DeviceConfig getDeviceConfig(String siteId, String deviceId, EmsDevicesSetting device, EmsPcsSetting pcsSetting, BigDecimal chargeDischargePower, int writeType) { + if (Objects.isNull(pcsSetting)) { + pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(device.getId()); + if (pcsSetting == null) { + logger.info("当前站点: {}, PCS设备: {} 未找到对应PCS配置", siteId, deviceId); + return null; + } + } + if (device.getIpPort() == null || device.getSlaveId() == null) { + logger.info("当前站点: {}, PCS设备: {} 未配置IP端口或从站号", siteId, deviceId); + return null; + } + DeviceConfig deviceConfig = new DeviceConfig(); + deviceConfig.setDeviceNumber(device.getDeviceId()); + deviceConfig.setDeviceName(device.getDeviceName()); + deviceConfig.setSlaveId(device.getSlaveId().intValue()); + deviceConfig.setHost(device.getIpAddress()); + deviceConfig.setPort(device.getIpPort().intValue()); + deviceConfig.setWriteTags(writeType == 0 ? getWriteTags(pcsSetting, chargeDischargePower) : getSwitchDeviceWriteTags(pcsSetting, device.getWorkStatus())); + return deviceConfig; + } + + private void sendModbusCommand(List pcsDeviceList, EmsPcsSetting pcsSetting, ChargeStatus chargeStatus, BigDecimal chargeDischargePower, + EmsStrategyTemp emsStrategyTemp, boolean needAntiReverseFlow, Integer powerDownType) { + for (EmsDevicesSetting pcsDevice : pcsDeviceList) { + String siteId = pcsDevice.getSiteId(); + String deviceId = pcsDevice.getDeviceId(); + List strategyLogList = getStrategyLog(deviceId, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow); + if (CollectionUtils.isNotEmpty(strategyLogList)) { + boolean isExist = true; + if (ChargeStatus.DISCHARGING.equals(chargeStatus) && needAntiReverseFlow) { + isExist = false; + } + if (isExist) { + logger.info("当前站点: {}, PCS设备: {} 当前时间段已存在策略执行记录,不再重复执行", siteId, deviceId); + continue; + } + } + + // 每次操作先判断设备工作状态 + if (StringUtils.isEmpty(pcsDevice.getWorkStatus()) || WorkStatus.ABNORMAL.getCode().equals(pcsDevice.getWorkStatus())) { + // 设备故障,不发送指令 + continue; + } else if (WorkStatus.STOP.getCode().equals(pcsDevice.getWorkStatus())) { + // 设备停机 + if (ChargeStatus.STANDBY.equals(chargeStatus)) { + // 待机,则不写入功率值 + continue; + } else { + // 充、放电,则先开机设备 + switchDevice(pcsDevice, pcsSetting, WorkStatus.NORMAL); + continue; + } + } + + DeviceConfig deviceConfig = getDeviceConfig(siteId, deviceId, pcsDevice, pcsSetting, chargeDischargePower, 0); + if (deviceConfig == null) { + continue; + } + boolean result = modbusProcessor.writeDataToDeviceWithRetry(deviceConfig); + if (!result) { + logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", siteId, deviceId, chargeStatus.getInfo()); + continue; + } else { + if (ChargeStatus.STANDBY.equals(chargeStatus)) { + // 待机,先写功率值,再关机 + if (!switchDevice(pcsDevice, pcsSetting, WorkStatus.STOP)) { + logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", siteId, deviceId, WorkStatus.STOP.getInfo()); + continue; + } + } + } + // 记录策略执行日志 + saveStrategyLog(deviceId, chargeDischargePower, chargeStatus.getCode(), emsStrategyTemp, needAntiReverseFlow, powerDownType); + } + } + + //设备开关机 + private boolean switchDevice(EmsDevicesSetting pcsDevice, EmsPcsSetting pcsSetting, WorkStatus workStatus) { + String siteId = pcsDevice.getSiteId(); + String deviceId = pcsDevice.getDeviceId(); + pcsDevice.setWorkStatus(workStatus.getCode()); + DeviceConfig deviceConfig = getDeviceConfig(siteId, deviceId, pcsDevice, pcsSetting , null, 1); + if (deviceConfig == null) { + return false; + } + boolean result = modbusProcessor.writeDataToDeviceWithRetry(deviceConfig); + if (!result) { + logger.info("当前站点: {}, PCS设备: {} modbus控制设备{}指令发送失败", siteId, deviceConfig, workStatus.getInfo()); + } + return result; + } + + // 判断当前时间是否在时间范围内 + private static boolean isTimeInRange(LocalTime now, Date startTime, Date endTime) { + ZoneId zoneId = ZoneId.of("Asia/Shanghai"); + LocalTime startLocalTime = startTime.toInstant() + .atZone(zoneId) + .toLocalTime(); + LocalTime endLocalTime = endTime.toInstant() + .atZone(zoneId) + .toLocalTime(); + return now.equals(startLocalTime) || (now.isAfter(startLocalTime) && now.isBefore(endLocalTime)); + } + + // 判断SOC上限和下限 + private boolean isSocInRange(EmsStrategyTemp emsStrategyTemp) { + BigDecimal socDown = SOC_DOWN; + BigDecimal socUp = SOC_UP; + if (SocLimit.ON.getCode().equals(emsStrategyTemp.getSdcLimit())) { + socDown = emsStrategyTemp.getSdcDown(); + socUp = emsStrategyTemp.getSdcUp(); + } + // 查询电池堆(BMSD) SOC + EmsBatteryStack emsBatteryStack = emsBatteryStackMapper.getSiteSumStackInfo(emsStrategyTemp.getSiteId()); + if (emsBatteryStack == null || emsBatteryStack.getStackSoc() == null) { + return true; + } + + // 充电阶段判断SOC上限值 + if (ChargeStatus.CHARGING.getCode().equals(emsStrategyTemp.getChargeStatus()) && emsBatteryStack.getStackSoc().compareTo(socUp) >= 0) { + return false; + } + + // 放电阶段判断SOC下限值 + if (ChargeStatus.DISCHARGING.getCode().equals(emsStrategyTemp.getChargeStatus()) && emsBatteryStack.getStackSoc().compareTo(socDown) <= 0) { + return false; + } + + return true; + } + +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/util/CronUtils.java b/ems-quartz/src/main/java/com/xzzn/quartz/util/CronUtils.java index 052ed37..10b7764 100644 --- a/ems-quartz/src/main/java/com/xzzn/quartz/util/CronUtils.java +++ b/ems-quartz/src/main/java/com/xzzn/quartz/util/CronUtils.java @@ -60,4 +60,25 @@ public class CronUtils throw new IllegalArgumentException(e.getMessage()); } } + + /** + * 返回当前时间到下一次执行时间间隔的毫秒 + */ + public static long getNextExecutionIntervalMillis(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + Date now = new Date(); + Date nextExecution = cron.getNextValidTimeAfter(now); + Date nextExecution2 = cron.getNextValidTimeAfter(nextExecution); + + return nextExecution2.getTime() - nextExecution.getTime(); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } + } diff --git a/ems-system/pom.xml b/ems-system/pom.xml index 458ffa1..7f2b1e1 100644 --- a/ems-system/pom.xml +++ b/ems-system/pom.xml @@ -22,6 +22,10 @@ com.xzzn ems-common + + org.glassfish.jaxb + jaxb-runtime + diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmMatchData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmMatchData.java new file mode 100644 index 0000000..e6f03c9 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmMatchData.java @@ -0,0 +1,117 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 告警点位匹配数据对象 ems_alarm_match_data + * + * @author xzzn + * @date 2025-09-22 + */ +public class EmsAlarmMatchData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 告警点位 */ + @Excel(name = "告警点位") + private String point; + + /** 告警值 */ + @Excel(name = "告警值") + private Long alarmData; + + /** 告警描述 */ + @Excel(name = "告警描述") + private String alarmDescription; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备类型 */ + @Excel(name = "设备类型") + private String deviceCategory; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setPoint(String point) + { + this.point = point; + } + + public String getPoint() + { + return point; + } + + public void setAlarmData(Long alarmData) + { + this.alarmData = alarmData; + } + + public Long getAlarmData() + { + return alarmData; + } + + public void setAlarmDescription(String alarmDescription) + { + this.alarmDescription = alarmDescription; + } + + public String getAlarmDescription() + { + return alarmDescription; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceCategory(String deviceCategory) + { + this.deviceCategory = deviceCategory; + } + + public String getDeviceCategory() + { + return deviceCategory; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("point", getPoint()) + .append("alarmData", getAlarmData()) + .append("alarmDescription", getAlarmDescription()) + .append("siteId", getSiteId()) + .append("deviceCategory", getDeviceCategory()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmRecords.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmRecords.java index f9a673b..7bd68ac 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmRecords.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAlarmRecords.java @@ -11,7 +11,7 @@ import com.xzzn.common.annotation.Excel; * 告警记录对象 ems_alarm_records * * @author xzzn - * @date 2025-06-17 + * @date 2025-06-29 */ public class EmsAlarmRecords extends BaseEntity { @@ -24,8 +24,8 @@ public class EmsAlarmRecords extends BaseEntity @Excel(name = "设备类型") private String deviceType; - /** 告警等级 */ - @Excel(name = "告警等级") + /** 告警等级:A-提示 B-一般 C-严重 D紧急 */ + @Excel(name = "告警等级:A-提示 B-一般 C-严重 D紧急") private String alarmLevel; /** 告警内容 */ @@ -42,21 +42,25 @@ public class EmsAlarmRecords extends BaseEntity @Excel(name = "告警结束时间", width = 30, dateFormat = "yyyy-MM-dd") private Date alarmEndTime; - /** 状态 */ - @Excel(name = "状态") + /** 告警点位 */ + @Excel(name = "告警点位") + private String alarmPoint; + + /** 状态:0-待处理 1-已处理 2-处理中 */ + @Excel(name = "状态:0-待处理 1-已处理 2-处理中") private String status; /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; - /** 设备名称,用于标识设备 */ - @Excel(name = "设备名称,用于标识设备") - private String deviceName; + /** 工单号(规则:T+日期+6位随机) */ + @Excel(name = "工单号", readConverterExp = "规=则:T+日期+6位随机") + private String ticketNo; public void setId(Long id) { @@ -118,6 +122,16 @@ public class EmsAlarmRecords extends BaseEntity return alarmEndTime; } + public void setAlarmPoint(String alarmPoint) + { + this.alarmPoint = alarmPoint; + } + + public String getAlarmPoint() + { + return alarmPoint; + } + public void setStatus(String status) { this.status = status; @@ -128,34 +142,34 @@ public class EmsAlarmRecords extends BaseEntity return status; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } - public void setDeviceName(String deviceName) + public void setTicketNo(String ticketNo) { - this.deviceName = deviceName; + this.ticketNo = ticketNo; } - public String getDeviceName() + public String getTicketNo() { - return deviceName; + return ticketNo; } @Override @@ -167,6 +181,7 @@ public class EmsAlarmRecords extends BaseEntity .append("alarmContent", getAlarmContent()) .append("alarmStartTime", getAlarmStartTime()) .append("alarmEndTime", getAlarmEndTime()) + .append("alarmPoint", getAlarmPoint()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) @@ -175,7 +190,7 @@ public class EmsAlarmRecords extends BaseEntity .append("remark", getRemark()) .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) - .append("deviceName", getDeviceName()) + .append("ticketNo", getTicketNo()) .toString(); } -} +} \ No newline at end of file diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsAmmeterData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAmmeterData.java new file mode 100644 index 0000000..d62e835 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsAmmeterData.java @@ -0,0 +1,2416 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 总数据对象 ems_ammeter_data + * + * @author xzzn + * @date 2025-07-29 + */ +public class EmsAmmeterData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 当前组合有功总电能 */ + @Excel(name = "当前组合有功总电能") + private BigDecimal currentCombActiveTotal; + + /** 当前组合有功尖电能 */ + @Excel(name = "当前组合有功尖电能") + private BigDecimal currentCombActivePeak; + + /** 当前组合有功峰电能 */ + @Excel(name = "当前组合有功峰电能") + private BigDecimal currentCombActiveHigh; + + /** 当前组合有功平电能 */ + @Excel(name = "当前组合有功平电能") + private BigDecimal currentCombActiveFlat; + + /** 当前组合有功谷电能 */ + @Excel(name = "当前组合有功谷电能") + private BigDecimal currentCombActiveValley; + + /** 当前正向总有功电能 */ + @Excel(name = "当前正向总有功电能") + private BigDecimal currentForwardActiveTotal; + + /** 当前正向有功尖电能 */ + @Excel(name = "当前正向有功尖电能") + private BigDecimal currentForwardActivePeak; + + /** 当前正向有功峰电能 */ + @Excel(name = "当前正向有功峰电能") + private BigDecimal currentForwardActiveHigh; + + /** 当前正向有功平电能 */ + @Excel(name = "当前正向有功平电能") + private BigDecimal currentForwardActiveFlat; + + /** 当前正向有功谷电能 */ + @Excel(name = "当前正向有功谷电能") + private BigDecimal currentForwardActiveValley; + + /** 当前反向总有功电能 */ + @Excel(name = "当前反向总有功电能") + private BigDecimal currentReverseActiveTotal; + + /** 当前反向有功尖电能 */ + @Excel(name = "当前反向有功尖电能") + private BigDecimal currentReverseActivePeak; + + /** 当前反向有功峰电能 */ + @Excel(name = "当前反向有功峰电能") + private BigDecimal currentReverseActiveHigh; + + /** 当前反向有功平电能 */ + @Excel(name = "当前反向有功平电能") + private BigDecimal currentReverseActiveFlat; + + /** 当前反向有功谷电能 */ + @Excel(name = "当前反向有功谷电能") + private BigDecimal currentReverseActiveValley; + + /** 当前组合无功总电能 */ + @Excel(name = "当前组合无功总电能") + private BigDecimal currentCombReactiveTotal; + + /** 当前组合无功尖电能 */ + @Excel(name = "当前组合无功尖电能") + private BigDecimal currentCombReactivePeak; + + /** 当前组合无功峰电能 */ + @Excel(name = "当前组合无功峰电能") + private BigDecimal currentCombReactiveHigh; + + /** 当前组合无功平电能 */ + @Excel(name = "当前组合无功平电能") + private BigDecimal currentCombReactiveFlat; + + /** 当前组合无功谷电能 */ + @Excel(name = "当前组合无功谷电能") + private BigDecimal currentCombReactiveValley; + + /** 当前正向总无功电能 */ + @Excel(name = "当前正向总无功电能") + private BigDecimal currentForwardReactiveTotal; + + /** 当前正向无功尖电能 */ + @Excel(name = "当前正向无功尖电能") + private BigDecimal currentForwardReactivePeak; + + /** 当前正向无功峰电能 */ + @Excel(name = "当前正向无功峰电能") + private BigDecimal currentForwardReactiveHigh; + + /** 当前正向无功平电能 */ + @Excel(name = "当前正向无功平电能") + private BigDecimal currentForwardReactiveFlat; + + /** 当前正向无功谷电能 */ + @Excel(name = "当前正向无功谷电能") + private BigDecimal currentForwardReactiveValley; + + /** 当前反向总无功电能 */ + @Excel(name = "当前反向总无功电能") + private BigDecimal currentReverseReactiveTotal; + + /** 当前反向无功尖电能 */ + @Excel(name = "当前反向无功尖电能") + private BigDecimal currentReverseReactivePeak; + + /** 当前反向无功峰电能 */ + @Excel(name = "当前反向无功峰电能") + private BigDecimal currentReverseReactiveHigh; + + /** 当前反向无功平电能 */ + @Excel(name = "当前反向无功平电能") + private BigDecimal currentReverseReactiveFlat; + + /** 当前反向无功谷电能 */ + @Excel(name = "当前反向无功谷电能") + private BigDecimal currentReverseReactiveValley; + + /** A相电压 */ + @Excel(name = "A相电压") + private BigDecimal phaseAVoltage; + + /** B相电压 */ + @Excel(name = "B相电压") + private BigDecimal phaseBVoltage; + + /** C相电压 */ + @Excel(name = "C相电压") + private BigDecimal phaseCVoltage; + + /** A相电流 */ + @Excel(name = "A相电流") + private BigDecimal phaseACurrent; + + /** B相电流 */ + @Excel(name = "B相电流") + private BigDecimal phaseBCurrent; + + /** C相电流 */ + @Excel(name = "C相电流") + private BigDecimal phaseCCurrent; + + /** 频率 */ + @Excel(name = "频率") + private BigDecimal frequency; + + /** A-B线电压 */ + @Excel(name = "A-B线电压") + private BigDecimal abLineVoltage; + + /** C-B线电压 */ + @Excel(name = "C-B线电压") + private BigDecimal cbLineVoltage; + + /** A-C线电压 */ + @Excel(name = "A-C线电压") + private BigDecimal acLineVoltage; + + /** 正向有功最大需量 */ + @Excel(name = "正向有功最大需量") + private BigDecimal forwardAcMaxDemand; + + /** 反向有功最大需量 */ + @Excel(name = "反向有功最大需量") + private BigDecimal reverseAcMaxDemand; + + /** A相有功功率 */ + @Excel(name = "A相有功功率") + private BigDecimal phaseAActivePower; + + /** B相有功功率 */ + @Excel(name = "B相有功功率") + private BigDecimal phaseBActivePower; + + /** C相有功功率 */ + @Excel(name = "C相有功功率") + private BigDecimal phaseCActivePower; + + /** 总有功功率 */ + @Excel(name = "总有功功率") + private BigDecimal totalActivePower; + + /** A相无功功率 */ + @Excel(name = "A相无功功率") + private BigDecimal phaseAReactivePower; + + /** B相无功功率 */ + @Excel(name = "B相无功功率") + private BigDecimal phaseBReactivePower; + + /** C相无功功率 */ + @Excel(name = "C相无功功率") + private BigDecimal phaseCReactivePower; + + /** 总无功功率 */ + @Excel(name = "总无功功率") + private BigDecimal totalReactivePower; + + /** A相视在功率 */ + @Excel(name = "A相视在功率") + private BigDecimal phaseAApparentPower; + + /** B相视在功率 */ + @Excel(name = "B相视在功率") + private BigDecimal phaseBApparentPower; + + /** C相视在功率 */ + @Excel(name = "C相视在功率") + private BigDecimal phaseCApparentPower; + + /** 总视在功率 */ + @Excel(name = "总视在功率") + private BigDecimal totalApparentPower; + + /** A相功率因数 */ + @Excel(name = "A相功率因数") + private BigDecimal phaseAPowerFactor; + + /** B相功率因数 */ + @Excel(name = "B相功率因数") + private BigDecimal phaseBPowerFactor; + + /** C相功率因数 */ + @Excel(name = "C相功率因数") + private BigDecimal phaseCPowerFactor; + + /** 总功率因数 */ + @Excel(name = "总功率因数") + private BigDecimal totalPowerFactor; + + /** 当日正向有功最大需量 */ + @Excel(name = "当日正向有功最大需量") + private BigDecimal dailyForwardMaxDemand; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 二次-AB 线电压 */ + @Excel(name = "二次-AB 线电压") + private BigDecimal secondaryAbLineVoltage; + + /** 二次-A 相电流 */ + @Excel(name = "二次-A 相电流") + private BigDecimal secondaryAPhaseCurrent; + + /** 二次-A 相电压 */ + @Excel(name = "二次-A 相电压") + private BigDecimal secondaryAPhaseVoltage; + + /** 二次-A 相功率因数 */ + @Excel(name = "二次-A 相功率因数") + private BigDecimal secondaryAPowerFactor; + + /** 二次-A 相视在功率 */ + @Excel(name = "二次-A 相视在功率") + private BigDecimal secondaryAApparentPower; + + /** 二次-A 相无功功率 */ + @Excel(name = "二次-A 相无功功率") + private BigDecimal secondaryAReactivePower; + + /** 二次-A 相有功功率 */ + @Excel(name = "二次-A 相有功功率") + private BigDecimal secondaryAActivePower; + + /** 二次-BC 线电压 */ + @Excel(name = "二次-BC 线电压") + private BigDecimal secondaryBcLineVoltage; + + /** 二次-B 相电流 */ + @Excel(name = "二次-B 相电流") + private BigDecimal secondaryBPhaseCurrent; + + /** 二次-B 相电压 */ + @Excel(name = "二次-B 相电压") + private BigDecimal secondaryBPhaseVoltage; + + /** 二次-B 相功率因数 */ + @Excel(name = "二次-B 相功率因数") + private BigDecimal secondaryBPowerFactor; + + /** 二次-B 相视在功率 */ + @Excel(name = "二次-B 相视在功率") + private BigDecimal secondaryBApparentPower; + + /** 二次-B 相无功功率 */ + @Excel(name = "二次-B 相无功功率") + private BigDecimal secondaryBReactivePower; + + /** 二次-B 相有功功率 */ + @Excel(name = "二次-B 相有功功率") + private BigDecimal secondaryBActivePower; + + /** 二次-CA 线电压 */ + @Excel(name = "二次-CA 线电压") + private BigDecimal secondaryCaLineVoltage; + + /** 二次-C 相电流 */ + @Excel(name = "二次-C 相电流") + private BigDecimal secondaryCPhaseCurrent; + + /** 二次-C 相电压 */ + @Excel(name = "二次-C 相电压") + private BigDecimal secondaryCPhaseVoltage; + + /** 二次-C 相功率因数 */ + @Excel(name = "二次-C 相功率因数") + private BigDecimal secondaryCPowerFactor; + + /** 二次-C 相视在功率 */ + @Excel(name = "二次-C 相视在功率") + private BigDecimal secondaryCApparentPower; + + /** 二次-C 相无功功率 */ + @Excel(name = "二次-C 相无功功率") + private BigDecimal secondaryCReactivePower; + + /** 二次-C 相有功功率 */ + @Excel(name = "二次-C 相有功功率") + private BigDecimal secondaryCActivePower; + + /** 二次-电网频率 */ + @Excel(name = "二次-电网频率") + private BigDecimal secondaryGridFrequency; + + /** 二次-反向无功电能 */ + @Excel(name = "二次-反向无功电能") + private BigDecimal secondaryReverseReactiveEnergy; + + /** 二次-负向有功电能 */ + @Excel(name = "二次-负向有功电能") + private BigDecimal secondaryNegativeActiveEnergy; + + /** 二次-总功率因数 */ + @Excel(name = "二次-总功率因数") + private BigDecimal secondaryTotalPowerFactor; + + /** 二次-总视在功率 */ + @Excel(name = "二次-总视在功率") + private BigDecimal secondaryTotalApparentPower; + + /** 二次-总无功功率 */ + @Excel(name = "二次-总无功功率") + private BigDecimal secondaryTotalReactivePower; + + /** 二次-正向无功电能 */ + @Excel(name = "二次-正向无功电能") + private BigDecimal secondaryPositiveReactiveEnergy; + + /** 二次-正向有功电能 */ + @Excel(name = "二次-正向有功电能") + private BigDecimal secondaryPositiveActiveEnergy; + + /** 二次-总有功功率 */ + @Excel(name = "二次-总有功功率") + private BigDecimal secondaryTotalActivePower; + + /** 反向无功电能 EQ- */ + @Excel(name = "反向无功电能 EQ-") + private BigDecimal reverseReactiveEnergyEqMinus; + + /** 反向有功电能 EP- */ + @Excel(name = "反向有功电能 EP-") + private BigDecimal reverseActiveEnergyEpMinus; + + /** 正向无功电能 EQ+ */ + @Excel(name = "正向无功电能 EQ+") + private BigDecimal positiveReactiveEnergyEqPlus; + + /** 正向有功电能 EP+ */ + @Excel(name = "正向有功电能 EP+") + private BigDecimal positiveActiveEnergyEpPlus; + + /** 电流变比 */ + @Excel(name = "电流变比") + private BigDecimal currentPercent; + + /** 电压变比 */ + @Excel(name = "电压变比") + private BigDecimal voltagePercent; + + /** 平均电流 */ + @Excel(name = "平均电流") + private BigDecimal avgCurrent; + + /** 总正向有功电能2 */ + @Excel(name = "总正向有功电能2") + private BigDecimal totalForwardActiveTwo; + + /** 总尖正向有功电能 */ + @Excel(name = "总尖正向有功电能") + private BigDecimal totalPeakForwardActive; + + /** 总峰正向有功电能 */ + @Excel(name = "总峰正向有功电能") + private BigDecimal totalHighForwardActive; + + /** 总平正向有功电能 */ + @Excel(name = "总平正向有功电能") + private BigDecimal totalFlatForwardActive; + + /** 总谷正向有功电能 */ + @Excel(name = "总谷正向有功电能") + private BigDecimal totalValleyForwardActive; + + /** 总反向有功电能2 */ + @Excel(name = "总反向有功电能2") + private BigDecimal totalReverseActiveTwo; + + /** 总尖反向有功电能 */ + @Excel(name = "总尖反向有功电能") + private BigDecimal totalPeakReverseActive; + + /** 总峰反向有功电能 */ + @Excel(name = "总峰反向有功电能") + private BigDecimal totalHighReverseActive; + + /** 总平反向有功电能 */ + @Excel(name = "总平反向有功电能") + private BigDecimal totalFlatReverseActive; + + /** 总谷反向有功电能 */ + @Excel(name = "总谷反向有功电能") + private BigDecimal totalValleyReverseActive; + + /** 断线检测指示 */ + @Excel(name = "断线检测指示") + private String disconnectDetectionIndication; + + /** 额定一次电流值 */ + @Excel(name = "额定一次电流值") + private BigDecimal ratedPrimaryCurrentValue; + + /** 开关量输入输出状态 */ + @Excel(name = "开关量输入输出状态") + private String switchInputOutputStatus; + + /** 报警状态 */ + @Excel(name = "报警状态") + private String alarmStatus; + + /** 当前总电压百分比 */ + @Excel(name = "当前总电压百分比") + private BigDecimal currentTotalVoltagePercent; + + /** 电压直流含量百分比 */ + @Excel(name = "电压直流含量百分比") + private BigDecimal voltageContentPercent; + + /** 电压交流含量百分比 */ + @Excel(name = "电压交流含量百分比") + private BigDecimal voltageAcPercent; + + /** 当前总电流百分比 */ + @Excel(name = "当前总电流百分比") + private BigDecimal currentTotalCurrentPercent; + + /** 电流直流含量百分比 */ + @Excel(name = "电流直流含量百分比") + private BigDecimal currentContentPercent; + + /** 电流交流含量百分比 */ + @Excel(name = "电流交流含量百分比") + private BigDecimal currentAcPercent; + + /** 当前总功率百分比 */ + @Excel(name = "当前总功率百分比") + private BigDecimal currentTotalPowerPercent; + + /** 功率直流含量百分比 */ + @Excel(name = "功率直流含量百分比") + private BigDecimal powerContentPercent; + + /** 功率交流含量百分比 */ + @Excel(name = "功率交流含量百分比") + private BigDecimal powerAcPercent; + + /** 日期时间设置(年月) */ + @Excel(name = "日期时间设置", readConverterExp = "年=月") + private String dataSettingYearMonth; + + /** 日期时间设置(日时) */ + @Excel(name = "日期时间设置", readConverterExp = "日=时") + private String dataSettingDayHour; + + /** 日期时间设置(分秒) */ + @Excel(name = "日期时间设置", readConverterExp = "分=秒") + private String dataSettingMinutesSeconds; + + /** 当前抄表日(高)、当前费率(低) */ + @Excel(name = "当前抄表日", readConverterExp = "高=") + private BigDecimal currentRate; + + /** 软件版本号 */ + @Excel(name = "软件版本号") + private String versionNumber; + + /** 电压 */ + @Excel(name = "电压") + private BigDecimal voltage; + + /** 电流 */ + @Excel(name = "电流") + private BigDecimal current; + + /** 功率 */ + @Excel(name = "功率") + private BigDecimal power; + + /** 内部温度 */ + @Excel(name = "内部温度") + private BigDecimal internalTemp; + + /** 总正向有功电能1 */ + @Excel(name = "总正向有功电能1") + private BigDecimal totalForwardActiveOne; + + /** 总反向有功电能1 */ + @Excel(name = "总反向有功电能1") + private BigDecimal totalReverseActiveOne; + + /** 正向无功最大需量 */ + @Excel(name = "正向无功最大需量") + private BigDecimal forwardReactiveMaxDemand; + + /** 反向无功最大需量 */ + @Excel(name = "反向无功最大需量") + private BigDecimal reverseReactiveMaxDemand; + + /** A 相正向有功电能 */ + @Excel(name = "A 相正向有功电能") + private BigDecimal aForwardActiveEnergy; + + /** B 相正向有功电能 */ + @Excel(name = "B 相正向有功电能") + private BigDecimal bForwardActiveEnergy; + + /** C 相正向有功电能 */ + @Excel(name = "C 相正向有功电能") + private BigDecimal cForwardActiveEnergy; + + /** DIDO 状态、失压状态 */ + @Excel(name = "DIDO 状态、失压状态") + private String didoStatus; + + /** 运行状态 1(高 8 位)/运行状态 2(低 8 位) */ + @Excel(name = "运行状态 1", readConverterExp = "高=,8=,位=") + private String runningStatus; + + /** 零序电流 */ + @Excel(name = "零序电流") + private BigDecimal zeroSeqCurrent; + + /** 电压不平衡度 */ + @Excel(name = "电压不平衡度") + private BigDecimal voltageUnbalanceDegree; + + /** 电流不平衡度 */ + @Excel(name = "电流不平衡度") + private BigDecimal currentUnbalanceDegree; + + /** 当日反向有功最大需量 */ + @Excel(name = "当日反向有功最大需量") + private BigDecimal dailyReverseAcMaxDemand; + + /** 当日正向无功最大需量 */ + @Excel(name = "当日正向无功最大需量") + private BigDecimal dailyForwardReacMaxDemand; + + /** 当日反向无功最大需量 */ + @Excel(name = "当日反向无功最大需量") + private BigDecimal dailyReverseReacMaxDemand; + + /** 上 1 日正向有功最大需量 */ + @Excel(name = "上 1 日正向有功最大需量") + private BigDecimal preDayForwardAcMaxDemand; + + /** 上 1 日反向有功最大需量 */ + @Excel(name = "上 1 日反向有功最大需量") + private BigDecimal preDayReverseAcMaxDemand; + + /** 上 1 日正向无功最大需量 */ + @Excel(name = "上 1 日正向无功最大需量") + private BigDecimal preDayForwardReacMaxDemand; + + /** 上 1 日反向无功最大需量 */ + @Excel(name = "上 1 日反向无功最大需量") + private BigDecimal preDayReverseReacMaxDemand; + + /** 上 2 日正向有功最大需量 */ + @Excel(name = "上 2 日正向有功最大需量") + private BigDecimal pre2dForwardAcMaxDemand; + + /** 上 2 日反向有功最大需量 */ + @Excel(name = "上 2 日反向有功最大需量") + private BigDecimal pre2dReverseAcMaxDemand; + + /** 上 2 日正向无功最大需量 */ + @Excel(name = "上 2 日正向无功最大需量") + private BigDecimal pre2dForwardReacMaxDemand; + + /** 上 2 日反向无功最大需量 */ + @Excel(name = "上 2 日反向无功最大需量") + private BigDecimal pre2dReverseReacMaxDemand; + + /** 当前正向有功需量 */ + @Excel(name = "当前正向有功需量") + private BigDecimal currentForwardAcDemand; + + /** 当前反向有功需量 */ + @Excel(name = "当前反向有功需量") + private BigDecimal currentReverseAcDemand; + + /** 当前正向无功需量 */ + @Excel(name = "当前正向无功需量") + private BigDecimal currentForwardReacDemand; + + /** 当前反向无功需量 */ + @Excel(name = "当前反向无功需量") + private BigDecimal currentReverseReacDemand; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataUpdateTime(Date dataUpdateTime) + { + this.dataUpdateTime = dataUpdateTime; + } + + public Date getDataUpdateTime() + { + return dataUpdateTime; + } + + public void setCurrentCombActiveTotal(BigDecimal currentCombActiveTotal) + { + this.currentCombActiveTotal = currentCombActiveTotal; + } + + public BigDecimal getCurrentCombActiveTotal() + { + return currentCombActiveTotal; + } + + public void setCurrentCombActivePeak(BigDecimal currentCombActivePeak) + { + this.currentCombActivePeak = currentCombActivePeak; + } + + public BigDecimal getCurrentCombActivePeak() + { + return currentCombActivePeak; + } + + public void setCurrentCombActiveHigh(BigDecimal currentCombActiveHigh) + { + this.currentCombActiveHigh = currentCombActiveHigh; + } + + public BigDecimal getCurrentCombActiveHigh() + { + return currentCombActiveHigh; + } + + public void setCurrentCombActiveFlat(BigDecimal currentCombActiveFlat) + { + this.currentCombActiveFlat = currentCombActiveFlat; + } + + public BigDecimal getCurrentCombActiveFlat() + { + return currentCombActiveFlat; + } + + public void setCurrentCombActiveValley(BigDecimal currentCombActiveValley) + { + this.currentCombActiveValley = currentCombActiveValley; + } + + public BigDecimal getCurrentCombActiveValley() + { + return currentCombActiveValley; + } + + public void setCurrentForwardActiveTotal(BigDecimal currentForwardActiveTotal) + { + this.currentForwardActiveTotal = currentForwardActiveTotal; + } + + public BigDecimal getCurrentForwardActiveTotal() + { + return currentForwardActiveTotal; + } + + public void setCurrentForwardActivePeak(BigDecimal currentForwardActivePeak) + { + this.currentForwardActivePeak = currentForwardActivePeak; + } + + public BigDecimal getCurrentForwardActivePeak() + { + return currentForwardActivePeak; + } + + public void setCurrentForwardActiveHigh(BigDecimal currentForwardActiveHigh) + { + this.currentForwardActiveHigh = currentForwardActiveHigh; + } + + public BigDecimal getCurrentForwardActiveHigh() + { + return currentForwardActiveHigh; + } + + public void setCurrentForwardActiveFlat(BigDecimal currentForwardActiveFlat) + { + this.currentForwardActiveFlat = currentForwardActiveFlat; + } + + public BigDecimal getCurrentForwardActiveFlat() + { + return currentForwardActiveFlat; + } + + public void setCurrentForwardActiveValley(BigDecimal currentForwardActiveValley) + { + this.currentForwardActiveValley = currentForwardActiveValley; + } + + public BigDecimal getCurrentForwardActiveValley() + { + return currentForwardActiveValley; + } + + public void setCurrentReverseActiveTotal(BigDecimal currentReverseActiveTotal) + { + this.currentReverseActiveTotal = currentReverseActiveTotal; + } + + public BigDecimal getCurrentReverseActiveTotal() + { + return currentReverseActiveTotal; + } + + public void setCurrentReverseActivePeak(BigDecimal currentReverseActivePeak) + { + this.currentReverseActivePeak = currentReverseActivePeak; + } + + public BigDecimal getCurrentReverseActivePeak() + { + return currentReverseActivePeak; + } + + public void setCurrentReverseActiveHigh(BigDecimal currentReverseActiveHigh) + { + this.currentReverseActiveHigh = currentReverseActiveHigh; + } + + public BigDecimal getCurrentReverseActiveHigh() + { + return currentReverseActiveHigh; + } + + public void setCurrentReverseActiveFlat(BigDecimal currentReverseActiveFlat) + { + this.currentReverseActiveFlat = currentReverseActiveFlat; + } + + public BigDecimal getCurrentReverseActiveFlat() + { + return currentReverseActiveFlat; + } + + public void setCurrentReverseActiveValley(BigDecimal currentReverseActiveValley) + { + this.currentReverseActiveValley = currentReverseActiveValley; + } + + public BigDecimal getCurrentReverseActiveValley() + { + return currentReverseActiveValley; + } + + public void setCurrentCombReactiveTotal(BigDecimal currentCombReactiveTotal) + { + this.currentCombReactiveTotal = currentCombReactiveTotal; + } + + public BigDecimal getCurrentCombReactiveTotal() + { + return currentCombReactiveTotal; + } + + public void setCurrentCombReactivePeak(BigDecimal currentCombReactivePeak) + { + this.currentCombReactivePeak = currentCombReactivePeak; + } + + public BigDecimal getCurrentCombReactivePeak() + { + return currentCombReactivePeak; + } + + public void setCurrentCombReactiveHigh(BigDecimal currentCombReactiveHigh) + { + this.currentCombReactiveHigh = currentCombReactiveHigh; + } + + public BigDecimal getCurrentCombReactiveHigh() + { + return currentCombReactiveHigh; + } + + public void setCurrentCombReactiveFlat(BigDecimal currentCombReactiveFlat) + { + this.currentCombReactiveFlat = currentCombReactiveFlat; + } + + public BigDecimal getCurrentCombReactiveFlat() + { + return currentCombReactiveFlat; + } + + public void setCurrentCombReactiveValley(BigDecimal currentCombReactiveValley) + { + this.currentCombReactiveValley = currentCombReactiveValley; + } + + public BigDecimal getCurrentCombReactiveValley() + { + return currentCombReactiveValley; + } + + public void setCurrentForwardReactiveTotal(BigDecimal currentForwardReactiveTotal) + { + this.currentForwardReactiveTotal = currentForwardReactiveTotal; + } + + public BigDecimal getCurrentForwardReactiveTotal() + { + return currentForwardReactiveTotal; + } + + public void setCurrentForwardReactivePeak(BigDecimal currentForwardReactivePeak) + { + this.currentForwardReactivePeak = currentForwardReactivePeak; + } + + public BigDecimal getCurrentForwardReactivePeak() + { + return currentForwardReactivePeak; + } + + public void setCurrentForwardReactiveHigh(BigDecimal currentForwardReactiveHigh) + { + this.currentForwardReactiveHigh = currentForwardReactiveHigh; + } + + public BigDecimal getCurrentForwardReactiveHigh() + { + return currentForwardReactiveHigh; + } + + public void setCurrentForwardReactiveFlat(BigDecimal currentForwardReactiveFlat) + { + this.currentForwardReactiveFlat = currentForwardReactiveFlat; + } + + public BigDecimal getCurrentForwardReactiveFlat() + { + return currentForwardReactiveFlat; + } + + public void setCurrentForwardReactiveValley(BigDecimal currentForwardReactiveValley) + { + this.currentForwardReactiveValley = currentForwardReactiveValley; + } + + public BigDecimal getCurrentForwardReactiveValley() + { + return currentForwardReactiveValley; + } + + public void setCurrentReverseReactiveTotal(BigDecimal currentReverseReactiveTotal) + { + this.currentReverseReactiveTotal = currentReverseReactiveTotal; + } + + public BigDecimal getCurrentReverseReactiveTotal() + { + return currentReverseReactiveTotal; + } + + public void setCurrentReverseReactivePeak(BigDecimal currentReverseReactivePeak) + { + this.currentReverseReactivePeak = currentReverseReactivePeak; + } + + public BigDecimal getCurrentReverseReactivePeak() + { + return currentReverseReactivePeak; + } + + public void setCurrentReverseReactiveHigh(BigDecimal currentReverseReactiveHigh) + { + this.currentReverseReactiveHigh = currentReverseReactiveHigh; + } + + public BigDecimal getCurrentReverseReactiveHigh() + { + return currentReverseReactiveHigh; + } + + public void setCurrentReverseReactiveFlat(BigDecimal currentReverseReactiveFlat) + { + this.currentReverseReactiveFlat = currentReverseReactiveFlat; + } + + public BigDecimal getCurrentReverseReactiveFlat() + { + return currentReverseReactiveFlat; + } + + public void setCurrentReverseReactiveValley(BigDecimal currentReverseReactiveValley) + { + this.currentReverseReactiveValley = currentReverseReactiveValley; + } + + public BigDecimal getCurrentReverseReactiveValley() + { + return currentReverseReactiveValley; + } + + public void setPhaseAVoltage(BigDecimal phaseAVoltage) + { + this.phaseAVoltage = phaseAVoltage; + } + + public BigDecimal getPhaseAVoltage() + { + return phaseAVoltage; + } + + public void setPhaseBVoltage(BigDecimal phaseBVoltage) + { + this.phaseBVoltage = phaseBVoltage; + } + + public BigDecimal getPhaseBVoltage() + { + return phaseBVoltage; + } + + public void setPhaseCVoltage(BigDecimal phaseCVoltage) + { + this.phaseCVoltage = phaseCVoltage; + } + + public BigDecimal getPhaseCVoltage() + { + return phaseCVoltage; + } + + public void setPhaseACurrent(BigDecimal phaseACurrent) + { + this.phaseACurrent = phaseACurrent; + } + + public BigDecimal getPhaseACurrent() + { + return phaseACurrent; + } + + public void setPhaseBCurrent(BigDecimal phaseBCurrent) + { + this.phaseBCurrent = phaseBCurrent; + } + + public BigDecimal getPhaseBCurrent() + { + return phaseBCurrent; + } + + public void setPhaseCCurrent(BigDecimal phaseCCurrent) + { + this.phaseCCurrent = phaseCCurrent; + } + + public BigDecimal getPhaseCCurrent() + { + return phaseCCurrent; + } + + public void setFrequency(BigDecimal frequency) + { + this.frequency = frequency; + } + + public BigDecimal getFrequency() + { + return frequency; + } + + public void setAbLineVoltage(BigDecimal abLineVoltage) + { + this.abLineVoltage = abLineVoltage; + } + + public BigDecimal getAbLineVoltage() + { + return abLineVoltage; + } + + public void setCbLineVoltage(BigDecimal cbLineVoltage) + { + this.cbLineVoltage = cbLineVoltage; + } + + public BigDecimal getCbLineVoltage() + { + return cbLineVoltage; + } + + public void setAcLineVoltage(BigDecimal acLineVoltage) + { + this.acLineVoltage = acLineVoltage; + } + + public BigDecimal getAcLineVoltage() + { + return acLineVoltage; + } + + public void setForwardAcMaxDemand(BigDecimal forwardAcMaxDemand) + { + this.forwardAcMaxDemand = forwardAcMaxDemand; + } + + public BigDecimal getForwardAcMaxDemand() + { + return forwardAcMaxDemand; + } + + public void setReverseAcMaxDemand(BigDecimal reverseAcMaxDemand) + { + this.reverseAcMaxDemand = reverseAcMaxDemand; + } + + public BigDecimal getReverseAcMaxDemand() + { + return reverseAcMaxDemand; + } + + public void setPhaseAActivePower(BigDecimal phaseAActivePower) + { + this.phaseAActivePower = phaseAActivePower; + } + + public BigDecimal getPhaseAActivePower() + { + return phaseAActivePower; + } + + public void setPhaseBActivePower(BigDecimal phaseBActivePower) + { + this.phaseBActivePower = phaseBActivePower; + } + + public BigDecimal getPhaseBActivePower() + { + return phaseBActivePower; + } + + public void setPhaseCActivePower(BigDecimal phaseCActivePower) + { + this.phaseCActivePower = phaseCActivePower; + } + + public BigDecimal getPhaseCActivePower() + { + return phaseCActivePower; + } + + public void setTotalActivePower(BigDecimal totalActivePower) + { + this.totalActivePower = totalActivePower; + } + + public BigDecimal getTotalActivePower() + { + return totalActivePower; + } + + public void setPhaseAReactivePower(BigDecimal phaseAReactivePower) + { + this.phaseAReactivePower = phaseAReactivePower; + } + + public BigDecimal getPhaseAReactivePower() + { + return phaseAReactivePower; + } + + public void setPhaseBReactivePower(BigDecimal phaseBReactivePower) + { + this.phaseBReactivePower = phaseBReactivePower; + } + + public BigDecimal getPhaseBReactivePower() + { + return phaseBReactivePower; + } + + public void setPhaseCReactivePower(BigDecimal phaseCReactivePower) + { + this.phaseCReactivePower = phaseCReactivePower; + } + + public BigDecimal getPhaseCReactivePower() + { + return phaseCReactivePower; + } + + public void setTotalReactivePower(BigDecimal totalReactivePower) + { + this.totalReactivePower = totalReactivePower; + } + + public BigDecimal getTotalReactivePower() + { + return totalReactivePower; + } + + public void setPhaseAApparentPower(BigDecimal phaseAApparentPower) + { + this.phaseAApparentPower = phaseAApparentPower; + } + + public BigDecimal getPhaseAApparentPower() + { + return phaseAApparentPower; + } + + public void setPhaseBApparentPower(BigDecimal phaseBApparentPower) + { + this.phaseBApparentPower = phaseBApparentPower; + } + + public BigDecimal getPhaseBApparentPower() + { + return phaseBApparentPower; + } + + public void setPhaseCApparentPower(BigDecimal phaseCApparentPower) + { + this.phaseCApparentPower = phaseCApparentPower; + } + + public BigDecimal getPhaseCApparentPower() + { + return phaseCApparentPower; + } + + public void setTotalApparentPower(BigDecimal totalApparentPower) + { + this.totalApparentPower = totalApparentPower; + } + + public BigDecimal getTotalApparentPower() + { + return totalApparentPower; + } + + public void setPhaseAPowerFactor(BigDecimal phaseAPowerFactor) + { + this.phaseAPowerFactor = phaseAPowerFactor; + } + + public BigDecimal getPhaseAPowerFactor() + { + return phaseAPowerFactor; + } + + public void setPhaseBPowerFactor(BigDecimal phaseBPowerFactor) + { + this.phaseBPowerFactor = phaseBPowerFactor; + } + + public BigDecimal getPhaseBPowerFactor() + { + return phaseBPowerFactor; + } + + public void setPhaseCPowerFactor(BigDecimal phaseCPowerFactor) + { + this.phaseCPowerFactor = phaseCPowerFactor; + } + + public BigDecimal getPhaseCPowerFactor() + { + return phaseCPowerFactor; + } + + public void setTotalPowerFactor(BigDecimal totalPowerFactor) + { + this.totalPowerFactor = totalPowerFactor; + } + + public BigDecimal getTotalPowerFactor() + { + return totalPowerFactor; + } + + public void setDailyForwardMaxDemand(BigDecimal dailyForwardMaxDemand) + { + this.dailyForwardMaxDemand = dailyForwardMaxDemand; + } + + public BigDecimal getDailyForwardMaxDemand() + { + return dailyForwardMaxDemand; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setSecondaryAbLineVoltage(BigDecimal secondaryAbLineVoltage) + { + this.secondaryAbLineVoltage = secondaryAbLineVoltage; + } + + public BigDecimal getSecondaryAbLineVoltage() + { + return secondaryAbLineVoltage; + } + + public void setSecondaryAPhaseCurrent(BigDecimal secondaryAPhaseCurrent) + { + this.secondaryAPhaseCurrent = secondaryAPhaseCurrent; + } + + public BigDecimal getSecondaryAPhaseCurrent() + { + return secondaryAPhaseCurrent; + } + + public void setSecondaryAPhaseVoltage(BigDecimal secondaryAPhaseVoltage) + { + this.secondaryAPhaseVoltage = secondaryAPhaseVoltage; + } + + public BigDecimal getSecondaryAPhaseVoltage() + { + return secondaryAPhaseVoltage; + } + + public void setSecondaryAPowerFactor(BigDecimal secondaryAPowerFactor) + { + this.secondaryAPowerFactor = secondaryAPowerFactor; + } + + public BigDecimal getSecondaryAPowerFactor() + { + return secondaryAPowerFactor; + } + + public void setSecondaryAApparentPower(BigDecimal secondaryAApparentPower) + { + this.secondaryAApparentPower = secondaryAApparentPower; + } + + public BigDecimal getSecondaryAApparentPower() + { + return secondaryAApparentPower; + } + + public void setSecondaryAReactivePower(BigDecimal secondaryAReactivePower) + { + this.secondaryAReactivePower = secondaryAReactivePower; + } + + public BigDecimal getSecondaryAReactivePower() + { + return secondaryAReactivePower; + } + + public void setSecondaryAActivePower(BigDecimal secondaryAActivePower) + { + this.secondaryAActivePower = secondaryAActivePower; + } + + public BigDecimal getSecondaryAActivePower() + { + return secondaryAActivePower; + } + + public void setSecondaryBcLineVoltage(BigDecimal secondaryBcLineVoltage) + { + this.secondaryBcLineVoltage = secondaryBcLineVoltage; + } + + public BigDecimal getSecondaryBcLineVoltage() + { + return secondaryBcLineVoltage; + } + + public void setSecondaryBPhaseCurrent(BigDecimal secondaryBPhaseCurrent) + { + this.secondaryBPhaseCurrent = secondaryBPhaseCurrent; + } + + public BigDecimal getSecondaryBPhaseCurrent() + { + return secondaryBPhaseCurrent; + } + + public void setSecondaryBPhaseVoltage(BigDecimal secondaryBPhaseVoltage) + { + this.secondaryBPhaseVoltage = secondaryBPhaseVoltage; + } + + public BigDecimal getSecondaryBPhaseVoltage() + { + return secondaryBPhaseVoltage; + } + + public void setSecondaryBPowerFactor(BigDecimal secondaryBPowerFactor) + { + this.secondaryBPowerFactor = secondaryBPowerFactor; + } + + public BigDecimal getSecondaryBPowerFactor() + { + return secondaryBPowerFactor; + } + + public void setSecondaryBApparentPower(BigDecimal secondaryBApparentPower) + { + this.secondaryBApparentPower = secondaryBApparentPower; + } + + public BigDecimal getSecondaryBApparentPower() + { + return secondaryBApparentPower; + } + + public void setSecondaryBReactivePower(BigDecimal secondaryBReactivePower) + { + this.secondaryBReactivePower = secondaryBReactivePower; + } + + public BigDecimal getSecondaryBReactivePower() + { + return secondaryBReactivePower; + } + + public void setSecondaryBActivePower(BigDecimal secondaryBActivePower) + { + this.secondaryBActivePower = secondaryBActivePower; + } + + public BigDecimal getSecondaryBActivePower() + { + return secondaryBActivePower; + } + + public void setSecondaryCaLineVoltage(BigDecimal secondaryCaLineVoltage) + { + this.secondaryCaLineVoltage = secondaryCaLineVoltage; + } + + public BigDecimal getSecondaryCaLineVoltage() + { + return secondaryCaLineVoltage; + } + + public void setSecondaryCPhaseCurrent(BigDecimal secondaryCPhaseCurrent) + { + this.secondaryCPhaseCurrent = secondaryCPhaseCurrent; + } + + public BigDecimal getSecondaryCPhaseCurrent() + { + return secondaryCPhaseCurrent; + } + + public void setSecondaryCPhaseVoltage(BigDecimal secondaryCPhaseVoltage) + { + this.secondaryCPhaseVoltage = secondaryCPhaseVoltage; + } + + public BigDecimal getSecondaryCPhaseVoltage() + { + return secondaryCPhaseVoltage; + } + + public void setSecondaryCPowerFactor(BigDecimal secondaryCPowerFactor) + { + this.secondaryCPowerFactor = secondaryCPowerFactor; + } + + public BigDecimal getSecondaryCPowerFactor() + { + return secondaryCPowerFactor; + } + + public void setSecondaryCApparentPower(BigDecimal secondaryCApparentPower) + { + this.secondaryCApparentPower = secondaryCApparentPower; + } + + public BigDecimal getSecondaryCApparentPower() + { + return secondaryCApparentPower; + } + + public void setSecondaryCReactivePower(BigDecimal secondaryCReactivePower) + { + this.secondaryCReactivePower = secondaryCReactivePower; + } + + public BigDecimal getSecondaryCReactivePower() + { + return secondaryCReactivePower; + } + + public void setSecondaryCActivePower(BigDecimal secondaryCActivePower) + { + this.secondaryCActivePower = secondaryCActivePower; + } + + public BigDecimal getSecondaryCActivePower() + { + return secondaryCActivePower; + } + + public void setSecondaryGridFrequency(BigDecimal secondaryGridFrequency) + { + this.secondaryGridFrequency = secondaryGridFrequency; + } + + public BigDecimal getSecondaryGridFrequency() + { + return secondaryGridFrequency; + } + + public void setSecondaryReverseReactiveEnergy(BigDecimal secondaryReverseReactiveEnergy) + { + this.secondaryReverseReactiveEnergy = secondaryReverseReactiveEnergy; + } + + public BigDecimal getSecondaryReverseReactiveEnergy() + { + return secondaryReverseReactiveEnergy; + } + + public void setSecondaryNegativeActiveEnergy(BigDecimal secondaryNegativeActiveEnergy) + { + this.secondaryNegativeActiveEnergy = secondaryNegativeActiveEnergy; + } + + public BigDecimal getSecondaryNegativeActiveEnergy() + { + return secondaryNegativeActiveEnergy; + } + + public void setSecondaryTotalPowerFactor(BigDecimal secondaryTotalPowerFactor) + { + this.secondaryTotalPowerFactor = secondaryTotalPowerFactor; + } + + public BigDecimal getSecondaryTotalPowerFactor() + { + return secondaryTotalPowerFactor; + } + + public void setSecondaryTotalApparentPower(BigDecimal secondaryTotalApparentPower) + { + this.secondaryTotalApparentPower = secondaryTotalApparentPower; + } + + public BigDecimal getSecondaryTotalApparentPower() + { + return secondaryTotalApparentPower; + } + + public void setSecondaryTotalReactivePower(BigDecimal secondaryTotalReactivePower) + { + this.secondaryTotalReactivePower = secondaryTotalReactivePower; + } + + public BigDecimal getSecondaryTotalReactivePower() + { + return secondaryTotalReactivePower; + } + + public void setSecondaryPositiveReactiveEnergy(BigDecimal secondaryPositiveReactiveEnergy) + { + this.secondaryPositiveReactiveEnergy = secondaryPositiveReactiveEnergy; + } + + public BigDecimal getSecondaryPositiveReactiveEnergy() + { + return secondaryPositiveReactiveEnergy; + } + + public void setSecondaryPositiveActiveEnergy(BigDecimal secondaryPositiveActiveEnergy) + { + this.secondaryPositiveActiveEnergy = secondaryPositiveActiveEnergy; + } + + public BigDecimal getSecondaryPositiveActiveEnergy() + { + return secondaryPositiveActiveEnergy; + } + + public void setSecondaryTotalActivePower(BigDecimal secondaryTotalActivePower) + { + this.secondaryTotalActivePower = secondaryTotalActivePower; + } + + public BigDecimal getSecondaryTotalActivePower() + { + return secondaryTotalActivePower; + } + + public void setReverseReactiveEnergyEqMinus(BigDecimal reverseReactiveEnergyEqMinus) + { + this.reverseReactiveEnergyEqMinus = reverseReactiveEnergyEqMinus; + } + + public BigDecimal getReverseReactiveEnergyEqMinus() + { + return reverseReactiveEnergyEqMinus; + } + + public void setReverseActiveEnergyEpMinus(BigDecimal reverseActiveEnergyEpMinus) + { + this.reverseActiveEnergyEpMinus = reverseActiveEnergyEpMinus; + } + + public BigDecimal getReverseActiveEnergyEpMinus() + { + return reverseActiveEnergyEpMinus; + } + + public void setPositiveReactiveEnergyEqPlus(BigDecimal positiveReactiveEnergyEqPlus) + { + this.positiveReactiveEnergyEqPlus = positiveReactiveEnergyEqPlus; + } + + public BigDecimal getPositiveReactiveEnergyEqPlus() + { + return positiveReactiveEnergyEqPlus; + } + + public void setPositiveActiveEnergyEpPlus(BigDecimal positiveActiveEnergyEpPlus) + { + this.positiveActiveEnergyEpPlus = positiveActiveEnergyEpPlus; + } + + public BigDecimal getPositiveActiveEnergyEpPlus() + { + return positiveActiveEnergyEpPlus; + } + + public void setCurrentPercent(BigDecimal currentPercent) + { + this.currentPercent = currentPercent; + } + + public BigDecimal getCurrentPercent() + { + return currentPercent; + } + + public void setVoltagePercent(BigDecimal voltagePercent) + { + this.voltagePercent = voltagePercent; + } + + public BigDecimal getVoltagePercent() + { + return voltagePercent; + } + + public void setAvgCurrent(BigDecimal avgCurrent) + { + this.avgCurrent = avgCurrent; + } + + public BigDecimal getAvgCurrent() + { + return avgCurrent; + } + + public void setTotalForwardActiveTwo(BigDecimal totalForwardActiveTwo) + { + this.totalForwardActiveTwo = totalForwardActiveTwo; + } + + public BigDecimal getTotalForwardActiveTwo() + { + return totalForwardActiveTwo; + } + + public void setTotalPeakForwardActive(BigDecimal totalPeakForwardActive) + { + this.totalPeakForwardActive = totalPeakForwardActive; + } + + public BigDecimal getTotalPeakForwardActive() + { + return totalPeakForwardActive; + } + + public void setTotalHighForwardActive(BigDecimal totalHighForwardActive) + { + this.totalHighForwardActive = totalHighForwardActive; + } + + public BigDecimal getTotalHighForwardActive() + { + return totalHighForwardActive; + } + + public void setTotalFlatForwardActive(BigDecimal totalFlatForwardActive) + { + this.totalFlatForwardActive = totalFlatForwardActive; + } + + public BigDecimal getTotalFlatForwardActive() + { + return totalFlatForwardActive; + } + + public void setTotalValleyForwardActive(BigDecimal totalValleyForwardActive) + { + this.totalValleyForwardActive = totalValleyForwardActive; + } + + public BigDecimal getTotalValleyForwardActive() + { + return totalValleyForwardActive; + } + + public void setTotalReverseActiveTwo(BigDecimal totalReverseActiveTwo) + { + this.totalReverseActiveTwo = totalReverseActiveTwo; + } + + public BigDecimal getTotalReverseActiveTwo() + { + return totalReverseActiveTwo; + } + + public void setTotalPeakReverseActive(BigDecimal totalPeakReverseActive) + { + this.totalPeakReverseActive = totalPeakReverseActive; + } + + public BigDecimal getTotalPeakReverseActive() + { + return totalPeakReverseActive; + } + + public void setTotalHighReverseActive(BigDecimal totalHighReverseActive) + { + this.totalHighReverseActive = totalHighReverseActive; + } + + public BigDecimal getTotalHighReverseActive() + { + return totalHighReverseActive; + } + + public void setTotalFlatReverseActive(BigDecimal totalFlatReverseActive) + { + this.totalFlatReverseActive = totalFlatReverseActive; + } + + public BigDecimal getTotalFlatReverseActive() + { + return totalFlatReverseActive; + } + + public void setTotalValleyReverseActive(BigDecimal totalValleyReverseActive) + { + this.totalValleyReverseActive = totalValleyReverseActive; + } + + public BigDecimal getTotalValleyReverseActive() + { + return totalValleyReverseActive; + } + + public void setDisconnectDetectionIndication(String disconnectDetectionIndication) + { + this.disconnectDetectionIndication = disconnectDetectionIndication; + } + + public String getDisconnectDetectionIndication() + { + return disconnectDetectionIndication; + } + + public void setRatedPrimaryCurrentValue(BigDecimal ratedPrimaryCurrentValue) + { + this.ratedPrimaryCurrentValue = ratedPrimaryCurrentValue; + } + + public BigDecimal getRatedPrimaryCurrentValue() + { + return ratedPrimaryCurrentValue; + } + + public void setSwitchInputOutputStatus(String switchInputOutputStatus) + { + this.switchInputOutputStatus = switchInputOutputStatus; + } + + public String getSwitchInputOutputStatus() + { + return switchInputOutputStatus; + } + + public void setAlarmStatus(String alarmStatus) + { + this.alarmStatus = alarmStatus; + } + + public String getAlarmStatus() + { + return alarmStatus; + } + + public void setCurrentTotalVoltagePercent(BigDecimal currentTotalVoltagePercent) + { + this.currentTotalVoltagePercent = currentTotalVoltagePercent; + } + + public BigDecimal getCurrentTotalVoltagePercent() + { + return currentTotalVoltagePercent; + } + + public void setVoltageContentPercent(BigDecimal voltageContentPercent) + { + this.voltageContentPercent = voltageContentPercent; + } + + public BigDecimal getVoltageContentPercent() + { + return voltageContentPercent; + } + + public void setVoltageAcPercent(BigDecimal voltageAcPercent) + { + this.voltageAcPercent = voltageAcPercent; + } + + public BigDecimal getVoltageAcPercent() + { + return voltageAcPercent; + } + + public void setCurrentTotalCurrentPercent(BigDecimal currentTotalCurrentPercent) + { + this.currentTotalCurrentPercent = currentTotalCurrentPercent; + } + + public BigDecimal getCurrentTotalCurrentPercent() + { + return currentTotalCurrentPercent; + } + + public void setCurrentContentPercent(BigDecimal currentContentPercent) + { + this.currentContentPercent = currentContentPercent; + } + + public BigDecimal getCurrentContentPercent() + { + return currentContentPercent; + } + + public void setCurrentAcPercent(BigDecimal currentAcPercent) + { + this.currentAcPercent = currentAcPercent; + } + + public BigDecimal getCurrentAcPercent() + { + return currentAcPercent; + } + + public void setCurrentTotalPowerPercent(BigDecimal currentTotalPowerPercent) + { + this.currentTotalPowerPercent = currentTotalPowerPercent; + } + + public BigDecimal getCurrentTotalPowerPercent() + { + return currentTotalPowerPercent; + } + + public void setPowerContentPercent(BigDecimal powerContentPercent) + { + this.powerContentPercent = powerContentPercent; + } + + public BigDecimal getPowerContentPercent() + { + return powerContentPercent; + } + + public void setPowerAcPercent(BigDecimal powerAcPercent) + { + this.powerAcPercent = powerAcPercent; + } + + public BigDecimal getPowerAcPercent() + { + return powerAcPercent; + } + + public void setDataSettingYearMonth(String dataSettingYearMonth) + { + this.dataSettingYearMonth = dataSettingYearMonth; + } + + public String getDataSettingYearMonth() + { + return dataSettingYearMonth; + } + + public void setDataSettingDayHour(String dataSettingDayHour) + { + this.dataSettingDayHour = dataSettingDayHour; + } + + public String getDataSettingDayHour() + { + return dataSettingDayHour; + } + + public void setDataSettingMinutesSeconds(String dataSettingMinutesSeconds) + { + this.dataSettingMinutesSeconds = dataSettingMinutesSeconds; + } + + public String getDataSettingMinutesSeconds() + { + return dataSettingMinutesSeconds; + } + + public void setCurrentRate(BigDecimal currentRate) + { + this.currentRate = currentRate; + } + + public BigDecimal getCurrentRate() + { + return currentRate; + } + + public void setVersionNumber(String versionNumber) + { + this.versionNumber = versionNumber; + } + + public String getVersionNumber() + { + return versionNumber; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setCurrent(BigDecimal current) + { + this.current = current; + } + + public BigDecimal getCurrent() + { + return current; + } + + public void setPower(BigDecimal power) + { + this.power = power; + } + + public BigDecimal getPower() + { + return power; + } + + public void setInternalTemp(BigDecimal internalTemp) + { + this.internalTemp = internalTemp; + } + + public BigDecimal getInternalTemp() + { + return internalTemp; + } + + public void setTotalForwardActiveOne(BigDecimal totalForwardActiveOne) + { + this.totalForwardActiveOne = totalForwardActiveOne; + } + + public BigDecimal getTotalForwardActiveOne() + { + return totalForwardActiveOne; + } + + public void setTotalReverseActiveOne(BigDecimal totalReverseActiveOne) + { + this.totalReverseActiveOne = totalReverseActiveOne; + } + + public BigDecimal getTotalReverseActiveOne() + { + return totalReverseActiveOne; + } + + public void setForwardReactiveMaxDemand(BigDecimal forwardReactiveMaxDemand) + { + this.forwardReactiveMaxDemand = forwardReactiveMaxDemand; + } + + public BigDecimal getForwardReactiveMaxDemand() + { + return forwardReactiveMaxDemand; + } + + public void setReverseReactiveMaxDemand(BigDecimal reverseReactiveMaxDemand) + { + this.reverseReactiveMaxDemand = reverseReactiveMaxDemand; + } + + public BigDecimal getReverseReactiveMaxDemand() + { + return reverseReactiveMaxDemand; + } + + public void setaForwardActiveEnergy(BigDecimal aForwardActiveEnergy) + { + this.aForwardActiveEnergy = aForwardActiveEnergy; + } + + public BigDecimal getaForwardActiveEnergy() + { + return aForwardActiveEnergy; + } + + public void setbForwardActiveEnergy(BigDecimal bForwardActiveEnergy) + { + this.bForwardActiveEnergy = bForwardActiveEnergy; + } + + public BigDecimal getbForwardActiveEnergy() + { + return bForwardActiveEnergy; + } + + public void setcForwardActiveEnergy(BigDecimal cForwardActiveEnergy) + { + this.cForwardActiveEnergy = cForwardActiveEnergy; + } + + public BigDecimal getcForwardActiveEnergy() + { + return cForwardActiveEnergy; + } + + public void setDidoStatus(String didoStatus) + { + this.didoStatus = didoStatus; + } + + public String getDidoStatus() + { + return didoStatus; + } + + public void setRunningStatus(String runningStatus) + { + this.runningStatus = runningStatus; + } + + public String getRunningStatus() + { + return runningStatus; + } + + public void setZeroSeqCurrent(BigDecimal zeroSeqCurrent) + { + this.zeroSeqCurrent = zeroSeqCurrent; + } + + public BigDecimal getZeroSeqCurrent() + { + return zeroSeqCurrent; + } + + public void setVoltageUnbalanceDegree(BigDecimal voltageUnbalanceDegree) + { + this.voltageUnbalanceDegree = voltageUnbalanceDegree; + } + + public BigDecimal getVoltageUnbalanceDegree() + { + return voltageUnbalanceDegree; + } + + public void setCurrentUnbalanceDegree(BigDecimal currentUnbalanceDegree) + { + this.currentUnbalanceDegree = currentUnbalanceDegree; + } + + public BigDecimal getCurrentUnbalanceDegree() + { + return currentUnbalanceDegree; + } + + public void setDailyReverseAcMaxDemand(BigDecimal dailyReverseAcMaxDemand) + { + this.dailyReverseAcMaxDemand = dailyReverseAcMaxDemand; + } + + public BigDecimal getDailyReverseAcMaxDemand() + { + return dailyReverseAcMaxDemand; + } + + public void setDailyForwardReacMaxDemand(BigDecimal dailyForwardReacMaxDemand) + { + this.dailyForwardReacMaxDemand = dailyForwardReacMaxDemand; + } + + public BigDecimal getDailyForwardReacMaxDemand() + { + return dailyForwardReacMaxDemand; + } + + public void setDailyReverseReacMaxDemand(BigDecimal dailyReverseReacMaxDemand) + { + this.dailyReverseReacMaxDemand = dailyReverseReacMaxDemand; + } + + public BigDecimal getDailyReverseReacMaxDemand() + { + return dailyReverseReacMaxDemand; + } + + public void setPreDayForwardAcMaxDemand(BigDecimal preDayForwardAcMaxDemand) + { + this.preDayForwardAcMaxDemand = preDayForwardAcMaxDemand; + } + + public BigDecimal getPreDayForwardAcMaxDemand() + { + return preDayForwardAcMaxDemand; + } + + public void setPreDayReverseAcMaxDemand(BigDecimal preDayReverseAcMaxDemand) + { + this.preDayReverseAcMaxDemand = preDayReverseAcMaxDemand; + } + + public BigDecimal getPreDayReverseAcMaxDemand() + { + return preDayReverseAcMaxDemand; + } + + public void setPreDayForwardReacMaxDemand(BigDecimal preDayForwardReacMaxDemand) + { + this.preDayForwardReacMaxDemand = preDayForwardReacMaxDemand; + } + + public BigDecimal getPreDayForwardReacMaxDemand() + { + return preDayForwardReacMaxDemand; + } + + public void setPreDayReverseReacMaxDemand(BigDecimal preDayReverseReacMaxDemand) + { + this.preDayReverseReacMaxDemand = preDayReverseReacMaxDemand; + } + + public BigDecimal getPreDayReverseReacMaxDemand() + { + return preDayReverseReacMaxDemand; + } + + public void setPre2dForwardAcMaxDemand(BigDecimal pre2dForwardAcMaxDemand) + { + this.pre2dForwardAcMaxDemand = pre2dForwardAcMaxDemand; + } + + public BigDecimal getPre2dForwardAcMaxDemand() + { + return pre2dForwardAcMaxDemand; + } + + public void setPre2dReverseAcMaxDemand(BigDecimal pre2dReverseAcMaxDemand) + { + this.pre2dReverseAcMaxDemand = pre2dReverseAcMaxDemand; + } + + public BigDecimal getPre2dReverseAcMaxDemand() + { + return pre2dReverseAcMaxDemand; + } + + public void setPre2dForwardReacMaxDemand(BigDecimal pre2dForwardReacMaxDemand) + { + this.pre2dForwardReacMaxDemand = pre2dForwardReacMaxDemand; + } + + public BigDecimal getPre2dForwardReacMaxDemand() + { + return pre2dForwardReacMaxDemand; + } + + public void setPre2dReverseReacMaxDemand(BigDecimal pre2dReverseReacMaxDemand) + { + this.pre2dReverseReacMaxDemand = pre2dReverseReacMaxDemand; + } + + public BigDecimal getPre2dReverseReacMaxDemand() + { + return pre2dReverseReacMaxDemand; + } + + public void setCurrentForwardAcDemand(BigDecimal currentForwardAcDemand) + { + this.currentForwardAcDemand = currentForwardAcDemand; + } + + public BigDecimal getCurrentForwardAcDemand() + { + return currentForwardAcDemand; + } + + public void setCurrentReverseAcDemand(BigDecimal currentReverseAcDemand) + { + this.currentReverseAcDemand = currentReverseAcDemand; + } + + public BigDecimal getCurrentReverseAcDemand() + { + return currentReverseAcDemand; + } + + public void setCurrentForwardReacDemand(BigDecimal currentForwardReacDemand) + { + this.currentForwardReacDemand = currentForwardReacDemand; + } + + public BigDecimal getCurrentForwardReacDemand() + { + return currentForwardReacDemand; + } + + public void setCurrentReverseReacDemand(BigDecimal currentReverseReacDemand) + { + this.currentReverseReacDemand = currentReverseReacDemand; + } + + public BigDecimal getCurrentReverseReacDemand() + { + return currentReverseReacDemand; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataUpdateTime", getDataUpdateTime()) + .append("currentCombActiveTotal", getCurrentCombActiveTotal()) + .append("currentCombActivePeak", getCurrentCombActivePeak()) + .append("currentCombActiveHigh", getCurrentCombActiveHigh()) + .append("currentCombActiveFlat", getCurrentCombActiveFlat()) + .append("currentCombActiveValley", getCurrentCombActiveValley()) + .append("currentForwardActiveTotal", getCurrentForwardActiveTotal()) + .append("currentForwardActivePeak", getCurrentForwardActivePeak()) + .append("currentForwardActiveHigh", getCurrentForwardActiveHigh()) + .append("currentForwardActiveFlat", getCurrentForwardActiveFlat()) + .append("currentForwardActiveValley", getCurrentForwardActiveValley()) + .append("currentReverseActiveTotal", getCurrentReverseActiveTotal()) + .append("currentReverseActivePeak", getCurrentReverseActivePeak()) + .append("currentReverseActiveHigh", getCurrentReverseActiveHigh()) + .append("currentReverseActiveFlat", getCurrentReverseActiveFlat()) + .append("currentReverseActiveValley", getCurrentReverseActiveValley()) + .append("currentCombReactiveTotal", getCurrentCombReactiveTotal()) + .append("currentCombReactivePeak", getCurrentCombReactivePeak()) + .append("currentCombReactiveHigh", getCurrentCombReactiveHigh()) + .append("currentCombReactiveFlat", getCurrentCombReactiveFlat()) + .append("currentCombReactiveValley", getCurrentCombReactiveValley()) + .append("currentForwardReactiveTotal", getCurrentForwardReactiveTotal()) + .append("currentForwardReactivePeak", getCurrentForwardReactivePeak()) + .append("currentForwardReactiveHigh", getCurrentForwardReactiveHigh()) + .append("currentForwardReactiveFlat", getCurrentForwardReactiveFlat()) + .append("currentForwardReactiveValley", getCurrentForwardReactiveValley()) + .append("currentReverseReactiveTotal", getCurrentReverseReactiveTotal()) + .append("currentReverseReactivePeak", getCurrentReverseReactivePeak()) + .append("currentReverseReactiveHigh", getCurrentReverseReactiveHigh()) + .append("currentReverseReactiveFlat", getCurrentReverseReactiveFlat()) + .append("currentReverseReactiveValley", getCurrentReverseReactiveValley()) + .append("phaseAVoltage", getPhaseAVoltage()) + .append("phaseBVoltage", getPhaseBVoltage()) + .append("phaseCVoltage", getPhaseCVoltage()) + .append("phaseACurrent", getPhaseACurrent()) + .append("phaseBCurrent", getPhaseBCurrent()) + .append("phaseCCurrent", getPhaseCCurrent()) + .append("frequency", getFrequency()) + .append("abLineVoltage", getAbLineVoltage()) + .append("cbLineVoltage", getCbLineVoltage()) + .append("acLineVoltage", getAcLineVoltage()) + .append("forwardAcMaxDemand", getForwardAcMaxDemand()) + .append("reverseAcMaxDemand", getReverseAcMaxDemand()) + .append("phaseAActivePower", getPhaseAActivePower()) + .append("phaseBActivePower", getPhaseBActivePower()) + .append("phaseCActivePower", getPhaseCActivePower()) + .append("totalActivePower", getTotalActivePower()) + .append("phaseAReactivePower", getPhaseAReactivePower()) + .append("phaseBReactivePower", getPhaseBReactivePower()) + .append("phaseCReactivePower", getPhaseCReactivePower()) + .append("totalReactivePower", getTotalReactivePower()) + .append("phaseAApparentPower", getPhaseAApparentPower()) + .append("phaseBApparentPower", getPhaseBApparentPower()) + .append("phaseCApparentPower", getPhaseCApparentPower()) + .append("totalApparentPower", getTotalApparentPower()) + .append("phaseAPowerFactor", getPhaseAPowerFactor()) + .append("phaseBPowerFactor", getPhaseBPowerFactor()) + .append("phaseCPowerFactor", getPhaseCPowerFactor()) + .append("totalPowerFactor", getTotalPowerFactor()) + .append("dailyForwardMaxDemand", getDailyForwardMaxDemand()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("secondaryAbLineVoltage", getSecondaryAbLineVoltage()) + .append("secondaryAPhaseCurrent", getSecondaryAPhaseCurrent()) + .append("secondaryAPhaseVoltage", getSecondaryAPhaseVoltage()) + .append("secondaryAPowerFactor", getSecondaryAPowerFactor()) + .append("secondaryAApparentPower", getSecondaryAApparentPower()) + .append("secondaryAReactivePower", getSecondaryAReactivePower()) + .append("secondaryAActivePower", getSecondaryAActivePower()) + .append("secondaryBcLineVoltage", getSecondaryBcLineVoltage()) + .append("secondaryBPhaseCurrent", getSecondaryBPhaseCurrent()) + .append("secondaryBPhaseVoltage", getSecondaryBPhaseVoltage()) + .append("secondaryBPowerFactor", getSecondaryBPowerFactor()) + .append("secondaryBApparentPower", getSecondaryBApparentPower()) + .append("secondaryBReactivePower", getSecondaryBReactivePower()) + .append("secondaryBActivePower", getSecondaryBActivePower()) + .append("secondaryCaLineVoltage", getSecondaryCaLineVoltage()) + .append("secondaryCPhaseCurrent", getSecondaryCPhaseCurrent()) + .append("secondaryCPhaseVoltage", getSecondaryCPhaseVoltage()) + .append("secondaryCPowerFactor", getSecondaryCPowerFactor()) + .append("secondaryCApparentPower", getSecondaryCApparentPower()) + .append("secondaryCReactivePower", getSecondaryCReactivePower()) + .append("secondaryCActivePower", getSecondaryCActivePower()) + .append("secondaryGridFrequency", getSecondaryGridFrequency()) + .append("secondaryReverseReactiveEnergy", getSecondaryReverseReactiveEnergy()) + .append("secondaryNegativeActiveEnergy", getSecondaryNegativeActiveEnergy()) + .append("secondaryTotalPowerFactor", getSecondaryTotalPowerFactor()) + .append("secondaryTotalApparentPower", getSecondaryTotalApparentPower()) + .append("secondaryTotalReactivePower", getSecondaryTotalReactivePower()) + .append("secondaryPositiveReactiveEnergy", getSecondaryPositiveReactiveEnergy()) + .append("secondaryPositiveActiveEnergy", getSecondaryPositiveActiveEnergy()) + .append("secondaryTotalActivePower", getSecondaryTotalActivePower()) + .append("reverseReactiveEnergyEqMinus", getReverseReactiveEnergyEqMinus()) + .append("reverseActiveEnergyEpMinus", getReverseActiveEnergyEpMinus()) + .append("positiveReactiveEnergyEqPlus", getPositiveReactiveEnergyEqPlus()) + .append("positiveActiveEnergyEpPlus", getPositiveActiveEnergyEpPlus()) + .append("currentPercent", getCurrentPercent()) + .append("voltagePercent", getVoltagePercent()) + .append("avgCurrent", getAvgCurrent()) + .append("totalForwardActiveTwo", getTotalForwardActiveTwo()) + .append("totalPeakForwardActive", getTotalPeakForwardActive()) + .append("totalHighForwardActive", getTotalHighForwardActive()) + .append("totalFlatForwardActive", getTotalFlatForwardActive()) + .append("totalValleyForwardActive", getTotalValleyForwardActive()) + .append("totalReverseActiveTwo", getTotalReverseActiveTwo()) + .append("totalPeakReverseActive", getTotalPeakReverseActive()) + .append("totalHighReverseActive", getTotalHighReverseActive()) + .append("totalFlatReverseActive", getTotalFlatReverseActive()) + .append("totalValleyReverseActive", getTotalValleyReverseActive()) + .append("disconnectDetectionIndication", getDisconnectDetectionIndication()) + .append("ratedPrimaryCurrentValue", getRatedPrimaryCurrentValue()) + .append("switchInputOutputStatus", getSwitchInputOutputStatus()) + .append("alarmStatus", getAlarmStatus()) + .append("currentTotalVoltagePercent", getCurrentTotalVoltagePercent()) + .append("voltageContentPercent", getVoltageContentPercent()) + .append("voltageAcPercent", getVoltageAcPercent()) + .append("currentTotalCurrentPercent", getCurrentTotalCurrentPercent()) + .append("currentContentPercent", getCurrentContentPercent()) + .append("currentAcPercent", getCurrentAcPercent()) + .append("currentTotalPowerPercent", getCurrentTotalPowerPercent()) + .append("powerContentPercent", getPowerContentPercent()) + .append("powerAcPercent", getPowerAcPercent()) + .append("dataSettingYearMonth", getDataSettingYearMonth()) + .append("dataSettingDayHour", getDataSettingDayHour()) + .append("dataSettingMinutesSeconds", getDataSettingMinutesSeconds()) + .append("currentRate", getCurrentRate()) + .append("versionNumber", getVersionNumber()) + .append("voltage", getVoltage()) + .append("current", getCurrent()) + .append("power", getPower()) + .append("internalTemp", getInternalTemp()) + .append("totalForwardActiveOne", getTotalForwardActiveOne()) + .append("totalReverseActiveOne", getTotalReverseActiveOne()) + .append("forwardReactiveMaxDemand", getForwardReactiveMaxDemand()) + .append("reverseReactiveMaxDemand", getReverseReactiveMaxDemand()) + .append("aForwardActiveEnergy", getaForwardActiveEnergy()) + .append("bForwardActiveEnergy", getbForwardActiveEnergy()) + .append("cForwardActiveEnergy", getcForwardActiveEnergy()) + .append("didoStatus", getDidoStatus()) + .append("runningStatus", getRunningStatus()) + .append("zeroSeqCurrent", getZeroSeqCurrent()) + .append("voltageUnbalanceDegree", getVoltageUnbalanceDegree()) + .append("currentUnbalanceDegree", getCurrentUnbalanceDegree()) + .append("dailyReverseAcMaxDemand", getDailyReverseAcMaxDemand()) + .append("dailyForwardReacMaxDemand", getDailyForwardReacMaxDemand()) + .append("dailyReverseReacMaxDemand", getDailyReverseReacMaxDemand()) + .append("preDayForwardAcMaxDemand", getPreDayForwardAcMaxDemand()) + .append("preDayReverseAcMaxDemand", getPreDayReverseAcMaxDemand()) + .append("preDayForwardReacMaxDemand", getPreDayForwardReacMaxDemand()) + .append("preDayReverseReacMaxDemand", getPreDayReverseReacMaxDemand()) + .append("pre2dForwardAcMaxDemand", getPre2dForwardAcMaxDemand()) + .append("pre2dReverseAcMaxDemand", getPre2dReverseAcMaxDemand()) + .append("pre2dForwardReacMaxDemand", getPre2dForwardReacMaxDemand()) + .append("pre2dReverseReacMaxDemand", getPre2dReverseReacMaxDemand()) + .append("currentForwardAcDemand", getCurrentForwardAcDemand()) + .append("currentReverseAcDemand", getCurrentReverseAcDemand()) + .append("currentForwardReacDemand", getCurrentForwardReacDemand()) + .append("currentReverseReacDemand", getCurrentReverseReacDemand()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryCluster.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryCluster.java index e19045d..5ebe921 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryCluster.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryCluster.java @@ -1,17 +1,21 @@ package com.xzzn.ems.domain; -import java.math.BigDecimal; - +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; import com.xzzn.common.core.domain.BaseEntity; +import com.xzzn.common.utils.StringUtils; + +import java.math.BigDecimal; +import java.util.Date; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.xzzn.common.annotation.Excel; /** * 电池簇数据对象 ems_battery_cluster * * @author xzzn - * @date 2025-06-22 + * @date 2025-07-29 */ public class EmsBatteryCluster extends BaseEntity { @@ -20,16 +24,21 @@ public class EmsBatteryCluster extends BaseEntity /** */ private Long id; - /** 工作状态 */ - @Excel(name = "工作状态") + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 工作状态:0-运行 1-停机 2-故障 */ + @Excel(name = "工作状态:0-运行 1-停机 2-故障") private String workStatus; - /** 与PCS通信状态 */ - @Excel(name = "与PCS通信状态") + /** 与PCS通信状态:0-正常 1-通信中断 2-异常 */ + @Excel(name = "与PCS通信状态:0-正常 1-通信中断 2-异常") private String pcsCommunicationStatus; - /** 与EMS通信状态 */ - @Excel(name = "与EMS通信状态") + /** 与EMS通信状态:0-正常 1-通信中断 2-异常 */ + @Excel(name = "与EMS通信状态:0-正常 1-通信中断 2-异常") private String emsCommunicationStatus; /** 簇电压 (V) */ @@ -74,11 +83,143 @@ public class EmsBatteryCluster extends BaseEntity /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; + + /** 堆设备id */ + @Excel(name = "堆设备id") + private String stackDeviceId; + + /** 允许充电最大功率 */ + @Excel(name = "允许充电最大功率") + private BigDecimal maxAllowedChargePower; + + /** 允许放电最大功率 */ + @Excel(name = "允许放电最大功率") + private BigDecimal maxAllowedDischargePower; + + /** 允许充电最大电压 */ + @Excel(name = "允许充电最大电压") + private BigDecimal maxAllowedChargeVoltage; + + /** 允许放电最大电压 */ + @Excel(name = "允许放电最大电压") + private BigDecimal maxAllowedDischargeVoltage; + + /** 允许充电最大电流 */ + @Excel(name = "允许充电最大电流") + private BigDecimal maxAllowedChargeCurrent; + + /** 允许放电最大电流 */ + @Excel(name = "允许放电最大电流") + private BigDecimal maxAllowedDischargeCurrent; + + /** 组电压 */ + @Excel(name = "组电压") + private BigDecimal batteryPackVoltage; + + /** 组电流 */ + @Excel(name = "组电流") + private BigDecimal batteryPackCurrent; + + /** 模块温度 */ + @Excel(name = "模块温度") + private BigDecimal batteryPackTemp; + + /** 组SOC */ + @Excel(name = "组SOC") + private BigDecimal batteryPackSoc; + + /** 组SOH */ + @Excel(name = "组SOH") + private BigDecimal batteryPackSoh; + + /** 组绝缘电阻 */ + @Excel(name = "组绝缘电阻") + private BigDecimal batteryPackInsulationResistance; + + /** 平均单体电压 */ + @Excel(name = "平均单体电压") + private BigDecimal avgCellVoltage; + + /** 平均单体温度 */ + @Excel(name = "平均单体温度") + private BigDecimal avgCellTemp; + + /** 最高单体电压 */ + @Excel(name = "最高单体电压") + private BigDecimal maxCellVoltage; + + /** 最高单体电压对应点号 */ + @Excel(name = "最高单体电压对应点号") + private String maxCellVoltageId; + + /** 最低单体电压 */ + @Excel(name = "最低单体电压") + private BigDecimal minCellVoltage; + + /** 最低单体电压对应点号 */ + @Excel(name = "最低单体电压对应点号") + private String minCellVoltageId; + + /** 最高单体温度 */ + @Excel(name = "最高单体温度") + private BigDecimal maxCellTemp; + + /** 最高单体温度对应点号 */ + @Excel(name = "最高单体温度对应点号") + private String maxCellTempId; + + /** 最低单体温度 */ + @Excel(name = "最低单体温度") + private BigDecimal minCellTemp; + + /** 最低单体温度对应点号 */ + @Excel(name = "最低单体温度对应点号") + private String minCellTempId; + + /** 最高单体SOC */ + @Excel(name = "最高单体SOC") + private BigDecimal maxCellSoc; + + /** 最高单体SOC对应点号 */ + @Excel(name = "最高单体SOC对应点号") + private String maxCellSocId; + + /** 最低单体SOC */ + @Excel(name = "最低单体SOC") + private BigDecimal minCellSoc; + + /** 最低单体SOC对应点号 */ + @Excel(name = "最低单体SOC对应点号") + private String minCellSocId; + + /** 最高单体SOH */ + @Excel(name = "最高单体SOH") + private BigDecimal maxCellSoh; + + /** 最高单体SOH对应点号 */ + @Excel(name = "最高单体SOH对应点号") + private String maxCellSohId; + + /** 最低单体SOH */ + @Excel(name = "最低单体SOH") + private BigDecimal minCellSoh; + + /** 最低单体SOH对应点号 */ + @Excel(name = "最低单体SOH对应点号") + private String minCellSohId; + + /** 单次累计充电电量 */ + @Excel(name = "单次累计充电电量") + private BigDecimal totalChargeEnergy; + + /** 单次累计放电电量 */ + @Excel(name = "单次累计放电电量") + private BigDecimal totalDischargeEnergy; public void setId(Long id) { @@ -90,6 +231,14 @@ public class EmsBatteryCluster extends BaseEntity return id; } + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + public void setWorkStatus(String workStatus) { this.workStatus = workStatus; @@ -220,26 +369,356 @@ public class EmsBatteryCluster extends BaseEntity return currentSoc; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } + public void setStackDeviceId(String stackDeviceId) + { + this.stackDeviceId = stackDeviceId; + } + + public String getStackDeviceId() + { + return stackDeviceId; + } + + public void setMaxAllowedChargePower(BigDecimal maxAllowedChargePower) + { + this.maxAllowedChargePower = maxAllowedChargePower; + } + + public BigDecimal getMaxAllowedChargePower() + { + return maxAllowedChargePower; + } + + public void setMaxAllowedDischargePower(BigDecimal maxAllowedDischargePower) + { + this.maxAllowedDischargePower = maxAllowedDischargePower; + } + + public BigDecimal getMaxAllowedDischargePower() + { + return maxAllowedDischargePower; + } + + public void setMaxAllowedChargeVoltage(BigDecimal maxAllowedChargeVoltage) + { + this.maxAllowedChargeVoltage = maxAllowedChargeVoltage; + } + + public BigDecimal getMaxAllowedChargeVoltage() + { + return maxAllowedChargeVoltage; + } + + public void setMaxAllowedDischargeVoltage(BigDecimal maxAllowedDischargeVoltage) + { + this.maxAllowedDischargeVoltage = maxAllowedDischargeVoltage; + } + + public BigDecimal getMaxAllowedDischargeVoltage() + { + return maxAllowedDischargeVoltage; + } + + public void setMaxAllowedChargeCurrent(BigDecimal maxAllowedChargeCurrent) + { + this.maxAllowedChargeCurrent = maxAllowedChargeCurrent; + } + + public BigDecimal getMaxAllowedChargeCurrent() + { + return maxAllowedChargeCurrent; + } + + public void setMaxAllowedDischargeCurrent(BigDecimal maxAllowedDischargeCurrent) + { + this.maxAllowedDischargeCurrent = maxAllowedDischargeCurrent; + } + + public BigDecimal getMaxAllowedDischargeCurrent() + { + return maxAllowedDischargeCurrent; + } + + public void setBatteryPackVoltage(BigDecimal batteryPackVoltage) + { + this.batteryPackVoltage = batteryPackVoltage; + } + + public BigDecimal getBatteryPackVoltage() + { + return batteryPackVoltage; + } + + public void setBatteryPackCurrent(BigDecimal batteryPackCurrent) + { + this.batteryPackCurrent = batteryPackCurrent; + } + + public BigDecimal getBatteryPackCurrent() + { + return batteryPackCurrent; + } + + public void setBatteryPackTemp(BigDecimal batteryPackTemp) + { + this.batteryPackTemp = batteryPackTemp; + } + + public BigDecimal getBatteryPackTemp() + { + return batteryPackTemp; + } + + public void setBatteryPackSoc(BigDecimal batteryPackSoc) + { + this.batteryPackSoc = batteryPackSoc; + } + + public BigDecimal getBatteryPackSoc() + { + return batteryPackSoc; + } + + public void setBatteryPackSoh(BigDecimal batteryPackSoh) + { + this.batteryPackSoh = batteryPackSoh; + } + + public BigDecimal getBatteryPackSoh() + { + return batteryPackSoh; + } + + public void setBatteryPackInsulationResistance(BigDecimal batteryPackInsulationResistance) + { + this.batteryPackInsulationResistance = batteryPackInsulationResistance; + } + + public BigDecimal getBatteryPackInsulationResistance() + { + return batteryPackInsulationResistance; + } + + public void setAvgCellVoltage(BigDecimal avgCellVoltage) + { + this.avgCellVoltage = avgCellVoltage; + } + + public BigDecimal getAvgCellVoltage() + { + return avgCellVoltage; + } + + public void setAvgCellTemp(BigDecimal avgCellTemp) + { + this.avgCellTemp = avgCellTemp; + } + + public BigDecimal getAvgCellTemp() + { + return avgCellTemp; + } + + public void setMaxCellVoltage(BigDecimal maxCellVoltage) + { + this.maxCellVoltage = maxCellVoltage; + } + + public BigDecimal getMaxCellVoltage() + { + return maxCellVoltage; + } + + public void setMaxCellVoltageId(String maxCellVoltageId) + { + this.maxCellVoltageId = StringUtils.fillThreeDigits(maxCellVoltageId); + } + + public String getMaxCellVoltageId() + { + return maxCellVoltageId; + } + + public void setMinCellVoltage(BigDecimal minCellVoltage) + { + this.minCellVoltage = minCellVoltage; + } + + public BigDecimal getMinCellVoltage() + { + return minCellVoltage; + } + + public void setMinCellVoltageId(String minCellVoltageId) + { + this.minCellVoltageId = StringUtils.fillThreeDigits(minCellVoltageId); + } + + public String getMinCellVoltageId() + { + return minCellVoltageId; + } + + public void setMaxCellTemp(BigDecimal maxCellTemp) + { + this.maxCellTemp = maxCellTemp; + } + + public BigDecimal getMaxCellTemp() + { + return maxCellTemp; + } + + public void setMaxCellTempId(String maxCellTempId) + { + this.maxCellTempId = StringUtils.fillThreeDigits(maxCellTempId); + } + + public String getMaxCellTempId() + { + return maxCellTempId; + } + + public void setMinCellTemp(BigDecimal minCellTemp) + { + this.minCellTemp = minCellTemp; + } + + public BigDecimal getMinCellTemp() + { + return minCellTemp; + } + + public void setMinCellTempId(String minCellTempId) + { + this.minCellTempId = StringUtils.fillThreeDigits(minCellTempId); + } + + public String getMinCellTempId() + { + return minCellTempId; + } + + public void setMaxCellSoc(BigDecimal maxCellSoc) + { + this.maxCellSoc = maxCellSoc; + } + + public BigDecimal getMaxCellSoc() + { + return maxCellSoc; + } + + public void setMaxCellSocId(String maxCellSocId) + { + this.maxCellSocId = StringUtils.fillThreeDigits(maxCellSocId); + } + + public String getMaxCellSocId() + { + return maxCellSocId; + } + + public void setMinCellSoc(BigDecimal minCellSoc) + { + this.minCellSoc = minCellSoc; + } + + public BigDecimal getMinCellSoc() + { + return minCellSoc; + } + + public void setMinCellSocId(String minCellSocId) + { + this.minCellSocId = StringUtils.fillThreeDigits(minCellSocId); + } + + public String getMinCellSocId() + { + return minCellSocId; + } + + public void setMaxCellSoh(BigDecimal maxCellSoh) + { + this.maxCellSoh = maxCellSoh; + } + + public BigDecimal getMaxCellSoh() + { + return maxCellSoh; + } + + public void setMaxCellSohId(String maxCellSohId) + { + this.maxCellSohId = StringUtils.fillThreeDigits(maxCellSohId); + } + + public String getMaxCellSohId() + { + return maxCellSohId; + } + + public void setMinCellSoh(BigDecimal minCellSoh) + { + this.minCellSoh = minCellSoh; + } + + public BigDecimal getMinCellSoh() + { + return minCellSoh; + } + + public void setMinCellSohId(String minCellSohId) + { + this.minCellSohId = StringUtils.fillThreeDigits(minCellSohId); + } + + public String getMinCellSohId() + { + return minCellSohId; + } + + public void setTotalChargeEnergy(BigDecimal totalChargeEnergy) + { + this.totalChargeEnergy = totalChargeEnergy; + } + + public BigDecimal getTotalChargeEnergy() + { + return totalChargeEnergy; + } + + public void setTotalDischargeEnergy(BigDecimal totalDischargeEnergy) + { + this.totalDischargeEnergy = totalDischargeEnergy; + } + + public BigDecimal getTotalDischargeEnergy() + { + return totalDischargeEnergy; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -264,6 +743,39 @@ public class EmsBatteryCluster extends BaseEntity .append("remark", getRemark()) .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) + .append("stackDeviceId", getStackDeviceId()) + .append("maxAllowedChargePower", getMaxAllowedChargePower()) + .append("maxAllowedDischargePower", getMaxAllowedDischargePower()) + .append("maxAllowedChargeVoltage", getMaxAllowedChargeVoltage()) + .append("maxAllowedDischargeVoltage", getMaxAllowedDischargeVoltage()) + .append("maxAllowedChargeCurrent", getMaxAllowedChargeCurrent()) + .append("maxAllowedDischargeCurrent", getMaxAllowedDischargeCurrent()) + .append("batteryPackVoltage", getBatteryPackVoltage()) + .append("batteryPackCurrent", getBatteryPackCurrent()) + .append("batteryPackTemp", getBatteryPackTemp()) + .append("batteryPackSoc", getBatteryPackSoc()) + .append("batteryPackSoh", getBatteryPackSoh()) + .append("batteryPackInsulationResistance", getBatteryPackInsulationResistance()) + .append("avgCellVoltage", getAvgCellVoltage()) + .append("avgCellTemp", getAvgCellTemp()) + .append("maxCellVoltage", getMaxCellVoltage()) + .append("maxCellVoltageId", getMaxCellVoltageId()) + .append("minCellVoltage", getMinCellVoltage()) + .append("minCellVoltageId", getMinCellVoltageId()) + .append("maxCellTemp", getMaxCellTemp()) + .append("maxCellTempId", getMaxCellTempId()) + .append("minCellTemp", getMinCellTemp()) + .append("minCellTempId", getMinCellTempId()) + .append("maxCellSoc", getMaxCellSoc()) + .append("maxCellSocId", getMaxCellSocId()) + .append("minCellSoc", getMinCellSoc()) + .append("minCellSocId", getMinCellSocId()) + .append("maxCellSoh", getMaxCellSoh()) + .append("maxCellSohId", getMaxCellSohId()) + .append("minCellSoh", getMinCellSoh()) + .append("minCellSohId", getMinCellSohId()) + .append("totalChargeEnergy", getTotalChargeEnergy()) + .append("totalDischargeEnergy", getTotalDischargeEnergy()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java index 8faf4fc..82d3380 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java @@ -1,18 +1,20 @@ package com.xzzn.ems.domain; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + import java.math.BigDecimal; import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.xzzn.common.core.domain.BaseEntity; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.xzzn.common.annotation.Excel; /** * 单体电池实时数据对象 ems_battery_data * * @author xzzn - * @date 2025-06-25 + * @date 2025-07-29 */ public class EmsBatteryData extends BaseEntity { @@ -56,15 +58,23 @@ public class EmsBatteryData extends BaseEntity /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; /** 簇设备id */ @Excel(name = "簇设备id") - private Long clusterDeviceId; + private String clusterDeviceId; + + /** 单体电池内阻 */ + @Excel(name = "单体电池内阻") + private BigDecimal interResistance; + + /** 单体电池电流 */ + @Excel(name = "单体电池电流") + private BigDecimal current; public void setId(Long id) { @@ -156,36 +166,54 @@ public class EmsBatteryData extends BaseEntity return dataTimestamp; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } - public void setClusterDeviceId(Long clusterDeviceId) + public void setClusterDeviceId(String clusterDeviceId) { this.clusterDeviceId = clusterDeviceId; } - public Long getClusterDeviceId() + public String getClusterDeviceId() { return clusterDeviceId; } + public void setInterResistance(BigDecimal interResistance) + { + this.interResistance = interResistance; + } + + public BigDecimal getInterResistance() + { + return interResistance; + } + + public BigDecimal getCurrent() { + return current; + } + + public void setCurrent(BigDecimal current) { + this.current = current; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -206,6 +234,8 @@ public class EmsBatteryData extends BaseEntity .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) .append("clusterDeviceId", getClusterDeviceId()) + .append("interResistance", getInterResistance()) + .append("current", getCurrent()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDailyLatest.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDailyLatest.java new file mode 100644 index 0000000..fad9485 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDailyLatest.java @@ -0,0 +1,213 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 单体电池每日最新数据对象 ems_battery_data_daily_latest + * + * @author xzzn + * @date 2025-07-17 + */ +public class EmsBatteryDataDailyLatest extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 电池堆 */ + @Excel(name = "电池堆") + private String batteryPack; + + /** 电池簇 */ + @Excel(name = "电池簇") + private String batteryCluster; + + /** 单体编号 */ + @Excel(name = "单体编号") + private String batteryCellId; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 温度 (℃) */ + @Excel(name = "温度 (℃)") + private BigDecimal temperature; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 日期:yyyy-MM-dd */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd") + private Date dateDay; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇设备id */ + @Excel(name = "簇设备id") + private String clusterDeviceId; + + public void setBatteryPack(String batteryPack) + { + this.batteryPack = batteryPack; + } + + public String getBatteryPack() + { + return batteryPack; + } + + public void setBatteryCluster(String batteryCluster) + { + this.batteryCluster = batteryCluster; + } + + public String getBatteryCluster() + { + return batteryCluster; + } + + public void setBatteryCellId(String batteryCellId) + { + this.batteryCellId = batteryCellId; + } + + public String getBatteryCellId() + { + return batteryCellId; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setDateDay(Date dateDay) + { + this.dateDay = dateDay; + } + + public Date getDateDay() + { + return dateDay; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public String getClusterDeviceId() + { + return clusterDeviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("batteryPack", getBatteryPack()) + .append("batteryCluster", getBatteryCluster()) + .append("batteryCellId", getBatteryCellId()) + .append("voltage", getVoltage()) + .append("temperature", getTemperature()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("dateDay", getDateDay()) + .append("dataTimestamp", getDataTimestamp()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDay.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDay.java new file mode 100644 index 0000000..4e6b1c3 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataDay.java @@ -0,0 +1,257 @@ +package com.xzzn.ems.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 单体电池天级数据对象 ems_battery_data_day + * + * @author xzzn + * @date 2025-08-20 + */ +public class EmsBatteryDataDay extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 电池堆 */ + @Excel(name = "电池堆") + private String batteryPack; + + /** 电池簇 */ + @Excel(name = "电池簇") + private String batteryCluster; + + /** 单体编号 */ + @Excel(name = "单体编号") + private String batteryCellId; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 温度 (℃) */ + @Excel(name = "温度 (℃)") + private BigDecimal temperature; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇设备id */ + @Excel(name = "簇设备id") + private String clusterDeviceId; + + /** 单体电池内阻 */ + @Excel(name = "单体电池内阻") + private BigDecimal interResistance; + + /** 天级时间维度 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "天级时间维度", width = 30, dateFormat = "yyyy-MM-dd") + private Date dayTime; + + /** 单体电池电流 */ + @Excel(name = "单体电池电流") + private BigDecimal current; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setBatteryPack(String batteryPack) + { + this.batteryPack = batteryPack; + } + + public String getBatteryPack() + { + return batteryPack; + } + + public void setBatteryCluster(String batteryCluster) + { + this.batteryCluster = batteryCluster; + } + + public String getBatteryCluster() + { + return batteryCluster; + } + + public void setBatteryCellId(String batteryCellId) + { + this.batteryCellId = batteryCellId; + } + + public String getBatteryCellId() + { + return batteryCellId; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public String getClusterDeviceId() + { + return clusterDeviceId; + } + + public void setInterResistance(BigDecimal interResistance) + { + this.interResistance = interResistance; + } + + public BigDecimal getInterResistance() + { + return interResistance; + } + + public void setDayTime(Date dayTime) + { + this.dayTime = dayTime; + } + + public Date getDayTime() + { + return dayTime; + } + + public BigDecimal getCurrent() { + return current; + } + + public void setCurrent(BigDecimal current) { + this.current = current; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("batteryPack", getBatteryPack()) + .append("batteryCluster", getBatteryCluster()) + .append("batteryCellId", getBatteryCellId()) + .append("voltage", getVoltage()) + .append("temperature", getTemperature()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("dataTimestamp", getDataTimestamp()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) + .append("interResistance", getInterResistance()) + .append("dayTime", getDayTime()) + .append("current", getCurrent()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataHour.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataHour.java new file mode 100644 index 0000000..859504b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataHour.java @@ -0,0 +1,242 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 单体电池小时级数据对象 ems_battery_data_hour + * + * @author xzzn + * @date 2025-08-19 + */ +public class EmsBatteryDataHour extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 电池堆 */ + @Excel(name = "电池堆") + private String batteryPack; + + /** 电池簇 */ + @Excel(name = "电池簇") + private String batteryCluster; + + /** 单体编号 */ + @Excel(name = "单体编号") + private String batteryCellId; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 温度 (℃) */ + @Excel(name = "温度 (℃)") + private BigDecimal temperature; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇设备id */ + @Excel(name = "簇设备id") + private String clusterDeviceId; + + /** 单体电池内阻 */ + @Excel(name = "单体电池内阻") + private BigDecimal interResistance; + + /** 小时级时间维度 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "小时级时间维度", width = 30, dateFormat = "yyyy-MM-dd") + private Date hourTime; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setBatteryPack(String batteryPack) + { + this.batteryPack = batteryPack; + } + + public String getBatteryPack() + { + return batteryPack; + } + + public void setBatteryCluster(String batteryCluster) + { + this.batteryCluster = batteryCluster; + } + + public String getBatteryCluster() + { + return batteryCluster; + } + + public void setBatteryCellId(String batteryCellId) + { + this.batteryCellId = batteryCellId; + } + + public String getBatteryCellId() + { + return batteryCellId; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public String getClusterDeviceId() + { + return clusterDeviceId; + } + + public void setInterResistance(BigDecimal interResistance) + { + this.interResistance = interResistance; + } + + public BigDecimal getInterResistance() + { + return interResistance; + } + + public void setHourTime(Date hourTime) + { + this.hourTime = hourTime; + } + + public Date getHourTime() + { + return hourTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("batteryPack", getBatteryPack()) + .append("batteryCluster", getBatteryCluster()) + .append("batteryCellId", getBatteryCellId()) + .append("voltage", getVoltage()) + .append("temperature", getTemperature()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("dataTimestamp", getDataTimestamp()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) + .append("interResistance", getInterResistance()) + .append("hourTime", getHourTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMinutes.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMinutes.java new file mode 100644 index 0000000..24ed5fe --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMinutes.java @@ -0,0 +1,226 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 单体电池分钟级数据对象 ems_battery_data_minutes + * + * @author xzzn + * @date 2025-08-18 + */ +public class EmsBatteryDataMinutes extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 电池堆 */ + @Excel(name = "电池堆") + private String batteryPack; + + /** 电池簇 */ + @Excel(name = "电池簇") + private String batteryCluster; + + /** 单体编号 */ + @Excel(name = "单体编号") + private String batteryCellId; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 温度 (℃) */ + @Excel(name = "温度 (℃)") + private BigDecimal temperature; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇设备id */ + @Excel(name = "簇设备id") + private String clusterDeviceId; + + /** 单体电池内阻 */ + @Excel(name = "单体电池内阻") + private BigDecimal interResistance; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setBatteryPack(String batteryPack) + { + this.batteryPack = batteryPack; + } + + public String getBatteryPack() + { + return batteryPack; + } + + public void setBatteryCluster(String batteryCluster) + { + this.batteryCluster = batteryCluster; + } + + public String getBatteryCluster() + { + return batteryCluster; + } + + public void setBatteryCellId(String batteryCellId) + { + this.batteryCellId = batteryCellId; + } + + public String getBatteryCellId() + { + return batteryCellId; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public String getClusterDeviceId() + { + return clusterDeviceId; + } + + public void setInterResistance(BigDecimal interResistance) + { + this.interResistance = interResistance; + } + + public BigDecimal getInterResistance() + { + return interResistance; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("batteryPack", getBatteryPack()) + .append("batteryCluster", getBatteryCluster()) + .append("batteryCellId", getBatteryCellId()) + .append("voltage", getVoltage()) + .append("temperature", getTemperature()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("dataTimestamp", getDataTimestamp()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) + .append("interResistance", getInterResistance()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMonth.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMonth.java new file mode 100644 index 0000000..1828042 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryDataMonth.java @@ -0,0 +1,242 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 单体电池月级数据对象 ems_battery_data_month + * + * @author xzzn + * @date 2025-08-22 + */ +public class EmsBatteryDataMonth extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 电池堆 */ + @Excel(name = "电池堆") + private String batteryPack; + + /** 电池簇 */ + @Excel(name = "电池簇") + private String batteryCluster; + + /** 单体编号 */ + @Excel(name = "单体编号") + private String batteryCellId; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 温度 (℃) */ + @Excel(name = "温度 (℃)") + private BigDecimal temperature; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇设备id */ + @Excel(name = "簇设备id") + private String clusterDeviceId; + + /** 单体电池内阻 */ + @Excel(name = "单体电池内阻") + private BigDecimal interResistance; + + /** 月级时间维度 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "月级时间维度", width = 30, dateFormat = "yyyy-MM-dd") + private Date monthTime; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setBatteryPack(String batteryPack) + { + this.batteryPack = batteryPack; + } + + public String getBatteryPack() + { + return batteryPack; + } + + public void setBatteryCluster(String batteryCluster) + { + this.batteryCluster = batteryCluster; + } + + public String getBatteryCluster() + { + return batteryCluster; + } + + public void setBatteryCellId(String batteryCellId) + { + this.batteryCellId = batteryCellId; + } + + public String getBatteryCellId() + { + return batteryCellId; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public String getClusterDeviceId() + { + return clusterDeviceId; + } + + public void setInterResistance(BigDecimal interResistance) + { + this.interResistance = interResistance; + } + + public BigDecimal getInterResistance() + { + return interResistance; + } + + public void setMonthTime(Date monthTime) + { + this.monthTime = monthTime; + } + + public Date getMonthTime() + { + return monthTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("batteryPack", getBatteryPack()) + .append("batteryCluster", getBatteryCluster()) + .append("batteryCellId", getBatteryCellId()) + .append("voltage", getVoltage()) + .append("temperature", getTemperature()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("dataTimestamp", getDataTimestamp()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) + .append("interResistance", getInterResistance()) + .append("monthTime", getMonthTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryGroup.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryGroup.java new file mode 100644 index 0000000..d01792c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryGroup.java @@ -0,0 +1,164 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 电池组数据对象 ems_battery_group + * + * @author xzzn + * @date 2025-07-29 + */ +public class EmsBatteryGroup extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 电池组状态 */ + @Excel(name = "电池组状态") + private String status; + + /** 电压 (V) */ + @Excel(name = "电压 (V)") + private BigDecimal voltage; + + /** 电流 (A) */ + @Excel(name = "电流 (A)") + private BigDecimal current; + + /** SOC (%) */ + @Excel(name = "SOC (%)") + private BigDecimal soc; + + /** SOH (%) */ + @Excel(name = "SOH (%)") + private BigDecimal soh; + + /** 备电预估时长 */ + @Excel(name = "备电预估时长") + private BigDecimal estimatedBackupDuration; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setVoltage(BigDecimal voltage) + { + this.voltage = voltage; + } + + public BigDecimal getVoltage() + { + return voltage; + } + + public void setCurrent(BigDecimal current) + { + this.current = current; + } + + public BigDecimal getCurrent() + { + return current; + } + + public void setSoc(BigDecimal soc) + { + this.soc = soc; + } + + public BigDecimal getSoc() + { + return soc; + } + + public void setSoh(BigDecimal soh) + { + this.soh = soh; + } + + public BigDecimal getSoh() + { + return soh; + } + + public void setEstimatedBackupDuration(BigDecimal estimatedBackupDuration) + { + this.estimatedBackupDuration = estimatedBackupDuration; + } + + public BigDecimal getEstimatedBackupDuration() + { + return estimatedBackupDuration; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("status", getStatus()) + .append("voltage", getVoltage()) + .append("current", getCurrent()) + .append("soc", getSoc()) + .append("soh", getSoh()) + .append("estimatedBackupDuration", getEstimatedBackupDuration()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryStack.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryStack.java index 30bc120..c15d912 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryStack.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryStack.java @@ -1,17 +1,20 @@ package com.xzzn.ems.domain; -import java.math.BigDecimal; - +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; import com.xzzn.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.xzzn.common.annotation.Excel; /** * 电池堆数据对象 ems_battery_stack * * @author xzzn - * @date 2025-06-22 + * @date 2025-07-02 */ public class EmsBatteryStack extends BaseEntity { @@ -20,65 +23,234 @@ public class EmsBatteryStack extends BaseEntity /** */ private Long id; - /** 工作状态 */ - @Excel(name = "工作状态") + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 工作状态:0-运行 1-停机 2-故障 */ + @Excel(name = "工作状态:0-运行 1-停机 2-故障") private String workStatus; - /** 与PCS通信状态 */ - @Excel(name = "与PCS通信状态") + /** 与PCS通信状态:0-正常 1-通信中断 2-异常 */ + @Excel(name = "与PCS通信状态:0-正常 1-通信中断 2-异常") private String pcsCommunicationStatus; - /** 与EMS通信状态 */ - @Excel(name = "与EMS通信状态") + /** 与EMS通信状态:0-正常 1-通信中断 2-异常 */ + @Excel(name = "与EMS通信状态:0-正常 1-通信中断 2-异常") private String emsCommunicationStatus; - /** 电池堆总电压 (V) */ - @Excel(name = "电池堆总电压 (V)") - private BigDecimal totalVoltage; + /** 电操状态 */ + @Excel(name = "电操状态") + private String operationStatus; - /** 可充电量 (kWh) */ - @Excel(name = "可充电量 (kWh)") - private BigDecimal chargeableCapacity; + /** 电池堆电压/V */ + @Excel(name = "电池堆电压/V") + private BigDecimal stackVoltage; - /** 累计充电量 (kWh) */ - @Excel(name = "累计充电量 (kWh)") - private BigDecimal totalChargedCapacity; + /** 电池堆电流/A */ + @Excel(name = "电池堆电流/A") + private BigDecimal stackCurrent; - /** 电池堆总电流 (A) */ - @Excel(name = "电池堆总电流 (A)") - private BigDecimal totalCurrent; + /** 电池堆SOC/% */ + @Excel(name = "电池堆SOC/%") + private BigDecimal stackSoc; - /** 可放电量 (kWh) */ - @Excel(name = "可放电量 (kWh)") - private BigDecimal dischargeableCapacity; + /** 电池堆SOH/% */ + @Excel(name = "电池堆SOH/%") + private BigDecimal stackSoh; - /** 累计放电量 (kWh) */ - @Excel(name = "累计放电量 (kWh)") - private BigDecimal totalDischargedCapacity; + /** 最高电池电压/V */ + @Excel(name = "最高电池电压/V") + private BigDecimal maxCellVoltage; - /** SOH (%) */ - @Excel(name = "SOH (%)") - private BigDecimal soh; + /** 最高电池电压组号 */ + @Excel(name = "最高电池电压组号") + private Long maxVoltageGroupId; - /** 平均温度 (℃) */ - @Excel(name = "平均温度 (℃)") - private BigDecimal averageTemperature; + /** 高电压电池所在组中的点号 */ + @Excel(name = "高电压电池所在组中的点号") + private Long maxVoltageCellId; - /** 绝缘电阻 (Ω) */ - @Excel(name = "绝缘电阻 (Ω)") - private BigDecimal insulationResistance; + /** 最低电池电压/V */ + @Excel(name = "最低电池电压/V") + private BigDecimal minCellVoltage; - /** 当前SOC (%) */ - @Excel(name = "当前SOC (%)") - private BigDecimal currentSoc; + /** 最低电池电压组号 */ + @Excel(name = "最低电池电压组号") + private Long minVoltageGroupId; - /** 站点id */ - @Excel(name = "站点id") - private Long siteId; + /** 最低电压电池所在组中的点号 */ + @Excel(name = "最低电压电池所在组中的点号") + private Long minVoltageCellId; - /** 设备唯一标识符 */ - @Excel(name = "设备唯一标识符") - private Long deviceId; + /** 最高电池温度/℃ */ + @Excel(name = "最高电池温度/℃") + private BigDecimal maxCellTemp; + + /** 最高温度电池组号 */ + @Excel(name = "最高温度电池组号") + private Long maxTempGroupId; + + /** 最高温度电池所在组中的点号 */ + @Excel(name = "最高温度电池所在组中的点号") + private Long maxTempCellId; + + /** 最低电池温度/℃ */ + @Excel(name = "最低电池温度/℃") + private BigDecimal minCellTemp; + + /** 最低电池温度组号 */ + @Excel(name = "最低电池温度组号") + private Long minTempGroupId; + + /** 最低温度电池所在组中的点号 */ + @Excel(name = "最低温度电池所在组中的点号") + private Long minTempCellId; + + /** 堆累计充电电量/kWh */ + @Excel(name = "堆累计充电电量/kWh") + private BigDecimal totalChargeCapacity; + + /** 堆累计放电电量/kWh */ + @Excel(name = "堆累计放电电量/kWh") + private BigDecimal totalDischargeCapacity; + + /** 堆单次累计充电电量/kWh */ + @Excel(name = "堆单次累计充电电量/kWh") + private BigDecimal sessionChargeCapacity; + + /** 堆单次累计放电电量/kWh */ + @Excel(name = "堆单次累计放电电量/kWh") + private BigDecimal sessionDischargeCapacity; + + /** 堆可充电量/kWh */ + @Excel(name = "堆可充电量/kWh") + private BigDecimal availableChargeCapacity; + + /** 堆可放电量/kWh */ + @Excel(name = "堆可放电量/kWh") + private BigDecimal availableDischargeCapacity; + + /** 可用放电时间/min */ + @Excel(name = "可用放电时间/min") + private Long remainingDischargeTime; + + /** 可用充电时间/min */ + @Excel(name = "可用充电时间/min") + private Long remainingChargeTime; + + /** 允许最大放电功率/kW */ + @Excel(name = "允许最大放电功率/kW") + private BigDecimal maxDischargePower; + + /** 允许最大充电功率/kW */ + @Excel(name = "允许最大充电功率/kW") + private BigDecimal maxChargePower; + + /** 允许最大放电电流/A */ + @Excel(name = "允许最大放电电流/A") + private BigDecimal maxDischargeCurrent; + + /** 允许最大充电电流/A */ + @Excel(name = "允许最大充电电流/A") + private BigDecimal maxChargeCurrent; + + /** 当天放电次数 */ + @Excel(name = "当天放电次数") + private Long dailyDischargeCycles; + + /** 当天充电次数 */ + @Excel(name = "当天充电次数") + private Long dailyChargeCycles; + + /** 当天放电电量/kWh */ + @Excel(name = "当天放电电量/kWh") + private BigDecimal dailyDischargeCapacity; + + /** 当天充电电量/kWh */ + @Excel(name = "当天充电电量/kWh") + private BigDecimal dailyChargeCapacity; + + /** 运行温度/℃ */ + @Excel(name = "运行温度/℃") + private BigDecimal operatingTemp; + + /** BMS堆当前状态 */ + @Excel(name = "BMS堆当前状态") + private String bmsStatus; + + /** BMS充放电状态 */ + @Excel(name = "BMS充放电状态") + private String bmsChargeStatus; + + /** 电池堆绝缘电阻/kΩ */ + @Excel(name = "电池堆绝缘电阻/kΩ") + private BigDecimal stackInsulationResistance; + + /** 站点 id */ + @Excel(name = "站点 id") + private String siteId; + + /** 设备id */ + @Excel(name = "设备id") + private String deviceId; + + /** 单体个数 */ + @Excel(name = "单体个数") + private Long batteryNumber; + + /** 单体平均电压 */ + @Excel(name = "单体平均电压") + private BigDecimal batteryAvgVoltage; + + /** 单体电池压差 */ + @Excel(name = "单体电池压差") + private BigDecimal batteryDifferentPressure; + + /** 平均温度 */ + @Excel(name = "平均温度") + private BigDecimal avgTemperature; + + /** 单体电池温度差 */ + @Excel(name = "单体电池温度差") + private BigDecimal batteryDifferentTemperature; + + /** 最大单体内阻 */ + @Excel(name = "最大单体内阻") + private BigDecimal maxInternalResistance; + + /** 最小单体内阻 */ + @Excel(name = "最小单体内阻") + private BigDecimal minInternalResistance; + + /** 平均单体内阻 */ + @Excel(name = "平均单体内阻") + private BigDecimal avgInternalResistance; + + /** 单体内阻差 */ + @Excel(name = "单体内阻差") + private BigDecimal batteryDefferentResistance; + + /** 最大单体内阻编号 */ + @Excel(name = "最大单体内阻编号") + private Long maxResistanceCellId; + + /** 最小单体内阻编号 */ + @Excel(name = "最小单体内阻编号") + private Long minResistanceCellId; + + /** 环境温度 */ + @Excel(name = "环境温度") + private BigDecimal environmentTemperature; + + /** 环境湿度 */ + @Excel(name = "环境湿度") + private BigDecimal environmentHumidity; + + /** 断路器状态 */ + @Excel(name = "断路器状态") + private String circuitBreakerStatus; public void setId(Long id) { @@ -90,6 +262,14 @@ public class EmsBatteryStack extends BaseEntity return id; } + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + public void setWorkStatus(String workStatus) { this.workStatus = workStatus; @@ -120,126 +300,536 @@ public class EmsBatteryStack extends BaseEntity return emsCommunicationStatus; } - public void setTotalVoltage(BigDecimal totalVoltage) + public void setOperationStatus(String operationStatus) { - this.totalVoltage = totalVoltage; + this.operationStatus = operationStatus; } - public BigDecimal getTotalVoltage() + public String getOperationStatus() { - return totalVoltage; + return operationStatus; } - public void setChargeableCapacity(BigDecimal chargeableCapacity) + public void setStackVoltage(BigDecimal stackVoltage) { - this.chargeableCapacity = chargeableCapacity; + this.stackVoltage = stackVoltage; } - public BigDecimal getChargeableCapacity() + public BigDecimal getStackVoltage() { - return chargeableCapacity; + return stackVoltage; } - public void setTotalChargedCapacity(BigDecimal totalChargedCapacity) + public void setStackCurrent(BigDecimal stackCurrent) { - this.totalChargedCapacity = totalChargedCapacity; + this.stackCurrent = stackCurrent; } - public BigDecimal getTotalChargedCapacity() + public BigDecimal getStackCurrent() { - return totalChargedCapacity; + return stackCurrent; } - public void setTotalCurrent(BigDecimal totalCurrent) + public void setStackSoc(BigDecimal stackSoc) { - this.totalCurrent = totalCurrent; + this.stackSoc = stackSoc; } - public BigDecimal getTotalCurrent() + public BigDecimal getStackSoc() { - return totalCurrent; + return stackSoc; } - public void setDischargeableCapacity(BigDecimal dischargeableCapacity) + public void setStackSoh(BigDecimal stackSoh) { - this.dischargeableCapacity = dischargeableCapacity; + this.stackSoh = stackSoh; } - public BigDecimal getDischargeableCapacity() + public BigDecimal getStackSoh() { - return dischargeableCapacity; + return stackSoh; } - public void setTotalDischargedCapacity(BigDecimal totalDischargedCapacity) + public void setMaxCellVoltage(BigDecimal maxCellVoltage) { - this.totalDischargedCapacity = totalDischargedCapacity; + this.maxCellVoltage = maxCellVoltage; } - public BigDecimal getTotalDischargedCapacity() + public BigDecimal getMaxCellVoltage() { - return totalDischargedCapacity; + return maxCellVoltage; } - public void setSoh(BigDecimal soh) + public void setMaxVoltageGroupId(Long maxVoltageGroupId) { - this.soh = soh; + this.maxVoltageGroupId = maxVoltageGroupId; } - public BigDecimal getSoh() + public Long getMaxVoltageGroupId() { - return soh; + return maxVoltageGroupId; } - public void setAverageTemperature(BigDecimal averageTemperature) + public void setMaxVoltageCellId(Long maxVoltageCellId) { - this.averageTemperature = averageTemperature; + this.maxVoltageCellId = maxVoltageCellId; } - public BigDecimal getAverageTemperature() + public Long getMaxVoltageCellId() { - return averageTemperature; + return maxVoltageCellId; } - public void setInsulationResistance(BigDecimal insulationResistance) + public void setMinCellVoltage(BigDecimal minCellVoltage) { - this.insulationResistance = insulationResistance; + this.minCellVoltage = minCellVoltage; } - public BigDecimal getInsulationResistance() + public BigDecimal getMinCellVoltage() { - return insulationResistance; + return minCellVoltage; } - public void setCurrentSoc(BigDecimal currentSoc) + public void setMinVoltageGroupId(Long minVoltageGroupId) { - this.currentSoc = currentSoc; + this.minVoltageGroupId = minVoltageGroupId; } - public BigDecimal getCurrentSoc() + public Long getMinVoltageGroupId() { - return currentSoc; + return minVoltageGroupId; } - public void setSiteId(Long siteId) + public void setMinVoltageCellId(Long minVoltageCellId) + { + this.minVoltageCellId = minVoltageCellId; + } + + public Long getMinVoltageCellId() + { + return minVoltageCellId; + } + + public void setMaxCellTemp(BigDecimal maxCellTemp) + { + this.maxCellTemp = maxCellTemp; + } + + public BigDecimal getMaxCellTemp() + { + return maxCellTemp; + } + + public void setMaxTempGroupId(Long maxTempGroupId) + { + this.maxTempGroupId = maxTempGroupId; + } + + public Long getMaxTempGroupId() + { + return maxTempGroupId; + } + + public void setMaxTempCellId(Long maxTempCellId) + { + this.maxTempCellId = maxTempCellId; + } + + public Long getMaxTempCellId() + { + return maxTempCellId; + } + + public void setMinCellTemp(BigDecimal minCellTemp) + { + this.minCellTemp = minCellTemp; + } + + public BigDecimal getMinCellTemp() + { + return minCellTemp; + } + + public void setMinTempGroupId(Long minTempGroupId) + { + this.minTempGroupId = minTempGroupId; + } + + public Long getMinTempGroupId() + { + return minTempGroupId; + } + + public void setMinTempCellId(Long minTempCellId) + { + this.minTempCellId = minTempCellId; + } + + public Long getMinTempCellId() + { + return minTempCellId; + } + + public void setTotalChargeCapacity(BigDecimal totalChargeCapacity) + { + this.totalChargeCapacity = totalChargeCapacity; + } + + public BigDecimal getTotalChargeCapacity() + { + return totalChargeCapacity; + } + + public void setTotalDischargeCapacity(BigDecimal totalDischargeCapacity) + { + this.totalDischargeCapacity = totalDischargeCapacity; + } + + public BigDecimal getTotalDischargeCapacity() + { + return totalDischargeCapacity; + } + + public void setSessionChargeCapacity(BigDecimal sessionChargeCapacity) + { + this.sessionChargeCapacity = sessionChargeCapacity; + } + + public BigDecimal getSessionChargeCapacity() + { + return sessionChargeCapacity; + } + + public void setSessionDischargeCapacity(BigDecimal sessionDischargeCapacity) + { + this.sessionDischargeCapacity = sessionDischargeCapacity; + } + + public BigDecimal getSessionDischargeCapacity() + { + return sessionDischargeCapacity; + } + + public void setAvailableChargeCapacity(BigDecimal availableChargeCapacity) + { + this.availableChargeCapacity = availableChargeCapacity; + } + + public BigDecimal getAvailableChargeCapacity() + { + return availableChargeCapacity; + } + + public void setAvailableDischargeCapacity(BigDecimal availableDischargeCapacity) + { + this.availableDischargeCapacity = availableDischargeCapacity; + } + + public BigDecimal getAvailableDischargeCapacity() + { + return availableDischargeCapacity; + } + + public void setRemainingDischargeTime(Long remainingDischargeTime) + { + this.remainingDischargeTime = remainingDischargeTime; + } + + public Long getRemainingDischargeTime() + { + return remainingDischargeTime; + } + + public void setRemainingChargeTime(Long remainingChargeTime) + { + this.remainingChargeTime = remainingChargeTime; + } + + public Long getRemainingChargeTime() + { + return remainingChargeTime; + } + + public void setMaxDischargePower(BigDecimal maxDischargePower) + { + this.maxDischargePower = maxDischargePower; + } + + public BigDecimal getMaxDischargePower() + { + return maxDischargePower; + } + + public void setMaxChargePower(BigDecimal maxChargePower) + { + this.maxChargePower = maxChargePower; + } + + public BigDecimal getMaxChargePower() + { + return maxChargePower; + } + + public void setMaxDischargeCurrent(BigDecimal maxDischargeCurrent) + { + this.maxDischargeCurrent = maxDischargeCurrent; + } + + public BigDecimal getMaxDischargeCurrent() + { + return maxDischargeCurrent; + } + + public void setMaxChargeCurrent(BigDecimal maxChargeCurrent) + { + this.maxChargeCurrent = maxChargeCurrent; + } + + public BigDecimal getMaxChargeCurrent() + { + return maxChargeCurrent; + } + + public void setDailyDischargeCycles(Long dailyDischargeCycles) + { + this.dailyDischargeCycles = dailyDischargeCycles; + } + + public Long getDailyDischargeCycles() + { + return dailyDischargeCycles; + } + + public void setDailyChargeCycles(Long dailyChargeCycles) + { + this.dailyChargeCycles = dailyChargeCycles; + } + + public Long getDailyChargeCycles() + { + return dailyChargeCycles; + } + + public void setDailyDischargeCapacity(BigDecimal dailyDischargeCapacity) + { + this.dailyDischargeCapacity = dailyDischargeCapacity; + } + + public BigDecimal getDailyDischargeCapacity() + { + return dailyDischargeCapacity; + } + + public void setDailyChargeCapacity(BigDecimal dailyChargeCapacity) + { + this.dailyChargeCapacity = dailyChargeCapacity; + } + + public BigDecimal getDailyChargeCapacity() + { + return dailyChargeCapacity; + } + + public void setOperatingTemp(BigDecimal operatingTemp) + { + this.operatingTemp = operatingTemp; + } + + public BigDecimal getOperatingTemp() + { + return operatingTemp; + } + + public void setBmsStatus(String bmsStatus) + { + this.bmsStatus = bmsStatus; + } + + public String getBmsStatus() + { + return bmsStatus; + } + + public void setBmsChargeStatus(String bmsChargeStatus) + { + this.bmsChargeStatus = bmsChargeStatus; + } + + public String getBmsChargeStatus() + { + return bmsChargeStatus; + } + + public void setStackInsulationResistance(BigDecimal stackInsulationResistance) + { + this.stackInsulationResistance = stackInsulationResistance; + } + + public BigDecimal getStackInsulationResistance() + { + return stackInsulationResistance; + } + + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } + public void setBatteryNumber(Long batteryNumber) + { + this.batteryNumber = batteryNumber; + } + + public Long getBatteryNumber() + { + return batteryNumber; + } + + public void setBatteryAvgVoltage(BigDecimal batteryAvgVoltage) + { + this.batteryAvgVoltage = batteryAvgVoltage; + } + + public BigDecimal getBatteryAvgVoltage() + { + return batteryAvgVoltage; + } + + public void setBatteryDifferentPressure(BigDecimal batteryDifferentPressure) + { + this.batteryDifferentPressure = batteryDifferentPressure; + } + + public BigDecimal getBatteryDifferentPressure() + { + return batteryDifferentPressure; + } + + public void setAvgTemperature(BigDecimal avgTemperature) + { + this.avgTemperature = avgTemperature; + } + + public BigDecimal getAvgTemperature() + { + return avgTemperature; + } + + public void setBatteryDifferentTemperature(BigDecimal batteryDifferentTemperature) + { + this.batteryDifferentTemperature = batteryDifferentTemperature; + } + + public BigDecimal getBatteryDifferentTemperature() + { + return batteryDifferentTemperature; + } + + public void setMaxInternalResistance(BigDecimal maxInternalResistance) + { + this.maxInternalResistance = maxInternalResistance; + } + + public BigDecimal getMaxInternalResistance() + { + return maxInternalResistance; + } + + public void setMinInternalResistance(BigDecimal minInternalResistance) + { + this.minInternalResistance = minInternalResistance; + } + + public BigDecimal getMinInternalResistance() + { + return minInternalResistance; + } + + public void setAvgInternalResistance(BigDecimal avgInternalResistance) + { + this.avgInternalResistance = avgInternalResistance; + } + + public BigDecimal getAvgInternalResistance() + { + return avgInternalResistance; + } + + public void setBatteryDefferentResistance(BigDecimal batteryDefferentResistance) + { + this.batteryDefferentResistance = batteryDefferentResistance; + } + + public BigDecimal getBatteryDefferentResistance() + { + return batteryDefferentResistance; + } + + public void setMaxResistanceCellId(Long maxResistanceCellId) + { + this.maxResistanceCellId = maxResistanceCellId; + } + + public Long getMaxResistanceCellId() + { + return maxResistanceCellId; + } + + public void setMinResistanceCellId(Long minResistanceCellId) + { + this.minResistanceCellId = minResistanceCellId; + } + + public Long getMinResistanceCellId() + { + return minResistanceCellId; + } + + public void setEnvironmentTemperature(BigDecimal environmentTemperature) + { + this.environmentTemperature = environmentTemperature; + } + + public BigDecimal getEnvironmentTemperature() + { + return environmentTemperature; + } + + public void setEnvironmentHumidity(BigDecimal environmentHumidity) + { + this.environmentHumidity = environmentHumidity; + } + + public BigDecimal getEnvironmentHumidity() + { + return environmentHumidity; + } + + public void setCircuitBreakerStatus(String circuitBreakerStatus) + { + this.circuitBreakerStatus = circuitBreakerStatus; + } + + public String getCircuitBreakerStatus() + { + return circuitBreakerStatus; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -247,23 +837,63 @@ public class EmsBatteryStack extends BaseEntity .append("workStatus", getWorkStatus()) .append("pcsCommunicationStatus", getPcsCommunicationStatus()) .append("emsCommunicationStatus", getEmsCommunicationStatus()) - .append("totalVoltage", getTotalVoltage()) - .append("chargeableCapacity", getChargeableCapacity()) - .append("totalChargedCapacity", getTotalChargedCapacity()) - .append("totalCurrent", getTotalCurrent()) - .append("dischargeableCapacity", getDischargeableCapacity()) - .append("totalDischargedCapacity", getTotalDischargedCapacity()) - .append("soh", getSoh()) - .append("averageTemperature", getAverageTemperature()) - .append("insulationResistance", getInsulationResistance()) - .append("currentSoc", getCurrentSoc()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) + .append("operationStatus", getOperationStatus()) + .append("stackVoltage", getStackVoltage()) + .append("stackCurrent", getStackCurrent()) + .append("stackSoc", getStackSoc()) + .append("stackSoh", getStackSoh()) + .append("maxCellVoltage", getMaxCellVoltage()) + .append("maxVoltageGroupId", getMaxVoltageGroupId()) + .append("maxVoltageCellId", getMaxVoltageCellId()) + .append("minCellVoltage", getMinCellVoltage()) + .append("minVoltageGroupId", getMinVoltageGroupId()) + .append("minVoltageCellId", getMinVoltageCellId()) + .append("maxCellTemp", getMaxCellTemp()) + .append("maxTempGroupId", getMaxTempGroupId()) + .append("maxTempCellId", getMaxTempCellId()) + .append("minCellTemp", getMinCellTemp()) + .append("minTempGroupId", getMinTempGroupId()) + .append("minTempCellId", getMinTempCellId()) + .append("totalChargeCapacity", getTotalChargeCapacity()) + .append("totalDischargeCapacity", getTotalDischargeCapacity()) + .append("sessionChargeCapacity", getSessionChargeCapacity()) + .append("sessionDischargeCapacity", getSessionDischargeCapacity()) + .append("availableChargeCapacity", getAvailableChargeCapacity()) + .append("availableDischargeCapacity", getAvailableDischargeCapacity()) + .append("remainingDischargeTime", getRemainingDischargeTime()) + .append("remainingChargeTime", getRemainingChargeTime()) + .append("maxDischargePower", getMaxDischargePower()) + .append("maxChargePower", getMaxChargePower()) + .append("maxDischargeCurrent", getMaxDischargeCurrent()) + .append("maxChargeCurrent", getMaxChargeCurrent()) + .append("dailyDischargeCycles", getDailyDischargeCycles()) + .append("dailyChargeCycles", getDailyChargeCycles()) + .append("dailyDischargeCapacity", getDailyDischargeCapacity()) + .append("dailyChargeCapacity", getDailyChargeCapacity()) + .append("operatingTemp", getOperatingTemp()) + .append("bmsStatus", getBmsStatus()) + .append("bmsChargeStatus", getBmsChargeStatus()) + .append("stackInsulationResistance", getStackInsulationResistance()) .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .append("batteryNumber", getBatteryNumber()) + .append("batteryAvgVoltage", getBatteryAvgVoltage()) + .append("batteryDifferentPressure", getBatteryDifferentPressure()) + .append("avgTemperature", getAvgTemperature()) + .append("batteryDifferentTemperature", getBatteryDifferentTemperature()) + .append("maxInternalResistance", getMaxInternalResistance()) + .append("minInternalResistance", getMinInternalResistance()) + .append("avgInternalResistance", getAvgInternalResistance()) + .append("batteryDefferentResistance", getBatteryDefferentResistance()) + .append("maxResistanceCellId", getMaxResistanceCellId()) + .append("minResistanceCellId", getMinResistanceCellId()) + .append("environmentTemperature", getEnvironmentTemperature()) + .append("environmentHumidity", getEnvironmentHumidity()) + .append("circuitBreakerStatus", getCircuitBreakerStatus()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsClusterAlarmData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsClusterAlarmData.java new file mode 100644 index 0000000..d550741 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsClusterAlarmData.java @@ -0,0 +1,1410 @@ +package com.xzzn.ems.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * bmsc告警数据对象 ems_cluster_alarm_data + * + * @author xzzn + * @date 2025-10-22 + */ +public class EmsClusterAlarmData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 记录唯一ID */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataTimestamp; + + /** 站点ID */ + @Excel(name = "站点ID") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 簇1主控通讯失联(0=正常,1=异常) */ + @Excel(name = "簇1主控通讯失联", readConverterExp = "0==正常,1=异常") + private Integer c1zktxsl; + + /** 簇1端电压欠压轻度告警 */ + @Excel(name = "簇1端电压欠压轻度告警") + private Integer c1ddyqyqdgj; + + /** 簇1端电压欠压中度告警 */ + @Excel(name = "簇1端电压欠压中度告警") + private Integer c1ddyqyzdgj; + + /** 簇1端电压欠压重度告警 */ + @Excel(name = "簇1端电压欠压重度告警") + private Integer c1ddyqyzzdgj; + + /** 簇1端电压过压轻度告警 */ + @Excel(name = "簇1端电压过压轻度告警") + private Integer c1ddygyqdgj; + + /** 簇1端电压过压中度告警 */ + @Excel(name = "簇1端电压过压中度告警") + private Integer c1ddygyzdgj; + + /** 簇1端电压过压重度告警 */ + @Excel(name = "簇1端电压过压重度告警") + private Integer c1ddygyzzdgj; + + /** 簇1端电流轻度告警 */ + @Excel(name = "簇1端电流轻度告警") + private Integer c1ddlqdgj; + + /** 簇1端电流中度告警 */ + @Excel(name = "簇1端电流中度告警") + private Integer c1ddlzdgj; + + /** 簇1端电流重度告警 */ + @Excel(name = "簇1端电流重度告警") + private Integer c1ddlzzdgj; + + /** 簇1单体欠压轻度告警 */ + @Excel(name = "簇1单体欠压轻度告警") + private Integer c1dtqyqdgj; + + /** 簇1单体欠压中度告警 */ + @Excel(name = "簇1单体欠压中度告警") + private Integer c1dtqyzdgj; + + /** 簇1单体欠压重度告警 */ + @Excel(name = "簇1单体欠压重度告警") + private Integer c1dtqyzzdgj; + + /** 簇1单体过压轻度告警 */ + @Excel(name = "簇1单体过压轻度告警") + private Integer c1dtgyqdgj; + + /** 簇1单体过压中度告警 */ + @Excel(name = "簇1单体过压中度告警") + private Integer c1dtgyzdgj; + + /** 簇1单体过压重度告警 */ + @Excel(name = "簇1单体过压重度告警") + private Integer c1dtgyzzdgj; + + /** 簇1单体欠温轻度告警 */ + @Excel(name = "簇1单体欠温轻度告警") + private Integer c1dtqwqdgj; + + /** 簇1单体欠温中度告警 */ + @Excel(name = "簇1单体欠温中度告警") + private Integer c1dtqwzdgj; + + /** 簇1单体欠温重度告警 */ + @Excel(name = "簇1单体欠温重度告警") + private Integer c1dtqwzzdgj; + + /** 簇1单体过温轻度告警 */ + @Excel(name = "簇1单体过温轻度告警") + private Integer c1dtgwqdgj; + + /** 簇1单体过温中度告警 */ + @Excel(name = "簇1单体过温中度告警") + private Integer c1dtgwzdgj; + + /** 簇1单体过温重度告警 */ + @Excel(name = "簇1单体过温重度告警") + private Integer c1dtgwzzdgj; + + /** 簇1单体SOC低轻度告警 */ + @Excel(name = "簇1单体SOC低轻度告警") + private Integer c1socdqdgj; + + /** 簇1单体SOC低中度告警 */ + @Excel(name = "簇1单体SOC低中度告警") + private Integer c1socdzdgj; + + /** 簇1单体SOC低重度告警 */ + @Excel(name = "簇1单体SOC低重度告警") + private Integer c1socdzzdgj; + + /** 簇1单体SOC高轻度告警 */ + @Excel(name = "簇1单体SOC高轻度告警") + private Integer c1socgqdgj; + + /** 簇1单体SOC高中度告警 */ + @Excel(name = "簇1单体SOC高中度告警") + private Integer c1socgzdgj; + + /** 簇1单体SOC高重度告警 */ + @Excel(name = "簇1单体SOC高重度告警") + private Integer c1socgzzdgj; + + /** 簇1单体SOH低轻度告警 */ + @Excel(name = "簇1单体SOH低轻度告警") + private Integer c1sohdqdgj; + + /** 簇1单体SOH低中度告警 */ + @Excel(name = "簇1单体SOH低中度告警") + private Integer c1sohdzdgj; + + /** 簇1单体SOH低重度告警 */ + @Excel(name = "簇1单体SOH低重度告警") + private Integer c1sohdzzdgj; + + /** 簇1单体压差轻度告警 */ + @Excel(name = "簇1单体压差轻度告警") + private Integer c1dtycqdgj; + + /** 簇1单体压差中度告警 */ + @Excel(name = "簇1单体压差中度告警") + private Integer c1dtyczdgj; + + /** 簇1单体压差重度告警 */ + @Excel(name = "簇1单体压差重度告警") + private Integer c1dtyczzdgj; + + /** 簇1单体温差轻度告警 */ + @Excel(name = "簇1单体温差轻度告警") + private Integer c1dtwcqdgj; + + /** 簇1单体温差中度告警 */ + @Excel(name = "簇1单体温差中度告警") + private Integer c1dtwczdgj; + + /** 簇1单体温差重度告警 */ + @Excel(name = "簇1单体温差重度告警") + private Integer c1dtwczzdgj; + + /** 簇1从控1通讯失联 */ + @Excel(name = "簇1从控1通讯失联") + private Integer c1ck1txsl; + + /** 簇1从控2通讯失联 */ + @Excel(name = "簇1从控2通讯失联") + private Integer c1ck2txsl; + + /** 簇1从控3通讯失联 */ + @Excel(name = "簇1从控3通讯失联") + private Integer c1ck3txsl; + + /** 簇1从控4通讯失联 */ + @Excel(name = "簇1从控4通讯失联") + private Integer c1ck4txsl; + + /** 簇1从控5通讯失联 */ + @Excel(name = "簇1从控5通讯失联") + private Integer c1ck5txsl; + + /** 簇1从控6通讯失联 */ + @Excel(name = "簇1从控6通讯失联") + private Integer c1ck6txsl; + + /** 簇1从控7通讯失联 */ + @Excel(name = "簇1从控7通讯失联") + private Integer c1ck7txsl; + + /** 簇1从控8通讯失联 */ + @Excel(name = "簇1从控8通讯失联") + private Integer c1ck8txsl; + + /** 簇1从控9通讯失联 */ + @Excel(name = "簇1从控9通讯失联") + private Integer c1ck9txsl; + + /** 簇1从控10通讯失联 */ + @Excel(name = "簇1从控10通讯失联") + private Integer c1ck10txsl; + + /** 簇1从控11通讯失联 */ + @Excel(name = "簇1从控11通讯失联") + private Integer c1ck11txsl; + + /** 簇1从控12通讯失联 */ + @Excel(name = "簇1从控12通讯失联") + private Integer c1ck12txsl; + + /** 簇1从控13通讯失联 */ + @Excel(name = "簇1从控13通讯失联") + private Integer c1ck13txsl; + + /** 簇1从控14通讯失联 */ + @Excel(name = "簇1从控14通讯失联") + private Integer c1ck14txsl; + + /** 簇1从控15通讯失联 */ + @Excel(name = "簇1从控15通讯失联") + private Integer c1ck15txsl; + + /** 簇1从控16通讯失联 */ + @Excel(name = "簇1从控16通讯失联") + private Integer c1ck16txsl; + + /** 簇1从控17通讯失联 */ + @Excel(name = "簇1从控17通讯失联") + private Integer c1ck17txsl; + + /** 簇1从控18通讯失联 */ + @Excel(name = "簇1从控18通讯失联") + private Integer c1ck18txsl; + + /** 簇1从控19通讯失联 */ + @Excel(name = "簇1从控19通讯失联") + private Integer c1ck19txsl; + + /** 簇1从控20通讯失联 */ + @Excel(name = "簇1从控20通讯失联") + private Integer c1ck20txsl; + + /** 簇1从控21通讯失联 */ + @Excel(name = "簇1从控21通讯失联") + private Integer c1ck21txsl; + + /** 簇1从控22通讯失联 */ + @Excel(name = "簇1从控22通讯失联") + private Integer c1ck22txsl; + + /** 簇1从控23通讯失联 */ + @Excel(name = "簇1从控23通讯失联") + private Integer c1ck23txsl; + + /** 簇1从控24通讯失联 */ + @Excel(name = "簇1从控24通讯失联") + private Integer c1ck24txsl; + + /** 簇1从控25通讯失联 */ + @Excel(name = "簇1从控25通讯失联") + private Integer c1ck25txsl; + + /** 簇1从控26通讯失联 */ + @Excel(name = "簇1从控26通讯失联") + private Integer c1ck26txsl; + + /** 簇1从控27通讯失联 */ + @Excel(name = "簇1从控27通讯失联") + private Integer c1ck27txsl; + + /** 簇1从控28通讯失联 */ + @Excel(name = "簇1从控28通讯失联") + private Integer c1ck28txsl; + + /** 簇1从控29通讯失联 */ + @Excel(name = "簇1从控29通讯失联") + private Integer c1ck29txsl; + + /** 簇1从控30通讯失联 */ + @Excel(name = "簇1从控30通讯失联") + private Integer c1ck30txsl; + + /** 簇1从控31通讯失联 */ + @Excel(name = "簇1从控31通讯失联") + private Integer c1ck31txsl; + + /** 簇1从控32通讯失联 */ + @Excel(name = "簇1从控32通讯失联") + private Integer c1ck32txsl; + + /** 簇1从控33通讯失联 */ + @Excel(name = "簇1从控33通讯失联") + private Integer c1ck33txsl; + + /** 簇1从控34通讯失联 */ + @Excel(name = "簇1从控34通讯失联") + private Integer c1ck34txsl; + + /** 簇1从控35通讯失联 */ + @Excel(name = "簇1从控35通讯失联") + private Integer c1ck35txsl; + + /** 簇1从控36通讯失联 */ + @Excel(name = "簇1从控36通讯失联") + private Integer c1ck36txsl; + + /** 簇1从控37通讯失联 */ + @Excel(name = "簇1从控37通讯失联") + private Integer c1ck37txsl; + + /** 簇1从控38通讯失联 */ + @Excel(name = "簇1从控38通讯失联") + private Integer c1ck38txsl; + + /** 簇1从控39通讯失联 */ + @Excel(name = "簇1从控39通讯失联") + private Integer c1ck39txsl; + + /** 簇1从控40通讯失联 */ + @Excel(name = "簇1从控40通讯失联") + private Integer c1ck40txsl; + + /** 簇1端子温度过高轻度告警 */ + @Excel(name = "簇1端子温度过高轻度告警") + private Integer c1dzwdggqdgj; + + /** 簇1端子温度过高中度告警 */ + @Excel(name = "簇1端子温度过高中度告警") + private Integer c1dzwdggzdgj; + + /** 簇1端子温度过高重度告警 */ + @Excel(name = "簇1端子温度过高重度告警") + private Integer c1dzwdggzzdgj; + + /** 簇1模块电压过高轻度告警 */ + @Excel(name = "簇1模块电压过高轻度告警") + private Integer c1mkdyggqdgj; + + /** 簇1模块电压过高中度告警 */ + @Excel(name = "簇1模块电压过高中度告警") + private Integer c1mkdyggzdgj; + + /** 簇1模块电压过高重度告警 */ + @Excel(name = "簇1模块电压过高重度告警") + private Integer c1mkdyggzzdgj; + + /** 簇1模块电压过低轻度告警 */ + @Excel(name = "簇1模块电压过低轻度告警") + private Integer c1mkdygdqdgj; + + /** 簇1模块电压过低中度告警 */ + @Excel(name = "簇1模块电压过低中度告警") + private Integer c1mkdygdzdgj; + + /** 簇1模块电压过低重度告警 */ + @Excel(name = "簇1模块电压过低重度告警") + private Integer c1mkdygdzzdgj; + + /** 簇1电压采集故障 */ + @Excel(name = "簇1电压采集故障") + private Integer c1dycjgz; + + /** 簇1温度采集故障 */ + @Excel(name = "簇1温度采集故障") + private Integer c1wdcjgz; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setC1zktxsl(Integer c1zktxsl) + { + this.c1zktxsl = c1zktxsl; + } + + public Integer getC1zktxsl() + { + return c1zktxsl; + } + + public void setC1ddyqyqdgj(Integer c1ddyqyqdgj) + { + this.c1ddyqyqdgj = c1ddyqyqdgj; + } + + public Integer getC1ddyqyqdgj() + { + return c1ddyqyqdgj; + } + + public void setC1ddyqyzdgj(Integer c1ddyqyzdgj) + { + this.c1ddyqyzdgj = c1ddyqyzdgj; + } + + public Integer getC1ddyqyzdgj() + { + return c1ddyqyzdgj; + } + + public void setC1ddyqyzzdgj(Integer c1ddyqyzzdgj) + { + this.c1ddyqyzzdgj = c1ddyqyzzdgj; + } + + public Integer getC1ddyqyzzdgj() + { + return c1ddyqyzzdgj; + } + + public void setC1ddygyqdgj(Integer c1ddygyqdgj) + { + this.c1ddygyqdgj = c1ddygyqdgj; + } + + public Integer getC1ddygyqdgj() + { + return c1ddygyqdgj; + } + + public void setC1ddygyzdgj(Integer c1ddygyzdgj) + { + this.c1ddygyzdgj = c1ddygyzdgj; + } + + public Integer getC1ddygyzdgj() + { + return c1ddygyzdgj; + } + + public void setC1ddygyzzdgj(Integer c1ddygyzzdgj) + { + this.c1ddygyzzdgj = c1ddygyzzdgj; + } + + public Integer getC1ddygyzzdgj() + { + return c1ddygyzzdgj; + } + + public void setC1ddlqdgj(Integer c1ddlqdgj) + { + this.c1ddlqdgj = c1ddlqdgj; + } + + public Integer getC1ddlqdgj() + { + return c1ddlqdgj; + } + + public void setC1ddlzdgj(Integer c1ddlzdgj) + { + this.c1ddlzdgj = c1ddlzdgj; + } + + public Integer getC1ddlzdgj() + { + return c1ddlzdgj; + } + + public void setC1ddlzzdgj(Integer c1ddlzzdgj) + { + this.c1ddlzzdgj = c1ddlzzdgj; + } + + public Integer getC1ddlzzdgj() + { + return c1ddlzzdgj; + } + + public void setC1dtqyqdgj(Integer c1dtqyqdgj) + { + this.c1dtqyqdgj = c1dtqyqdgj; + } + + public Integer getC1dtqyqdgj() + { + return c1dtqyqdgj; + } + + public void setC1dtqyzdgj(Integer c1dtqyzdgj) + { + this.c1dtqyzdgj = c1dtqyzdgj; + } + + public Integer getC1dtqyzdgj() + { + return c1dtqyzdgj; + } + + public void setC1dtqyzzdgj(Integer c1dtqyzzdgj) + { + this.c1dtqyzzdgj = c1dtqyzzdgj; + } + + public Integer getC1dtqyzzdgj() + { + return c1dtqyzzdgj; + } + + public void setC1dtgyqdgj(Integer c1dtgyqdgj) + { + this.c1dtgyqdgj = c1dtgyqdgj; + } + + public Integer getC1dtgyqdgj() + { + return c1dtgyqdgj; + } + + public void setC1dtgyzdgj(Integer c1dtgyzdgj) + { + this.c1dtgyzdgj = c1dtgyzdgj; + } + + public Integer getC1dtgyzdgj() + { + return c1dtgyzdgj; + } + + public void setC1dtgyzzdgj(Integer c1dtgyzzdgj) + { + this.c1dtgyzzdgj = c1dtgyzzdgj; + } + + public Integer getC1dtgyzzdgj() + { + return c1dtgyzzdgj; + } + + public void setC1dtqwqdgj(Integer c1dtqwqdgj) + { + this.c1dtqwqdgj = c1dtqwqdgj; + } + + public Integer getC1dtqwqdgj() + { + return c1dtqwqdgj; + } + + public void setC1dtqwzdgj(Integer c1dtqwzdgj) + { + this.c1dtqwzdgj = c1dtqwzdgj; + } + + public Integer getC1dtqwzdgj() + { + return c1dtqwzdgj; + } + + public void setC1dtqwzzdgj(Integer c1dtqwzzdgj) + { + this.c1dtqwzzdgj = c1dtqwzzdgj; + } + + public Integer getC1dtqwzzdgj() + { + return c1dtqwzzdgj; + } + + public void setC1dtgwqdgj(Integer c1dtgwqdgj) + { + this.c1dtgwqdgj = c1dtgwqdgj; + } + + public Integer getC1dtgwqdgj() + { + return c1dtgwqdgj; + } + + public void setC1dtgwzdgj(Integer c1dtgwzdgj) + { + this.c1dtgwzdgj = c1dtgwzdgj; + } + + public Integer getC1dtgwzdgj() + { + return c1dtgwzdgj; + } + + public void setC1dtgwzzdgj(Integer c1dtgwzzdgj) + { + this.c1dtgwzzdgj = c1dtgwzzdgj; + } + + public Integer getC1dtgwzzdgj() + { + return c1dtgwzzdgj; + } + + public void setC1socdqdgj(Integer c1socdqdgj) + { + this.c1socdqdgj = c1socdqdgj; + } + + public Integer getC1socdqdgj() + { + return c1socdqdgj; + } + + public void setC1socdzdgj(Integer c1socdzdgj) + { + this.c1socdzdgj = c1socdzdgj; + } + + public Integer getC1socdzdgj() + { + return c1socdzdgj; + } + + public void setC1socdzzdgj(Integer c1socdzzdgj) + { + this.c1socdzzdgj = c1socdzzdgj; + } + + public Integer getC1socdzzdgj() + { + return c1socdzzdgj; + } + + public void setC1socgqdgj(Integer c1socgqdgj) + { + this.c1socgqdgj = c1socgqdgj; + } + + public Integer getC1socgqdgj() + { + return c1socgqdgj; + } + + public void setC1socgzdgj(Integer c1socgzdgj) + { + this.c1socgzdgj = c1socgzdgj; + } + + public Integer getC1socgzdgj() + { + return c1socgzdgj; + } + + public void setC1socgzzdgj(Integer c1socgzzdgj) + { + this.c1socgzzdgj = c1socgzzdgj; + } + + public Integer getC1socgzzdgj() + { + return c1socgzzdgj; + } + + public void setC1sohdqdgj(Integer c1sohdqdgj) + { + this.c1sohdqdgj = c1sohdqdgj; + } + + public Integer getC1sohdqdgj() + { + return c1sohdqdgj; + } + + public void setC1sohdzdgj(Integer c1sohdzdgj) + { + this.c1sohdzdgj = c1sohdzdgj; + } + + public Integer getC1sohdzdgj() + { + return c1sohdzdgj; + } + + public void setC1sohdzzdgj(Integer c1sohdzzdgj) + { + this.c1sohdzzdgj = c1sohdzzdgj; + } + + public Integer getC1sohdzzdgj() + { + return c1sohdzzdgj; + } + + public void setC1dtycqdgj(Integer c1dtycqdgj) + { + this.c1dtycqdgj = c1dtycqdgj; + } + + public Integer getC1dtycqdgj() + { + return c1dtycqdgj; + } + + public void setC1dtyczdgj(Integer c1dtyczdgj) + { + this.c1dtyczdgj = c1dtyczdgj; + } + + public Integer getC1dtyczdgj() + { + return c1dtyczdgj; + } + + public void setC1dtyczzdgj(Integer c1dtyczzdgj) + { + this.c1dtyczzdgj = c1dtyczzdgj; + } + + public Integer getC1dtyczzdgj() + { + return c1dtyczzdgj; + } + + public void setC1dtwcqdgj(Integer c1dtwcqdgj) + { + this.c1dtwcqdgj = c1dtwcqdgj; + } + + public Integer getC1dtwcqdgj() + { + return c1dtwcqdgj; + } + + public void setC1dtwczdgj(Integer c1dtwczdgj) + { + this.c1dtwczdgj = c1dtwczdgj; + } + + public Integer getC1dtwczdgj() + { + return c1dtwczdgj; + } + + public void setC1dtwczzdgj(Integer c1dtwczzdgj) + { + this.c1dtwczzdgj = c1dtwczzdgj; + } + + public Integer getC1dtwczzdgj() + { + return c1dtwczzdgj; + } + + public void setC1ck1txsl(Integer c1ck1txsl) + { + this.c1ck1txsl = c1ck1txsl; + } + + public Integer getC1ck1txsl() + { + return c1ck1txsl; + } + + public void setC1ck2txsl(Integer c1ck2txsl) + { + this.c1ck2txsl = c1ck2txsl; + } + + public Integer getC1ck2txsl() + { + return c1ck2txsl; + } + + public void setC1ck3txsl(Integer c1ck3txsl) + { + this.c1ck3txsl = c1ck3txsl; + } + + public Integer getC1ck3txsl() + { + return c1ck3txsl; + } + + public void setC1ck4txsl(Integer c1ck4txsl) + { + this.c1ck4txsl = c1ck4txsl; + } + + public Integer getC1ck4txsl() + { + return c1ck4txsl; + } + + public void setC1ck5txsl(Integer c1ck5txsl) + { + this.c1ck5txsl = c1ck5txsl; + } + + public Integer getC1ck5txsl() + { + return c1ck5txsl; + } + + public void setC1ck6txsl(Integer c1ck6txsl) + { + this.c1ck6txsl = c1ck6txsl; + } + + public Integer getC1ck6txsl() + { + return c1ck6txsl; + } + + public void setC1ck7txsl(Integer c1ck7txsl) + { + this.c1ck7txsl = c1ck7txsl; + } + + public Integer getC1ck7txsl() + { + return c1ck7txsl; + } + + public void setC1ck8txsl(Integer c1ck8txsl) + { + this.c1ck8txsl = c1ck8txsl; + } + + public Integer getC1ck8txsl() + { + return c1ck8txsl; + } + + public void setC1ck9txsl(Integer c1ck9txsl) + { + this.c1ck9txsl = c1ck9txsl; + } + + public Integer getC1ck9txsl() + { + return c1ck9txsl; + } + + public void setC1ck10txsl(Integer c1ck10txsl) + { + this.c1ck10txsl = c1ck10txsl; + } + + public Integer getC1ck10txsl() + { + return c1ck10txsl; + } + + public void setC1ck11txsl(Integer c1ck11txsl) + { + this.c1ck11txsl = c1ck11txsl; + } + + public Integer getC1ck11txsl() + { + return c1ck11txsl; + } + + public void setC1ck12txsl(Integer c1ck12txsl) + { + this.c1ck12txsl = c1ck12txsl; + } + + public Integer getC1ck12txsl() + { + return c1ck12txsl; + } + + public void setC1ck13txsl(Integer c1ck13txsl) + { + this.c1ck13txsl = c1ck13txsl; + } + + public Integer getC1ck13txsl() + { + return c1ck13txsl; + } + + public void setC1ck14txsl(Integer c1ck14txsl) + { + this.c1ck14txsl = c1ck14txsl; + } + + public Integer getC1ck14txsl() + { + return c1ck14txsl; + } + + public void setC1ck15txsl(Integer c1ck15txsl) + { + this.c1ck15txsl = c1ck15txsl; + } + + public Integer getC1ck15txsl() + { + return c1ck15txsl; + } + + public void setC1ck16txsl(Integer c1ck16txsl) + { + this.c1ck16txsl = c1ck16txsl; + } + + public Integer getC1ck16txsl() + { + return c1ck16txsl; + } + + public void setC1ck17txsl(Integer c1ck17txsl) + { + this.c1ck17txsl = c1ck17txsl; + } + + public Integer getC1ck17txsl() + { + return c1ck17txsl; + } + + public void setC1ck18txsl(Integer c1ck18txsl) + { + this.c1ck18txsl = c1ck18txsl; + } + + public Integer getC1ck18txsl() + { + return c1ck18txsl; + } + + public void setC1ck19txsl(Integer c1ck19txsl) + { + this.c1ck19txsl = c1ck19txsl; + } + + public Integer getC1ck19txsl() + { + return c1ck19txsl; + } + + public void setC1ck20txsl(Integer c1ck20txsl) + { + this.c1ck20txsl = c1ck20txsl; + } + + public Integer getC1ck20txsl() + { + return c1ck20txsl; + } + + public void setC1ck21txsl(Integer c1ck21txsl) + { + this.c1ck21txsl = c1ck21txsl; + } + + public Integer getC1ck21txsl() + { + return c1ck21txsl; + } + + public void setC1ck22txsl(Integer c1ck22txsl) + { + this.c1ck22txsl = c1ck22txsl; + } + + public Integer getC1ck22txsl() + { + return c1ck22txsl; + } + + public void setC1ck23txsl(Integer c1ck23txsl) + { + this.c1ck23txsl = c1ck23txsl; + } + + public Integer getC1ck23txsl() + { + return c1ck23txsl; + } + + public void setC1ck24txsl(Integer c1ck24txsl) + { + this.c1ck24txsl = c1ck24txsl; + } + + public Integer getC1ck24txsl() + { + return c1ck24txsl; + } + + public void setC1ck25txsl(Integer c1ck25txsl) + { + this.c1ck25txsl = c1ck25txsl; + } + + public Integer getC1ck25txsl() + { + return c1ck25txsl; + } + + public void setC1ck26txsl(Integer c1ck26txsl) + { + this.c1ck26txsl = c1ck26txsl; + } + + public Integer getC1ck26txsl() + { + return c1ck26txsl; + } + + public void setC1ck27txsl(Integer c1ck27txsl) + { + this.c1ck27txsl = c1ck27txsl; + } + + public Integer getC1ck27txsl() + { + return c1ck27txsl; + } + + public void setC1ck28txsl(Integer c1ck28txsl) + { + this.c1ck28txsl = c1ck28txsl; + } + + public Integer getC1ck28txsl() + { + return c1ck28txsl; + } + + public void setC1ck29txsl(Integer c1ck29txsl) + { + this.c1ck29txsl = c1ck29txsl; + } + + public Integer getC1ck29txsl() + { + return c1ck29txsl; + } + + public void setC1ck30txsl(Integer c1ck30txsl) + { + this.c1ck30txsl = c1ck30txsl; + } + + public Integer getC1ck30txsl() + { + return c1ck30txsl; + } + + public void setC1ck31txsl(Integer c1ck31txsl) + { + this.c1ck31txsl = c1ck31txsl; + } + + public Integer getC1ck31txsl() + { + return c1ck31txsl; + } + + public void setC1ck32txsl(Integer c1ck32txsl) + { + this.c1ck32txsl = c1ck32txsl; + } + + public Integer getC1ck32txsl() + { + return c1ck32txsl; + } + + public void setC1ck33txsl(Integer c1ck33txsl) + { + this.c1ck33txsl = c1ck33txsl; + } + + public Integer getC1ck33txsl() + { + return c1ck33txsl; + } + + public void setC1ck34txsl(Integer c1ck34txsl) + { + this.c1ck34txsl = c1ck34txsl; + } + + public Integer getC1ck34txsl() + { + return c1ck34txsl; + } + + public void setC1ck35txsl(Integer c1ck35txsl) + { + this.c1ck35txsl = c1ck35txsl; + } + + public Integer getC1ck35txsl() + { + return c1ck35txsl; + } + + public void setC1ck36txsl(Integer c1ck36txsl) + { + this.c1ck36txsl = c1ck36txsl; + } + + public Integer getC1ck36txsl() + { + return c1ck36txsl; + } + + public void setC1ck37txsl(Integer c1ck37txsl) + { + this.c1ck37txsl = c1ck37txsl; + } + + public Integer getC1ck37txsl() + { + return c1ck37txsl; + } + + public void setC1ck38txsl(Integer c1ck38txsl) + { + this.c1ck38txsl = c1ck38txsl; + } + + public Integer getC1ck38txsl() + { + return c1ck38txsl; + } + + public void setC1ck39txsl(Integer c1ck39txsl) + { + this.c1ck39txsl = c1ck39txsl; + } + + public Integer getC1ck39txsl() + { + return c1ck39txsl; + } + + public void setC1ck40txsl(Integer c1ck40txsl) + { + this.c1ck40txsl = c1ck40txsl; + } + + public Integer getC1ck40txsl() + { + return c1ck40txsl; + } + + public void setC1dzwdggqdgj(Integer c1dzwdggqdgj) + { + this.c1dzwdggqdgj = c1dzwdggqdgj; + } + + public Integer getC1dzwdggqdgj() + { + return c1dzwdggqdgj; + } + + public void setC1dzwdggzdgj(Integer c1dzwdggzdgj) + { + this.c1dzwdggzdgj = c1dzwdggzdgj; + } + + public Integer getC1dzwdggzdgj() + { + return c1dzwdggzdgj; + } + + public void setC1dzwdggzzdgj(Integer c1dzwdggzzdgj) + { + this.c1dzwdggzzdgj = c1dzwdggzzdgj; + } + + public Integer getC1dzwdggzzdgj() + { + return c1dzwdggzzdgj; + } + + public void setC1mkdyggqdgj(Integer c1mkdyggqdgj) + { + this.c1mkdyggqdgj = c1mkdyggqdgj; + } + + public Integer getC1mkdyggqdgj() + { + return c1mkdyggqdgj; + } + + public void setC1mkdyggzdgj(Integer c1mkdyggzdgj) + { + this.c1mkdyggzdgj = c1mkdyggzdgj; + } + + public Integer getC1mkdyggzdgj() + { + return c1mkdyggzdgj; + } + + public void setC1mkdyggzzdgj(Integer c1mkdyggzzdgj) + { + this.c1mkdyggzzdgj = c1mkdyggzzdgj; + } + + public Integer getC1mkdyggzzdgj() + { + return c1mkdyggzzdgj; + } + + public void setC1mkdygdqdgj(Integer c1mkdygdqdgj) + { + this.c1mkdygdqdgj = c1mkdygdqdgj; + } + + public Integer getC1mkdygdqdgj() + { + return c1mkdygdqdgj; + } + + public void setC1mkdygdzdgj(Integer c1mkdygdzdgj) + { + this.c1mkdygdzdgj = c1mkdygdzdgj; + } + + public Integer getC1mkdygdzdgj() + { + return c1mkdygdzdgj; + } + + public void setC1mkdygdzzdgj(Integer c1mkdygdzzdgj) + { + this.c1mkdygdzzdgj = c1mkdygdzzdgj; + } + + public Integer getC1mkdygdzzdgj() + { + return c1mkdygdzzdgj; + } + + public void setC1dycjgz(Integer c1dycjgz) + { + this.c1dycjgz = c1dycjgz; + } + + public Integer getC1dycjgz() + { + return c1dycjgz; + } + + public void setC1wdcjgz(Integer c1wdcjgz) + { + this.c1wdcjgz = c1wdcjgz; + } + + public Integer getC1wdcjgz() + { + return c1wdcjgz; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataTimestamp", getDataTimestamp()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("c1zktxsl", getC1zktxsl()) + .append("c1ddyqyqdgj", getC1ddyqyqdgj()) + .append("c1ddyqyzdgj", getC1ddyqyzdgj()) + .append("c1ddyqyzzdgj", getC1ddyqyzzdgj()) + .append("c1ddygyqdgj", getC1ddygyqdgj()) + .append("c1ddygyzdgj", getC1ddygyzdgj()) + .append("c1ddygyzzdgj", getC1ddygyzzdgj()) + .append("c1ddlqdgj", getC1ddlqdgj()) + .append("c1ddlzdgj", getC1ddlzdgj()) + .append("c1ddlzzdgj", getC1ddlzzdgj()) + .append("c1dtqyqdgj", getC1dtqyqdgj()) + .append("c1dtqyzdgj", getC1dtqyzdgj()) + .append("c1dtqyzzdgj", getC1dtqyzzdgj()) + .append("c1dtgyqdgj", getC1dtgyqdgj()) + .append("c1dtgyzdgj", getC1dtgyzdgj()) + .append("c1dtgyzzdgj", getC1dtgyzzdgj()) + .append("c1dtqwqdgj", getC1dtqwqdgj()) + .append("c1dtqwzdgj", getC1dtqwzdgj()) + .append("c1dtqwzzdgj", getC1dtqwzzdgj()) + .append("c1dtgwqdgj", getC1dtgwqdgj()) + .append("c1dtgwzdgj", getC1dtgwzdgj()) + .append("c1dtgwzzdgj", getC1dtgwzzdgj()) + .append("c1socdqdgj", getC1socdqdgj()) + .append("c1socdzdgj", getC1socdzdgj()) + .append("c1socdzzdgj", getC1socdzzdgj()) + .append("c1socgqdgj", getC1socgqdgj()) + .append("c1socgzdgj", getC1socgzdgj()) + .append("c1socgzzdgj", getC1socgzzdgj()) + .append("c1sohdqdgj", getC1sohdqdgj()) + .append("c1sohdzdgj", getC1sohdzdgj()) + .append("c1sohdzzdgj", getC1sohdzzdgj()) + .append("c1dtycqdgj", getC1dtycqdgj()) + .append("c1dtyczdgj", getC1dtyczdgj()) + .append("c1dtyczzdgj", getC1dtyczzdgj()) + .append("c1dtwcqdgj", getC1dtwcqdgj()) + .append("c1dtwczdgj", getC1dtwczdgj()) + .append("c1dtwczzdgj", getC1dtwczzdgj()) + .append("c1ck1txsl", getC1ck1txsl()) + .append("c1ck2txsl", getC1ck2txsl()) + .append("c1ck3txsl", getC1ck3txsl()) + .append("c1ck4txsl", getC1ck4txsl()) + .append("c1ck5txsl", getC1ck5txsl()) + .append("c1ck6txsl", getC1ck6txsl()) + .append("c1ck7txsl", getC1ck7txsl()) + .append("c1ck8txsl", getC1ck8txsl()) + .append("c1ck9txsl", getC1ck9txsl()) + .append("c1ck10txsl", getC1ck10txsl()) + .append("c1ck11txsl", getC1ck11txsl()) + .append("c1ck12txsl", getC1ck12txsl()) + .append("c1ck13txsl", getC1ck13txsl()) + .append("c1ck14txsl", getC1ck14txsl()) + .append("c1ck15txsl", getC1ck15txsl()) + .append("c1ck16txsl", getC1ck16txsl()) + .append("c1ck17txsl", getC1ck17txsl()) + .append("c1ck18txsl", getC1ck18txsl()) + .append("c1ck19txsl", getC1ck19txsl()) + .append("c1ck20txsl", getC1ck20txsl()) + .append("c1ck21txsl", getC1ck21txsl()) + .append("c1ck22txsl", getC1ck22txsl()) + .append("c1ck23txsl", getC1ck23txsl()) + .append("c1ck24txsl", getC1ck24txsl()) + .append("c1ck25txsl", getC1ck25txsl()) + .append("c1ck26txsl", getC1ck26txsl()) + .append("c1ck27txsl", getC1ck27txsl()) + .append("c1ck28txsl", getC1ck28txsl()) + .append("c1ck29txsl", getC1ck29txsl()) + .append("c1ck30txsl", getC1ck30txsl()) + .append("c1ck31txsl", getC1ck31txsl()) + .append("c1ck32txsl", getC1ck32txsl()) + .append("c1ck33txsl", getC1ck33txsl()) + .append("c1ck34txsl", getC1ck34txsl()) + .append("c1ck35txsl", getC1ck35txsl()) + .append("c1ck36txsl", getC1ck36txsl()) + .append("c1ck37txsl", getC1ck37txsl()) + .append("c1ck38txsl", getC1ck38txsl()) + .append("c1ck39txsl", getC1ck39txsl()) + .append("c1ck40txsl", getC1ck40txsl()) + .append("c1dzwdggqdgj", getC1dzwdggqdgj()) + .append("c1dzwdggzdgj", getC1dzwdggzdgj()) + .append("c1dzwdggzzdgj", getC1dzwdggzzdgj()) + .append("c1mkdyggqdgj", getC1mkdyggqdgj()) + .append("c1mkdyggzdgj", getC1mkdyggzdgj()) + .append("c1mkdyggzzdgj", getC1mkdyggzzdgj()) + .append("c1mkdygdqdgj", getC1mkdygdqdgj()) + .append("c1mkdygdzdgj", getC1mkdygdzdgj()) + .append("c1mkdygdzzdgj", getC1mkdygdzzdgj()) + .append("c1dycjgz", getC1dycjgz()) + .append("c1wdcjgz", getC1wdcjgz()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingAlarmData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingAlarmData.java new file mode 100644 index 0000000..9ae72ef --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingAlarmData.java @@ -0,0 +1,795 @@ +package com.xzzn.ems.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * ZSLQ告警故障数据对象 ems_cooling_alarm_data + * + * @author xzzn + * @date 2025-10-22 + */ +public class EmsCoolingAlarmData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 记录唯一ID */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataTimestamp; + + /** 站点ID */ + @Excel(name = "站点ID") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** */ + @Excel(name = "") + private Integer lsjyx; + + /** */ + @Excel(name = "") + private Integer pqdcfyx; + + /** */ + @Excel(name = "") + private Integer djrq2yx; + + /** */ + @Excel(name = "") + private Integer djrq1yx; + + /** */ + @Excel(name = "") + private Integer bqbyx; + + /** */ + @Excel(name = "") + private Integer bsbyx; + + /** */ + @Excel(name = "") + private Integer zxhbyx; + + /** */ + @Excel(name = "") + private Integer sltzgz; + + /** */ + @Excel(name = "") + private Integer slzhyj; + + /** */ + @Excel(name = "") + private Integer slxtyctzxh; + + /** */ + @Excel(name = "") + private Integer slxtycqdxh; + + /** */ + @Excel(name = "") + private Integer slxtyckz; + + /** */ + @Excel(name = "") + private Integer slxtbdkz; + + /** */ + @Excel(name = "") + private Integer slxtzdms; + + /** */ + @Excel(name = "") + private Integer slxtsdms; + + /** */ + @Excel(name = "") + private Integer hsylcdyj; + + /** */ + @Excel(name = "") + private Integer hsyldyj; + + /** */ + @Excel(name = "") + private Integer gsylcgyj; + + /** */ + @Excel(name = "") + private Integer gsylgyj; + + /** */ + @Excel(name = "") + private Integer gsylcdyj; + + /** */ + @Excel(name = "") + private Integer gsyldyj; + + /** */ + @Excel(name = "") + private Integer hcgywg; + + /** */ + @Excel(name = "") + private Integer hcgywcdtz; + + /** */ + @Excel(name = "") + private Integer hcgywd; + + /** */ + @Excel(name = "") + private Integer hcgylg; + + /** */ + @Excel(name = "") + private Integer hcgyld; + + /** */ + @Excel(name = "") + private Integer lysylgyj; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Integer lysyldyj; + + /** */ + @Excel(name = "") + private Integer hswdcgyj; + + /** */ + @Excel(name = "") + private Integer hswdgyj; + + /** */ + @Excel(name = "") + private Integer gswdcgtz; + + /** */ + @Excel(name = "") + private Integer gswdgyj; + + /** */ + @Excel(name = "") + private Integer gswddyj; + + /** */ + @Excel(name = "") + private Integer ddf2gz; + + /** */ + @Excel(name = "") + private Integer ddf1gz; + + /** */ + @Excel(name = "") + private Integer lyswdbsqyJ; + + /** */ + @Excel(name = "") + private Integer hsylbsqyJ; + + /** */ + @Excel(name = "") + private Integer gsylbsqyJ; + + /** */ + @Excel(name = "") + private Integer hswdbsqyJ; + + /** */ + @Excel(name = "") + private Integer gswdbsqgztz; + + /** */ + @Excel(name = "") + private Integer lsjgz; + + /** */ + @Excel(name = "") + private Integer djrq2gz; + + /** */ + @Excel(name = "") + private Integer djrq1gz; + + /** */ + @Excel(name = "") + private Integer bqbgz; + + /** */ + @Excel(name = "") + private Integer bsbgz; + + /** */ + @Excel(name = "") + private Integer xhbgz; + + /** */ + @Excel(name = "") + private Integer zdygz; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setLsjyx(Integer lsjyx) + { + this.lsjyx = lsjyx; + } + + public Integer getLsjyx() + { + return lsjyx; + } + + public void setPqdcfyx(Integer pqdcfyx) + { + this.pqdcfyx = pqdcfyx; + } + + public Integer getPqdcfyx() + { + return pqdcfyx; + } + + public void setDjrq2yx(Integer djrq2yx) + { + this.djrq2yx = djrq2yx; + } + + public Integer getDjrq2yx() + { + return djrq2yx; + } + + public void setDjrq1yx(Integer djrq1yx) + { + this.djrq1yx = djrq1yx; + } + + public Integer getDjrq1yx() + { + return djrq1yx; + } + + public void setBqbyx(Integer bqbyx) + { + this.bqbyx = bqbyx; + } + + public Integer getBqbyx() + { + return bqbyx; + } + + public void setBsbyx(Integer bsbyx) + { + this.bsbyx = bsbyx; + } + + public Integer getBsbyx() + { + return bsbyx; + } + + public void setZxhbyx(Integer zxhbyx) + { + this.zxhbyx = zxhbyx; + } + + public Integer getZxhbyx() + { + return zxhbyx; + } + + public void setSltzgz(Integer sltzgz) + { + this.sltzgz = sltzgz; + } + + public Integer getSltzgz() + { + return sltzgz; + } + + public void setSlzhyj(Integer slzhyj) + { + this.slzhyj = slzhyj; + } + + public Integer getSlzhyj() + { + return slzhyj; + } + + public void setSlxtyctzxh(Integer slxtyctzxh) + { + this.slxtyctzxh = slxtyctzxh; + } + + public Integer getSlxtyctzxh() + { + return slxtyctzxh; + } + + public void setSlxtycqdxh(Integer slxtycqdxh) + { + this.slxtycqdxh = slxtycqdxh; + } + + public Integer getSlxtycqdxh() + { + return slxtycqdxh; + } + + public void setSlxtyckz(Integer slxtyckz) + { + this.slxtyckz = slxtyckz; + } + + public Integer getSlxtyckz() + { + return slxtyckz; + } + + public void setSlxtbdkz(Integer slxtbdkz) + { + this.slxtbdkz = slxtbdkz; + } + + public Integer getSlxtbdkz() + { + return slxtbdkz; + } + + public void setSlxtzdms(Integer slxtzdms) + { + this.slxtzdms = slxtzdms; + } + + public Integer getSlxtzdms() + { + return slxtzdms; + } + + public void setSlxtsdms(Integer slxtsdms) + { + this.slxtsdms = slxtsdms; + } + + public Integer getSlxtsdms() + { + return slxtsdms; + } + + public void setHsylcdyj(Integer hsylcdyj) + { + this.hsylcdyj = hsylcdyj; + } + + public Integer getHsylcdyj() + { + return hsylcdyj; + } + + public void setHsyldyj(Integer hsyldyj) + { + this.hsyldyj = hsyldyj; + } + + public Integer getHsyldyj() + { + return hsyldyj; + } + + public void setGsylcgyj(Integer gsylcgyj) + { + this.gsylcgyj = gsylcgyj; + } + + public Integer getGsylcgyj() + { + return gsylcgyj; + } + + public void setGsylgyj(Integer gsylgyj) + { + this.gsylgyj = gsylgyj; + } + + public Integer getGsylgyj() + { + return gsylgyj; + } + + public void setGsylcdyj(Integer gsylcdyj) + { + this.gsylcdyj = gsylcdyj; + } + + public Integer getGsylcdyj() + { + return gsylcdyj; + } + + public void setGsyldyj(Integer gsyldyj) + { + this.gsyldyj = gsyldyj; + } + + public Integer getGsyldyj() + { + return gsyldyj; + } + + public void setHcgywg(Integer hcgywg) + { + this.hcgywg = hcgywg; + } + + public Integer getHcgywg() + { + return hcgywg; + } + + public void setHcgywcdtz(Integer hcgywcdtz) + { + this.hcgywcdtz = hcgywcdtz; + } + + public Integer getHcgywcdtz() + { + return hcgywcdtz; + } + + public void setHcgywd(Integer hcgywd) + { + this.hcgywd = hcgywd; + } + + public Integer getHcgywd() + { + return hcgywd; + } + + public void setHcgylg(Integer hcgylg) + { + this.hcgylg = hcgylg; + } + + public Integer getHcgylg() + { + return hcgylg; + } + + public void setHcgyld(Integer hcgyld) + { + this.hcgyld = hcgyld; + } + + public Integer getHcgyld() + { + return hcgyld; + } + + public void setLysylgyj(Integer lysylgyj) + { + this.lysylgyj = lysylgyj; + } + + public Integer getLysylgyj() + { + return lysylgyj; + } + + public void setLysyldyj(Integer lysyldyj) + { + this.lysyldyj = lysyldyj; + } + + public Integer getLysyldyj() + { + return lysyldyj; + } + + public void setHswdcgyj(Integer hswdcgyj) + { + this.hswdcgyj = hswdcgyj; + } + + public Integer getHswdcgyj() + { + return hswdcgyj; + } + + public void setHswdgyj(Integer hswdgyj) + { + this.hswdgyj = hswdgyj; + } + + public Integer getHswdgyj() + { + return hswdgyj; + } + + public void setGswdcgtz(Integer gswdcgtz) + { + this.gswdcgtz = gswdcgtz; + } + + public Integer getGswdcgtz() + { + return gswdcgtz; + } + + public void setGswdgyj(Integer gswdgyj) + { + this.gswdgyj = gswdgyj; + } + + public Integer getGswdgyj() + { + return gswdgyj; + } + + public void setGswddyj(Integer gswddyj) + { + this.gswddyj = gswddyj; + } + + public Integer getGswddyj() + { + return gswddyj; + } + + public void setDdf2gz(Integer ddf2gz) + { + this.ddf2gz = ddf2gz; + } + + public Integer getDdf2gz() + { + return ddf2gz; + } + + public void setDdf1gz(Integer ddf1gz) + { + this.ddf1gz = ddf1gz; + } + + public Integer getDdf1gz() + { + return ddf1gz; + } + + public void setLyswdbsqyJ(Integer lyswdbsqyJ) + { + this.lyswdbsqyJ = lyswdbsqyJ; + } + + public Integer getLyswdbsqyJ() + { + return lyswdbsqyJ; + } + + public void setHsylbsqyJ(Integer hsylbsqyJ) + { + this.hsylbsqyJ = hsylbsqyJ; + } + + public Integer getHsylbsqyJ() + { + return hsylbsqyJ; + } + + public void setGsylbsqyJ(Integer gsylbsqyJ) + { + this.gsylbsqyJ = gsylbsqyJ; + } + + public Integer getGsylbsqyJ() + { + return gsylbsqyJ; + } + + public void setHswdbsqyJ(Integer hswdbsqyJ) + { + this.hswdbsqyJ = hswdbsqyJ; + } + + public Integer getHswdbsqyJ() + { + return hswdbsqyJ; + } + + public void setGswdbsqgztz(Integer gswdbsqgztz) + { + this.gswdbsqgztz = gswdbsqgztz; + } + + public Integer getGswdbsqgztz() + { + return gswdbsqgztz; + } + + public void setLsjgz(Integer lsjgz) + { + this.lsjgz = lsjgz; + } + + public Integer getLsjgz() + { + return lsjgz; + } + + public void setDjrq2gz(Integer djrq2gz) + { + this.djrq2gz = djrq2gz; + } + + public Integer getDjrq2gz() + { + return djrq2gz; + } + + public void setDjrq1gz(Integer djrq1gz) + { + this.djrq1gz = djrq1gz; + } + + public Integer getDjrq1gz() + { + return djrq1gz; + } + + public void setBqbgz(Integer bqbgz) + { + this.bqbgz = bqbgz; + } + + public Integer getBqbgz() + { + return bqbgz; + } + + public void setBsbgz(Integer bsbgz) + { + this.bsbgz = bsbgz; + } + + public Integer getBsbgz() + { + return bsbgz; + } + + public void setXhbgz(Integer xhbgz) + { + this.xhbgz = xhbgz; + } + + public Integer getXhbgz() + { + return xhbgz; + } + + public void setZdygz(Integer zdygz) + { + this.zdygz = zdygz; + } + + public Integer getZdygz() + { + return zdygz; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataTimestamp", getDataTimestamp()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("lsjyx", getLsjyx()) + .append("pqdcfyx", getPqdcfyx()) + .append("djrq2yx", getDjrq2yx()) + .append("djrq1yx", getDjrq1yx()) + .append("bqbyx", getBqbyx()) + .append("bsbyx", getBsbyx()) + .append("zxhbyx", getZxhbyx()) + .append("sltzgz", getSltzgz()) + .append("slzhyj", getSlzhyj()) + .append("slxtyctzxh", getSlxtyctzxh()) + .append("slxtycqdxh", getSlxtycqdxh()) + .append("slxtyckz", getSlxtyckz()) + .append("slxtbdkz", getSlxtbdkz()) + .append("slxtzdms", getSlxtzdms()) + .append("slxtsdms", getSlxtsdms()) + .append("hsylcdyj", getHsylcdyj()) + .append("hsyldyj", getHsyldyj()) + .append("gsylcgyj", getGsylcgyj()) + .append("gsylgyj", getGsylgyj()) + .append("gsylcdyj", getGsylcdyj()) + .append("gsyldyj", getGsyldyj()) + .append("hcgywg", getHcgywg()) + .append("hcgywcdtz", getHcgywcdtz()) + .append("hcgywd", getHcgywd()) + .append("hcgylg", getHcgylg()) + .append("hcgyld", getHcgyld()) + .append("lysylgyj", getLysylgyj()) + .append("lysyldyj", getLysyldyj()) + .append("hswdcgyj", getHswdcgyj()) + .append("hswdgyj", getHswdgyj()) + .append("gswdcgtz", getGswdcgtz()) + .append("gswdgyj", getGswdgyj()) + .append("gswddyj", getGswddyj()) + .append("ddf2gz", getDdf2gz()) + .append("ddf1gz", getDdf1gz()) + .append("lyswdbsqyJ", getLyswdbsqyJ()) + .append("hsylbsqyJ", getHsylbsqyJ()) + .append("gsylbsqyJ", getGsylbsqyJ()) + .append("hswdbsqyJ", getHswdbsqyJ()) + .append("gswdbsqgztz", getGswdbsqgztz()) + .append("lsjgz", getLsjgz()) + .append("djrq2gz", getDjrq2gz()) + .append("djrq1gz", getDjrq1gz()) + .append("bqbgz", getBqbgz()) + .append("bsbgz", getBsbgz()) + .append("xhbgz", getXhbgz()) + .append("zdygz", getZdygz()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingData.java index 1a782f0..d539cd2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsCoolingData.java @@ -1,7 +1,9 @@ package com.xzzn.ems.domain; import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; import com.xzzn.common.core.domain.BaseEntity; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -11,21 +13,26 @@ import com.xzzn.common.annotation.Excel; * 冷却系统参数对象 ems_cooling_data * * @author xzzn - * @date 2025-06-25 + * @date 2025-09-26 */ public class EmsCoolingData extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ + /** */ private Long id; + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + /** 系统名称,如1#液冷 */ @Excel(name = "系统名称,如1#液冷") private String systemName; - /** 工作模式 */ - @Excel(name = "工作模式") + /** 工作模式:0-正常 1-停止 */ + @Excel(name = "工作模式:0-正常 1-停止") private String workMode; /** 当前温度 (℃) */ @@ -56,13 +63,41 @@ public class EmsCoolingData extends BaseEntity @Excel(name = "低温告警点 (℃)") private BigDecimal lowTempAlarmPoint; + /** 供水温度 */ + @Excel(name = "供水温度") + private BigDecimal gsTemp; + + /** 回水温度 */ + @Excel(name = "回水温度") + private BigDecimal hsTemp; + + /** 供水压力 */ + @Excel(name = "供水压力") + private BigDecimal gsPressure; + + /** 回水压力 */ + @Excel(name = "回水压力") + private BigDecimal hsPressure; + + /** 冷源水温度 */ + @Excel(name = "冷源水温度") + private BigDecimal lysTemp; + + /** VB01开度 */ + @Excel(name = "VB01开度") + private BigDecimal vb01Kd; + + /** VB02开度 */ + @Excel(name = "VB02开度") + private BigDecimal vb02Kd; + /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; public void setId(Long id) { @@ -74,6 +109,14 @@ public class EmsCoolingData extends BaseEntity return id; } + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + public void setSystemName(String systemName) { this.systemName = systemName; @@ -164,22 +207,92 @@ public class EmsCoolingData extends BaseEntity return lowTempAlarmPoint; } - public void setSiteId(Long siteId) + public void setGsTemp(BigDecimal gsTemp) + { + this.gsTemp = gsTemp; + } + + public BigDecimal getGsTemp() + { + return gsTemp; + } + + public void setHsTemp(BigDecimal hsTemp) + { + this.hsTemp = hsTemp; + } + + public BigDecimal getHsTemp() + { + return hsTemp; + } + + public void setGsPressure(BigDecimal gsPressure) + { + this.gsPressure = gsPressure; + } + + public BigDecimal getGsPressure() + { + return gsPressure; + } + + public void setHsPressure(BigDecimal hsPressure) + { + this.hsPressure = hsPressure; + } + + public BigDecimal getHsPressure() + { + return hsPressure; + } + + public void setLysTemp(BigDecimal lysTemp) + { + this.lysTemp = lysTemp; + } + + public BigDecimal getLysTemp() + { + return lysTemp; + } + + public void setVb01Kd(BigDecimal vb01Kd) + { + this.vb01Kd = vb01Kd; + } + + public BigDecimal getVb01Kd() + { + return vb01Kd; + } + + public void setVb02Kd(BigDecimal vb02Kd) + { + this.vb02Kd = vb02Kd; + } + + public BigDecimal getVb02Kd() + { + return vb02Kd; + } + + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } @@ -197,6 +310,13 @@ public class EmsCoolingData extends BaseEntity .append("heatingStopPoint", getHeatingStopPoint()) .append("coolingStopPoint", getCoolingStopPoint()) .append("lowTempAlarmPoint", getLowTempAlarmPoint()) + .append("gsTemp", getGsTemp()) + .append("hsTemp", getHsTemp()) + .append("gsPressure", getGsPressure()) + .append("hsPressure", getHsPressure()) + .append("lysTemp", getLysTemp()) + .append("vb01Kd", getVb01Kd()) + .append("vb02Kd", getVb02Kd()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyChargeData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyChargeData.java new file mode 100644 index 0000000..05e5898 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyChargeData.java @@ -0,0 +1,151 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 站点每日充放电数据对象 ems_daily_charge_data + * + * @author xzzn + * @date 2025-08-27 + */ +public class EmsDailyChargeData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 数据日期:yyyy-MM-dd */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd") + private Date dateTime; + + /** 总充电量 */ + @Excel(name = "总充电量") + private BigDecimal totalChargeData; + + /** 总放电量 */ + @Excel(name = "总放电量") + private BigDecimal totalDischargeData; + + /** 当日充电量 */ + @Excel(name = "当日充电量") + private BigDecimal chargeData; + + /** 当日放电量 */ + @Excel(name = "当日放电量") + private BigDecimal dischargeData; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setDateTime(Date dateTime) + { + this.dateTime = dateTime; + } + + public Date getDateTime() + { + return dateTime; + } + + public void setTotalChargeData(BigDecimal totalChargeData) + { + this.totalChargeData = totalChargeData; + } + + public BigDecimal getTotalChargeData() + { + return totalChargeData; + } + + public void setTotalDischargeData(BigDecimal totalDischargeData) + { + this.totalDischargeData = totalDischargeData; + } + + public BigDecimal getTotalDischargeData() + { + return totalDischargeData; + } + + public void setChargeData(BigDecimal chargeData) + { + this.chargeData = chargeData; + } + + public BigDecimal getChargeData() + { + return chargeData; + } + + public void setDischargeData(BigDecimal dischargeData) + { + this.dischargeData = dischargeData; + } + + public BigDecimal getDischargeData() + { + return dischargeData; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("dateTime", getDateTime()) + .append("totalChargeData", getTotalChargeData()) + .append("totalDischargeData", getTotalDischargeData()) + .append("chargeData", getChargeData()) + .append("dischargeData", getDischargeData()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java new file mode 100644 index 0000000..91f1630 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java @@ -0,0 +1,241 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 站点电每日数据对象 ems_daily_energy_data + * + * @author xzzn + * @date 2025-10-09 + */ +public class EmsDailyEnergyData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 数据日期:yyyy-MM-dd */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataDate; + + /** 总收入 */ + @Excel(name = "总收入") + private BigDecimal totalRevenue; + + /** 当日实时收入 */ + @Excel(name = "当日实时收入") + private BigDecimal dayRevenue; + + /** 尖峰时段充电差值 */ + @Excel(name = "尖峰时段充电差值") + private BigDecimal peakChargeDiff; + + /** 尖峰时段放电差值 */ + @Excel(name = "尖峰时段放电差值") + private BigDecimal peakDischargeDiff; + + /** 峰时时段充电差值 */ + @Excel(name = "峰时时段充电差值") + private BigDecimal highChargeDiff; + + /** 峰时时段放电差值 */ + @Excel(name = "峰时时段放电差值") + private BigDecimal highDischargeDiff; + + /** 平时时段充电差值 */ + @Excel(name = "平时时段充电差值") + private BigDecimal flatChargeDiff; + + /** 平时时段放电差值 */ + @Excel(name = "平时时段放电差值") + private BigDecimal flatDischargeDiff; + + /** 谷时时段充电差值 */ + @Excel(name = "谷时时段充电差值") + private BigDecimal valleyChargeDiff; + + /** 谷时时段放电差值 */ + @Excel(name = "谷时时段放电差值") + private BigDecimal valleyDischargeDiff; + + /** 差值计算时间(如2025-10-10 23:59:00) */ + @Excel(name = "差值计算时间", readConverterExp = "如=2025-10-10,2=3:59:00") + private Date calcTime; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDataDate(Date dataDate) + { + this.dataDate = dataDate; + } + + public Date getDataDate() + { + return dataDate; + } + + public void setTotalRevenue(BigDecimal totalRevenue) + { + this.totalRevenue = totalRevenue; + } + + public BigDecimal getTotalRevenue() + { + return totalRevenue; + } + + public void setDayRevenue(BigDecimal dayRevenue) + { + this.dayRevenue = dayRevenue; + } + + public BigDecimal getDayRevenue() + { + return dayRevenue; + } + + public void setPeakChargeDiff(BigDecimal peakChargeDiff) + { + this.peakChargeDiff = peakChargeDiff; + } + + public BigDecimal getPeakChargeDiff() + { + return peakChargeDiff; + } + + public void setPeakDischargeDiff(BigDecimal peakDischargeDiff) + { + this.peakDischargeDiff = peakDischargeDiff; + } + + public BigDecimal getPeakDischargeDiff() + { + return peakDischargeDiff; + } + + public void setHighChargeDiff(BigDecimal highChargeDiff) + { + this.highChargeDiff = highChargeDiff; + } + + public BigDecimal getHighChargeDiff() + { + return highChargeDiff; + } + + public void setHighDischargeDiff(BigDecimal highDischargeDiff) + { + this.highDischargeDiff = highDischargeDiff; + } + + public BigDecimal getHighDischargeDiff() + { + return highDischargeDiff; + } + + public void setFlatChargeDiff(BigDecimal flatChargeDiff) + { + this.flatChargeDiff = flatChargeDiff; + } + + public BigDecimal getFlatChargeDiff() + { + return flatChargeDiff; + } + + public void setFlatDischargeDiff(BigDecimal flatDischargeDiff) + { + this.flatDischargeDiff = flatDischargeDiff; + } + + public BigDecimal getFlatDischargeDiff() + { + return flatDischargeDiff; + } + + public void setValleyChargeDiff(BigDecimal valleyChargeDiff) + { + this.valleyChargeDiff = valleyChargeDiff; + } + + public BigDecimal getValleyChargeDiff() + { + return valleyChargeDiff; + } + + public void setValleyDischargeDiff(BigDecimal valleyDischargeDiff) + { + this.valleyDischargeDiff = valleyDischargeDiff; + } + + public BigDecimal getValleyDischargeDiff() + { + return valleyDischargeDiff; + } + + public void setCalcTime(Date calcTime) + { + this.calcTime = calcTime; + } + + public Date getCalcTime() + { + return calcTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("siteId", getSiteId()) + .append("dataDate", getDataDate()) + .append("totalRevenue", getTotalRevenue()) + .append("dayRevenue", getDayRevenue()) + .append("peakChargeDiff", getPeakChargeDiff()) + .append("peakDischargeDiff", getPeakDischargeDiff()) + .append("highChargeDiff", getHighChargeDiff()) + .append("highDischargeDiff", getHighDischargeDiff()) + .append("flatChargeDiff", getFlatChargeDiff()) + .append("flatDischargeDiff", getFlatDischargeDiff()) + .append("valleyChargeDiff", getValleyChargeDiff()) + .append("valleyDischargeDiff", getValleyDischargeDiff()) + .append("calcTime", getCalcTime()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDeviceChangeLog.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDeviceChangeLog.java new file mode 100644 index 0000000..350c8e2 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDeviceChangeLog.java @@ -0,0 +1,134 @@ +package com.xzzn.ems.domain; + +import java.util.Date; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 设备状态变更记录对象 ems_device_change_log + * + * @author xzzn + * @date 2025-11-15 + */ +public class EmsDeviceChangeLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 日志ID(UUID) */ + @Excel(name = "日志ID", readConverterExp = "U=UID") + private String logId; + + /** 日志时间(精确到秒) */ + @Excel(name = "日志时间", readConverterExp = "精=确到秒") + private Date logTime; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备id */ + @Excel(name = "设备id") + private String deviceId; + + /** 变更前状态:0-离线、1-待机、2-运行、3-故障、4-停机 */ + @Excel(name = "变更前状态:0-离线、1-待机、2-运行、3-故障、4-停机") + private String beforeStatus; + + /** 变更后状态:0-离线、1-待机、2-运行、3-故障、4-停机 */ + @Excel(name = "变更后状态:0-离线、1-待机、2-运行、3-故障、4-停机") + private String afterStatus; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setLogId(String logId) + { + this.logId = logId; + } + + public String getLogId() + { + return logId; + } + + public void setLogTime(Date logTime) + { + this.logTime = logTime; + } + + public Date getLogTime() + { + return logTime; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setBeforeStatus(String beforeStatus) + { + this.beforeStatus = beforeStatus; + } + + public String getBeforeStatus() + { + return beforeStatus; + } + + public void setAfterStatus(String afterStatus) + { + this.afterStatus = afterStatus; + } + + public String getAfterStatus() + { + return afterStatus; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("logId", getLogId()) + .append("logTime", getLogTime()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("beforeStatus", getBeforeStatus()) + .append("afterStatus", getAfterStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDevicesSetting.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDevicesSetting.java index de71eee..08db29f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDevicesSetting.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDevicesSetting.java @@ -1,17 +1,19 @@ package com.xzzn.ems.domain; -import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; import com.xzzn.common.core.domain.BaseEntity; + +import java.util.Date; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.xzzn.common.annotation.Excel; /** * Modbus设备配置对象 ems_devices_setting * * @author xzzn - * @date 2025-06-24 + * @date 2025-07-12 */ public class EmsDevicesSetting extends BaseEntity { @@ -84,12 +86,36 @@ public class EmsDevicesSetting extends BaseEntity /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; - /** 通信状态 */ - @Excel(name = "通信状态") + /** 通信状态:0-正常 1-通信中断 2-异常 */ + @Excel(name = "通信状态:0-正常 1-通信中断 2-异常") private String communicationStatus; + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 上级设备id */ + @Excel(name = "上级设备id") + private String parentId; + + /** 设备类别,例如“STACK/CLUSTER/PCS等” */ + @Excel(name = "设备类别,例如“STACK/CLUSTER/PCS等”") + private String deviceCategory; + + /** 设备运行状态:0-离线、1-在线 */ + @Excel(name = "设备运行状态:0-离线、1-在线") + private String deviceStatus; + + /** 设备运行状态:0-离线、1-在线 */ + @Excel(name = "工作状态:0-运行 1-停机 2-故障") + private String workStatus; + + /** 设备图像地址 */ + @Excel(name = "设备图像地址") + private String pictureUrl; + public void setId(Long id) { this.id = id; @@ -250,12 +276,12 @@ public class EmsDevicesSetting extends BaseEntity return updatedAt; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } @@ -270,6 +296,62 @@ public class EmsDevicesSetting extends BaseEntity return communicationStatus; } + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setParentId(String parentId) + { + this.parentId = parentId; + } + + public String getParentId() + { + return parentId; + } + + public void setDeviceCategory(String deviceCategory) + { + this.deviceCategory = deviceCategory; + } + + public String getDeviceCategory() + { + return deviceCategory; + } + + public String getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(String deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getWorkStatus() { + return workStatus; + } + + public void setWorkStatus(String workStatus) { + this.workStatus = workStatus; + } + + public void setPictureUrl(String pictureUrl) + { + this.pictureUrl = pictureUrl; + } + + public String getPictureUrl() + { + return pictureUrl; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -291,6 +373,11 @@ public class EmsDevicesSetting extends BaseEntity .append("updatedAt", getUpdatedAt()) .append("siteId", getSiteId()) .append("communicationStatus", getCommunicationStatus()) + .append("deviceId", getDeviceId()) + .append("parentId", getParentId()) + .append("deviceCategory", getDeviceCategory()) + .append("deviceStatus", getDeviceStatus()) + .append("pictureUrl", getPictureUrl()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDhData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDhData.java new file mode 100644 index 0000000..9d1552f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDhData.java @@ -0,0 +1,119 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 动环数据对象 ems_dh_data + * + * @author xzzn + * @date 2025-07-28 + */ +public class EmsDhData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 湿度 */ + @Excel(name = "湿度") + private BigDecimal humidity; + + /** 温度 */ + @Excel(name = "温度") + private BigDecimal temperature; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public void setHumidity(BigDecimal humidity) + { + this.humidity = humidity; + } + + public BigDecimal getHumidity() + { + return humidity; + } + + public void setTemperature(BigDecimal temperature) + { + this.temperature = temperature; + } + + public BigDecimal getTemperature() + { + return temperature; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("humidity", getHumidity()) + .append("temperature", getTemperature()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsEmsData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsEmsData.java new file mode 100644 index 0000000..3afdad2 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsEmsData.java @@ -0,0 +1,241 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +/** + * 数据对象 ems_ems_data + * + * @author xzzn + * @date 2025-12-09 + */ +public class EmsEmsData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataUpdateTime; + + /** EMS控制模式 */ + @Excel(name = "EMS控制模式") + private BigDecimal emsStatus; + + /** BMS1SOC */ + @Excel(name = "BMS1SOC") + private BigDecimal bms1Soc; + + /** BMS2SOC */ + @Excel(name = "BMS2SOC") + private BigDecimal bms2Soc; + + /** BMS3SOC */ + @Excel(name = "BMS3SOC") + private BigDecimal bms3Soc; + + /** BMS4SOC */ + @Excel(name = "BMS4SOC") + private BigDecimal bms4Soc; + + /** PCS-1有功功率 */ + @Excel(name = "PCS-1有功功率") + private BigDecimal pcs1Yggl; + + /** PCS-2有功功率 */ + @Excel(name = "PCS-2有功功率") + private BigDecimal pcs2Yggl; + + /** PCS-3有功功率 */ + @Excel(name = "PCS-3有功功率") + private BigDecimal pcs3Yggl; + + /** PCS-4有功功率 */ + @Excel(name = "PCS-4有功功率") + private BigDecimal pcs4Yggl; + + /** EMS有功功率 */ + @Excel(name = "EMS有功功率") + private BigDecimal emsYggl; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataUpdateTime(Date dataUpdateTime) + { + this.dataUpdateTime = dataUpdateTime; + } + + public Date getDataUpdateTime() + { + return dataUpdateTime; + } + + public void setEmsStatus(BigDecimal emsStatus) + { + this.emsStatus = emsStatus; + } + + public BigDecimal getEmsStatus() + { + return emsStatus; + } + + public void setBms1Soc(BigDecimal bms1Soc) + { + this.bms1Soc = bms1Soc; + } + + public BigDecimal getBms1Soc() + { + return bms1Soc; + } + + public void setBms2Soc(BigDecimal bms2Soc) + { + this.bms2Soc = bms2Soc; + } + + public BigDecimal getBms2Soc() + { + return bms2Soc; + } + + public void setBms3Soc(BigDecimal bms3Soc) + { + this.bms3Soc = bms3Soc; + } + + public BigDecimal getBms3Soc() + { + return bms3Soc; + } + + public void setBms4Soc(BigDecimal bms4Soc) + { + this.bms4Soc = bms4Soc; + } + + public BigDecimal getBms4Soc() + { + return bms4Soc; + } + + public void setPcs1Yggl(BigDecimal pcs1Yggl) + { + this.pcs1Yggl = pcs1Yggl; + } + + public BigDecimal getPcs1Yggl() + { + return pcs1Yggl; + } + + public void setPcs2Yggl(BigDecimal pcs2Yggl) + { + this.pcs2Yggl = pcs2Yggl; + } + + public BigDecimal getPcs2Yggl() + { + return pcs2Yggl; + } + + public void setPcs3Yggl(BigDecimal pcs3Yggl) + { + this.pcs3Yggl = pcs3Yggl; + } + + public BigDecimal getPcs3Yggl() + { + return pcs3Yggl; + } + + public void setPcs4Yggl(BigDecimal pcs4Yggl) + { + this.pcs4Yggl = pcs4Yggl; + } + + public BigDecimal getPcs4Yggl() + { + return pcs4Yggl; + } + + public void setEmsYggl(BigDecimal emsYggl) + { + this.emsYggl = emsYggl; + } + + public BigDecimal getEmsYggl() + { + return emsYggl; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataUpdateTime", getDataUpdateTime()) + .append("emsStatus", getEmsStatus()) + .append("bms1Soc", getBms1Soc()) + .append("bms2Soc", getBms2Soc()) + .append("bms3Soc", getBms3Soc()) + .append("bms4Soc", getBms4Soc()) + .append("pcs1Yggl", getPcs1Yggl()) + .append("pcs2Yggl", getPcs2Yggl()) + .append("pcs3Yggl", getPcs3Yggl()) + .append("pcs4Yggl", getPcs4Yggl()) + .append("emsYggl", getEmsYggl()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsEnergyPriceConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsEnergyPriceConfig.java new file mode 100644 index 0000000..6887f1e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsEnergyPriceConfig.java @@ -0,0 +1,149 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 电价配置对象 ems_energy_price_config + * + * @author xzzn + * @date 2025-10-09 + */ +public class EmsEnergyPriceConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 年份,如2025 */ + @Excel(name = "年份,如2025") + private String year; + + /** 月份,如"9"表示9月 */ + @Excel(name = "月份,如\"9\"表示9月") + private String month; + + /** 尖-peak电价(元/kWh) */ + @Excel(name = "尖-peak电价(元/kWh)") + private BigDecimal peak; + + /** 峰-high电价(元/kWh) */ + @Excel(name = "峰-high电价(元/kWh)") + private BigDecimal high; + + /** 平-flat电价(元/kWh) */ + @Excel(name = "平-flat电价(元/kWh)") + private BigDecimal flat; + + /** 谷-valley电价(元/kWh) */ + @Excel(name = "谷-valley电价(元/kWh)") + private BigDecimal valley; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setYear(String year) + { + this.year = year; + } + + public String getYear() + { + return year; + } + + public void setMonth(String month) + { + this.month = month; + } + + public String getMonth() + { + return month; + } + + public void setPeak(BigDecimal peak) + { + this.peak = peak; + } + + public BigDecimal getPeak() + { + return peak; + } + + public void setHigh(BigDecimal high) + { + this.high = high; + } + + public BigDecimal getHigh() + { + return high; + } + + public void setFlat(BigDecimal flat) + { + this.flat = flat; + } + + public BigDecimal getFlat() + { + return flat; + } + + public void setValley(BigDecimal valley) + { + this.valley = valley; + } + + public BigDecimal getValley() + { + return valley; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("siteId", getSiteId()) + .append("year", getYear()) + .append("month", getMonth()) + .append("peak", getPeak()) + .append("high", getHigh()) + .append("flat", getFlat()) + .append("valley", getValley()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultIssueLog.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultIssueLog.java new file mode 100644 index 0000000..5e1b042 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultIssueLog.java @@ -0,0 +1,150 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 告警保护方案下发日志对象 ems_fault_issue_log + * + * @author xzzn + * @date 2025-11-15 + */ +public class EmsFaultIssueLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 日志ID(UUID) */ + @Excel(name = "日志ID", readConverterExp = "U=UID") + private String logId; + + /** 日志时间(精确到秒) */ + @Excel(name = "日志时间", readConverterExp = "精=确到秒") + private Date logTime; + + /** 日志等级(同方案等级1/2/3等) */ + @Excel(name = "日志等级", readConverterExp = "同=方案等级1/2/3等") + private Integer logLevel; + + /** 站点名称/编号 */ + @Excel(name = "站点名称/编号") + private String siteId; + + /** 设备ID */ + @Excel(name = "设备ID") + private String deviceId; + + /** 操作点位 */ + @Excel(name = "操作点位") + private String point; + + /** 设置数据 */ + @Excel(name = "设置数据") + private BigDecimal value; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setLogId(String logId) + { + this.logId = logId; + } + + public String getLogId() + { + return logId; + } + + public void setLogTime(Date logTime) + { + this.logTime = logTime; + } + + public Date getLogTime() + { + return logTime; + } + + public void setLogLevel(Integer logLevel) + { + this.logLevel = logLevel; + } + + public Integer getLogLevel() + { + return logLevel; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setPoint(String point) + { + this.point = point; + } + + public String getPoint() + { + return point; + } + + public void setValue(BigDecimal value) + { + this.value = value; + } + + public BigDecimal getValue() + { + return value; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("logId", getLogId()) + .append("logTime", getLogTime()) + .append("logLevel", getLogLevel()) + .append("site", getSiteId()) + .append("deviceId", getDeviceId()) + .append("point", getPoint()) + .append("value", getValue()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultProtectionPlan.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultProtectionPlan.java new file mode 100644 index 0000000..b8d7458 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsFaultProtectionPlan.java @@ -0,0 +1,191 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 故障告警保护方案对象 ems_fault_protection_plan + * + * @author xzzn + * @date 2025-10-24 + */ +public class EmsFaultProtectionPlan extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 故障名称(如:总压高、放电总压过低) */ + @Excel(name = "故障名称", readConverterExp = "如=:总压高、放电总压过低") + private String faultName; + + /** 故障等级(1级/2级/3级) */ + @Excel(name = "故障等级", readConverterExp = "1=级/2级/3级") + private Integer faultLevel; + + /** 保护设置:点位/故障值/比较方式/释放值等 */ + @Excel(name = "保护设置:点位/故障值/比较方式/释放值等") + private String protectionSettings; + + /** 故障延时(秒,如:3S→3) */ + @Excel(name = "故障延时", readConverterExp = "秒=,如:3S→3") + private Long faultDelaySeconds; + + /** 保护方案:修改目标点位和值 */ + @Excel(name = "保护方案:修改目标点位和值") + private String protectionPlan; + + /** 释放延时(秒,如:5S→5,3级可能无) */ + @Excel(name = "释放延时", readConverterExp = "秒=,如:5S→5,3级可能无") + private Long releaseDelaySeconds; + + /** 处理方案描述(例如:报警,降功率50%运行) */ + @Excel(name = "处理方案描述", readConverterExp = "例=如:报警,降功率50%运行") + private String description; + + /** 是否触发告警(0 - 不告警;1 - 告警) */ + @Excel(name = "是否触发告警", readConverterExp = "0=不告警;1=告警") + private Integer isAlert; + + /** 方案是否启用 0-未启用 1-已启用 */ + @Excel(name = "方案是否启用 0-未启用 1-已启用") + private Long status; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setFaultName(String faultName) + { + this.faultName = faultName; + } + + public String getFaultName() + { + return faultName; + } + + public void setFaultLevel(Integer faultLevel) + { + this.faultLevel = faultLevel; + } + + public Integer getFaultLevel() + { + return faultLevel; + } + + public void setProtectionSettings(String protectionSettings) + { + this.protectionSettings = protectionSettings; + } + + public String getProtectionSettings() + { + return protectionSettings; + } + + public void setFaultDelaySeconds(Long faultDelaySeconds) + { + this.faultDelaySeconds = faultDelaySeconds; + } + + public Long getFaultDelaySeconds() + { + return faultDelaySeconds; + } + + public void setProtectionPlan(String protectionPlan) + { + this.protectionPlan = protectionPlan; + } + + public String getProtectionPlan() + { + return protectionPlan; + } + + public void setReleaseDelaySeconds(Long releaseDelaySeconds) + { + this.releaseDelaySeconds = releaseDelaySeconds; + } + + public Long getReleaseDelaySeconds() + { + return releaseDelaySeconds; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getDescription() + { + return description; + } + + public void setIsAlert(Integer isAlert) + { + this.isAlert = isAlert; + } + + public Integer getIsAlert() + { + return isAlert; + } + + public void setStatus(Long status) + { + this.status = status; + } + + public Long getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("siteId", getSiteId()) + .append("faultName", getFaultName()) + .append("faultLevel", getFaultLevel()) + .append("protectionSettings", getProtectionSettings()) + .append("faultDelaySeconds", getFaultDelaySeconds()) + .append("protectionPlan", getProtectionPlan()) + .append("releaseDelaySeconds", getReleaseDelaySeconds()) + .append("description", getDescription()) + .append("isAlert", getIsAlert()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttMessage.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttMessage.java new file mode 100644 index 0000000..b9828ca --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttMessage.java @@ -0,0 +1,71 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 【请填写功能名称】对象 ems_mqtt_message + * + * @author xzzn + * @date 2025-06-27 + */ +public class EmsMqttMessage extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String mqttTopic; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String mqttMessage; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setMqttTopic(String mqttTopic) + { + this.mqttTopic = mqttTopic; + } + + public String getMqttTopic() + { + return mqttTopic; + } + + public void setMqttMessage(String mqttMessage) + { + this.mqttMessage = mqttMessage; + } + + public String getMqttMessage() + { + return mqttMessage; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mqttTopic", getMqttTopic()) + .append("mqttMessage", getMqttMessage()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java new file mode 100644 index 0000000..db6a9bb --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java @@ -0,0 +1,130 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 站点topic配置对象 ems_mqtt_topic_config + * + * @author xzzn + * @date 2025-11-06 + */ +public class EmsMqttTopicConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + /** 主键 */ + private Long id; + + /** 订阅topic */ + @Excel(name = "订阅topic") + private String mqttTopic; + + /** QoS等级(0/1/2) */ + @Excel(name = "QoS等级", readConverterExp = "0=/1/2") + private Integer qos; + + /** topic描述 */ + @Excel(name = "topic描述") + private String topicName; + + /** 对应方法 */ + @Excel(name = "对应方法") + private String handleMethod; + + /** 处理器类型:(DEVICE=设备数据,SYSTEM=系统状态,ALARM=告警数据等) */ + @Excel(name = "处理器类型:(DEVICE=设备数据,SYSTEM=系统状态,ALARM=告警数据等)") + private String handleType; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setMqttTopic(String mqttTopic) + { + this.mqttTopic = mqttTopic; + } + + public String getMqttTopic() + { + return mqttTopic; + } + + public void setQos(Integer qos) + { + this.qos = qos; + } + + public Integer getQos() + { + return qos; + } + + public void setTopicName(String topicName) + { + this.topicName = topicName; + } + + public String getTopicName() + { + return topicName; + } + + public void setHandleMethod(String handleMethod) + { + this.handleMethod = handleMethod; + } + + public String getHandleMethod() + { + return handleMethod; + } + + public void setHandleType(String handleType) + { + this.handleType = handleType; + } + + public String getHandleType() + { + return handleType; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mqttTopic", getMqttTopic()) + .append("qos", getQos()) + .append("topicName", getTopicName()) + .append("handleMethod", getHandleMethod()) + .append("handleType", getHandleType()) + .append("siteId", getSiteId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsAlarmData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsAlarmData.java new file mode 100644 index 0000000..bc10122 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsAlarmData.java @@ -0,0 +1,1545 @@ +package com.xzzn.ems.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * pcs设备告警故障数据对象 ems_pcs_alarm_data + * + * @author xzzn + * @date 2025-10-22 + */ +public class EmsPcsAlarmData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 记录唯一ID */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date dataTimestamp; + + /** 站点ID */ + @Excel(name = "站点ID") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 故障标志(0-正常,1-故障) */ + @Excel(name = "故障标志", readConverterExp = "0=-正常,1-故障") + private Integer gzbz; + + /** 绝缘阻抗异常(0-正常,1-异常) */ + @Excel(name = "绝缘阻抗异常", readConverterExp = "0=-正常,1-异常") + private Integer jyzkyc; + + /** 交流漏电流异常(0-正常,1-异常) */ + @Excel(name = "交流漏电流异常", readConverterExp = "0=-正常,1-异常") + private Integer jlllyc; + + /** 直流过压(0-正常,1-异常) */ + @Excel(name = "直流过压", readConverterExp = "0=-正常,1-异常") + private Integer zlgv; + + /** 电网过压异常(0-正常,1-异常) */ + @Excel(name = "电网过压异常", readConverterExp = "0=-正常,1-异常") + private Integer dwgyyc; + + /** 电网欠压异常(0-正常,1-异常) */ + @Excel(name = "电网欠压异常", readConverterExp = "0=-正常,1-异常") + private Integer dwqyyc; + + /** 电网过频异常(0-正常,1-异常) */ + @Excel(name = "电网过频异常", readConverterExp = "0=-正常,1-异常") + private Integer dwgpyc; + + /** 电网欠频异常(0-正常,1-异常) */ + @Excel(name = "电网欠频异常", readConverterExp = "0=-正常,1-异常") + private Integer dwqpyc; + + /** 功率模块过温(0-正常,1-异常) */ + @Excel(name = "功率模块过温", readConverterExp = "0=-正常,1-异常") + private Integer glmkgw; + + /** 电网相序异常(0-正常,1-异常) */ + @Excel(name = "电网相序异常", readConverterExp = "0=-正常,1-异常") + private Integer dwxxyc; + + /** 逆变软件过流(0-正常,1-异常) */ + @Excel(name = "逆变软件过流", readConverterExp = "0=-正常,1-异常") + private Integer nbrjgl; + + /** 直流软启动异常(0-正常,1-异常) */ + @Excel(name = "直流软启动异常", readConverterExp = "0=-正常,1-异常") + private Integer zlrqdyc; + + /** 直流开关异常(0-正常,1-异常) */ + @Excel(name = "直流开关异常", readConverterExp = "0=-正常,1-异常") + private Integer zlkgwc; + + /** 交流风机异常(0-正常,1-异常) */ + @Excel(name = "交流风机异常", readConverterExp = "0=-正常,1-异常") + private Integer jlfjyc; + + /** 交流开关异常(0-正常,1-异常) */ + @Excel(name = "交流开关异常", readConverterExp = "0=-正常,1-异常") + private Integer jlkgwc; + + /** 温度开关异常(0-正常,1-异常) */ + @Excel(name = "温度开关异常", readConverterExp = "0=-正常,1-异常") + private Integer wdkgwc; + + /** 内部异常(0-正常,1-异常) */ + @Excel(name = "内部异常", readConverterExp = "0=-正常,1-异常") + private Integer nbyc; + + /** 机内过温(0-正常,1-异常) */ + @Excel(name = "机内过温", readConverterExp = "0=-正常,1-异常") + private Integer jngw; + + /** 交流软启动异常(0-正常,1-异常) */ + @Excel(name = "交流软启动异常", readConverterExp = "0=-正常,1-异常") + private Integer jlrqdyc; + + /** 热交换机异常(0-正常,1-异常) */ + @Excel(name = "热交换机异常", readConverterExp = "0=-正常,1-异常") + private Integer rjhjyc; + + /** 交流防雷器异常(0-正常,1-异常) */ + @Excel(name = "交流防雷器异常", readConverterExp = "0=-正常,1-异常") + private Integer jlflqyc; + + /** 内部急停(0-正常,1-触发) */ + @Excel(name = "内部急停", readConverterExp = "0=-正常,1-触发") + private Integer nbjt; + + /** 外部急停(0-正常,1-触发) */ + @Excel(name = "外部急停", readConverterExp = "0=-正常,1-触发") + private Integer wbjt; + + /** 母线电压不符合开机条件(0-符合,1-不符合) */ + @Excel(name = "母线电压不符合开机条件", readConverterExp = "0=-符合,1-不符合") + private Integer mxdbyfhkjtj; + + /** 母线电流过流(0-正常,1-过流) */ + @Excel(name = "母线电流过流", readConverterExp = "0=-正常,1-过流") + private Integer mxdlgl; + + /** 零偏校准异常(0-正常,1-异常) */ + @Excel(name = "零偏校准异常", readConverterExp = "0=-正常,1-异常") + private Integer lpjzyc; + + /** 门禁告警(0-正常,1-告警) */ + @Excel(name = "门禁告警", readConverterExp = "0=-正常,1-告警") + private Integer mjgj; + + /** 锁相异常(0-正常,1-异常) */ + @Excel(name = "锁相异常", readConverterExp = "0=-正常,1-异常") + private Integer sxyc; + + /** 直流防雷器异常(0-正常,1-异常) */ + @Excel(name = "直流防雷器异常", readConverterExp = "0=-正常,1-异常") + private Integer zlflqyc; + + /** 智能电表通信异常(0-正常,1-异常) */ + @Excel(name = "智能电表通信异常", readConverterExp = "0=-正常,1-异常") + private Integer zndbtxyc; + + /** 逆变硬件过流(0-正常,1-过流) */ + @Excel(name = "逆变硬件过流", readConverterExp = "0=-正常,1-过流") + private Integer nbyjgl; + + /** 驱动异常(0-正常,1-异常) */ + @Excel(name = "驱动异常", readConverterExp = "0=-正常,1-异常") + private Integer qdyc; + + /** ID冲突(0-正常,1-冲突) */ + @Excel(name = "ID冲突", readConverterExp = "0=-正常,1-冲突") + private Integer idct; + + /** 信息共享CAN通信异常(0-正常,1-异常) */ + @Excel(name = "信息共享CAN通信异常", readConverterExp = "0=-正常,1-异常") + private Integer xxgxctxvc; + + /** 并机通信线异常(0-正常,1-异常) */ + @Excel(name = "并机通信线异常", readConverterExp = "0=-正常,1-异常") + private Integer bjtxxyc; + + /** 同步CAN通信异常(0-正常,1-异常) */ + @Excel(name = "同步CAN通信异常", readConverterExp = "0=-正常,1-异常") + private Integer tbctxvc; + + /** 直流电弧异常(0-正常,1-异常) */ + @Excel(name = "直流电弧异常", readConverterExp = "0=-正常,1-异常") + private Integer zldhyc; + + /** 零序过流(0-正常,1-过流) */ + @Excel(name = "零序过流", readConverterExp = "0=-正常,1-过流") + private Integer lxgl; + + /** 直流主接触器异常(0-正常,1-异常) */ + @Excel(name = "直流主接触器异常", readConverterExp = "0=-正常,1-异常") + private Integer zlzjcqyc; + + /** 烟雾告警(0-正常,1-告警) */ + @Excel(name = "烟雾告警", readConverterExp = "0=-正常,1-告警") + private Integer ywgj; + + /** 并机通信异常(0-正常,1-异常) */ + @Excel(name = "并机通信异常", readConverterExp = "0=-正常,1-异常") + private Integer bjtxyc; + + /** HMI CAN通信异常(0-正常,1-异常) */ + @Excel(name = "HMI CAN通信异常", readConverterExp = "0=-正常,1-异常") + private Integer hmictxyc; + + /** 机型设置错误(0-正确,1-错误) */ + @Excel(name = "机型设置错误", readConverterExp = "0=-正确,1-错误") + private Integer jxszcw; + + /** HMI 485通信异常(0-正常,1-异常) */ + @Excel(name = "HMI 485通信异常", readConverterExp = "0=-正常,1-异常") + private Integer hmi485txyc; + + /** 远程通信异常(0-正常,1-异常) */ + @Excel(name = "远程通信异常", readConverterExp = "0=-正常,1-异常") + private Integer yctxyc; + + /** 故障总(0-无故障,1-有故障) */ + @Excel(name = "故障总", readConverterExp = "0=-无故障,1-有故障") + private Integer gzz; + + /** 告警总(0-无告警,1-有告警) */ + @Excel(name = "告警总", readConverterExp = "0=-无告警,1-有告警") + private Integer gjz; + + /** 直流并联模式设置错误(0-正确,1-错误) */ + @Excel(name = "直流并联模式设置错误", readConverterExp = "0=-正确,1-错误") + private Integer zlblmsszcw; + + /** 系统参数不匹配(0-匹配,1-不匹配) */ + @Excel(name = "系统参数不匹配", readConverterExp = "0=-匹配,1-不匹配") + private Integer xtcsbpp; + + /** 电网电压不平衡告警(0-正常,1-告警) */ + @Excel(name = "电网电压不平衡告警", readConverterExp = "0=-正常,1-告警") + private Integer dwdybphgj; + + /** 低电压穿越运行(0-未运行,1-运行中) */ + @Excel(name = "低电压穿越运行", readConverterExp = "0=-未运行,1-运行中") + private Integer ddycyyx; + + /** 高电压穿越运行(0-未运行,1-运行中) */ + @Excel(name = "高电压穿越运行", readConverterExp = "0=-未运行,1-运行中") + private Integer gdycyyx; + + /** 直流风机异常(0-正常,1-异常) */ + @Excel(name = "直流风机异常", readConverterExp = "0=-正常,1-异常") + private Integer zlfjyc; + + /** 散热器温度开关异常(0-正常,1-异常) */ + @Excel(name = "散热器温度开关异常", readConverterExp = "0=-正常,1-异常") + private Integer srqwdkgwc; + + /** 外部温度开关异常(0-正常,1-异常) */ + @Excel(name = "外部温度开关异常", readConverterExp = "0=-正常,1-异常") + private Integer wbwdkgwc; + + /** 辅源变压器温度开关异常(0-正常,1-异常) */ + @Excel(name = "辅源变压器温度开关异常", readConverterExp = "0=-正常,1-异常") + private Integer fybyqwdkgwc; + + /** 电感温度开关异常(0-正常,1-异常) */ + @Excel(name = "电感温度开关异常", readConverterExp = "0=-正常,1-异常") + private Integer dgwdkgwc; + + /** 正极接地异常(0-正常,1-异常) */ + @Excel(name = "正极接地异常", readConverterExp = "0=-正常,1-异常") + private Integer zjjdvc; + + /** 负极接地异常(0-正常,1-异常) */ + @Excel(name = "负极接地异常", readConverterExp = "0=-正常,1-异常") + private Integer fjjdvc; + + /** 交流接地异常(0-正常,1-异常) */ + @Excel(name = "交流接地异常", readConverterExp = "0=-正常,1-异常") + private Integer jljdvc; + + /** 并网接地异常(0-正常,1-异常) */ + @Excel(name = "并网接地异常", readConverterExp = "0=-正常,1-异常") + private Integer bwjdvc; + + /** BMS急停(0-正常,1-触发) */ + @Excel(name = "BMS急停", readConverterExp = "0=-正常,1-触发") + private Integer bmsjt; + + /** 空空换热器异常(0-正常,1-异常) */ + @Excel(name = "空空换热器异常", readConverterExp = "0=-正常,1-异常") + private Integer kkhrqyc; + + /** 电网过欠频待机告警(0-正常,1-告警) */ + @Excel(name = "电网过欠频待机告警", readConverterExp = "0=-正常,1-告警") + private Integer dwgqpdjgj; + + /** 功率模块过温告警(0-正常,1-告警) */ + @Excel(name = "功率模块过温告警", readConverterExp = "0=-正常,1-告警") + private Integer glmkgwgJ; + + /** 电池过压(0-正常,1-过压) */ + @Excel(name = "电池过压", readConverterExp = "0=-正常,1-过压") + private Integer dcgy; + + /** 电池轻载欠压(0-正常,1-欠压) */ + @Excel(name = "电池轻载欠压", readConverterExp = "0=-正常,1-欠压") + private Integer dcqzqy; + + /** 直流过流(0-正常,1-过流) */ + @Excel(name = "直流过流", readConverterExp = "0=-正常,1-过流") + private Integer zlgl; + + /** 输出电压异常(0-正常,1-异常) */ + @Excel(name = "输出电压异常", readConverterExp = "0=-正常,1-异常") + private Integer scdyyc; + + /** 输出电压不符合离网条件(0-符合,1-不符合) */ + @Excel(name = "输出电压不符合离网条件", readConverterExp = "0=-符合,1-不符合") + private Integer scdybfhlwtj; + + /** 过载保护(0-未触发,1-已触发) */ + @Excel(name = "过载保护", readConverterExp = "0=-未触发,1-已触发") + private Integer gzbh; + + /** 短路保护(0-未触发,1-已触发) */ + @Excel(name = "短路保护", readConverterExp = "0=-未触发,1-已触发") + private Integer dlbh; + + /** 内部风机异常(0-正常,1-异常) */ + @Excel(name = "内部风机异常", readConverterExp = "0=-正常,1-异常") + private Integer nbfjyc; + + /** 直流保险丝异常(0-正常,1-异常) */ + @Excel(name = "直流保险丝异常", readConverterExp = "0=-正常,1-异常") + private Integer zlbxsyc; + + /** 电池重载欠压(0-正常,1-欠压) */ + @Excel(name = "电池重载欠压", readConverterExp = "0=-正常,1-欠压") + private Integer dczzqy; + + /** 电池低压告警(0-正常,1-告警) */ + @Excel(name = "电池低压告警", readConverterExp = "0=-正常,1-告警") + private Integer dcdygj; + + /** 外部风机异常(0-正常,1-异常) */ + @Excel(name = "外部风机异常", readConverterExp = "0=-正常,1-异常") + private Integer wbfjyc; + + /** 电池反接(0-正常,1-反接) */ + @Excel(name = "电池反接", readConverterExp = "0=-正常,1-反接") + private Integer dcfj; + + /** 电池电压不符合充电条件(0-符合,1-不符合) */ + @Excel(name = "电池电压不符合充电条件", readConverterExp = "0=-符合,1-不符合") + private Integer dcdybfhcdtj; + + /** 过载告警(0-正常,1-告警) */ + @Excel(name = "过载告警", readConverterExp = "0=-正常,1-告警") + private Integer gzgJ; + + /** 直流电弧模块通信异常(0-正常,1-异常) */ + @Excel(name = "直流电弧模块通信异常", readConverterExp = "0=-正常,1-异常") + private Integer zldhmktxyc; + + /** BMS系统故障(0-正常,1-故障) */ + @Excel(name = "BMS系统故障", readConverterExp = "0=-正常,1-故障") + private Integer bmsxtgz; + + /** BMS通信异常(0-正常,1-异常) */ + @Excel(name = "BMS通信异常", readConverterExp = "0=-正常,1-异常") + private Integer bmstxyc; + + /** BMS干接点异常(0-正常,1-异常) */ + @Excel(name = "BMS干接点异常", readConverterExp = "0=-正常,1-异常") + private Integer bmsgjdyc; + + /** BMS禁充(0-允许,1-禁止) */ + @Excel(name = "BMS禁充", readConverterExp = "0=-允许,1-禁止") + private Integer bmsjc; + + /** BMS禁放(0-允许,1-禁止) */ + @Excel(name = "BMS禁放", readConverterExp = "0=-允许,1-禁止") + private Integer bmsjf; + + /** BMS待机(0-运行,1-待机) */ + @Excel(name = "BMS待机", readConverterExp = "0=-运行,1-待机") + private Integer bmsdj; + + /** BMS告警(0-正常,1-告警) */ + @Excel(name = "BMS告警", readConverterExp = "0=-正常,1-告警") + private Integer bmsgj; + + /** 电感风机异常(0-正常,1-异常) */ + @Excel(name = "电感风机异常", readConverterExp = "0=-正常,1-异常") + private Integer dgfjyc; + + /** 散热器过温告警(0-正常,1-告警) */ + @Excel(name = "散热器过温告警", readConverterExp = "0=-正常,1-告警") + private Integer srqgwgj; + + /** 故障总2(0-无故障,1-有故障) */ + @Excel(name = "故障总2", readConverterExp = "0=-无故障,1-有故障") + private Integer gzz2; + + /** 告警总2(0-无告警,1-有告警) */ + @Excel(name = "告警总2", readConverterExp = "0=-无告警,1-有告警") + private Integer gjz2; + + /** 交流风机寿命异常(0-正常,1-异常) */ + @Excel(name = "交流风机寿命异常", readConverterExp = "0=-正常,1-异常") + private Integer jlfjsmyc; + + /** 直流风机寿命异常(0-正常,1-异常) */ + @Excel(name = "直流风机寿命异常", readConverterExp = "0=-正常,1-异常") + private Integer zlfjsmyc; + + /** 交流开关寿命异常(0-正常,1-异常) */ + @Excel(name = "交流开关寿命异常", readConverterExp = "0=-正常,1-异常") + private Integer jlkgSmyc; + + /** 直流开关寿命异常(0-正常,1-异常) */ + @Excel(name = "直流开关寿命异常", readConverterExp = "0=-正常,1-异常") + private Integer zlkgSmyc; + + /** 液冷机组异常(0-正常,1-异常) */ + @Excel(name = "液冷机组异常", readConverterExp = "0=-正常,1-异常") + private Integer yljzyc; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setGzbz(Integer gzbz) + { + this.gzbz = gzbz; + } + + public Integer getGzbz() + { + return gzbz; + } + + public void setJyzkyc(Integer jyzkyc) + { + this.jyzkyc = jyzkyc; + } + + public Integer getJyzkyc() + { + return jyzkyc; + } + + public void setJlllyc(Integer jlllyc) + { + this.jlllyc = jlllyc; + } + + public Integer getJlllyc() + { + return jlllyc; + } + + public void setZlgv(Integer zlgv) + { + this.zlgv = zlgv; + } + + public Integer getZlgv() + { + return zlgv; + } + + public void setDwgyyc(Integer dwgyyc) + { + this.dwgyyc = dwgyyc; + } + + public Integer getDwgyyc() + { + return dwgyyc; + } + + public void setDwqyyc(Integer dwqyyc) + { + this.dwqyyc = dwqyyc; + } + + public Integer getDwqyyc() + { + return dwqyyc; + } + + public void setDwgpyc(Integer dwgpyc) + { + this.dwgpyc = dwgpyc; + } + + public Integer getDwgpyc() + { + return dwgpyc; + } + + public void setDwqpyc(Integer dwqpyc) + { + this.dwqpyc = dwqpyc; + } + + public Integer getDwqpyc() + { + return dwqpyc; + } + + public void setGlmkgw(Integer glmkgw) + { + this.glmkgw = glmkgw; + } + + public Integer getGlmkgw() + { + return glmkgw; + } + + public void setDwxxyc(Integer dwxxyc) + { + this.dwxxyc = dwxxyc; + } + + public Integer getDwxxyc() + { + return dwxxyc; + } + + public void setNbrjgl(Integer nbrjgl) + { + this.nbrjgl = nbrjgl; + } + + public Integer getNbrjgl() + { + return nbrjgl; + } + + public void setZlrqdyc(Integer zlrqdyc) + { + this.zlrqdyc = zlrqdyc; + } + + public Integer getZlrqdyc() + { + return zlrqdyc; + } + + public void setZlkgwc(Integer zlkgwc) + { + this.zlkgwc = zlkgwc; + } + + public Integer getZlkgwc() + { + return zlkgwc; + } + + public void setJlfjyc(Integer jlfjyc) + { + this.jlfjyc = jlfjyc; + } + + public Integer getJlfjyc() + { + return jlfjyc; + } + + public void setJlkgwc(Integer jlkgwc) + { + this.jlkgwc = jlkgwc; + } + + public Integer getJlkgwc() + { + return jlkgwc; + } + + public void setWdkgwc(Integer wdkgwc) + { + this.wdkgwc = wdkgwc; + } + + public Integer getWdkgwc() + { + return wdkgwc; + } + + public void setNbyc(Integer nbyc) + { + this.nbyc = nbyc; + } + + public Integer getNbyc() + { + return nbyc; + } + + public void setJngw(Integer jngw) + { + this.jngw = jngw; + } + + public Integer getJngw() + { + return jngw; + } + + public void setJlrqdyc(Integer jlrqdyc) + { + this.jlrqdyc = jlrqdyc; + } + + public Integer getJlrqdyc() + { + return jlrqdyc; + } + + public void setRjhjyc(Integer rjhjyc) + { + this.rjhjyc = rjhjyc; + } + + public Integer getRjhjyc() + { + return rjhjyc; + } + + public void setJlflqyc(Integer jlflqyc) + { + this.jlflqyc = jlflqyc; + } + + public Integer getJlflqyc() + { + return jlflqyc; + } + + public void setNbjt(Integer nbjt) + { + this.nbjt = nbjt; + } + + public Integer getNbjt() + { + return nbjt; + } + + public void setWbjt(Integer wbjt) + { + this.wbjt = wbjt; + } + + public Integer getWbjt() + { + return wbjt; + } + + public void setMxdbyfhkjtj(Integer mxdbyfhkjtj) + { + this.mxdbyfhkjtj = mxdbyfhkjtj; + } + + public Integer getMxdbyfhkjtj() + { + return mxdbyfhkjtj; + } + + public void setMxdlgl(Integer mxdlgl) + { + this.mxdlgl = mxdlgl; + } + + public Integer getMxdlgl() + { + return mxdlgl; + } + + public void setLpjzyc(Integer lpjzyc) + { + this.lpjzyc = lpjzyc; + } + + public Integer getLpjzyc() + { + return lpjzyc; + } + + public void setMjgj(Integer mjgj) + { + this.mjgj = mjgj; + } + + public Integer getMjgj() + { + return mjgj; + } + + public void setSxyc(Integer sxyc) + { + this.sxyc = sxyc; + } + + public Integer getSxyc() + { + return sxyc; + } + + public void setZlflqyc(Integer zlflqyc) + { + this.zlflqyc = zlflqyc; + } + + public Integer getZlflqyc() + { + return zlflqyc; + } + + public void setZndbtxyc(Integer zndbtxyc) + { + this.zndbtxyc = zndbtxyc; + } + + public Integer getZndbtxyc() + { + return zndbtxyc; + } + + public void setNbyjgl(Integer nbyjgl) + { + this.nbyjgl = nbyjgl; + } + + public Integer getNbyjgl() + { + return nbyjgl; + } + + public void setQdyc(Integer qdyc) + { + this.qdyc = qdyc; + } + + public Integer getQdyc() + { + return qdyc; + } + + public void setIdct(Integer idct) + { + this.idct = idct; + } + + public Integer getIdct() + { + return idct; + } + + public void setXxgxctxvc(Integer xxgxctxvc) + { + this.xxgxctxvc = xxgxctxvc; + } + + public Integer getXxgxctxvc() + { + return xxgxctxvc; + } + + public void setBjtxxyc(Integer bjtxxyc) + { + this.bjtxxyc = bjtxxyc; + } + + public Integer getBjtxxyc() + { + return bjtxxyc; + } + + public void setTbctxvc(Integer tbctxvc) + { + this.tbctxvc = tbctxvc; + } + + public Integer getTbctxvc() + { + return tbctxvc; + } + + public void setZldhyc(Integer zldhyc) + { + this.zldhyc = zldhyc; + } + + public Integer getZldhyc() + { + return zldhyc; + } + + public void setLxgl(Integer lxgl) + { + this.lxgl = lxgl; + } + + public Integer getLxgl() + { + return lxgl; + } + + public void setZlzjcqyc(Integer zlzjcqyc) + { + this.zlzjcqyc = zlzjcqyc; + } + + public Integer getZlzjcqyc() + { + return zlzjcqyc; + } + + public void setYwgj(Integer ywgj) + { + this.ywgj = ywgj; + } + + public Integer getYwgj() + { + return ywgj; + } + + public void setBjtxyc(Integer bjtxyc) + { + this.bjtxyc = bjtxyc; + } + + public Integer getBjtxyc() + { + return bjtxyc; + } + + public void setHmictxyc(Integer hmictxyc) + { + this.hmictxyc = hmictxyc; + } + + public Integer getHmictxyc() + { + return hmictxyc; + } + + public void setJxszcw(Integer jxszcw) + { + this.jxszcw = jxszcw; + } + + public Integer getJxszcw() + { + return jxszcw; + } + + public void setHmi485txyc(Integer hmi485txyc) + { + this.hmi485txyc = hmi485txyc; + } + + public Integer getHmi485txyc() + { + return hmi485txyc; + } + + public void setYctxyc(Integer yctxyc) + { + this.yctxyc = yctxyc; + } + + public Integer getYctxyc() + { + return yctxyc; + } + + public void setGzz(Integer gzz) + { + this.gzz = gzz; + } + + public Integer getGzz() + { + return gzz; + } + + public void setGjz(Integer gjz) + { + this.gjz = gjz; + } + + public Integer getGjz() + { + return gjz; + } + + public void setZlblmsszcw(Integer zlblmsszcw) + { + this.zlblmsszcw = zlblmsszcw; + } + + public Integer getZlblmsszcw() + { + return zlblmsszcw; + } + + public void setXtcsbpp(Integer xtcsbpp) + { + this.xtcsbpp = xtcsbpp; + } + + public Integer getXtcsbpp() + { + return xtcsbpp; + } + + public void setDwdybphgj(Integer dwdybphgj) + { + this.dwdybphgj = dwdybphgj; + } + + public Integer getDwdybphgj() + { + return dwdybphgj; + } + + public void setDdycyyx(Integer ddycyyx) + { + this.ddycyyx = ddycyyx; + } + + public Integer getDdycyyx() + { + return ddycyyx; + } + + public void setGdycyyx(Integer gdycyyx) + { + this.gdycyyx = gdycyyx; + } + + public Integer getGdycyyx() + { + return gdycyyx; + } + + public void setZlfjyc(Integer zlfjyc) + { + this.zlfjyc = zlfjyc; + } + + public Integer getZlfjyc() + { + return zlfjyc; + } + + public void setSrqwdkgwc(Integer srqwdkgwc) + { + this.srqwdkgwc = srqwdkgwc; + } + + public Integer getSrqwdkgwc() + { + return srqwdkgwc; + } + + public void setWbwdkgwc(Integer wbwdkgwc) + { + this.wbwdkgwc = wbwdkgwc; + } + + public Integer getWbwdkgwc() + { + return wbwdkgwc; + } + + public void setFybyqwdkgwc(Integer fybyqwdkgwc) + { + this.fybyqwdkgwc = fybyqwdkgwc; + } + + public Integer getFybyqwdkgwc() + { + return fybyqwdkgwc; + } + + public void setDgwdkgwc(Integer dgwdkgwc) + { + this.dgwdkgwc = dgwdkgwc; + } + + public Integer getDgwdkgwc() + { + return dgwdkgwc; + } + + public void setZjjdvc(Integer zjjdvc) + { + this.zjjdvc = zjjdvc; + } + + public Integer getZjjdvc() + { + return zjjdvc; + } + + public void setFjjdvc(Integer fjjdvc) + { + this.fjjdvc = fjjdvc; + } + + public Integer getFjjdvc() + { + return fjjdvc; + } + + public void setJljdvc(Integer jljdvc) + { + this.jljdvc = jljdvc; + } + + public Integer getJljdvc() + { + return jljdvc; + } + + public void setBwjdvc(Integer bwjdvc) + { + this.bwjdvc = bwjdvc; + } + + public Integer getBwjdvc() + { + return bwjdvc; + } + + public void setBmsjt(Integer bmsjt) + { + this.bmsjt = bmsjt; + } + + public Integer getBmsjt() + { + return bmsjt; + } + + public void setKkhrqyc(Integer kkhrqyc) + { + this.kkhrqyc = kkhrqyc; + } + + public Integer getKkhrqyc() + { + return kkhrqyc; + } + + public void setDwgqpdjgj(Integer dwgqpdjgj) + { + this.dwgqpdjgj = dwgqpdjgj; + } + + public Integer getDwgqpdjgj() + { + return dwgqpdjgj; + } + + public void setGlmkgwgJ(Integer glmkgwgJ) + { + this.glmkgwgJ = glmkgwgJ; + } + + public Integer getGlmkgwgJ() + { + return glmkgwgJ; + } + + public void setDcgy(Integer dcgy) + { + this.dcgy = dcgy; + } + + public Integer getDcgy() + { + return dcgy; + } + + public void setDcqzqy(Integer dcqzqy) + { + this.dcqzqy = dcqzqy; + } + + public Integer getDcqzqy() + { + return dcqzqy; + } + + public void setZlgl(Integer zlgl) + { + this.zlgl = zlgl; + } + + public Integer getZlgl() + { + return zlgl; + } + + public void setScdyyc(Integer scdyyc) + { + this.scdyyc = scdyyc; + } + + public Integer getScdyyc() + { + return scdyyc; + } + + public void setScdybfhlwtj(Integer scdybfhlwtj) + { + this.scdybfhlwtj = scdybfhlwtj; + } + + public Integer getScdybfhlwtj() + { + return scdybfhlwtj; + } + + public void setGzbh(Integer gzbh) + { + this.gzbh = gzbh; + } + + public Integer getGzbh() + { + return gzbh; + } + + public void setDlbh(Integer dlbh) + { + this.dlbh = dlbh; + } + + public Integer getDlbh() + { + return dlbh; + } + + public void setNbfjyc(Integer nbfjyc) + { + this.nbfjyc = nbfjyc; + } + + public Integer getNbfjyc() + { + return nbfjyc; + } + + public void setZlbxsyc(Integer zlbxsyc) + { + this.zlbxsyc = zlbxsyc; + } + + public Integer getZlbxsyc() + { + return zlbxsyc; + } + + public void setDczzqy(Integer dczzqy) + { + this.dczzqy = dczzqy; + } + + public Integer getDczzqy() + { + return dczzqy; + } + + public void setDcdygj(Integer dcdygj) + { + this.dcdygj = dcdygj; + } + + public Integer getDcdygj() + { + return dcdygj; + } + + public void setWbfjyc(Integer wbfjyc) + { + this.wbfjyc = wbfjyc; + } + + public Integer getWbfjyc() + { + return wbfjyc; + } + + public void setDcfj(Integer dcfj) + { + this.dcfj = dcfj; + } + + public Integer getDcfj() + { + return dcfj; + } + + public void setDcdybfhcdtj(Integer dcdybfhcdtj) + { + this.dcdybfhcdtj = dcdybfhcdtj; + } + + public Integer getDcdybfhcdtj() + { + return dcdybfhcdtj; + } + + public void setGzgJ(Integer gzgJ) + { + this.gzgJ = gzgJ; + } + + public Integer getGzgJ() + { + return gzgJ; + } + + public void setZldhmktxyc(Integer zldhmktxyc) + { + this.zldhmktxyc = zldhmktxyc; + } + + public Integer getZldhmktxyc() + { + return zldhmktxyc; + } + + public void setBmsxtgz(Integer bmsxtgz) + { + this.bmsxtgz = bmsxtgz; + } + + public Integer getBmsxtgz() + { + return bmsxtgz; + } + + public void setBmstxyc(Integer bmstxyc) + { + this.bmstxyc = bmstxyc; + } + + public Integer getBmstxyc() + { + return bmstxyc; + } + + public void setBmsgjdyc(Integer bmsgjdyc) + { + this.bmsgjdyc = bmsgjdyc; + } + + public Integer getBmsgjdyc() + { + return bmsgjdyc; + } + + public void setBmsjc(Integer bmsjc) + { + this.bmsjc = bmsjc; + } + + public Integer getBmsjc() + { + return bmsjc; + } + + public void setBmsjf(Integer bmsjf) + { + this.bmsjf = bmsjf; + } + + public Integer getBmsjf() + { + return bmsjf; + } + + public void setBmsdj(Integer bmsdj) + { + this.bmsdj = bmsdj; + } + + public Integer getBmsdj() + { + return bmsdj; + } + + public void setBmsgj(Integer bmsgj) + { + this.bmsgj = bmsgj; + } + + public Integer getBmsgj() + { + return bmsgj; + } + + public void setDgfjyc(Integer dgfjyc) + { + this.dgfjyc = dgfjyc; + } + + public Integer getDgfjyc() + { + return dgfjyc; + } + + public void setSrqgwgj(Integer srqgwgj) + { + this.srqgwgj = srqgwgj; + } + + public Integer getSrqgwgj() + { + return srqgwgj; + } + + public void setGzz2(Integer gzz2) + { + this.gzz2 = gzz2; + } + + public Integer getGzz2() + { + return gzz2; + } + + public void setGjz2(Integer gjz2) + { + this.gjz2 = gjz2; + } + + public Integer getGjz2() + { + return gjz2; + } + + public void setJlfjsmyc(Integer jlfjsmyc) + { + this.jlfjsmyc = jlfjsmyc; + } + + public Integer getJlfjsmyc() + { + return jlfjsmyc; + } + + public void setZlfjsmyc(Integer zlfjsmyc) + { + this.zlfjsmyc = zlfjsmyc; + } + + public Integer getZlfjsmyc() + { + return zlfjsmyc; + } + + public void setJlkgSmyc(Integer jlkgSmyc) + { + this.jlkgSmyc = jlkgSmyc; + } + + public Integer getJlkgSmyc() + { + return jlkgSmyc; + } + + public void setZlkgSmyc(Integer zlkgSmyc) + { + this.zlkgSmyc = zlkgSmyc; + } + + public Integer getZlkgSmyc() + { + return zlkgSmyc; + } + + public void setYljzyc(Integer yljzyc) + { + this.yljzyc = yljzyc; + } + + public Integer getYljzyc() + { + return yljzyc; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataTimestamp", getDataTimestamp()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("gzbz", getGzbz()) + .append("jyzkyc", getJyzkyc()) + .append("jlllyc", getJlllyc()) + .append("zlgv", getZlgv()) + .append("dwgyyc", getDwgyyc()) + .append("dwqyyc", getDwqyyc()) + .append("dwgpyc", getDwgpyc()) + .append("dwqpyc", getDwqpyc()) + .append("glmkgw", getGlmkgw()) + .append("dwxxyc", getDwxxyc()) + .append("nbrjgl", getNbrjgl()) + .append("zlrqdyc", getZlrqdyc()) + .append("zlkgwc", getZlkgwc()) + .append("jlfjyc", getJlfjyc()) + .append("jlkgwc", getJlkgwc()) + .append("wdkgwc", getWdkgwc()) + .append("nbyc", getNbyc()) + .append("jngw", getJngw()) + .append("jlrqdyc", getJlrqdyc()) + .append("rjhjyc", getRjhjyc()) + .append("jlflqyc", getJlflqyc()) + .append("nbjt", getNbjt()) + .append("wbjt", getWbjt()) + .append("mxdbyfhkjtj", getMxdbyfhkjtj()) + .append("mxdlgl", getMxdlgl()) + .append("lpjzyc", getLpjzyc()) + .append("mjgj", getMjgj()) + .append("sxyc", getSxyc()) + .append("zlflqyc", getZlflqyc()) + .append("zndbtxyc", getZndbtxyc()) + .append("nbyjgl", getNbyjgl()) + .append("qdyc", getQdyc()) + .append("idct", getIdct()) + .append("xxgxctxvc", getXxgxctxvc()) + .append("bjtxxyc", getBjtxxyc()) + .append("tbctxvc", getTbctxvc()) + .append("zldhyc", getZldhyc()) + .append("lxgl", getLxgl()) + .append("zlzjcqyc", getZlzjcqyc()) + .append("ywgj", getYwgj()) + .append("bjtxyc", getBjtxyc()) + .append("hmictxyc", getHmictxyc()) + .append("jxszcw", getJxszcw()) + .append("hmi485txyc", getHmi485txyc()) + .append("yctxyc", getYctxyc()) + .append("gzz", getGzz()) + .append("gjz", getGjz()) + .append("zlblmsszcw", getZlblmsszcw()) + .append("xtcsbpp", getXtcsbpp()) + .append("dwdybphgj", getDwdybphgj()) + .append("ddycyyx", getDdycyyx()) + .append("gdycyyx", getGdycyyx()) + .append("zlfjyc", getZlfjyc()) + .append("srqwdkgwc", getSrqwdkgwc()) + .append("wbwdkgwc", getWbwdkgwc()) + .append("fybyqwdkgwc", getFybyqwdkgwc()) + .append("dgwdkgwc", getDgwdkgwc()) + .append("zjjdvc", getZjjdvc()) + .append("fjjdvc", getFjjdvc()) + .append("jljdvc", getJljdvc()) + .append("bwjdvc", getBwjdvc()) + .append("bmsjt", getBmsjt()) + .append("kkhrqyc", getKkhrqyc()) + .append("dwgqpdjgj", getDwgqpdjgj()) + .append("glmkgwgJ", getGlmkgwgJ()) + .append("dcgy", getDcgy()) + .append("dcqzqy", getDcqzqy()) + .append("zlgl", getZlgl()) + .append("scdyyc", getScdyyc()) + .append("scdybfhlwtj", getScdybfhlwtj()) + .append("gzbh", getGzbh()) + .append("dlbh", getDlbh()) + .append("nbfjyc", getNbfjyc()) + .append("zlbxsyc", getZlbxsyc()) + .append("dczzqy", getDczzqy()) + .append("dcdygj", getDcdygj()) + .append("wbfjyc", getWbfjyc()) + .append("dcfj", getDcfj()) + .append("dcdybfhcdtj", getDcdybfhcdtj()) + .append("gzgJ", getGzgJ()) + .append("zldhmktxyc", getZldhmktxyc()) + .append("bmsxtgz", getBmsxtgz()) + .append("bmstxyc", getBmstxyc()) + .append("bmsgjdyc", getBmsgjdyc()) + .append("bmsjc", getBmsjc()) + .append("bmsjf", getBmsjf()) + .append("bmsdj", getBmsdj()) + .append("bmsgj", getBmsgj()) + .append("dgfjyc", getDgfjyc()) + .append("srqgwgj", getSrqgwgj()) + .append("gzz2", getGzz2()) + .append("gjz2", getGjz2()) + .append("jlfjsmyc", getJlfjsmyc()) + .append("zlfjsmyc", getZlfjsmyc()) + .append("jlkgSmyc", getJlkgSmyc()) + .append("zlkgSmyc", getZlkgSmyc()) + .append("yljzyc", getYljzyc()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java index 7fefdcc..a954deb 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java @@ -11,13 +11,13 @@ import com.xzzn.common.annotation.Excel; * pcs支路数据对象 ems_pcs_branch_data * * @author xzzn - * @date 2025-06-24 + * @date 2025-06-29 */ public class EmsPcsBranchData extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ + /** */ private Long id; /** 放电状态 */ @@ -38,15 +38,95 @@ public class EmsPcsBranchData extends BaseEntity /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; /** 支路id */ @Excel(name = "支路id") - private Long branchId; + private String branchId; + + /** 电网U相电压 */ + @Excel(name = "电网U相电压") + private BigDecimal gridUVoltage; + + /** 电网V相电压 */ + @Excel(name = "电网V相电压") + private BigDecimal gridVVoltage; + + /** 电网W相电压 */ + @Excel(name = "电网W相电压") + private BigDecimal gridWVoltage; + + /** 输出U相电流 */ + @Excel(name = "输出U相电流") + private BigDecimal outputUCurrent; + + /** 输出V相电流 */ + @Excel(name = "输出V相电流") + private BigDecimal outputVCurrent; + + /** 输出W相电流 */ + @Excel(name = "输出W相电流") + private BigDecimal outputWCurrent; + + /** 视在功率 */ + @Excel(name = "视在功率") + private BigDecimal apparentPower; + + /** 有功功率 */ + @Excel(name = "有功功率") + private BigDecimal activePower; + + /** 无功功率 */ + @Excel(name = "无功功率") + private BigDecimal reactivePower; + + /** 功率因数 */ + @Excel(name = "功率因数") + private BigDecimal powerFactor; + + /** 频率 */ + @Excel(name = "频率") + private BigDecimal frequency; + + /** 内部温度 */ + @Excel(name = "内部温度") + private BigDecimal internalTemp; + + /** U相IGBT温度 */ + @Excel(name = "U相IGBT温度") + private BigDecimal uIgbtTemp; + + /** V相IGBT温度 */ + @Excel(name = "V相IGBT温度") + private BigDecimal vIgbtTemp; + + /** W相IGBT温度 */ + @Excel(name = "W相IGBT温度") + private BigDecimal wIgbtTemp; + + /** 并离网状态 */ + @Excel(name = "并离网状态") + private String gridStatus; + + /** 可用功率 */ + @Excel(name = "可用功率") + private BigDecimal availablePower; + + /** 总负载比 */ + @Excel(name = "总负载比") + private BigDecimal totalLoadRatio; + + /** 交流漏电流 */ + @Excel(name = "交流漏电流") + private BigDecimal acLeakageCurrent; + + /** 绝缘阻抗 */ + @Excel(name = "绝缘阻抗") + private BigDecimal insulationResistance; public void setId(Long id) { @@ -98,36 +178,236 @@ public class EmsPcsBranchData extends BaseEntity return dcCurrent; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } - public void setBranchId(Long branchId) + public void setBranchId(String branchId) { this.branchId = branchId; } - public Long getBranchId() + public String getBranchId() { return branchId; } + public void setGridUVoltage(BigDecimal gridUVoltage) + { + this.gridUVoltage = gridUVoltage; + } + + public BigDecimal getGridUVoltage() + { + return gridUVoltage; + } + + public void setGridVVoltage(BigDecimal gridVVoltage) + { + this.gridVVoltage = gridVVoltage; + } + + public BigDecimal getGridVVoltage() + { + return gridVVoltage; + } + + public void setGridWVoltage(BigDecimal gridWVoltage) + { + this.gridWVoltage = gridWVoltage; + } + + public BigDecimal getGridWVoltage() + { + return gridWVoltage; + } + + public void setOutputUCurrent(BigDecimal outputUCurrent) + { + this.outputUCurrent = outputUCurrent; + } + + public BigDecimal getOutputUCurrent() + { + return outputUCurrent; + } + + public void setOutputVCurrent(BigDecimal outputVCurrent) + { + this.outputVCurrent = outputVCurrent; + } + + public BigDecimal getOutputVCurrent() + { + return outputVCurrent; + } + + public void setOutputWCurrent(BigDecimal outputWCurrent) + { + this.outputWCurrent = outputWCurrent; + } + + public BigDecimal getOutputWCurrent() + { + return outputWCurrent; + } + + public void setApparentPower(BigDecimal apparentPower) + { + this.apparentPower = apparentPower; + } + + public BigDecimal getApparentPower() + { + return apparentPower; + } + + public void setActivePower(BigDecimal activePower) + { + this.activePower = activePower; + } + + public BigDecimal getActivePower() + { + return activePower; + } + + public void setReactivePower(BigDecimal reactivePower) + { + this.reactivePower = reactivePower; + } + + public BigDecimal getReactivePower() + { + return reactivePower; + } + + public void setPowerFactor(BigDecimal powerFactor) + { + this.powerFactor = powerFactor; + } + + public BigDecimal getPowerFactor() + { + return powerFactor; + } + + public void setFrequency(BigDecimal frequency) + { + this.frequency = frequency; + } + + public BigDecimal getFrequency() + { + return frequency; + } + + public void setInternalTemp(BigDecimal internalTemp) + { + this.internalTemp = internalTemp; + } + + public BigDecimal getInternalTemp() + { + return internalTemp; + } + + public void setuIgbtTemp(BigDecimal uIgbtTemp) + { + this.uIgbtTemp = uIgbtTemp; + } + + public BigDecimal getuIgbtTemp() + { + return uIgbtTemp; + } + + public void setvIgbtTemp(BigDecimal vIgbtTemp) + { + this.vIgbtTemp = vIgbtTemp; + } + + public BigDecimal getvIgbtTemp() + { + return vIgbtTemp; + } + + public void setwIgbtTemp(BigDecimal wIgbtTemp) + { + this.wIgbtTemp = wIgbtTemp; + } + + public BigDecimal getwIgbtTemp() + { + return wIgbtTemp; + } + + public void setGridStatus(String gridStatus) + { + this.gridStatus = gridStatus; + } + + public String getGridStatus() + { + return gridStatus; + } + + public void setAvailablePower(BigDecimal availablePower) + { + this.availablePower = availablePower; + } + + public BigDecimal getAvailablePower() + { + return availablePower; + } + + public void setTotalLoadRatio(BigDecimal totalLoadRatio) + { + this.totalLoadRatio = totalLoadRatio; + } + + public BigDecimal getTotalLoadRatio() + { + return totalLoadRatio; + } + + public void setAcLeakageCurrent(BigDecimal acLeakageCurrent) + { + this.acLeakageCurrent = acLeakageCurrent; + } + + public BigDecimal getAcLeakageCurrent() + { + return acLeakageCurrent; + } + + public void setInsulationResistance(BigDecimal insulationResistance) + { + this.insulationResistance = insulationResistance; + } + + public BigDecimal getInsulationResistance() + { + return insulationResistance; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -144,6 +424,26 @@ public class EmsPcsBranchData extends BaseEntity .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) .append("branchId", getBranchId()) + .append("gridUVoltage", getGridUVoltage()) + .append("gridVVoltage", getGridVVoltage()) + .append("gridWVoltage", getGridWVoltage()) + .append("outputUCurrent", getOutputUCurrent()) + .append("outputVCurrent", getOutputVCurrent()) + .append("outputWCurrent", getOutputWCurrent()) + .append("apparentPower", getApparentPower()) + .append("activePower", getActivePower()) + .append("reactivePower", getReactivePower()) + .append("powerFactor", getPowerFactor()) + .append("frequency", getFrequency()) + .append("internalTemp", getInternalTemp()) + .append("uIgbtTemp", getuIgbtTemp()) + .append("vIgbtTemp", getvIgbtTemp()) + .append("wIgbtTemp", getwIgbtTemp()) + .append("gridStatus", getGridStatus()) + .append("availablePower", getAvailablePower()) + .append("totalLoadRatio", getTotalLoadRatio()) + .append("acLeakageCurrent", getAcLeakageCurrent()) + .append("insulationResistance", getInsulationResistance()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java index 98c2c72..bd39327 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java @@ -1,18 +1,20 @@ package com.xzzn.ems.domain; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + import java.math.BigDecimal; import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.xzzn.common.core.domain.BaseEntity; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.xzzn.common.annotation.Excel; /** * PCS数据对象 ems_pcs_data * * @author xzzn - * @date 2025-06-17 + * @date 2025-09-25 */ public class EmsPcsData extends BaseEntity { @@ -23,23 +25,23 @@ public class EmsPcsData extends BaseEntity /** 数据更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd") + @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date dataUpdateTime; - /** 工作状态 */ - @Excel(name = "工作状态") + /** 工作状态:0-运行 1-停机 2-故障 */ + @Excel(name = "工作状态:0-运行 1-停机 2-故障") private String workStatus; - /** 并网状态 */ - @Excel(name = "并网状态") + /** 并网状态:0-并网 1-未并网 */ + @Excel(name = "并网状态:0-并网 1-未并网") private String gridStatus; - /** 设备状态 */ - @Excel(name = "设备状态") + /** 设备运行状态:0-离线、1-在线 */ + @Excel(name = "设备运行状态:0-离线、1-在线") private String deviceStatus; - /** 控制模式 */ - @Excel(name = "控制模式") + /** 控制模式:0-远程 1-本地 */ + @Excel(name = "控制模式:0-远程 1-本地") private String controlMode; /** 总交流有功电率 (kW) */ @@ -102,12 +104,12 @@ public class EmsPcsData extends BaseEntity @Excel(name = "交流频率 (Hz)") private BigDecimal acFrequency; - /** 支路状态 */ - @Excel(name = "支路状态") + /** 支路状态:0-备用 1-正常 2-切换中 */ + @Excel(name = "支路状态:0-备用 1-正常 2-切换中") private String branchStatus; - /** 放电状态 */ - @Excel(name = "放电状态") + /** 放电状态:0-充电中 1-待机 */ + @Excel(name = "放电状态:0-充电中 1-待机") private String dischargeStatus; /** 直流功率 (kW) */ @@ -124,19 +126,115 @@ public class EmsPcsData extends BaseEntity /** 站点id */ @Excel(name = "站点id") - private Long siteId; + private String siteId; /** 设备唯一标识符 */ @Excel(name = "设备唯一标识符") - private Long deviceId; + private String deviceId; /** 月 */ @Excel(name = "月") - private int dateMonth; + private Long dateMonth; /** 日 */ @Excel(name = "日") - private int dateDay; + private Long dateDay; + + /** 总交流充电量 (kWh) */ + @Excel(name = "总交流充电量 (kWh)") + private BigDecimal totalAcChargeEnergy; + + /** 总交流放电量 (kWh) */ + @Excel(name = "总交流放电量 (kWh)") + private BigDecimal totalAcDischargeEnergy; + + /** 交流侧充电有功功率 */ + @Excel(name = "交流侧充电有功功率") + private BigDecimal acChargeActivePower; + + /** 交流侧容性无功功率 */ + @Excel(name = "交流侧容性无功功率") + private BigDecimal acCapacitiveReactivePower; + + /** 交流侧放电有功功率 */ + @Excel(name = "交流侧放电有功功率") + private BigDecimal acDischargeActivePower; + + /** 交流侧感性无功功率 */ + @Excel(name = "交流侧感性无功功率") + private BigDecimal acInductiveReactivePower; + + /** 最大容性无功能力 */ + @Excel(name = "最大容性无功能力") + private BigDecimal maxCapacitivePowerCapacity; + + /** 最大感性无功能力 */ + @Excel(name = "最大感性无功能力") + private BigDecimal maxInductivePowerCapacity; + + /** 最大可冲功率 */ + @Excel(name = "最大可冲功率") + private BigDecimal maxChargePowerCapacity; + + /** 最大可放功率 */ + @Excel(name = "最大可放功率") + private BigDecimal maxDischargePowerCapacity; + + /** 交流开关状态 */ + @Excel(name = "交流开关状态") + private String acSwitchStatus; + + /** 直流开关状态 */ + @Excel(name = "直流开关状态") + private String dcSwitchStatus; + + /** 远程投退状态 */ + @Excel(name = "远程投退状态") + private String remoteControlStatus; + + /** 系统输出U相电流 */ + @Excel(name = "系统输出U相电流") + private BigDecimal sysUCurrent; + + /** 系统输出V相电流 */ + @Excel(name = "系统输出V相电流") + private BigDecimal sysVCurrent; + + /** 系统输出W相电流 */ + @Excel(name = "系统输出W相电流") + private BigDecimal sysWCurrent; + + /** 电网频率 */ + @Excel(name = "电网频率") + private BigDecimal dwFrequency; + + /** 单元1U相IGBT温度 */ + @Excel(name = "单元1U相IGBT温度") + private BigDecimal uTemperature; + + /** 单元1V相IGBT温度 */ + @Excel(name = "单元1V相IGBT温度") + private BigDecimal vTemperature; + + /** 单元1W相IGBT温度 */ + @Excel(name = "单元1W相IGBT温度") + private BigDecimal wTemperature; + + /** 1#模块IGBT最高温 */ + @Excel(name = "1#模块IGBT最高温") + private BigDecimal module1Temp; + + /** 2#模块IGBT最高温 */ + @Excel(name = "2#模块IGBT最高温") + private BigDecimal module2Temp; + + /** 3#模块IGBT最高温 */ + @Excel(name = "3#模块IGBT最高温") + private BigDecimal module3Temp; + + /** 4#模块IGBT最高温 */ + @Excel(name = "4#模块IGBT最高温") + private BigDecimal module4Temp; public void setId(Long id) { @@ -398,40 +496,284 @@ public class EmsPcsData extends BaseEntity return dcCurrent; } - public void setSiteId(Long siteId) + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getSiteId() + public String getSiteId() { return siteId; } - public void setDeviceId(Long deviceId) + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getDeviceId() + public String getDeviceId() { return deviceId; } - public int getDateMonth() { - return dateMonth; - } - - public void setDateMonth(int dateMonth) { + public void setDateMonth(Long dateMonth) + { this.dateMonth = dateMonth; } - public int getDateDay() { + public Long getDateMonth() + { + return dateMonth; + } + + public void setDateDay(Long dateDay) + { + this.dateDay = dateDay; + } + + public Long getDateDay() + { return dateDay; } - public void setDateDay(int dateDay) { - this.dateDay = dateDay; + public void setTotalAcChargeEnergy(BigDecimal totalAcChargeEnergy) + { + this.totalAcChargeEnergy = totalAcChargeEnergy; + } + + public BigDecimal getTotalAcChargeEnergy() + { + return totalAcChargeEnergy; + } + + public void setTotalAcDischargeEnergy(BigDecimal totalAcDischargeEnergy) + { + this.totalAcDischargeEnergy = totalAcDischargeEnergy; + } + + public BigDecimal getTotalAcDischargeEnergy() + { + return totalAcDischargeEnergy; + } + + public void setAcChargeActivePower(BigDecimal acChargeActivePower) + { + this.acChargeActivePower = acChargeActivePower; + } + + public BigDecimal getAcChargeActivePower() + { + return acChargeActivePower; + } + + public void setAcCapacitiveReactivePower(BigDecimal acCapacitiveReactivePower) + { + this.acCapacitiveReactivePower = acCapacitiveReactivePower; + } + + public BigDecimal getAcCapacitiveReactivePower() + { + return acCapacitiveReactivePower; + } + + public void setAcDischargeActivePower(BigDecimal acDischargeActivePower) + { + this.acDischargeActivePower = acDischargeActivePower; + } + + public BigDecimal getAcDischargeActivePower() + { + return acDischargeActivePower; + } + + public void setAcInductiveReactivePower(BigDecimal acInductiveReactivePower) + { + this.acInductiveReactivePower = acInductiveReactivePower; + } + + public BigDecimal getAcInductiveReactivePower() + { + return acInductiveReactivePower; + } + + public void setMaxCapacitivePowerCapacity(BigDecimal maxCapacitivePowerCapacity) + { + this.maxCapacitivePowerCapacity = maxCapacitivePowerCapacity; + } + + public BigDecimal getMaxCapacitivePowerCapacity() + { + return maxCapacitivePowerCapacity; + } + + public void setMaxInductivePowerCapacity(BigDecimal maxInductivePowerCapacity) + { + this.maxInductivePowerCapacity = maxInductivePowerCapacity; + } + + public BigDecimal getMaxInductivePowerCapacity() + { + return maxInductivePowerCapacity; + } + + public void setMaxChargePowerCapacity(BigDecimal maxChargePowerCapacity) + { + this.maxChargePowerCapacity = maxChargePowerCapacity; + } + + public BigDecimal getMaxChargePowerCapacity() + { + return maxChargePowerCapacity; + } + + public void setMaxDischargePowerCapacity(BigDecimal maxDischargePowerCapacity) + { + this.maxDischargePowerCapacity = maxDischargePowerCapacity; + } + + public BigDecimal getMaxDischargePowerCapacity() + { + return maxDischargePowerCapacity; + } + + public void setAcSwitchStatus(String acSwitchStatus) + { + this.acSwitchStatus = acSwitchStatus; + } + + public String getAcSwitchStatus() + { + return acSwitchStatus; + } + + public void setDcSwitchStatus(String dcSwitchStatus) + { + this.dcSwitchStatus = dcSwitchStatus; + } + + public String getDcSwitchStatus() + { + return dcSwitchStatus; + } + + public void setRemoteControlStatus(String remoteControlStatus) + { + this.remoteControlStatus = remoteControlStatus; + } + + public String getRemoteControlStatus() + { + return remoteControlStatus; + } + + public void setSysUCurrent(BigDecimal sysUCurrent) + { + this.sysUCurrent = sysUCurrent; + } + + public BigDecimal getSysUCurrent() + { + return sysUCurrent; + } + + public void setSysVCurrent(BigDecimal sysVCurrent) + { + this.sysVCurrent = sysVCurrent; + } + + public BigDecimal getSysVCurrent() + { + return sysVCurrent; + } + + public void setSysWCurrent(BigDecimal sysWCurrent) + { + this.sysWCurrent = sysWCurrent; + } + + public BigDecimal getSysWCurrent() + { + return sysWCurrent; + } + + public void setDwFrequency(BigDecimal dwFrequency) + { + this.dwFrequency = dwFrequency; + } + + public BigDecimal getDwFrequency() + { + return dwFrequency; + } + + public void setuTemperature(BigDecimal uTemperature) + { + this.uTemperature = uTemperature; + } + + public BigDecimal getuTemperature() + { + return uTemperature; + } + + public void setvTemperature(BigDecimal vTemperature) + { + this.vTemperature = vTemperature; + } + + public BigDecimal getvTemperature() + { + return vTemperature; + } + + public void setwTemperature(BigDecimal wTemperature) + { + this.wTemperature = wTemperature; + } + + public BigDecimal getwTemperature() + { + return wTemperature; + } + + public void setModule1Temp(BigDecimal module1Temp) + { + this.module1Temp = module1Temp; + } + + public BigDecimal getModule1Temp() + { + return module1Temp; + } + + public void setModule2Temp(BigDecimal module2Temp) + { + this.module2Temp = module2Temp; + } + + public BigDecimal getModule2Temp() + { + return module2Temp; + } + + public void setModule3Temp(BigDecimal module3Temp) + { + this.module3Temp = module3Temp; + } + + public BigDecimal getModule3Temp() + { + return module3Temp; + } + + public void setModule4Temp(BigDecimal module4Temp) + { + this.module4Temp = module4Temp; + } + + public BigDecimal getModule4Temp() + { + return module4Temp; } @Override @@ -472,7 +814,30 @@ public class EmsPcsData extends BaseEntity .append("deviceId", getDeviceId()) .append("dateMonth", getDateMonth()) .append("dateDay", getDateDay()) + .append("totalAcChargeEnergy", getTotalAcChargeEnergy()) + .append("totalAcDischargeEnergy", getTotalAcDischargeEnergy()) + .append("acChargeActivePower", getAcChargeActivePower()) + .append("acCapacitiveReactivePower", getAcCapacitiveReactivePower()) + .append("acDischargeActivePower", getAcDischargeActivePower()) + .append("acInductiveReactivePower", getAcInductiveReactivePower()) + .append("maxCapacitivePowerCapacity", getMaxCapacitivePowerCapacity()) + .append("maxInductivePowerCapacity", getMaxInductivePowerCapacity()) + .append("maxChargePowerCapacity", getMaxChargePowerCapacity()) + .append("maxDischargePowerCapacity", getMaxDischargePowerCapacity()) + .append("acSwitchStatus", getAcSwitchStatus()) + .append("dcSwitchStatus", getDcSwitchStatus()) + .append("remoteControlStatus", getRemoteControlStatus()) + .append("sysUCurrent", getSysUCurrent()) + .append("sysVCurrent", getSysVCurrent()) + .append("sysWCurrent", getSysWCurrent()) + .append("dwFrequency", getDwFrequency()) + .append("uTemperature", getuTemperature()) + .append("vTemperature", getvTemperature()) + .append("wTemperature", getwTemperature()) + .append("module1Temp", getModule1Temp()) + .append("module2Temp", getModule2Temp()) + .append("module3Temp", getModule3Temp()) + .append("module4Temp", getModule4Temp()) .toString(); } } - diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsSetting.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsSetting.java new file mode 100644 index 0000000..2327f61 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsSetting.java @@ -0,0 +1,177 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +import java.math.BigDecimal; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * PCS设备配置对象 ems_pcs_setting + * + * @author xzzn + * @date 2025-12-29 + */ +public class EmsPcsSetting extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 设备ID,主键自增长 */ + private Long id; + + /** 设备配置关联ID */ + @Excel(name = "设备配置关联ID") + private Long deviceSettingId; + + /** 开关机地址 */ + @Excel(name = "开关机地址") + private String pointAddress; + + /** 功率地址 */ + @Excel(name = "功率地址") + private String powerAddress; + + /** 开机指令 */ + @Excel(name = "开机指令") + private String startCommand; + + /** 关机指令 */ + @Excel(name = "关机指令") + private String stopCommand; + + /** 开机目标功率 */ + @Excel(name = "开机目标功率") + private BigDecimal startPower; + + /** 关机目标功率 */ + @Excel(name = "关机目标功率") + private BigDecimal stopPower; + + /** 电池簇数 */ + @Excel(name = "电池簇数") + private Integer clusterNum; + + /** 电池簇地址 */ + @Excel(name = "电池簇地址") + private String clusterPointAddress; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDeviceSettingId(Long deviceSettingId) + { + this.deviceSettingId = deviceSettingId; + } + + public Long getDeviceSettingId() + { + return deviceSettingId; + } + + public String getPowerAddress() { + return powerAddress; + } + + public void setPowerAddress(String powerAddress) { + this.powerAddress = powerAddress; + } + + public void setPointAddress(String pointAddress) + { + this.pointAddress = pointAddress; + } + + public String getPointAddress() + { + return pointAddress; + } + + public void setStartCommand(String startCommand) + { + this.startCommand = startCommand; + } + + public String getStartCommand() + { + return startCommand; + } + + public void setStopCommand(String stopCommand) + { + this.stopCommand = stopCommand; + } + + public String getStopCommand() + { + return stopCommand; + } + + public void setStartPower(BigDecimal startPower) + { + this.startPower = startPower; + } + + public BigDecimal getStartPower() + { + return startPower; + } + + public void setStopPower(BigDecimal stopPower) + { + this.stopPower = stopPower; + } + + public BigDecimal getStopPower() + { + return stopPower; + } + + public void setClusterNum(Integer clusterNum) + { + this.clusterNum = clusterNum; + } + + public Integer getClusterNum() + { + return clusterNum; + } + + public void setClusterPointAddress(String clusterPointAddress) + { + this.clusterPointAddress = clusterPointAddress; + } + + public String getClusterPointAddress() + { + return clusterPointAddress; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("deviceSettingId", getDeviceSettingId()) + .append("pointAddress", getPointAddress()) + .append("startCommand", getStartCommand()) + .append("stopCommand", getStopCommand()) + .append("startPower", getStartPower()) + .append("stopPower", getStopPower()) + .append("clusterNum", getClusterNum()) + .append("clusterPointAddress", getClusterPointAddress()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java new file mode 100644 index 0000000..6c55f0b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointEnumMatch.java @@ -0,0 +1,147 @@ +package com.xzzn.ems.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +/** + * 点位枚举匹配对象 ems_point_enum_match + * + * @author xzzn + * @date 2025-12-08 + */ +public class EmsPointEnumMatch extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键自增长 */ + private Long id; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备类别,例如“STACK/CLUSTER/PCS等” */ + @Excel(name = "设备类别,例如“STACK/CLUSTER/PCS等”") + private String deviceCategory; + + /** 系统枚举代码 */ + @Excel(name = "系统枚举代码") + private String enumCode; + + /** 系统枚举名称 */ + @Excel(name = "系统枚举名称") + private String enumName; + + /** 系统枚举描述 */ + @Excel(name = "系统枚举描述") + private String enumDesc; + + /** 数据枚举代码 */ + @Excel(name = "数据枚举代码") + private String dataEnumCode; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setMatchField(String matchField) + { + this.matchField = matchField; + } + + public String getMatchField() + { + return matchField; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceCategory(String deviceCategory) + { + this.deviceCategory = deviceCategory; + } + + public String getDeviceCategory() + { + return deviceCategory; + } + + public void setEnumCode(String enumCode) + { + this.enumCode = enumCode; + } + + public String getEnumCode() + { + return enumCode; + } + + public void setEnumName(String enumName) + { + this.enumName = enumName; + } + + public String getEnumName() + { + return enumName; + } + + public void setEnumDesc(String enumDesc) + { + this.enumDesc = enumDesc; + } + + public String getEnumDesc() + { + return enumDesc; + } + + public void setDataEnumCode(String dataEnumCode) + { + this.dataEnumCode = dataEnumCode; + } + + public String getDataEnumCode() + { + return dataEnumCode; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("matchField", getMatchField()) + .append("siteId", getSiteId()) + .append("deviceCategory", getDeviceCategory()) + .append("enumCode", getEnumCode()) + .append("enumName", getEnumName()) + .append("enumDesc", getEnumDesc()) + .append("dataEnumCode", getDataEnumCode()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java new file mode 100644 index 0000000..de257a7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java @@ -0,0 +1,310 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +import java.math.BigDecimal; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 点位匹配对象 ems_point_match + * + * @author xzzn + * @date 2025-11-04 + */ +public class EmsPointMatch extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 设备ID,主键自增长 */ + private Long id; + + /** 存储点位名称 */ + @Excel(name = "存储点位名称") + private String pointName; + + /** 点位所在表 */ + @Excel(name = "点位所在表") + private String matchTable; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备类别,例如“STACK/CLUSTER/PCS等” */ + @Excel(name = "设备类别,例如“STACK/CLUSTER/PCS等”") + private String deviceCategory; + + /** 数据点位 */ + @Excel(name = "数据点位") + private String dataPoint; + + /** 数据点位名称 */ + @Excel(name = "数据点位名称") + private String dataPointName; + + /** 数据点位来源设备 */ + @Excel(name = "数据点位来源设备") + private String dataDevice; + + /** 数据单位 */ + @Excel(name = "数据单位") + private String dataUnit; + + /** 地址 */ + @Excel(name = "寄存器地址") + private String ipAddress; + + /** 端口 */ + @Excel(name = "端口") + private Integer ipPort; + + /** 数据类型:1-瞬时值 2-累计值 */ + @Excel(name = "数据类型:1-瞬时值 2-累计值") + private Long dataType; + + /** 点位是否需要区分多设备:0-不需要 1-需要 */ + @Excel(name = "点位是否需要区分多设备:0-不需要 1-需要") + private Long needDiffDeviceId; + + /** 是否告警点位 */ + @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") + private Integer isAlarm; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 设备点位数据转换公式:二次函数(f(x) = Ax² + Kx + B) */ + /** 二次项系数 */ + @Excel(name = "二次项系数") + private BigDecimal a; + + /** 一次项系数 */ + @Excel(name = "一次项系数") + private BigDecimal k; + + /** 常量 */ + @Excel(name = "常量") + private BigDecimal b; + + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setPointName(String pointName) + { + this.pointName = pointName; + } + + public String getPointName() + { + return pointName; + } + + public void setMatchTable(String matchTable) + { + this.matchTable = matchTable; + } + + public String getMatchTable() + { + return matchTable; + } + + public void setMatchField(String matchField) + { + this.matchField = matchField; + } + + public String getMatchField() + { + return matchField; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceCategory(String deviceCategory) + { + this.deviceCategory = deviceCategory; + } + + public String getDeviceCategory() + { + return deviceCategory; + } + + public void setDataPoint(String dataPoint) + { + this.dataPoint = dataPoint; + } + + public String getDataPoint() + { + return dataPoint; + } + + public void setDataPointName(String dataPointName) + { + this.dataPointName = dataPointName; + } + + public String getDataPointName() + { + return dataPointName; + } + + public void setDataDevice(String dataDevice) + { + this.dataDevice = dataDevice; + } + + public String getDataDevice() + { + return dataDevice; + } + + public void setDataUnit(String dataUnit) + { + this.dataUnit = dataUnit; + } + + public String getDataUnit() + { + return dataUnit; + } + + public void setIpAddress(String ipAddress) + { + this.ipAddress = ipAddress; + } + + public String getIpAddress() + { + return ipAddress; + } + + public Integer getIpPort() { + return ipPort; + } + + public void setIpPort(Integer ipPort) { + this.ipPort = ipPort; + } + + public void setDataType(Long dataType) + { + this.dataType = dataType; + } + + public Long getDataType() + { + return dataType; + } + + public void setNeedDiffDeviceId(Long needDiffDeviceId) + { + this.needDiffDeviceId = needDiffDeviceId; + } + + public Long getNeedDiffDeviceId() + { + return needDiffDeviceId; + } + + public Integer getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(Integer isAlarm) { + this.isAlarm = isAlarm; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public BigDecimal getA() { + return a; + } + + public void setA(BigDecimal a) { + this.a = a; + } + + public BigDecimal getK() { + return k; + } + + public void setK(BigDecimal k) { + this.k = k; + } + + public BigDecimal getB() { + return b; + } + + public void setB(BigDecimal b) { + this.b = b; + } + + /** 二次函数公式转换点位数据: A * value² + K * value + B */ + public int convert(BigDecimal value) { + return a.multiply(value.pow(2)).add(k.multiply(value)).add(b).intValueExact(); + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("pointName", getPointName()) + .append("matchTable", getMatchTable()) + .append("matchField", getMatchField()) + .append("siteId", getSiteId()) + .append("deviceCategory", getDeviceCategory()) + .append("dataPoint", getDataPoint()) + .append("dataPointName", getDataPointName()) + .append("dataDevice", getDataDevice()) + .append("dataUnit", getDataUnit()) + .append("ipAddress", getIpAddress()) + .append("ipPort", getIpPort()) + .append("dataType", getDataType()) + .append("needDiffDeviceId", getNeedDiffDeviceId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("isAlarm", getIsAlarm()) + .append("deviceId", getDeviceId()) + .append("a", getA()) + .append("k", getK()) + .append("b", getB()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPriceTimeConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPriceTimeConfig.java new file mode 100644 index 0000000..2bdc7ab --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPriceTimeConfig.java @@ -0,0 +1,102 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 电价时间配置对象 ems_price_time_config + * + * @author xzzn + * @date 2025-10-09 + */ +public class EmsPriceTimeConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 时段开始时间 */ + @Excel(name = "时段开始时间") + private String startTime; + + /** 时段结束时间 */ + @Excel(name = "时段结束时间") + private String endTime; + + /** 电价类型: 尖-peak,峰-high,平-flat,谷-valley */ + @Excel(name = "电价类型: 尖-peak,峰-high,平-flat,谷-valley") + private String costType; + + /** 电价配置id */ + @Excel(name = "电价配置id") + private Long priceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStartTime(String startTime) + { + this.startTime = startTime; + } + + public String getStartTime() + { + return startTime; + } + + public void setEndTime(String endTime) + { + this.endTime = endTime; + } + + public String getEndTime() + { + return endTime; + } + + public void setCostType(String costType) + { + this.costType = costType; + } + + public String getCostType() + { + return costType; + } + + public void setPriceId(Long priceId) + { + this.priceId = priceId; + } + + public Long getPriceId() + { + return priceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("costType", getCostType()) + .append("priceId", getPriceId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsSiteSetting.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsSiteSetting.java index 6143a21..9ef28ee 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsSiteSetting.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsSiteSetting.java @@ -12,7 +12,7 @@ import com.xzzn.common.annotation.Excel; * 站点对象 ems_site_setting * * @author xzzn - * @date 2025-06-20 + * @date 2025-06-29 */ public class EmsSiteSetting extends BaseEntity { @@ -30,8 +30,8 @@ public class EmsSiteSetting extends BaseEntity private String siteAddress; /** 运营时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "运营时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "运营时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date runningTime; /** 纬度 */ @@ -50,6 +50,10 @@ public class EmsSiteSetting extends BaseEntity @Excel(name = "装机功率") private BigDecimal installPower; + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + public void setId(Long id) { this.id = id; @@ -130,6 +134,16 @@ public class EmsSiteSetting extends BaseEntity return installPower; } + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -146,6 +160,7 @@ public class EmsSiteSetting extends BaseEntity .append("updateBy", getUpdateBy()) .append("createTime", getCreateTime()) .append("updateTime", getUpdateTime()) + .append("siteId", getSiteId()) .toString(); } -} \ No newline at end of file +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStackAlarmData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStackAlarmData.java new file mode 100644 index 0000000..a3201a8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStackAlarmData.java @@ -0,0 +1,1545 @@ +package com.xzzn.ems.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * bmsd告警数据对象 ems_stack_alarm_data + * + * @author xzzn + * @date 2025-10-22 + */ +public class EmsStackAlarmData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** BMS故障状态(0=正常,1=故障) */ + @Excel(name = "BMS故障状态", readConverterExp = "0==正常,1=故障") + private Integer bmsgzzt; + + /** 禁充状态(0=允许充电,1=禁止充电) */ + @Excel(name = "禁充状态", readConverterExp = "0==允许充电,1=禁止充电") + private Integer jczt; + + /** 禁放状态(0=允许放电,1=禁止放电) */ + @Excel(name = "禁放状态", readConverterExp = "0==允许放电,1=禁止放电") + private Integer jfzt; + + /** 堆内各组端电压欠压轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压欠压轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddyqyqdgjhz; + + /** 堆内各组端电压欠压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压欠压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddyqyzdgjhz; + + /** 堆内各组端电压欠压重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压欠压重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddyqyzzdgjhz; + + /** 堆内各组端电压过压轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压过压轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddygyqdgjhz; + + /** 堆内各组端电压过压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压过压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddygyzdgjhz; + + /** 堆内各组端电压过压重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端电压过压重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzddygyzzdgjhz; + + /** 堆内各组端过流轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端过流轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzdglqdgjhz; + + /** 堆内各组端过流中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端过流中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzdglzdgjhz; + + /** 堆内各组端过流重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组端过流重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzdglzzdgjhz; + + /** 堆内各组绝缘电阻低轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组绝缘电阻低轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzjydzdqdgjhz; + + /** 堆内各组绝缘电阻低中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组绝缘电阻低中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzjydzdzdgjhz; + + /** 堆内各组绝缘电阻低重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组绝缘电阻低重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzjydzdzzdgjhz; + + /** 堆内各组模块欠温度轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块欠温度轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkqwdqdgjhz; + + /** 堆内各组模块欠温度中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块欠温度中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkqwdzdgjhz; + + /** 堆内各组模块欠温度重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块欠温度重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkqwdzzdgjhz; + + /** 堆内各组模块过温度轻度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块过温度轻度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkgwdqdgjhz; + + /** 堆内各组模块过温度中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块过温度中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkgwdzdgjhz; + + /** 堆内各组模块过温度重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各组模块过温度重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngzmkgwdzzdgjhz; + + /** 堆内各单体过压轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过压轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgyqwgjhz; + + /** 堆内各单体过压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgyzdgjhz; + + /** 堆内各单体过压严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过压严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgyyzgjhz; + + /** 堆内各单体欠压轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠压轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqyqwgjhz; + + /** 堆内各单体欠压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqyzdgjhz; + + /** 堆内各单体欠压严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠压严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqyyzgjhz; + + /** 堆内各单体压差轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体压差轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtycqwgjhz; + + /** 堆内各单体压差中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体压差中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtyczdgjhz; + + /** 堆内各单体压差严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体压差严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtycyzgjhz; + + /** 堆内各单体欠温轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠温轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqwqwgjhz; + + /** 堆内各单体欠温中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠温中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqwzdgjhz; + + /** 堆内各单体欠温严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体欠温严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtqwyzgjhz; + + /** 堆内各单体过温轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过温轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgwqwgjhz; + + /** 堆内各单体过温中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过温中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgwzdgjhz; + + /** 堆内各单体过温严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体过温严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtgwyzgjhz; + + /** 堆内各单体温差轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体温差轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtwcqwgjhz; + + /** 堆内各单体温差中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体温差中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtwczdgjhz; + + /** 堆内各单体温差严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体温差严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdtwcyzgjhz; + + /** 堆内各单体 SOC 低轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 低轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocdqwgjhz; + + /** 堆内各单体 SOC 低中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 低中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocdzdgjhz; + + /** 堆内各单体 SOC 低严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 低严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocdyzgjhz; + + /** 堆内各单体 SOC 高轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 高轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocgqwgjhz; + + /** 堆内各单体 SOC 高中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 高中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocgzdgjhz; + + /** 堆内各单体 SOC 高严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOC 高严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsocgyzgjhz; + + /** 堆内各单体 SOH 低轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 低轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohdqwgjhz; + + /** 堆内各单体 SOH 低中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 低中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohdzdgjhz; + + /** 堆内各单体 SOH 低严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 低严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohdyzgjhz; + + /** 堆内各单体 SOH 高轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 高轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohgqwgjhz; + + /** 堆内各单体 SOH 高中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 高中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohgzdgjhz; + + /** 堆内各单体 SOH 高严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各单体 SOH 高严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dtsohgyzgjhz; + + /** 堆内各主控失联汇总(0=正常,1=失联) */ + @Excel(name = "堆内各主控失联汇总", readConverterExp = "0==正常,1=失联") + private Integer dngzkslhz; + + /** 堆内各从控失联告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各从控失联告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngckslgjhz; + + /** 堆内各组电压异常(组间压差大于 20V)(0=正常,1=异常) */ + @Excel(name = "堆内各组电压异常", readConverterExp = "组=间压差大于,2=0V") + private Integer dngzdyyc; + + /** 堆内接触器断开异常(0=正常,1=异常) */ + @Excel(name = "堆内接触器断开异常", readConverterExp = "0==正常,1=异常") + private Integer dnjcqdkyc; + + /** 堆内接触器闭合异常(0=正常,1=异常) */ + @Excel(name = "堆内接触器闭合异常", readConverterExp = "0==正常,1=异常") + private Integer dnjcqbhyc; + + /** 充电禁止(0=允许,1=禁止) */ + @Excel(name = "充电禁止", readConverterExp = "0==允许,1=禁止") + private Integer cdjz; + + /** 放电禁止(0=允许,1=禁止) */ + @Excel(name = "放电禁止", readConverterExp = "0==允许,1=禁止") + private Integer fdjz; + + /** BMS 系统告警汇总(0=无告警,1=有告警) */ + @Excel(name = "BMS 系统告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer bmsxtgjhz; + + /** BMS 系统故障汇总(0=无故障,1=有故障) */ + @Excel(name = "BMS 系统故障汇总", readConverterExp = "0==无故障,1=有故障") + private Integer bmsxtgzhz; + + /** 输入 IN0(0=断开,1=闭合/有效) */ + @Excel(name = "输入 IN0", readConverterExp = "0==断开,1=闭合/有效") + private Integer srin0; + + /** 输入 IN1(0=断开,1=闭合/有效) */ + @Excel(name = "输入 IN1", readConverterExp = "0==断开,1=闭合/有效") + private Integer srin1; + + /** 输入 IN2(0=断开,1=闭合/有效) */ + @Excel(name = "输入 IN2", readConverterExp = "0==断开,1=闭合/有效") + private Integer srin2; + + /** 输入 IN3(0=断开,1=闭合/有效) */ + @Excel(name = "输入 IN3", readConverterExp = "0==断开,1=闭合/有效") + private Integer srin3; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl1; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl2; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl3; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl4; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl5; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl6; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl7; + + /** 预留/reserved */ + @Excel(name = "预留/reserved") + private Integer yl8; + + /** 堆内各端子过温轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各端子过温轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdzgwqwgjhz; + + /** 堆内各端子过温中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各端子过温中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdzgwzdgjhz; + + /** 堆内各端子过温重度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内各端子过温重度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dngdzgwzzdgjhz; + + /** 堆内模块电压过压轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压过压轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdygyqwgjhz; + + /** 堆内模块电压过压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压过压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdygyzdgjhz; + + /** 堆内模块电压过压严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压过压严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdygyyzgjhz; + + /** 堆内模块电压欠压轻微告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压欠压轻微告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdyqyqwgjhz; + + /** 堆内模块电压欠压中度告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压欠压中度告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdyqyzdgjhz; + + /** 堆内模块电压欠压严重告警汇总(0=无告警,1=有告警) */ + @Excel(name = "堆内模块电压欠压严重告警汇总", readConverterExp = "0==无告警,1=有告警") + private Integer dnmkdyqyyzgjhz; + + /** 电压采集失联(0=正常,1=失联) */ + @Excel(name = "电压采集失联", readConverterExp = "0==正常,1=失联") + private Integer dycjsl; + + /** 温度采集失联(0=正常,1=失联) */ + @Excel(name = "温度采集失联", readConverterExp = "0==正常,1=失联") + private Integer wdcjsl; + + /** DIDO-DI0(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI0", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi0; + + /** DIDO-DI1(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI1", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi1; + + /** DIDO-DI2(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI2", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi2; + + /** DIDO-DI3(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI3", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi3; + + /** DIDO-DI4(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI4", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi4; + + /** DIDO-DI5(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI5", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi5; + + /** DIDO-DI6(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI6", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi6; + + /** DIDO-DI7(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI7", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi7; + + /** DIDO-DI8(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI8", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi8; + + /** DIDO-DI9(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI9", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi9; + + /** DIDO-DI10(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI10", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi10; + + /** DIDO-DI11(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI11", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi11; + + /** DIDO-DI12(0=断开,1=闭合/有效) */ + @Excel(name = "DIDO-DI12", readConverterExp = "0==断开,1=闭合/有效") + private Integer didodi12; + + /** 空调-通信失联(0=正常,1=失联) */ + @Excel(name = "空调-通信失联", readConverterExp = "0==正常,1=失联") + private Integer kttxsl; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public void setBmsgzzt(Integer bmsgzzt) + { + this.bmsgzzt = bmsgzzt; + } + + public Integer getBmsgzzt() + { + return bmsgzzt; + } + + public void setJczt(Integer jczt) + { + this.jczt = jczt; + } + + public Integer getJczt() + { + return jczt; + } + + public void setJfzt(Integer jfzt) + { + this.jfzt = jfzt; + } + + public Integer getJfzt() + { + return jfzt; + } + + public void setDngzddyqyqdgjhz(Integer dngzddyqyqdgjhz) + { + this.dngzddyqyqdgjhz = dngzddyqyqdgjhz; + } + + public Integer getDngzddyqyqdgjhz() + { + return dngzddyqyqdgjhz; + } + + public void setDngzddyqyzdgjhz(Integer dngzddyqyzdgjhz) + { + this.dngzddyqyzdgjhz = dngzddyqyzdgjhz; + } + + public Integer getDngzddyqyzdgjhz() + { + return dngzddyqyzdgjhz; + } + + public void setDngzddyqyzzdgjhz(Integer dngzddyqyzzdgjhz) + { + this.dngzddyqyzzdgjhz = dngzddyqyzzdgjhz; + } + + public Integer getDngzddyqyzzdgjhz() + { + return dngzddyqyzzdgjhz; + } + + public void setDngzddygyqdgjhz(Integer dngzddygyqdgjhz) + { + this.dngzddygyqdgjhz = dngzddygyqdgjhz; + } + + public Integer getDngzddygyqdgjhz() + { + return dngzddygyqdgjhz; + } + + public void setDngzddygyzdgjhz(Integer dngzddygyzdgjhz) + { + this.dngzddygyzdgjhz = dngzddygyzdgjhz; + } + + public Integer getDngzddygyzdgjhz() + { + return dngzddygyzdgjhz; + } + + public void setDngzddygyzzdgjhz(Integer dngzddygyzzdgjhz) + { + this.dngzddygyzzdgjhz = dngzddygyzzdgjhz; + } + + public Integer getDngzddygyzzdgjhz() + { + return dngzddygyzzdgjhz; + } + + public void setDngzdglqdgjhz(Integer dngzdglqdgjhz) + { + this.dngzdglqdgjhz = dngzdglqdgjhz; + } + + public Integer getDngzdglqdgjhz() + { + return dngzdglqdgjhz; + } + + public void setDngzdglzdgjhz(Integer dngzdglzdgjhz) + { + this.dngzdglzdgjhz = dngzdglzdgjhz; + } + + public Integer getDngzdglzdgjhz() + { + return dngzdglzdgjhz; + } + + public void setDngzdglzzdgjhz(Integer dngzdglzzdgjhz) + { + this.dngzdglzzdgjhz = dngzdglzzdgjhz; + } + + public Integer getDngzdglzzdgjhz() + { + return dngzdglzzdgjhz; + } + + public void setDngzjydzdqdgjhz(Integer dngzjydzdqdgjhz) + { + this.dngzjydzdqdgjhz = dngzjydzdqdgjhz; + } + + public Integer getDngzjydzdqdgjhz() + { + return dngzjydzdqdgjhz; + } + + public void setDngzjydzdzdgjhz(Integer dngzjydzdzdgjhz) + { + this.dngzjydzdzdgjhz = dngzjydzdzdgjhz; + } + + public Integer getDngzjydzdzdgjhz() + { + return dngzjydzdzdgjhz; + } + + public void setDngzjydzdzzdgjhz(Integer dngzjydzdzzdgjhz) + { + this.dngzjydzdzzdgjhz = dngzjydzdzzdgjhz; + } + + public Integer getDngzjydzdzzdgjhz() + { + return dngzjydzdzzdgjhz; + } + + public void setDngzmkqwdqdgjhz(Integer dngzmkqwdqdgjhz) + { + this.dngzmkqwdqdgjhz = dngzmkqwdqdgjhz; + } + + public Integer getDngzmkqwdqdgjhz() + { + return dngzmkqwdqdgjhz; + } + + public void setDngzmkqwdzdgjhz(Integer dngzmkqwdzdgjhz) + { + this.dngzmkqwdzdgjhz = dngzmkqwdzdgjhz; + } + + public Integer getDngzmkqwdzdgjhz() + { + return dngzmkqwdzdgjhz; + } + + public void setDngzmkqwdzzdgjhz(Integer dngzmkqwdzzdgjhz) + { + this.dngzmkqwdzzdgjhz = dngzmkqwdzzdgjhz; + } + + public Integer getDngzmkqwdzzdgjhz() + { + return dngzmkqwdzzdgjhz; + } + + public void setDngzmkgwdqdgjhz(Integer dngzmkgwdqdgjhz) + { + this.dngzmkgwdqdgjhz = dngzmkgwdqdgjhz; + } + + public Integer getDngzmkgwdqdgjhz() + { + return dngzmkgwdqdgjhz; + } + + public void setDngzmkgwdzdgjhz(Integer dngzmkgwdzdgjhz) + { + this.dngzmkgwdzdgjhz = dngzmkgwdzdgjhz; + } + + public Integer getDngzmkgwdzdgjhz() + { + return dngzmkgwdzdgjhz; + } + + public void setDngzmkgwdzzdgjhz(Integer dngzmkgwdzzdgjhz) + { + this.dngzmkgwdzzdgjhz = dngzmkgwdzzdgjhz; + } + + public Integer getDngzmkgwdzzdgjhz() + { + return dngzmkgwdzzdgjhz; + } + + public void setDngdtgyqwgjhz(Integer dngdtgyqwgjhz) + { + this.dngdtgyqwgjhz = dngdtgyqwgjhz; + } + + public Integer getDngdtgyqwgjhz() + { + return dngdtgyqwgjhz; + } + + public void setDngdtgyzdgjhz(Integer dngdtgyzdgjhz) + { + this.dngdtgyzdgjhz = dngdtgyzdgjhz; + } + + public Integer getDngdtgyzdgjhz() + { + return dngdtgyzdgjhz; + } + + public void setDngdtgyyzgjhz(Integer dngdtgyyzgjhz) + { + this.dngdtgyyzgjhz = dngdtgyyzgjhz; + } + + public Integer getDngdtgyyzgjhz() + { + return dngdtgyyzgjhz; + } + + public void setDngdtqyqwgjhz(Integer dngdtqyqwgjhz) + { + this.dngdtqyqwgjhz = dngdtqyqwgjhz; + } + + public Integer getDngdtqyqwgjhz() + { + return dngdtqyqwgjhz; + } + + public void setDngdtqyzdgjhz(Integer dngdtqyzdgjhz) + { + this.dngdtqyzdgjhz = dngdtqyzdgjhz; + } + + public Integer getDngdtqyzdgjhz() + { + return dngdtqyzdgjhz; + } + + public void setDngdtqyyzgjhz(Integer dngdtqyyzgjhz) + { + this.dngdtqyyzgjhz = dngdtqyyzgjhz; + } + + public Integer getDngdtqyyzgjhz() + { + return dngdtqyyzgjhz; + } + + public void setDngdtycqwgjhz(Integer dngdtycqwgjhz) + { + this.dngdtycqwgjhz = dngdtycqwgjhz; + } + + public Integer getDngdtycqwgjhz() + { + return dngdtycqwgjhz; + } + + public void setDngdtyczdgjhz(Integer dngdtyczdgjhz) + { + this.dngdtyczdgjhz = dngdtyczdgjhz; + } + + public Integer getDngdtyczdgjhz() + { + return dngdtyczdgjhz; + } + + public void setDngdtycyzgjhz(Integer dngdtycyzgjhz) + { + this.dngdtycyzgjhz = dngdtycyzgjhz; + } + + public Integer getDngdtycyzgjhz() + { + return dngdtycyzgjhz; + } + + public void setDngdtqwqwgjhz(Integer dngdtqwqwgjhz) + { + this.dngdtqwqwgjhz = dngdtqwqwgjhz; + } + + public Integer getDngdtqwqwgjhz() + { + return dngdtqwqwgjhz; + } + + public void setDngdtqwzdgjhz(Integer dngdtqwzdgjhz) + { + this.dngdtqwzdgjhz = dngdtqwzdgjhz; + } + + public Integer getDngdtqwzdgjhz() + { + return dngdtqwzdgjhz; + } + + public void setDngdtqwyzgjhz(Integer dngdtqwyzgjhz) + { + this.dngdtqwyzgjhz = dngdtqwyzgjhz; + } + + public Integer getDngdtqwyzgjhz() + { + return dngdtqwyzgjhz; + } + + public void setDngdtgwqwgjhz(Integer dngdtgwqwgjhz) + { + this.dngdtgwqwgjhz = dngdtgwqwgjhz; + } + + public Integer getDngdtgwqwgjhz() + { + return dngdtgwqwgjhz; + } + + public void setDngdtgwzdgjhz(Integer dngdtgwzdgjhz) + { + this.dngdtgwzdgjhz = dngdtgwzdgjhz; + } + + public Integer getDngdtgwzdgjhz() + { + return dngdtgwzdgjhz; + } + + public void setDngdtgwyzgjhz(Integer dngdtgwyzgjhz) + { + this.dngdtgwyzgjhz = dngdtgwyzgjhz; + } + + public Integer getDngdtgwyzgjhz() + { + return dngdtgwyzgjhz; + } + + public void setDngdtwcqwgjhz(Integer dngdtwcqwgjhz) + { + this.dngdtwcqwgjhz = dngdtwcqwgjhz; + } + + public Integer getDngdtwcqwgjhz() + { + return dngdtwcqwgjhz; + } + + public void setDngdtwczdgjhz(Integer dngdtwczdgjhz) + { + this.dngdtwczdgjhz = dngdtwczdgjhz; + } + + public Integer getDngdtwczdgjhz() + { + return dngdtwczdgjhz; + } + + public void setDngdtwcyzgjhz(Integer dngdtwcyzgjhz) + { + this.dngdtwcyzgjhz = dngdtwcyzgjhz; + } + + public Integer getDngdtwcyzgjhz() + { + return dngdtwcyzgjhz; + } + + public void setDtsocdqwgjhz(Integer dtsocdqwgjhz) + { + this.dtsocdqwgjhz = dtsocdqwgjhz; + } + + public Integer getDtsocdqwgjhz() + { + return dtsocdqwgjhz; + } + + public void setDtsocdzdgjhz(Integer dtsocdzdgjhz) + { + this.dtsocdzdgjhz = dtsocdzdgjhz; + } + + public Integer getDtsocdzdgjhz() + { + return dtsocdzdgjhz; + } + + public void setDtsocdyzgjhz(Integer dtsocdyzgjhz) + { + this.dtsocdyzgjhz = dtsocdyzgjhz; + } + + public Integer getDtsocdyzgjhz() + { + return dtsocdyzgjhz; + } + + public void setDtsocgqwgjhz(Integer dtsocgqwgjhz) + { + this.dtsocgqwgjhz = dtsocgqwgjhz; + } + + public Integer getDtsocgqwgjhz() + { + return dtsocgqwgjhz; + } + + public void setDtsocgzdgjhz(Integer dtsocgzdgjhz) + { + this.dtsocgzdgjhz = dtsocgzdgjhz; + } + + public Integer getDtsocgzdgjhz() + { + return dtsocgzdgjhz; + } + + public void setDtsocgyzgjhz(Integer dtsocgyzgjhz) + { + this.dtsocgyzgjhz = dtsocgyzgjhz; + } + + public Integer getDtsocgyzgjhz() + { + return dtsocgyzgjhz; + } + + public void setDtsohdqwgjhz(Integer dtsohdqwgjhz) + { + this.dtsohdqwgjhz = dtsohdqwgjhz; + } + + public Integer getDtsohdqwgjhz() + { + return dtsohdqwgjhz; + } + + public void setDtsohdzdgjhz(Integer dtsohdzdgjhz) + { + this.dtsohdzdgjhz = dtsohdzdgjhz; + } + + public Integer getDtsohdzdgjhz() + { + return dtsohdzdgjhz; + } + + public void setDtsohdyzgjhz(Integer dtsohdyzgjhz) + { + this.dtsohdyzgjhz = dtsohdyzgjhz; + } + + public Integer getDtsohdyzgjhz() + { + return dtsohdyzgjhz; + } + + public void setDtsohgqwgjhz(Integer dtsohgqwgjhz) + { + this.dtsohgqwgjhz = dtsohgqwgjhz; + } + + public Integer getDtsohgqwgjhz() + { + return dtsohgqwgjhz; + } + + public void setDtsohgzdgjhz(Integer dtsohgzdgjhz) + { + this.dtsohgzdgjhz = dtsohgzdgjhz; + } + + public Integer getDtsohgzdgjhz() + { + return dtsohgzdgjhz; + } + + public void setDtsohgyzgjhz(Integer dtsohgyzgjhz) + { + this.dtsohgyzgjhz = dtsohgyzgjhz; + } + + public Integer getDtsohgyzgjhz() + { + return dtsohgyzgjhz; + } + + public void setDngzkslhz(Integer dngzkslhz) + { + this.dngzkslhz = dngzkslhz; + } + + public Integer getDngzkslhz() + { + return dngzkslhz; + } + + public void setDngckslgjhz(Integer dngckslgjhz) + { + this.dngckslgjhz = dngckslgjhz; + } + + public Integer getDngckslgjhz() + { + return dngckslgjhz; + } + + public void setDngzdyyc(Integer dngzdyyc) + { + this.dngzdyyc = dngzdyyc; + } + + public Integer getDngzdyyc() + { + return dngzdyyc; + } + + public void setDnjcqdkyc(Integer dnjcqdkyc) + { + this.dnjcqdkyc = dnjcqdkyc; + } + + public Integer getDnjcqdkyc() + { + return dnjcqdkyc; + } + + public void setDnjcqbhyc(Integer dnjcqbhyc) + { + this.dnjcqbhyc = dnjcqbhyc; + } + + public Integer getDnjcqbhyc() + { + return dnjcqbhyc; + } + + public void setCdjz(Integer cdjz) + { + this.cdjz = cdjz; + } + + public Integer getCdjz() + { + return cdjz; + } + + public void setFdjz(Integer fdjz) + { + this.fdjz = fdjz; + } + + public Integer getFdjz() + { + return fdjz; + } + + public void setBmsxtgjhz(Integer bmsxtgjhz) + { + this.bmsxtgjhz = bmsxtgjhz; + } + + public Integer getBmsxtgjhz() + { + return bmsxtgjhz; + } + + public void setBmsxtgzhz(Integer bmsxtgzhz) + { + this.bmsxtgzhz = bmsxtgzhz; + } + + public Integer getBmsxtgzhz() + { + return bmsxtgzhz; + } + + public void setSrin0(Integer srin0) + { + this.srin0 = srin0; + } + + public Integer getSrin0() + { + return srin0; + } + + public void setSrin1(Integer srin1) + { + this.srin1 = srin1; + } + + public Integer getSrin1() + { + return srin1; + } + + public void setSrin2(Integer srin2) + { + this.srin2 = srin2; + } + + public Integer getSrin2() + { + return srin2; + } + + public void setSrin3(Integer srin3) + { + this.srin3 = srin3; + } + + public Integer getSrin3() + { + return srin3; + } + + public void setYl1(Integer yl1) + { + this.yl1 = yl1; + } + + public Integer getYl1() + { + return yl1; + } + + public void setYl2(Integer yl2) + { + this.yl2 = yl2; + } + + public Integer getYl2() + { + return yl2; + } + + public void setYl3(Integer yl3) + { + this.yl3 = yl3; + } + + public Integer getYl3() + { + return yl3; + } + + public void setYl4(Integer yl4) + { + this.yl4 = yl4; + } + + public Integer getYl4() + { + return yl4; + } + + public void setYl5(Integer yl5) + { + this.yl5 = yl5; + } + + public Integer getYl5() + { + return yl5; + } + + public void setYl6(Integer yl6) + { + this.yl6 = yl6; + } + + public Integer getYl6() + { + return yl6; + } + + public void setYl7(Integer yl7) + { + this.yl7 = yl7; + } + + public Integer getYl7() + { + return yl7; + } + + public void setYl8(Integer yl8) + { + this.yl8 = yl8; + } + + public Integer getYl8() + { + return yl8; + } + + public void setDngdzgwqwgjhz(Integer dngdzgwqwgjhz) + { + this.dngdzgwqwgjhz = dngdzgwqwgjhz; + } + + public Integer getDngdzgwqwgjhz() + { + return dngdzgwqwgjhz; + } + + public void setDngdzgwzdgjhz(Integer dngdzgwzdgjhz) + { + this.dngdzgwzdgjhz = dngdzgwzdgjhz; + } + + public Integer getDngdzgwzdgjhz() + { + return dngdzgwzdgjhz; + } + + public void setDngdzgwzzdgjhz(Integer dngdzgwzzdgjhz) + { + this.dngdzgwzzdgjhz = dngdzgwzzdgjhz; + } + + public Integer getDngdzgwzzdgjhz() + { + return dngdzgwzzdgjhz; + } + + public void setDnmkdygyqwgjhz(Integer dnmkdygyqwgjhz) + { + this.dnmkdygyqwgjhz = dnmkdygyqwgjhz; + } + + public Integer getDnmkdygyqwgjhz() + { + return dnmkdygyqwgjhz; + } + + public void setDnmkdygyzdgjhz(Integer dnmkdygyzdgjhz) + { + this.dnmkdygyzdgjhz = dnmkdygyzdgjhz; + } + + public Integer getDnmkdygyzdgjhz() + { + return dnmkdygyzdgjhz; + } + + public void setDnmkdygyyzgjhz(Integer dnmkdygyyzgjhz) + { + this.dnmkdygyyzgjhz = dnmkdygyyzgjhz; + } + + public Integer getDnmkdygyyzgjhz() + { + return dnmkdygyyzgjhz; + } + + public void setDnmkdyqyqwgjhz(Integer dnmkdyqyqwgjhz) + { + this.dnmkdyqyqwgjhz = dnmkdyqyqwgjhz; + } + + public Integer getDnmkdyqyqwgjhz() + { + return dnmkdyqyqwgjhz; + } + + public void setDnmkdyqyzdgjhz(Integer dnmkdyqyzdgjhz) + { + this.dnmkdyqyzdgjhz = dnmkdyqyzdgjhz; + } + + public Integer getDnmkdyqyzdgjhz() + { + return dnmkdyqyzdgjhz; + } + + public void setDnmkdyqyyzgjhz(Integer dnmkdyqyyzgjhz) + { + this.dnmkdyqyyzgjhz = dnmkdyqyyzgjhz; + } + + public Integer getDnmkdyqyyzgjhz() + { + return dnmkdyqyyzgjhz; + } + + public void setDycjsl(Integer dycjsl) + { + this.dycjsl = dycjsl; + } + + public Integer getDycjsl() + { + return dycjsl; + } + + public void setWdcjsl(Integer wdcjsl) + { + this.wdcjsl = wdcjsl; + } + + public Integer getWdcjsl() + { + return wdcjsl; + } + + public void setDidodi0(Integer didodi0) + { + this.didodi0 = didodi0; + } + + public Integer getDidodi0() + { + return didodi0; + } + + public void setDidodi1(Integer didodi1) + { + this.didodi1 = didodi1; + } + + public Integer getDidodi1() + { + return didodi1; + } + + public void setDidodi2(Integer didodi2) + { + this.didodi2 = didodi2; + } + + public Integer getDidodi2() + { + return didodi2; + } + + public void setDidodi3(Integer didodi3) + { + this.didodi3 = didodi3; + } + + public Integer getDidodi3() + { + return didodi3; + } + + public void setDidodi4(Integer didodi4) + { + this.didodi4 = didodi4; + } + + public Integer getDidodi4() + { + return didodi4; + } + + public void setDidodi5(Integer didodi5) + { + this.didodi5 = didodi5; + } + + public Integer getDidodi5() + { + return didodi5; + } + + public void setDidodi6(Integer didodi6) + { + this.didodi6 = didodi6; + } + + public Integer getDidodi6() + { + return didodi6; + } + + public void setDidodi7(Integer didodi7) + { + this.didodi7 = didodi7; + } + + public Integer getDidodi7() + { + return didodi7; + } + + public void setDidodi8(Integer didodi8) + { + this.didodi8 = didodi8; + } + + public Integer getDidodi8() + { + return didodi8; + } + + public void setDidodi9(Integer didodi9) + { + this.didodi9 = didodi9; + } + + public Integer getDidodi9() + { + return didodi9; + } + + public void setDidodi10(Integer didodi10) + { + this.didodi10 = didodi10; + } + + public Integer getDidodi10() + { + return didodi10; + } + + public void setDidodi11(Integer didodi11) + { + this.didodi11 = didodi11; + } + + public Integer getDidodi11() + { + return didodi11; + } + + public void setDidodi12(Integer didodi12) + { + this.didodi12 = didodi12; + } + + public Integer getDidodi12() + { + return didodi12; + } + + public void setKttxsl(Integer kttxsl) + { + this.kttxsl = kttxsl; + } + + public Integer getKttxsl() + { + return kttxsl; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataTimestamp", getDataTimestamp()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("bmsgzzt", getBmsgzzt()) + .append("jczt", getJczt()) + .append("jfzt", getJfzt()) + .append("dngzddyqyqdgjhz", getDngzddyqyqdgjhz()) + .append("dngzddyqyzdgjhz", getDngzddyqyzdgjhz()) + .append("dngzddyqyzzdgjhz", getDngzddyqyzzdgjhz()) + .append("dngzddygyqdgjhz", getDngzddygyqdgjhz()) + .append("dngzddygyzdgjhz", getDngzddygyzdgjhz()) + .append("dngzddygyzzdgjhz", getDngzddygyzzdgjhz()) + .append("dngzdglqdgjhz", getDngzdglqdgjhz()) + .append("dngzdglzdgjhz", getDngzdglzdgjhz()) + .append("dngzdglzzdgjhz", getDngzdglzzdgjhz()) + .append("dngzjydzdqdgjhz", getDngzjydzdqdgjhz()) + .append("dngzjydzdzdgjhz", getDngzjydzdzdgjhz()) + .append("dngzjydzdzzdgjhz", getDngzjydzdzzdgjhz()) + .append("dngzmkqwdqdgjhz", getDngzmkqwdqdgjhz()) + .append("dngzmkqwdzdgjhz", getDngzmkqwdzdgjhz()) + .append("dngzmkqwdzzdgjhz", getDngzmkqwdzzdgjhz()) + .append("dngzmkgwdqdgjhz", getDngzmkgwdqdgjhz()) + .append("dngzmkgwdzdgjhz", getDngzmkgwdzdgjhz()) + .append("dngzmkgwdzzdgjhz", getDngzmkgwdzzdgjhz()) + .append("dngdtgyqwgjhz", getDngdtgyqwgjhz()) + .append("dngdtgyzdgjhz", getDngdtgyzdgjhz()) + .append("dngdtgyyzgjhz", getDngdtgyyzgjhz()) + .append("dngdtqyqwgjhz", getDngdtqyqwgjhz()) + .append("dngdtqyzdgjhz", getDngdtqyzdgjhz()) + .append("dngdtqyyzgjhz", getDngdtqyyzgjhz()) + .append("dngdtycqwgjhz", getDngdtycqwgjhz()) + .append("dngdtyczdgjhz", getDngdtyczdgjhz()) + .append("dngdtycyzgjhz", getDngdtycyzgjhz()) + .append("dngdtqwqwgjhz", getDngdtqwqwgjhz()) + .append("dngdtqwzdgjhz", getDngdtqwzdgjhz()) + .append("dngdtqwyzgjhz", getDngdtqwyzgjhz()) + .append("dngdtgwqwgjhz", getDngdtgwqwgjhz()) + .append("dngdtgwzdgjhz", getDngdtgwzdgjhz()) + .append("dngdtgwyzgjhz", getDngdtgwyzgjhz()) + .append("dngdtwcqwgjhz", getDngdtwcqwgjhz()) + .append("dngdtwczdgjhz", getDngdtwczdgjhz()) + .append("dngdtwcyzgjhz", getDngdtwcyzgjhz()) + .append("dtsocdqwgjhz", getDtsocdqwgjhz()) + .append("dtsocdzdgjhz", getDtsocdzdgjhz()) + .append("dtsocdyzgjhz", getDtsocdyzgjhz()) + .append("dtsocgqwgjhz", getDtsocgqwgjhz()) + .append("dtsocgzdgjhz", getDtsocgzdgjhz()) + .append("dtsocgyzgjhz", getDtsocgyzgjhz()) + .append("dtsohdqwgjhz", getDtsohdqwgjhz()) + .append("dtsohdzdgjhz", getDtsohdzdgjhz()) + .append("dtsohdyzgjhz", getDtsohdyzgjhz()) + .append("dtsohgqwgjhz", getDtsohgqwgjhz()) + .append("dtsohgzdgjhz", getDtsohgzdgjhz()) + .append("dtsohgyzgjhz", getDtsohgyzgjhz()) + .append("dngzkslhz", getDngzkslhz()) + .append("dngckslgjhz", getDngckslgjhz()) + .append("dngzdyyc", getDngzdyyc()) + .append("dnjcqdkyc", getDnjcqdkyc()) + .append("dnjcqbhyc", getDnjcqbhyc()) + .append("cdjz", getCdjz()) + .append("fdjz", getFdjz()) + .append("bmsxtgjhz", getBmsxtgjhz()) + .append("bmsxtgzhz", getBmsxtgzhz()) + .append("srin0", getSrin0()) + .append("srin1", getSrin1()) + .append("srin2", getSrin2()) + .append("srin3", getSrin3()) + .append("yl1", getYl1()) + .append("yl2", getYl2()) + .append("yl3", getYl3()) + .append("yl4", getYl4()) + .append("yl5", getYl5()) + .append("yl6", getYl6()) + .append("yl7", getYl7()) + .append("yl8", getYl8()) + .append("dngdzgwqwgjhz", getDngdzgwqwgjhz()) + .append("dngdzgwzdgjhz", getDngdzgwzdgjhz()) + .append("dngdzgwzzdgjhz", getDngdzgwzzdgjhz()) + .append("dnmkdygyqwgjhz", getDnmkdygyqwgjhz()) + .append("dnmkdygyzdgjhz", getDnmkdygyzdgjhz()) + .append("dnmkdygyyzgjhz", getDnmkdygyyzgjhz()) + .append("dnmkdyqyqwgjhz", getDnmkdyqyqwgjhz()) + .append("dnmkdyqyzdgjhz", getDnmkdyqyzdgjhz()) + .append("dnmkdyqyyzgjhz", getDnmkdyqyyzgjhz()) + .append("dycjsl", getDycjsl()) + .append("wdcjsl", getWdcjsl()) + .append("didodi0", getDidodi0()) + .append("didodi1", getDidodi1()) + .append("didodi2", getDidodi2()) + .append("didodi3", getDidodi3()) + .append("didodi4", getDidodi4()) + .append("didodi5", getDidodi5()) + .append("didodi6", getDidodi6()) + .append("didodi7", getDidodi7()) + .append("didodi8", getDidodi8()) + .append("didodi9", getDidodi9()) + .append("didodi10", getDidodi10()) + .append("didodi11", getDidodi11()) + .append("didodi12", getDidodi12()) + .append("kttxsl", getKttxsl()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategy.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategy.java new file mode 100644 index 0000000..1eaea3d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategy.java @@ -0,0 +1,114 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 策略对象 ems_strategy + * + * @author xzzn + * @date 2025-07-10 + */ +public class EmsStrategy extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 策略名称,如“削峰填谷” */ + @Excel(name = "策略名称,如“削峰填谷”") + private String strategyName; + + /** 策略类型:1 - 主策略;2 - 辅助策略 */ + @Excel(name = "策略类型:1 - 主策略;2 - 辅助策略") + private Long strategyType; + + /** 策略状态:0-未启用 1-已运行 2-已暂停 3-禁用 4-删除 */ + @Excel(name = "策略状态:0-未启用 1-已运行 2-已暂停 3-禁用 4-删除") + private String status; + + /** 描述 */ + @Excel(name = "描述") + private String description; + + /** 主策略id */ + @Excel(name = "主策略id") + private Long mainStrategy; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyName(String strategyName) + { + this.strategyName = strategyName; + } + + public String getStrategyName() + { + return strategyName; + } + + public void setStrategyType(Long strategyType) + { + this.strategyType = strategyType; + } + + public Long getStrategyType() + { + return strategyType; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getDescription() + { + return description; + } + + public void setMainStrategy(Long mainStrategy) + { + this.mainStrategy = mainStrategy; + } + + public Long getMainStrategy() + { + return mainStrategy; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("strategyName", getStrategyName()) + .append("strategyType", getStrategyType()) + .append("status", getStatus()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("description", getDescription()) + .append("mainStrategy", getMainStrategy()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyCurve.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyCurve.java new file mode 100644 index 0000000..fbd89f5 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyCurve.java @@ -0,0 +1,175 @@ +package com.xzzn.ems.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 策曲线对象 ems_strategy_curve + * + * @author xzzn + * @date 2025-07-11 + */ +public class EmsStrategyCurve extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 关联的策略ID */ + @Excel(name = "关联的策略ID") + private Long strategyId; + + /** 任务编号 */ + @Excel(name = "任务编号") + private Long taskNumber; + + /** 开始日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date startDate; + + /** 结束日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date endDate; + + /** 功率数据,可以是JSON格式存储曲线数据 */ + @Excel(name = "功率数据,可以是JSON格式存储曲线数据") + private String powerData; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 模板id */ + @Excel(name = "模板id") + private String templateId; + + /** 月份,1-12 */ + @Excel(name = "月份,1-12") + private Long month; + + /** 是否删除 0-已删除 1-未删除 */ + @Excel(name = "是否删除 0-已删除 1-未删除") + private Long isDelete; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setTaskNumber(Long taskNumber) + { + this.taskNumber = taskNumber; + } + + public Long getTaskNumber() + { + return taskNumber; + } + + public void setStartDate(Date startDate) + { + this.startDate = startDate; + } + + public Date getStartDate() + { + return startDate; + } + + public void setEndDate(Date endDate) + { + this.endDate = endDate; + } + + public Date getEndDate() + { + return endDate; + } + + public void setPowerData(String powerData) + { + this.powerData = powerData; + } + + public String getPowerData() + { + return powerData; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public Long getMonth() { + return month; + } + + public void setMonth(Long month) { + this.month = month; + } + + public Long getIsDelete() { + return isDelete; + } + + public void setIsDelete(Long isDelete) { + this.isDelete = isDelete; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("strategyId", getStrategyId()) + .append("taskNumber", getTaskNumber()) + .append("startDate", getStartDate()) + .append("endDate", getEndDate()) + .append("powerData", getPowerData()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("templateId", getTemplateId()) + .append("month", getMonth()) + .append("isDelete", getIsDelete()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyLog.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyLog.java new file mode 100644 index 0000000..0c7c0a2 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyLog.java @@ -0,0 +1,210 @@ +package com.xzzn.ems.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 策略运行日志对象 ems_strategy_log + * + * @author xzzn + * @date 2025-12-26 + */ +public class EmsStrategyLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 策略ID */ + @Excel(name = "策略ID") + private Long strategyId; + + /** 模版id */ + @Excel(name = "模版id") + private String templateId; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + /** 开始时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "开始时间", width = 30, dateFormat = "HH:mm") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "结束时间", width = 30, dateFormat = "HH:mm") + private Date endTime; + + /** 功率 (kW) */ + @Excel(name = "功率 (kW)") + private BigDecimal chargeDischargePower; + + /** 充电状态,如“1-充电”、“2-待机”、“3-放电” */ + @Excel(name = "充电状态,如“1-充电”、“2-待机”、“3-放电”") + private String chargeStatus; + + /** 执行时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "执行时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date executionDate; + + /** 防逆流, 1-是、0-否 */ + @Excel(name = "防逆流, 1-是、0-否") + private Integer antiReverse; + + /** PCS降功率类型 */ + @Excel(name = "PCS降功率类型,0-降低功率、1-增加功率") + private Integer powerDownType; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setTemplateId(String templateId) + { + this.templateId = templateId; + } + + public String getTemplateId() + { + return templateId; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStartTime() + { + return startTime; + } + + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getEndTime() + { + return endTime; + } + + public void setChargeDischargePower(BigDecimal chargeDischargePower) + { + this.chargeDischargePower = chargeDischargePower; + } + + public BigDecimal getChargeDischargePower() + { + return chargeDischargePower; + } + + public void setChargeStatus(String chargeStatus) + { + this.chargeStatus = chargeStatus; + } + + public String getChargeStatus() + { + return chargeStatus; + } + + public void setExecutionDate(Date executionDate) + { + this.executionDate = executionDate; + } + + public Date getExecutionDate() + { + return executionDate; + } + + public Integer getAntiReverse() { + return antiReverse; + } + + public void setAntiReverse(Integer antiReverse) { + this.antiReverse = antiReverse; + } + + public Integer getPowerDownType() { + return powerDownType; + } + + public void setPowerDownType(Integer powerDownType) { + this.powerDownType = powerDownType; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("strategyId", getStrategyId()) + .append("templateId", getTemplateId()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("antiReverse", getAntiReverse()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("chargeDischargePower", getChargeDischargePower()) + .append("chargeStatus", getChargeStatus()) + .append("executionDate", getExecutionDate()) + .append("antiReverse", getAntiReverse()) + .append("powerDownType", getPowerDownType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyRunning.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyRunning.java new file mode 100644 index 0000000..3b4e26c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyRunning.java @@ -0,0 +1,115 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 策略运行对象 ems_strategy_running + * + * @author xzzn + * @date 2025-07-10 + */ +public class EmsStrategyRunning extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 主要策略 */ + @Excel(name = "主要策略") + private Long mainStrategyId; + + /** 辅助策略 */ + @Excel(name = "辅助策略") + private Long auxiliaryStrategyId; + + /** 策略状态:0-未启用 1-已运行 2-已暂停 3-禁用 4-删除 */ + @Excel(name = "策略状态:0-未启用 1-已运行 2-已暂停 3-禁用 4-删除") + private String status; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setMainStrategyId(Long mainStrategyId) + { + this.mainStrategyId = mainStrategyId; + } + + public Long getMainStrategyId() + { + return mainStrategyId; + } + + public void setAuxiliaryStrategyId(Long auxiliaryStrategyId) + { + this.auxiliaryStrategyId = auxiliaryStrategyId; + } + + public Long getAuxiliaryStrategyId() + { + return auxiliaryStrategyId; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mainStrategyId", getMainStrategyId()) + .append("auxiliaryStrategyId", getAuxiliaryStrategyId()) + .append("status", getStatus()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTemp.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTemp.java new file mode 100644 index 0000000..8b05e5b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTemp.java @@ -0,0 +1,212 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 模板对象 ems_strategy_temp + * + * @author xzzn + * @date 2025-07-13 + */ +public class EmsStrategyTemp extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 关联的策略ID */ + @Excel(name = "关联的策略ID") + private Long strategyId; + + /** 模板名称,如“模板一” */ + @Excel(name = "模板名称,如“模板一”") + private String templateName; + + /** SDC限制 (%) 1 = 开,0 = 关 */ + @Excel(name = "SDC限制 (%) 1 = 开,0 = 关") + private Integer sdcLimit; + + /** SDC下限 (%) */ + @Excel(name = "SDC下限 (%)") + private BigDecimal sdcDown; + + /** SDC上限 (%) */ + @Excel(name = "SDC上限 (%)") + private BigDecimal sdcUp; + + /** 开始时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "开始时间", width = 30, dateFormat = "HH:mm") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "结束时间", width = 30, dateFormat = "HH:mm") + private Date endTime; + + /** 充放功率 (kW) */ + @Excel(name = "充放功率 (kW)") + private BigDecimal chargeDischargePower; + + /** 充电状态,如“1-充电”、“2-待机” */ + @Excel(name = "充电状态,如“1-充电”、“2-待机”") + private String chargeStatus; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 模板id */ + @Excel(name = "模板id") + private String templateId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setTemplateName(String templateName) + { + this.templateName = templateName; + } + + public String getTemplateName() + { + return templateName; + } + + public void setSdcLimit(Integer sdcLimit) + { + this.sdcLimit = sdcLimit; + } + + public Integer getSdcLimit() + { + return sdcLimit; + } + + public void setSdcDown(BigDecimal sdcDown) + { + this.sdcDown = sdcDown; + } + + public BigDecimal getSdcDown() + { + return sdcDown; + } + + public void setSdcUp(BigDecimal sdcUp) + { + this.sdcUp = sdcUp; + } + + public BigDecimal getSdcUp() + { + return sdcUp; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStartTime() + { + return startTime; + } + + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getEndTime() + { + return endTime; + } + + public void setChargeDischargePower(BigDecimal chargeDischargePower) + { + this.chargeDischargePower = chargeDischargePower; + } + + public BigDecimal getChargeDischargePower() + { + return chargeDischargePower; + } + + public void setChargeStatus(String chargeStatus) + { + this.chargeStatus = chargeStatus; + } + + public String getChargeStatus() + { + return chargeStatus; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setTemplateId(String templateId) + { + this.templateId = templateId; + } + + public String getTemplateId() + { + return templateId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("strategyId", getStrategyId()) + .append("templateName", getTemplateName()) + .append("sdcLimit", getSdcLimit()) + .append("sdcDown", getSdcDown()) + .append("sdcUp", getSdcUp()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("chargeDischargePower", getChargeDischargePower()) + .append("chargeStatus", getChargeStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("templateId", getTemplateId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTempTimeConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTempTimeConfig.java new file mode 100644 index 0000000..1cf9f9f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTempTimeConfig.java @@ -0,0 +1,122 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 模板配置对象 ems_strategy_temp_time_config + * + * @author xzzn + * @date 2025-07-12 + */ +public class EmsStrategyTempTimeConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 开始时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "开始时间", width = 30, dateFormat = "HH:mm") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "HH:mm") + @Excel(name = "结束时间", width = 30, dateFormat = "HH:mm") + private Date endTime; + + /** 充放功率 (kW) */ + @Excel(name = "充放功率 (kW)") + private BigDecimal chargeDischargePower; + + /** 充电状态,如“1-充电”、“2-待机” */ + @Excel(name = "充电状态,如“1-充电”、“2-待机”") + private String chargeStatus; + + /** 模板id */ + @Excel(name = "模板id") + private String templateId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStartTime() + { + return startTime; + } + + public void setEndTime(Date endTime) + { + this.endTime = endTime; + } + + public Date getEndTime() + { + return endTime; + } + + public void setChargeDischargePower(BigDecimal chargeDischargePower) + { + this.chargeDischargePower = chargeDischargePower; + } + + public BigDecimal getChargeDischargePower() + { + return chargeDischargePower; + } + + public void setChargeStatus(String chargeStatus) + { + this.chargeStatus = chargeStatus; + } + + public String getChargeStatus() + { + return chargeStatus; + } + + public void setTemplateId(String templateId) + { + this.templateId = templateId; + } + + public String getTemplateId() + { + return templateId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("chargeDischargePower", getChargeDischargePower()) + .append("chargeStatus", getChargeStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("templateId", getTemplateId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTimeConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTimeConfig.java new file mode 100644 index 0000000..e6a9ff8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsStrategyTimeConfig.java @@ -0,0 +1,130 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 时间配置对象 ems_strategy_time_config + * + * @author xzzn + * @date 2025-07-12 + */ +public class EmsStrategyTimeConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** */ + private Long id; + + /** 关联的策略ID */ + @Excel(name = "关联的策略ID") + private Long strategyId; + + /** 月份,1-12 */ + @Excel(name = "月份,1-12") + private Long month; + + /** 充放电模式,如“两充两放” */ + @Excel(name = "充放电模式,如“两充两放”") + private String chargeDischargeMode; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 模版id */ + @Excel(name = "模版id") + private String templateId; + + /** 是否下发 0-已下发 1-未下发 */ + @Excel(name = "是否下发 0-已下发 1-未下发") + private int isPost; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setMonth(Long month) + { + this.month = month; + } + + public Long getMonth() + { + return month; + } + + public void setChargeDischargeMode(String chargeDischargeMode) + { + this.chargeDischargeMode = chargeDischargeMode; + } + + public String getChargeDischargeMode() + { + return chargeDischargeMode; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setTemplateId(String templateId) + { + this.templateId = templateId; + } + + public String getTemplateId() + { + return templateId; + } + + public int getIsPost() { + return isPost; + } + + public void setIsPost(int isPost) { + this.isPost = isPost; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("strategyId", getStrategyId()) + .append("month", getMonth()) + .append("chargeDischargeMode", getChargeDischargeMode()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("templateId", getTemplateId()) + .append("isPost", getIsPost()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsTicket.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsTicket.java index bcd31ce..fd5a8b2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsTicket.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsTicket.java @@ -9,15 +9,15 @@ import com.xzzn.common.annotation.Excel; /** * 工单主对象 ems_ticket - * + * * @author xzzn - * @date 2025-06-26 + * @date 2025-07-15 */ public class EmsTicket extends BaseEntity { private static final long serialVersionUID = 1L; - /** $column.columnComment */ + /** */ private String id; /** 工单号(规则:T+日期+6位随机) */ @@ -26,7 +26,7 @@ public class EmsTicket extends BaseEntity /** 提交用户ID */ @Excel(name = "提交用户ID") - private String userId; + private Long userId; /** 工单标题 */ @Excel(name = "工单标题") @@ -44,121 +44,152 @@ public class EmsTicket extends BaseEntity @Excel(name = "1待处理 2处理中 3已完成") private Long status; + /** 期望完成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "期望完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date expectedCompleteTime; + /** 完成时间 */ - @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date completeTime; /** 处理人ID */ @Excel(name = "处理人ID") private Long workUserId; - public void setId(String id) + /** 0-已废弃 1-有效 */ + @Excel(name = "0-已废弃 1-有效") + private Long isDelete; + + public void setId(String id) { this.id = id; } - public String getId() + public String getId() { return id; } - public void setTicketNo(String ticketNo) + public void setTicketNo(String ticketNo) { this.ticketNo = ticketNo; } - public String getTicketNo() + public String getTicketNo() { return ticketNo; } - public void setUserId(String userId) + public void setUserId(Long userId) { this.userId = userId; } - public String getUserId() + public Long getUserId() { return userId; } - public void setTitle(String title) + public void setTitle(String title) { this.title = title; } - public String getTitle() + public String getTitle() { return title; } - public void setContent(String content) + public void setContent(String content) { this.content = content; } - public String getContent() + public String getContent() { return content; } - public void setImages(String images) + public void setImages(String images) { this.images = images; } - public String getImages() + public String getImages() { return images; } - public void setStatus(Long status) + public void setStatus(Long status) { this.status = status; } - public Long getStatus() + public Long getStatus() { return status; } - public void setCompleteTime(Date completeTime) + public void setExpectedCompleteTime(Date expectedCompleteTime) + { + this.expectedCompleteTime = expectedCompleteTime; + } + + public Date getExpectedCompleteTime() + { + return expectedCompleteTime; + } + + public void setCompleteTime(Date completeTime) { this.completeTime = completeTime; } - public Date getCompleteTime() + public Date getCompleteTime() { return completeTime; } - public void setWorkUserId(Long workUserId) + public void setWorkUserId(Long workUserId) { this.workUserId = workUserId; } - public Long getWorkUserId() + public Long getWorkUserId() { return workUserId; } + public void setIsDelete(Long isDelete) + { + this.isDelete = isDelete; + } + + public Long getIsDelete() + { + return isDelete; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("ticketNo", getTicketNo()) - .append("userId", getUserId()) - .append("title", getTitle()) - .append("content", getContent()) - .append("images", getImages()) - .append("status", getStatus()) - .append("createTime", getCreateTime()) - .append("completeTime", getCompleteTime()) - .append("createBy", getCreateBy()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("workUserId", getWorkUserId()) - .toString(); + .append("id", getId()) + .append("ticketNo", getTicketNo()) + .append("userId", getUserId()) + .append("title", getTitle()) + .append("content", getContent()) + .append("images", getImages()) + .append("status", getStatus()) + .append("expectedCompleteTime", getExpectedCompleteTime()) + .append("completeTime", getCompleteTime()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("workUserId", getWorkUserId()) + .append("isDelete", getIsDelete()) + .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsXfData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsXfData.java new file mode 100644 index 0000000..0d784aa --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsXfData.java @@ -0,0 +1,151 @@ +package com.xzzn.ems.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * 消防数据对象 ems_xf_data + * + * @author xzzn + * @date 2025-10-21 + */ +public class EmsXfData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 数据采集时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "数据采集时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 主电源备用电池状态 */ + @Excel(name = "主电源备用电池状态") + private BigDecimal dczt; + + /** 手自动状态延时状态 */ + @Excel(name = "手自动状态延时状态") + private BigDecimal yszt; + + /** 启动喷洒气体喷洒状态 */ + @Excel(name = "启动喷洒气体喷洒状态") + private BigDecimal pszt; + + /** 压力开关状态电磁阀状态 */ + @Excel(name = "压力开关状态电磁阀状态") + private BigDecimal dcfzt; + + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + + /** 设备唯一标识符 */ + @Excel(name = "设备唯一标识符") + private String deviceId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setDataTimestamp(Date dataTimestamp) + { + this.dataTimestamp = dataTimestamp; + } + + public Date getDataTimestamp() + { + return dataTimestamp; + } + + public void setDczt(BigDecimal dczt) + { + this.dczt = dczt; + } + + public BigDecimal getDczt() + { + return dczt; + } + + public void setYszt(BigDecimal yszt) + { + this.yszt = yszt; + } + + public BigDecimal getYszt() + { + return yszt; + } + + public void setPszt(BigDecimal pszt) + { + this.pszt = pszt; + } + + public BigDecimal getPszt() + { + return pszt; + } + + public void setDcfzt(BigDecimal dcfzt) + { + this.dcfzt = dcfzt; + } + + public BigDecimal getDcfzt() + { + return dcfzt; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dataTimestamp", getDataTimestamp()) + .append("dczt", getDczt()) + .append("yszt", getYszt()) + .append("pszt", getPszt()) + .append("dcfzt", getDcfzt()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("siteId", getSiteId()) + .append("deviceId", getDeviceId()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/MqttSyncLog.java b/ems-system/src/main/java/com/xzzn/ems/domain/MqttSyncLog.java new file mode 100644 index 0000000..a2b72aa --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/MqttSyncLog.java @@ -0,0 +1,173 @@ +package com.xzzn.ems.domain; + +import com.xzzn.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.xzzn.common.annotation.Excel; + +/** + * MQTT云上本地同步日志对象 mqtt_sync_log + * + * @author xzzn + * @date 2025-11-12 + */ +public class MqttSyncLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 同步消息唯一标识(与消息中的syncId一致) */ + @Excel(name = "同步消息唯一标识", readConverterExp = "与=消息中的syncId一致") + private String syncId; + + /** MQTT主题 */ + @Excel(name = "MQTT主题") + private String topic; + + /** 操作类型:INSERT/UPDATE/DELETE */ + @Excel(name = "操作类型:INSERT/UPDATE/DELETE") + private String operateType; + + /** 涉及的表名 */ + @Excel(name = "涉及的表名") + private String tableName; + + /** 同步数据内容(JSON格式) */ + @Excel(name = "同步数据内容", readConverterExp = "J=SON格式") + private String content; + + /** 处理状态:SUCCESS/FAIL */ + @Excel(name = "处理状态:SUCCESS/FAIL") + private String status; + + /** 失败原因(status=FAIL时填写) */ + @Excel(name = "失败原因", readConverterExp = "s=tatus=FAIL时填写") + private String errorMsg; + + /** 同步对象 */ + @Excel(name = "同步对象") + private String syncObject; + + /** 同步目标 */ + @Excel(name = "同步目标") + private String target; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setSyncId(String syncId) + { + this.syncId = syncId; + } + + public String getSyncId() + { + return syncId; + } + + public void setTopic(String topic) + { + this.topic = topic; + } + + public String getTopic() + { + return topic; + } + + public void setOperateType(String operateType) + { + this.operateType = operateType; + } + + public String getOperateType() + { + return operateType; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableName() + { + return tableName; + } + + public void setContent(String content) + { + this.content = content; + } + + public String getContent() + { + return content; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setSyncObject(String syncObject) + { + this.syncObject = syncObject; + } + + public String getSyncObject() + { + return syncObject; + } + + public void setTarget(String target) + { + this.target = target; + } + + public String getTarget() + { + return target; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("syncId", getSyncId()) + .append("topic", getTopic()) + .append("operateType", getOperateType()) + .append("tableName", getTableName()) + .append("content", getContent()) + .append("status", getStatus()) + .append("errorMsg", getErrorMsg()) + .append("syncObject", getSyncObject()) + .append("target", getTarget()) + .append("createTime", getCreateTime()) + .toString(); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmGradeList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmGradeList.java index 50e9bd0..8378a40 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmGradeList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmGradeList.java @@ -1,5 +1,7 @@ package com.xzzn.ems.domain.vo; +import java.math.BigDecimal; + /** * 首页看板数据概览-告警等级分布 */ @@ -7,39 +9,39 @@ public class AlarmGradeList { /** * 告警等级 */ - private String grade; + private String level; /** * 数据一 */ - private int num1; + private int dataNum; /** - * 数据三 + * 数据占比 */ - private int num2; + private BigDecimal percent; - public String getGrade() { - return grade; + public String getLevel() { + return level; } - public void setGrade(String grade) { - this.grade = grade; + public void setLevel(String level) { + this.level = level; } - public int getNum1() { - return num1; + public int getDataNum() { + return dataNum; } - public void setNum1(int num1) { - this.num1 = num1; + public void setDataNum(int dataNum) { + this.dataNum = dataNum; } - public int getNum2() { - return num2; + public BigDecimal getPercent() { + return percent; } - public void setNum2(int num2) { - this.num2 = num2; + public void setPercent(BigDecimal percent) { + this.percent = percent; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListRequestVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListRequestVo.java new file mode 100644 index 0000000..b334c00 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListRequestVo.java @@ -0,0 +1,87 @@ +package com.xzzn.ems.domain.vo; + + +import java.util.Date; + +/** + * 单站监控-故障告警请求 + * + */ +public class AlarmRecordListRequestVo { + /** 站点id */ + private String siteId; + + /** 设备类型 */ + private String deviceType; + + /** 告警等级 */ + private String alarmLevel; + + /** 告警发生时间 */ + private String alarmStartTime; + + /** 告警结束时间 */ + private String alarmEndTime; + + /** 设备id */ + private String deviceId; + + /** 告警状态 */ + private String status; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmStartTime() { + return alarmStartTime; + } + + public void setAlarmStartTime(String alarmStartTime) { + this.alarmStartTime = alarmStartTime; + } + + public String getAlarmEndTime() { + return alarmEndTime; + } + + public void setAlarmEndTime(String alarmEndTime) { + this.alarmEndTime = alarmEndTime; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListResponseVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListResponseVo.java new file mode 100644 index 0000000..6aa4203 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AlarmRecordListResponseVo.java @@ -0,0 +1,100 @@ +package com.xzzn.ems.domain.vo; + + +import com.xzzn.common.annotation.Excel; + +import java.util.Date; + +/** + * 单站监控-故障告警返回 + * + */ +public class AlarmRecordListResponseVo { + /** 设备名称 */ + private String deviceName; + + /** 告警等级 */ + private String alarmLevel; + + /** 告警内容 */ + private String alarmContent; + + /** 告警发生时间 */ + private Date alarmStartTime; + + /** 告警结束时间 */ + private Date alarmEndTime; + + /** 状态 */ + private String status; + + /** 工单号 */ + private String ticketNo; + + /** 告警唯一标识 */ + private String id; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getAlarmLevel() { + return alarmLevel; + } + + public void setAlarmLevel(String alarmLevel) { + this.alarmLevel = alarmLevel; + } + + public String getAlarmContent() { + return alarmContent; + } + + public void setAlarmContent(String alarmContent) { + this.alarmContent = alarmContent; + } + + public Date getAlarmStartTime() { + return alarmStartTime; + } + + public void setAlarmStartTime(Date alarmStartTime) { + this.alarmStartTime = alarmStartTime; + } + + public Date getAlarmEndTime() { + return alarmEndTime; + } + + public void setAlarmEndTime(Date alarmEndTime) { + this.alarmEndTime = alarmEndTime; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTicketNo() { + return ticketNo; + } + + public void setTicketNo(String ticketNo) { + this.ticketNo = ticketNo; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataResponse.java new file mode 100644 index 0000000..7c1eb87 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataResponse.java @@ -0,0 +1,29 @@ +package com.xzzn.ems.domain.vo; + +/** + * 电表数据 + */ +public class AmmeterDataResponse { + + /** 总表信息 */ + private AmmeterDataVo ammeterLoadData; + + /** 储能表信息 */ + private AmmeterMeteDataVo ammeterMeteData; + + public AmmeterDataVo getAmmeterLoadData() { + return ammeterLoadData; + } + + public void setAmmeterLoadDataVoList(AmmeterDataVo ammeterLoadData) { + this.ammeterLoadData = ammeterLoadData; + } + + public AmmeterMeteDataVo getAmmeterMeteData() { + return ammeterMeteData; + } + + public void setAmmeterMeteDataVoList(AmmeterMeteDataVo ammeterMeteData) { + this.ammeterMeteData = ammeterMeteData; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataVo.java new file mode 100644 index 0000000..d4ea0ff --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterDataVo.java @@ -0,0 +1,161 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 电表数据 + */ +public class AmmeterDataVo { + + /** 电表名称 */ + private String deviceName; + + /** 设备id */ + private String deviceId; + + /** 通信状态 */ + private String emsCommunicationStatus; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 表数据信息 */ + private List loadDataDetailInfo; + + // 正向有功电能 + private BigDecimal forwardActive; + // 反向有功电能 + private BigDecimal reverseActive; + // 正向无功电能 + private BigDecimal forwardReactive; + // 反向无功电能 + private BigDecimal reverseReactive; + // 有功功率 + private BigDecimal activePower; + // 无功功率 + private BigDecimal reactivePower; + // 有功电能 + private BigDecimal activeEnergy; + // 无功电能 + private BigDecimal reactiveEnergy; + + /** 报警个数 */ + private int alarmNum; + + public BigDecimal getActiveEnergy() { + return activeEnergy; + } + + public void setActiveEnergy(BigDecimal activeEnergy) { + this.activeEnergy = activeEnergy; + } + + public BigDecimal getReactiveEnergy() { + return reactiveEnergy; + } + + public void setReactiveEnergy(BigDecimal reactiveEnergy) { + this.reactiveEnergy = reactiveEnergy; + } + + public BigDecimal getForwardActive() { + return forwardActive; + } + + public void setForwardActive(BigDecimal forwardActive) { + this.forwardActive = forwardActive; + } + + public BigDecimal getReverseActive() { + return reverseActive; + } + + public void setReverseActive(BigDecimal reverseActive) { + this.reverseActive = reverseActive; + } + + public BigDecimal getForwardReactive() { + return forwardReactive; + } + + public void setForwardReactive(BigDecimal forwardReactive) { + this.forwardReactive = forwardReactive; + } + + public BigDecimal getReverseReactive() { + return reverseReactive; + } + + public void setReverseReactive(BigDecimal reverseReactive) { + this.reverseReactive = reverseReactive; + } + + public BigDecimal getActivePower() { + return activePower; + } + + public void setActivePower(BigDecimal activePower) { + this.activePower = activePower; + } + + public BigDecimal getReactivePower() { + return reactivePower; + } + + public void setReactivePower(BigDecimal reactivePower) { + this.reactivePower = reactivePower; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getEmsCommunicationStatus() { + return emsCommunicationStatus; + } + + public void setEmsCommunicationStatus(String emsCommunicationStatus) { + this.emsCommunicationStatus = emsCommunicationStatus; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public List getLoadDataDetailInfo() { + return loadDataDetailInfo; + } + + public void setLoadDataDetailInfo(List loadDataDetailInfo) { + this.loadDataDetailInfo = loadDataDetailInfo; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterMeteDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterMeteDataVo.java new file mode 100644 index 0000000..6d29576 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterMeteDataVo.java @@ -0,0 +1,66 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; +import java.util.List; + +/** + * 电表-总表数据 + */ +public class AmmeterMeteDataVo { + + /** 电表名称 */ + private String deviceName; + /** 设备id */ + private String deviceId; + /** 通信状态 */ + private String emsCommunicationStatus; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 储能表数据信息 */ + private List meteDataDetailInfo; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getEmsCommunicationStatus() { + return emsCommunicationStatus; + } + + public void setEmsCommunicationStatus(String emsCommunicationStatus) { + this.emsCommunicationStatus = emsCommunicationStatus; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public List getMeteDataDetailInfo() { + return meteDataDetailInfo; + } + + public void setMeteDataDetailInfo(List meteDataDetailInfo) { + this.meteDataDetailInfo = meteDataDetailInfo; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java new file mode 100644 index 0000000..c0acd13 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java @@ -0,0 +1,142 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电表收益数据 + */ +public class AmmeterRevenueStatisListVo { + + + /** 类别 */ + private String dataTime; + + /** 组合有功-总 */ + private BigDecimal activeTotalPrice = BigDecimal.ZERO; + + /** 组合有功-尖 */ + private BigDecimal activePeakPrice = BigDecimal.ZERO; + + /** 组合有功-峰 */ + private BigDecimal activeHighPrice = BigDecimal.ZERO; + + /** 组合有功-平 */ + private BigDecimal activeFlatPrice = BigDecimal.ZERO; + + /** 组合有功-谷 */ + private BigDecimal activeValleyPrice = BigDecimal.ZERO; + + /** 组合无功-总 */ + private BigDecimal reActiveTotalPrice = BigDecimal.ZERO; + + /** 组合无功-尖 */ + private BigDecimal reActivePeakPrice = BigDecimal.ZERO; + + /** 组合无功-峰 */ + private BigDecimal reActiveHighPrice = BigDecimal.ZERO; + + /** 组合无功-平 */ + private BigDecimal reActiveFlatPrice = BigDecimal.ZERO; + + /** 组合无功-谷 */ + private BigDecimal reActiveValleyPrice = BigDecimal.ZERO; + + /** 实际收益 */ + private BigDecimal actualRevenue = BigDecimal.ZERO; + + public String getDataTime() { + return dataTime; + } + + public void setDataTime(String dataTime) { + this.dataTime = dataTime; + } + + public BigDecimal getActiveTotalPrice() { + return activeTotalPrice; + } + + public void setActiveTotalPrice(BigDecimal activeTotalPrice) { + this.activeTotalPrice = activeTotalPrice; + } + + public BigDecimal getActivePeakPrice() { + return activePeakPrice; + } + + public void setActivePeakPrice(BigDecimal activePeakPrice) { + this.activePeakPrice = activePeakPrice; + } + + public BigDecimal getActiveHighPrice() { + return activeHighPrice; + } + + public void setActiveHighPrice(BigDecimal activeHighPrice) { + this.activeHighPrice = activeHighPrice; + } + + public BigDecimal getActiveFlatPrice() { + return activeFlatPrice; + } + + public void setActiveFlatPrice(BigDecimal activeFlatPrice) { + this.activeFlatPrice = activeFlatPrice; + } + + public BigDecimal getActiveValleyPrice() { + return activeValleyPrice; + } + + public void setActiveValleyPrice(BigDecimal activeValleyPrice) { + this.activeValleyPrice = activeValleyPrice; + } + + public BigDecimal getReActiveTotalPrice() { + return reActiveTotalPrice; + } + + public void setReActiveTotalPrice(BigDecimal reActiveTotalPrice) { + this.reActiveTotalPrice = reActiveTotalPrice; + } + + public BigDecimal getReActivePeakPrice() { + return reActivePeakPrice; + } + + public void setReActivePeakPrice(BigDecimal reActivePeakPrice) { + this.reActivePeakPrice = reActivePeakPrice; + } + + public BigDecimal getReActiveHighPrice() { + return reActiveHighPrice; + } + + public void setReActiveHighPrice(BigDecimal reActiveHighPrice) { + this.reActiveHighPrice = reActiveHighPrice; + } + + public BigDecimal getReActiveFlatPrice() { + return reActiveFlatPrice; + } + + public void setReActiveFlatPrice(BigDecimal reActiveFlatPrice) { + this.reActiveFlatPrice = reActiveFlatPrice; + } + + public BigDecimal getReActiveValleyPrice() { + return reActiveValleyPrice; + } + + public void setReActiveValleyPrice(BigDecimal reActiveValleyPrice) { + this.reActiveValleyPrice = reActiveValleyPrice; + } + + public BigDecimal getActualRevenue() { + return actualRevenue; + } + + public void setActualRevenue(BigDecimal actualRevenue) { + this.actualRevenue = actualRevenue; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterStatisListVo.java new file mode 100644 index 0000000..d53917c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterStatisListVo.java @@ -0,0 +1,152 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电表数据 + */ +public class AmmeterStatisListVo { + + + /** 类别 */ + private String dataTime; + +// private String timePart; + + /** 组合有功-总 (kWh) */ + private BigDecimal activeTotalKwh = BigDecimal.ZERO; + + /** 组合有功-尖 (kWh) */ + private BigDecimal activePeakKwh = BigDecimal.ZERO; + + /** 组合有功-峰 (kWh) */ + private BigDecimal activeHighKwh = BigDecimal.ZERO; + + /** 组合有功-平 (kWh) */ + private BigDecimal activeFlatKwh = BigDecimal.ZERO; + + /** 组合有功-谷 (kWh) */ + private BigDecimal activeValleyKwh = BigDecimal.ZERO; + + /** 组合无功-总 (kWh) */ + private BigDecimal reActiveTotalKwh = BigDecimal.ZERO; + + /** 组合无功-尖 (kWh) */ + private BigDecimal reActivePeakKwh = BigDecimal.ZERO; + + /** 组合无功-峰 (kWh) */ + private BigDecimal reActiveHighKwh = BigDecimal.ZERO; + + /** 组合无功-平 (kWh) */ + private BigDecimal reActiveFlatKwh = BigDecimal.ZERO; + + /** 组合无功-谷 (kWh) */ + private BigDecimal reActiveValleyKwh = BigDecimal.ZERO; + + /** 效率-有功总/无功总 */ + private BigDecimal effect = BigDecimal.ZERO; + + public String getDataTime() { + return dataTime; + } + + public void setDataTime(String dataTime) { + this.dataTime = dataTime; + } +// +// public String getTimePart() { +// return timePart; +// } +// +// public void setTimePart(String timePart) { +// this.timePart = timePart; +// } + + public BigDecimal getActiveTotalKwh() { + return activeTotalKwh; + } + + public void setActiveTotalKwh(BigDecimal activeTotalKwh) { + this.activeTotalKwh = activeTotalKwh; + } + + public BigDecimal getActivePeakKwh() { + return activePeakKwh; + } + + public void setActivePeakKwh(BigDecimal activePeakKwh) { + this.activePeakKwh = activePeakKwh; + } + + public BigDecimal getActiveHighKwh() { + return activeHighKwh; + } + + public void setActiveHighKwh(BigDecimal activeHighKwh) { + this.activeHighKwh = activeHighKwh; + } + + public BigDecimal getActiveFlatKwh() { + return activeFlatKwh; + } + + public void setActiveFlatKwh(BigDecimal activeFlatKwh) { + this.activeFlatKwh = activeFlatKwh; + } + + public BigDecimal getActiveValleyKwh() { + return activeValleyKwh; + } + + public void setActiveValleyKwh(BigDecimal activeValleyKwh) { + this.activeValleyKwh = activeValleyKwh; + } + + public BigDecimal getReActiveTotalKwh() { + return reActiveTotalKwh; + } + + public void setReActiveTotalKwh(BigDecimal reActiveTotalKwh) { + this.reActiveTotalKwh = reActiveTotalKwh; + } + + public BigDecimal getReActivePeakKwh() { + return reActivePeakKwh; + } + + public void setReActivePeakKwh(BigDecimal reActivePeakKwh) { + this.reActivePeakKwh = reActivePeakKwh; + } + + public BigDecimal getReActiveHighKwh() { + return reActiveHighKwh; + } + + public void setReActiveHighKwh(BigDecimal reActiveHighKwh) { + this.reActiveHighKwh = reActiveHighKwh; + } + + public BigDecimal getReActiveFlatKwh() { + return reActiveFlatKwh; + } + + public void setReActiveFlatKwh(BigDecimal reActiveFlatKwh) { + this.reActiveFlatKwh = reActiveFlatKwh; + } + + public BigDecimal getReActiveValleyKwh() { + return reActiveValleyKwh; + } + + public void setReActiveValleyKwh(BigDecimal reActiveValleyKwh) { + this.reActiveValleyKwh = reActiveValleyKwh; + } + + public BigDecimal getEffect() { + return effect; + } + + public void setEffect(BigDecimal effect) { + this.effect = effect; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java index edeb022..a03e286 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java @@ -18,13 +18,13 @@ public class BMSBatteryClusterDataList { private BigDecimal minData; /** 单体最小值ID */ - private Long minDataID; + private String minDataID; /** 单体最大值 */ private BigDecimal maxData; /** 单体最大值ID */ - private Long maxDataID; + private String maxDataID; public String getDataName() { return dataName; @@ -50,11 +50,11 @@ public class BMSBatteryClusterDataList { this.minData = minData; } - public Long getMinDataID() { + public String getMinDataID() { return minDataID; } - public void setMinDataID(Long minDataID) { + public void setMinDataID(String minDataID) { this.minDataID = minDataID; } @@ -66,11 +66,11 @@ public class BMSBatteryClusterDataList { this.maxData = maxData; } - public Long getMaxDataID() { + public String getMaxDataID() { return maxDataID; } - public void setMaxDataID(Long maxDataID) { + public void setMaxDataID(String maxDataID) { this.maxDataID = maxDataID; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterVo.java index f576b6b..b324959 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterVo.java @@ -1,6 +1,9 @@ package com.xzzn.ems.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; + import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -12,6 +15,10 @@ public class BMSBatteryClusterVo { /** 设备名称 */ private String deviceName; + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + /** 工作状态 */ private String workStatus; @@ -52,10 +59,16 @@ public class BMSBatteryClusterVo { private BigDecimal currentSoc; /** 站点id */ - private Long siteId; + private String siteId; /** 设备唯一标识符 */ - private Long deviceId; + private String deviceId; + + /** 父类设备名称 */ + private String parentDeviceName; + + /** 报警个数 */ + private int alarmNum; private List batteryDataList; @@ -67,6 +80,14 @@ public class BMSBatteryClusterVo { this.deviceName = deviceName; } + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + public String getWorkStatus() { return workStatus; } @@ -171,19 +192,19 @@ public class BMSBatteryClusterVo { this.currentSoc = currentSoc; } - public Long getSiteId() { + public String getSiteId() { return siteId; } - public void setSiteId(Long siteId) { + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getDeviceId() { + public String getDeviceId() { return deviceId; } - public void setDeviceId(Long deviceId) { + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } @@ -194,4 +215,20 @@ public class BMSBatteryClusterVo { public void setBatteryDataList(List batteryDataList) { this.batteryDataList = batteryDataList; } + + public String getParentDeviceName() { + return parentDeviceName; + } + + public void setParentDeviceName(String parentDeviceName) { + this.parentDeviceName = parentDeviceName; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java index 1ef444c..b43ec4a 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java @@ -9,7 +9,7 @@ public class BMSBatteryDataList { /** * 簇号 */ - private Long clusterId; + private String clusterId; /** 簇电压 (V) */ private BigDecimal clusterVoltage; @@ -21,61 +21,89 @@ public class BMSBatteryDataList { private BigDecimal currentSoc; /** 单体最高电压 (V) */ - private BigDecimal maxVoltage; + private BigDecimal maxCellVoltage; + + /** 最高单体电压对应点号 */ + private String maxCellVoltageId; /** 单体最低电压 (V) */ - private BigDecimal minVoltage; + private BigDecimal minCellVoltage; + + /** 最低单体电压对应点号 */ + private String minCellVoltageId; /** 单体最高温度 (℃) */ - private BigDecimal maxTemperature; + private BigDecimal maxCellTemp; + + /** 最高单体温度对应点号 */ + private String maxCellTempId; /** 单体最低温度 (℃) */ - private BigDecimal minTemperature; + private BigDecimal minCellTemp; + + /** 最低单体温度对应点号 */ + private String minCellTempId; /** 换电站id */ - private Long siteId; + private String siteId; /** 堆id */ - private Long stackDeviceId; + private String stackDeviceId; - public Long getClusterId() { + public String getClusterId() { return clusterId; } - public void setClusterId(Long clusterId) { + public void setClusterId(String clusterId) { this.clusterId = clusterId; } - public BigDecimal getMinTemperature() { - return minTemperature; + public String getStackDeviceId() { + return stackDeviceId; } - public void setMinTemperature(BigDecimal minTemperature) { - this.minTemperature = minTemperature; + public void setStackDeviceId(String stackDeviceId) { + this.stackDeviceId = stackDeviceId; } - public BigDecimal getMaxTemperature() { - return maxTemperature; + public String getSiteId() { + return siteId; } - public void setMaxTemperature(BigDecimal maxTemperature) { - this.maxTemperature = maxTemperature; + public void setSiteId(String siteId) { + this.siteId = siteId; } - public BigDecimal getMinVoltage() { - return minVoltage; + public BigDecimal getMinCellTemp() { + return minCellTemp; } - public void setMinVoltage(BigDecimal minVoltage) { - this.minVoltage = minVoltage; + public void setMinCellTemp(BigDecimal minCellTemp) { + this.minCellTemp = minCellTemp; } - public BigDecimal getMaxVoltage() { - return maxVoltage; + public BigDecimal getMaxCellTemp() { + return maxCellTemp; } - public void setMaxVoltage(BigDecimal maxVoltage) { - this.maxVoltage = maxVoltage; + public void setMaxCellTemp(BigDecimal maxCellTemp) { + this.maxCellTemp = maxCellTemp; + } + + public BigDecimal getMinCellVoltage() { + return minCellVoltage; + } + + public void setMinCellVoltage(BigDecimal minCellVoltage) { + this.minCellVoltage = minCellVoltage; + } + + public BigDecimal getMaxCellVoltage() { + return maxCellVoltage; + } + + public void setMaxCellVoltage(BigDecimal maxCellVoltage) { + this.maxCellVoltage = maxCellVoltage; } public BigDecimal getCurrentSoc() { @@ -101,4 +129,36 @@ public class BMSBatteryDataList { public void setClusterVoltage(BigDecimal clusterVoltage) { this.clusterVoltage = clusterVoltage; } + + public String getMaxCellVoltageId() { + return maxCellVoltageId; + } + + public void setMaxCellVoltageId(String maxCellVoltageId) { + this.maxCellVoltageId = maxCellVoltageId; + } + + public String getMinCellTempId() { + return minCellTempId; + } + + public void setMinCellTempId(String minCellTempId) { + this.minCellTempId = minCellTempId; + } + + public String getMaxCellTempId() { + return maxCellTempId; + } + + public void setMaxCellTempId(String maxCellTempId) { + this.maxCellTempId = maxCellTempId; + } + + public String getMinCellVoltageId() { + return minCellVoltageId; + } + + public void setMinCellVoltageId(String minCellVoltageId) { + this.minCellVoltageId = minCellVoltageId; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSOverViewVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSOverViewVo.java index e5b2a43..c787ba1 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSOverViewVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSOverViewVo.java @@ -1,6 +1,9 @@ package com.xzzn.ems.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; + import java.math.BigDecimal; +import java.util.Date; import java.util.List; /** @@ -12,6 +15,10 @@ public class BMSOverViewVo { /** 设备名称 */ private String deviceName; + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + /** 工作状态 */ private String workStatus; @@ -22,40 +29,43 @@ public class BMSOverViewVo { private String emsCommunicationStatus; /** 电池堆总电压 (V) */ - private BigDecimal totalVoltage; + private BigDecimal stackVoltage; /** 可充电量 (kWh) */ - private BigDecimal chargeableCapacity; + private BigDecimal availableChargeCapacity; /** 累计充电量 (kWh) */ - private BigDecimal totalChargedCapacity; + private BigDecimal totalChargeCapacity; /** 电池堆总电流 (A) */ - private BigDecimal totalCurrent; + private BigDecimal stackCurrent; /** 可放电量 (kWh) */ - private BigDecimal dischargeableCapacity; + private BigDecimal availableDischargeCapacity; /** 累计放电量 (kWh) */ - private BigDecimal totalDischargedCapacity; + private BigDecimal totalDischargeCapacity; /** SOH (%) */ - private BigDecimal soh; + private BigDecimal stackSoh; /** 平均温度 (℃) */ - private BigDecimal averageTemperature; + private BigDecimal operatingTemp; /** 绝缘电阻 (Ω) */ - private BigDecimal insulationResistance; + private BigDecimal stackInsulationResistance; /** 当前SOC (%) */ - private BigDecimal currentSoc; + private BigDecimal stackSoc; /** 站点id */ - private Long siteId; + private String siteId; /** 设备唯一标识符 */ - private Long deviceId; + private String deviceId; + + /** 报警个数 */ + private int alarmNum; private List batteryDataList; @@ -67,6 +77,14 @@ public class BMSOverViewVo { this.deviceName = deviceName; } + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + public String getWorkStatus() { return workStatus; } @@ -91,102 +109,110 @@ public class BMSOverViewVo { this.emsCommunicationStatus = emsCommunicationStatus; } - public BigDecimal getTotalVoltage() { - return totalVoltage; + public BigDecimal getStackVoltage() { + return stackVoltage; } - public void setTotalVoltage(BigDecimal totalVoltage) { - this.totalVoltage = totalVoltage; + public void setStackVoltage(BigDecimal stackVoltage) { + this.stackVoltage = stackVoltage; } - public BigDecimal getChargeableCapacity() { - return chargeableCapacity; + public BigDecimal getAvailableChargeCapacity() { + return availableChargeCapacity; } - public void setChargeableCapacity(BigDecimal chargeableCapacity) { - this.chargeableCapacity = chargeableCapacity; + public void setAvailableChargeCapacity(BigDecimal availableChargeCapacity) { + this.availableChargeCapacity = availableChargeCapacity; } - public BigDecimal getTotalChargedCapacity() { - return totalChargedCapacity; + public BigDecimal getTotalChargeCapacity() { + return totalChargeCapacity; } - public void setTotalChargedCapacity(BigDecimal totalChargedCapacity) { - this.totalChargedCapacity = totalChargedCapacity; + public void setTotalChargeCapacity(BigDecimal totalChargeCapacity) { + this.totalChargeCapacity = totalChargeCapacity; } - public BigDecimal getTotalCurrent() { - return totalCurrent; + public BigDecimal getStackCurrent() { + return stackCurrent; } - public void setTotalCurrent(BigDecimal totalCurrent) { - this.totalCurrent = totalCurrent; + public void setStackCurrent(BigDecimal stackCurrent) { + this.stackCurrent = stackCurrent; } - public BigDecimal getDischargeableCapacity() { - return dischargeableCapacity; + public BigDecimal getAvailableDischargeCapacity() { + return availableDischargeCapacity; } - public void setDischargeableCapacity(BigDecimal dischargeableCapacity) { - this.dischargeableCapacity = dischargeableCapacity; + public void setAvailableDischargeCapacity(BigDecimal availableDischargeCapacity) { + this.availableDischargeCapacity = availableDischargeCapacity; } - public BigDecimal getTotalDischargedCapacity() { - return totalDischargedCapacity; + public BigDecimal getTotalDischargeCapacity() { + return totalDischargeCapacity; } - public void setTotalDischargedCapacity(BigDecimal totalDischargedCapacity) { - this.totalDischargedCapacity = totalDischargedCapacity; + public void setTotalDischargeCapacity(BigDecimal totalDischargeCapacity) { + this.totalDischargeCapacity = totalDischargeCapacity; } - public BigDecimal getSoh() { - return soh; + public BigDecimal getStackSoh() { + return stackSoh; } - public void setSoh(BigDecimal soh) { - this.soh = soh; + public void setStackSoh(BigDecimal stackSoh) { + this.stackSoh = stackSoh; } - public BigDecimal getAverageTemperature() { - return averageTemperature; + public BigDecimal getOperatingTemp() { + return operatingTemp; } - public void setAverageTemperature(BigDecimal averageTemperature) { - this.averageTemperature = averageTemperature; + public void setOperatingTemp(BigDecimal operatingTemp) { + this.operatingTemp = operatingTemp; } - public BigDecimal getInsulationResistance() { - return insulationResistance; + public BigDecimal getStackInsulationResistance() { + return stackInsulationResistance; } - public void setInsulationResistance(BigDecimal insulationResistance) { - this.insulationResistance = insulationResistance; + public void setStackInsulationResistance(BigDecimal stackInsulationResistance) { + this.stackInsulationResistance = stackInsulationResistance; } - public BigDecimal getCurrentSoc() { - return currentSoc; + public BigDecimal getStackSoc() { + return stackSoc; } - public void setCurrentSoc(BigDecimal currentSoc) { - this.currentSoc = currentSoc; + public void setStackSoc(BigDecimal stackSoc) { + this.stackSoc = stackSoc; } - public Long getDeviceId() { - return deviceId; - } - - public void setDeviceId(Long deviceId) { - this.deviceId = deviceId; - } - - public Long getSiteId() { + public String getSiteId() { return siteId; } - public void setSiteId(Long siteId) { + public void setSiteId(String siteId) { this.siteId = siteId; } + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } + public List getBatteryDataList() { return batteryDataList; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveSOCVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveSOCVo.java index 5c216e3..9d60a7c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveSOCVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveSOCVo.java @@ -1,6 +1,7 @@ package com.xzzn.ems.domain.vo; import java.math.BigDecimal; +import java.util.Date; /** * 实时运行-电池平均SOC数据 @@ -8,26 +9,26 @@ import java.math.BigDecimal; */ public class BatteryAveSOCVo { /** - * 月份 月+日 + * 游标显示日期 */ - private String monthDay; + private String dateDay; + + /** + * 数据时间 + */ + private String createDate; /** * 实时SOC */ private BigDecimal batterySOC; - /** - * 昨日SOC - */ - private BigDecimal ytdBatterySOC; - - public String getMonthDay() { - return monthDay; + public String getCreateDate() { + return createDate; } - public void setMonthDay(String monthDay) { - this.monthDay = monthDay; + public void setCreateDate(String createDate) { + this.createDate = createDate; } public BigDecimal getBatterySOC() { @@ -38,11 +39,11 @@ public class BatteryAveSOCVo { this.batterySOC = batterySOC; } - public BigDecimal getYtdBatterySOC() { - return ytdBatterySOC; + public String getDateDay() { + return dateDay; } - public void setYtdBatterySOC(BigDecimal ytdBatterySOC) { - this.ytdBatterySOC = ytdBatterySOC; + public void setDateDay(String dateDay) { + this.dateDay = dateDay; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveTempVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveTempVo.java index 7b89800..9e5736e 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveTempVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryAveTempVo.java @@ -1,6 +1,7 @@ package com.xzzn.ems.domain.vo; import java.math.BigDecimal; +import java.util.Date; /** * 实时运行-电池平均温度数据 @@ -8,27 +9,26 @@ import java.math.BigDecimal; */ public class BatteryAveTempVo { /** - * 月份 月+日 + * 游标显示日期 */ - private String monthDay; + private String dateDay; + + /** + * 数据时间 + */ + private String createDate; /** * 实时温度 */ private BigDecimal batteryTemp; - /** - * 昨日温度 - */ - private BigDecimal batteryYtdTemp; - - - public String getMonthDay() { - return monthDay; + public String getCreateDate() { + return createDate; } - public void setMonthDay(String monthDay) { - this.monthDay = monthDay; + public void setCreateDate(String createDate) { + this.createDate = createDate; } public BigDecimal getBatteryTemp() { @@ -39,11 +39,11 @@ public class BatteryAveTempVo { this.batteryTemp = batteryTemp; } - public BigDecimal getBatteryYtdTemp() { - return batteryYtdTemp; + public String getDateDay() { + return dateDay; } - public void setBatteryYtdTemp(BigDecimal batteryYtdTemp) { - this.batteryYtdTemp = batteryYtdTemp; + public void setDateDay(String dateDay) { + this.dateDay = dateDay; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java index 45e40e1..3cf27ed 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java @@ -8,10 +8,10 @@ import java.math.BigDecimal; public class BatteryClusterDataDetailVo { /** 设备id */ - private Long siteId; + private String siteId; /** 电池簇id */ - private Long clusterId; + private String clusterId; /** 电压平均值 */ private BigDecimal avgVoltage; @@ -40,19 +40,19 @@ public class BatteryClusterDataDetailVo { /** soc最小值 */ private BigDecimal minSoc; - public Long getSiteId() { + public String getSiteId() { return siteId; } - public void setSiteId(Long siteId) { + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getClusterId() { + public String getClusterId() { return clusterId; } - public void setClusterId(Long clusterId) { + public void setClusterId(String clusterId) { this.clusterId = clusterId; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryDataStatsListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryDataStatsListVo.java new file mode 100644 index 0000000..95cacf5 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryDataStatsListVo.java @@ -0,0 +1,89 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 单站监控-单体电池数据 + * + */ +public class BatteryDataStatsListVo { + /** 单体电池设备id */ + private String deviceId; + + /** 电压 (V) */ + private BigDecimal voltage; + + /** 温度 (℃) */ + private BigDecimal temperature; + + /** SOC (%) */ + private BigDecimal soc; + + /** SOH (%) */ + private BigDecimal soh; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date dataTimestamp; + + /** 簇号 */ + private String clusterDeviceId; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public BigDecimal getVoltage() { + return voltage; + } + + public void setVoltage(BigDecimal voltage) { + this.voltage = voltage; + } + + public BigDecimal getTemperature() { + return temperature; + } + + public void setTemperature(BigDecimal temperature) { + this.temperature = temperature; + } + + public BigDecimal getSoc() { + return soc; + } + + public void setSoc(BigDecimal soc) { + this.soc = soc; + } + + public BigDecimal getSoh() { + return soh; + } + + public void setSoh(BigDecimal soh) { + this.soh = soh; + } + + public Date getDataTimestamp() { + return dataTimestamp; + } + + public void setDataTimestamp(Date dataTimestamp) { + this.dataTimestamp = dataTimestamp; + } + + public String getClusterDeviceId() { + return clusterDeviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) { + this.clusterDeviceId = clusterDeviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ClusterStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ClusterStatisListVo.java new file mode 100644 index 0000000..fe66392 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ClusterStatisListVo.java @@ -0,0 +1,109 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电池簇-电池温度等数据入参 + * + */ +public class ClusterStatisListVo { + + /** 统计时间 */ + private String statisDate; + + /** 最高温度 */ + private BigDecimal maxTemp; + + /** 最高温度单体ID */ + private String maxTempId; + + /** 最低温度 */ + private BigDecimal minTemp; + + /** 最低温度单体ID */ + private String minTempId; + + /** 最高电压 */ + private BigDecimal maxVoltage; + + /** 最高电压单体ID */ + private String maxVoltageId; + + /** 最低电压 */ + private BigDecimal minVoltage; + + /** 最低电压单体ID */ + private String minVoltageId; + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getMaxTemp() { + return maxTemp; + } + + public void setMaxTemp(BigDecimal maxTemp) { + this.maxTemp = maxTemp; + } + + public String getMaxTempId() { + return maxTempId; + } + + public void setMaxTempId(String maxTempId) { + this.maxTempId = maxTempId; + } + + public BigDecimal getMinTemp() { + return minTemp; + } + + public void setMinTemp(BigDecimal minTemp) { + this.minTemp = minTemp; + } + + public String getMinTempId() { + return minTempId; + } + + public void setMinTempId(String minTempId) { + this.minTempId = minTempId; + } + + public BigDecimal getMaxVoltage() { + return maxVoltage; + } + + public void setMaxVoltage(BigDecimal maxVoltage) { + this.maxVoltage = maxVoltage; + } + + public String getMaxVoltageId() { + return maxVoltageId; + } + + public void setMaxVoltageId(String maxVoltageId) { + this.maxVoltageId = maxVoltageId; + } + + public BigDecimal getMinVoltage() { + return minVoltage; + } + + public void setMinVoltage(BigDecimal minVoltage) { + this.minVoltage = minVoltage; + } + + public String getMinVoltageId() { + return minVoltageId; + } + + public void setMinVoltageId(String minVoltageId) { + this.minVoltageId = minVoltageId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/CoolingDataViewVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/CoolingDataViewVo.java new file mode 100644 index 0000000..d479388 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/CoolingDataViewVo.java @@ -0,0 +1,143 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 单站监控-液冷 + * + */ +public class CoolingDataViewVo { + + /** 设备名称 */ + private String deviceName; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 供水温度 */ + @Excel(name = "供水温度") + private BigDecimal gsTemp; + + /** 回水温度 */ + @Excel(name = "回水温度") + private BigDecimal hsTemp; + + /** 供水压力 */ + @Excel(name = "供水压力") + private BigDecimal gsPressure; + + /** 回水压力 */ + @Excel(name = "回水压力") + private BigDecimal hsPressure; + + /** 冷源水温度 */ + @Excel(name = "冷源水温度") + private BigDecimal lysTemp; + + /** VB01开度 */ + @Excel(name = "VB01开度") + private BigDecimal vb01Kd; + + /** VB02开度 */ + @Excel(name = "VB02开度") + private BigDecimal vb02Kd; + + /** 设备唯一标识符 */ + private String deviceId; + + /** 报警个数 */ + private int alarmNum; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public BigDecimal getGsTemp() { + return gsTemp; + } + + public void setGsTemp(BigDecimal gsTemp) { + this.gsTemp = gsTemp; + } + + public BigDecimal getHsTemp() { + return hsTemp; + } + + public void setHsTemp(BigDecimal hsTemp) { + this.hsTemp = hsTemp; + } + + public BigDecimal getGsPressure() { + return gsPressure; + } + + public void setGsPressure(BigDecimal gsPressure) { + this.gsPressure = gsPressure; + } + + public BigDecimal getHsPressure() { + return hsPressure; + } + + public void setHsPressure(BigDecimal hsPressure) { + this.hsPressure = hsPressure; + } + + public BigDecimal getLysTemp() { + return lysTemp; + } + + public void setLysTemp(BigDecimal lysTemp) { + this.lysTemp = lysTemp; + } + + public BigDecimal getVb01Kd() { + return vb01Kd; + } + + public void setVb01Kd(BigDecimal vb01Kd) { + this.vb01Kd = vb01Kd; + } + + public BigDecimal getVb02Kd() { + return vb02Kd; + } + + public void setVb02Kd(BigDecimal vb02Kd) { + this.vb02Kd = vb02Kd; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DateSearchRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DateSearchRequest.java new file mode 100644 index 0000000..d087ad2 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DateSearchRequest.java @@ -0,0 +1,77 @@ +package com.xzzn.ems.domain.vo; + + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 入参-时间 + * + */ +public class DateSearchRequest { + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + private String siteId; + + private String deviceId; + + private String dataType; + + private String clusterDeviceId; + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getClusterDeviceId() { + return clusterDeviceId; + } + + public void setClusterDeviceId(String clusterDeviceId) { + this.clusterDeviceId = clusterDeviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java new file mode 100644 index 0000000..3d9d2f0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java @@ -0,0 +1,124 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 综合查询返回-设备数据list + */ +public class DevicePointDataList +{ + // 设备id + private String deviceId; + // 父类设备id + private String parentDeviceId; + // 该设备点位数据list + private List pointValueList; + // 最大值&时间 + private BigDecimal maxValue; + private String maxDate; + // 最小值&时间 + private BigDecimal minValue; + private String minDate; + // 平均值(保留4位小数) + private BigDecimal avgValue; + // 差值(max - min) + private BigDecimal diffValue; + + public DevicePointDataList(String deviceId, List pointValueList,String parentDeviceId, + BigDecimal maxValue, BigDecimal minValue, + BigDecimal avgValue, BigDecimal diffValue, + String maxDate, String minDate) { + this.deviceId = deviceId; + this.pointValueList = pointValueList; + this.parentDeviceId = parentDeviceId; + this.maxValue = maxValue; + this.minValue = minValue; + this.avgValue = avgValue; + this.diffValue = diffValue; + this.maxDate = maxDate; + this.minDate = minDate; + } + + public DevicePointDataList(String deviceId, String parentDeviceId, List pointValueList) { + this.deviceId = deviceId; + this.parentDeviceId = parentDeviceId; + this.pointValueList = pointValueList; + } + + public DevicePointDataList() { + + } + + public String getMaxDate() { + return maxDate; + } + + public void setMaxDate(String maxDate) { + this.maxDate = maxDate; + } + + public String getMinDate() { + return minDate; + } + + public void setMinDate(String minDate) { + this.minDate = minDate; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public List getPointValueList() { + return pointValueList; + } + + public void setPointValueList(List pointValueList) { + this.pointValueList = pointValueList; + } + + public String getParentDeviceId() { + return parentDeviceId; + } + + public void setParentDeviceId(String parentDeviceId) { + this.parentDeviceId = parentDeviceId; + } + + public BigDecimal getMaxValue() { + return maxValue; + } + + public void setMaxValue(BigDecimal maxValue) { + this.maxValue = maxValue; + } + + public BigDecimal getMinValue() { + return minValue; + } + + public void setMinValue(BigDecimal minValue) { + this.minValue = minValue; + } + + public BigDecimal getAvgValue() { + return avgValue; + } + + public void setAvgValue(BigDecimal avgValue) { + this.avgValue = avgValue; + } + + public BigDecimal getDiffValue() { + return diffValue; + } + + public void setDiffValue(BigDecimal diffValue) { + this.diffValue = diffValue; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java new file mode 100644 index 0000000..7bfa4a6 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchExportVo.java @@ -0,0 +1,157 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 点位清单导出参数 + */ +public class DevicePointMatchExportVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 存储点位名称 */ + @Excel(name = "点位匹配字段名称") + private String pointName; + + /** 数据枚举映射-导出枚举名称 */ + @Excel(name = "数据枚举映射") + private String matchFieldEnum; + + /** 数据点位 */ + @Excel(name = "数据点位") + private String dataPoint; + + /** 数据点位名称 */ + @Excel(name = "数据点位名称") + private String dataPointName; + + /** 数据单位 */ + @Excel(name = "数据单位") + private String dataUnit; + + /** 数据枚举 */ + @Excel(name = "数据枚举") + private String dataEnum; + + /** 是否告警点位 */ + @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") + private String isAlarm; + + /** 寄存器地址 */ + @Excel(name = "寄存器地址") + private String ipAddress; + + /** 二次项系数 */ + @Excel(name = "a") + private BigDecimal a; + + /** 一次项系数 */ + @Excel(name = "k") + private BigDecimal k; + + /** 常量 */ + @Excel(name = "b") + private BigDecimal b; + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public String getMatchField() { + return matchField; + } + + public void setMatchField(String matchField) { + this.matchField = matchField; + } + + public String getMatchFieldEnum() { + return matchFieldEnum; + } + + public void setMatchFieldEnum(String matchFieldEnum) { + this.matchFieldEnum = matchFieldEnum; + } + + public String getDataPoint() { + return dataPoint; + } + + public void setDataPoint(String dataPoint) { + this.dataPoint = dataPoint; + } + + public String getDataPointName() { + return dataPointName; + } + + public void setDataPointName(String dataPointName) { + this.dataPointName = dataPointName; + } + + public String getDataUnit() { + return dataUnit; + } + + public void setDataUnit(String dataUnit) { + this.dataUnit = dataUnit; + } + + public String getDataEnum() { + return dataEnum; + } + + public void setDataEnum(String dataEnum) { + this.dataEnum = dataEnum; + } + + public String getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(String isAlarm) { + this.isAlarm = isAlarm; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public BigDecimal getA() { + return a; + } + + public void setA(BigDecimal a) { + this.a = a; + } + + public BigDecimal getK() { + return k; + } + + public void setK(BigDecimal k) { + this.k = k; + } + + public BigDecimal getB() { + return b; + } + + public void setB(BigDecimal b) { + this.b = b; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchInfo.java new file mode 100644 index 0000000..c375476 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchInfo.java @@ -0,0 +1,116 @@ +package com.xzzn.ems.domain.vo; + +import java.util.Map; + +public class DevicePointMatchInfo { + + private Map pcs; + + private Map branch; + + private Map stack; + + private Map cluster; + + private Map battery; + + private Map ammeterLoad; + + private Map ammeterMete; + + private Map cooling; + + private Map dh; + + private Map xf; + + private Map batteryGroup; + + public Map getPcs() { + return pcs; + } + + public void setPcs(Map pcs) { + this.pcs = pcs; + } + + public Map getBranch() { + return branch; + } + + public void setBranch(Map branch) { + this.branch = branch; + } + + public Map getStack() { + return stack; + } + + public void setStack(Map stack) { + this.stack = stack; + } + + public Map getCluster() { + return cluster; + } + + public void setCluster(Map cluster) { + this.cluster = cluster; + } + + public Map getBattery() { + return battery; + } + + public void setBattery(Map battery) { + this.battery = battery; + } + + public Map getAmmeterLoad() { + return ammeterLoad; + } + + public void setAmmeterLoad(Map ammeterLoad) { + this.ammeterLoad = ammeterLoad; + } + + public Map getAmmeterMete() { + return ammeterMete; + } + + public void setAmmeterMete(Map ammeterMete) { + this.ammeterMete = ammeterMete; + } + + public Map getCooling() { + return cooling; + } + + public void setCooling(Map cooling) { + this.cooling = cooling; + } + + public Map getDh() { + return dh; + } + + public void setDh(Map dh) { + this.dh = dh; + } + + public Map getXf() { + return xf; + } + + public void setXf(Map xf) { + this.xf = xf; + } + + public Map getBatteryGroup() { + return batteryGroup; + } + + public void setBatteryGroup(Map batteryGroup) { + this.batteryGroup = batteryGroup; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java new file mode 100644 index 0000000..03b0fff --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java @@ -0,0 +1,169 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 点位清单上传参数 + */ +public class DevicePointMatchVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 存储点位名称 */ + @Excel(name = "点位匹配字段名称") + private String pointName; + + /** 数据枚举映射 */ + @Excel(name = "数据枚举映射") + private String matchFieldEnum; + + /** 数据点位 */ + @Excel(name = "数据点位") + private String dataPoint; + + /** 数据点位名称 */ + @Excel(name = "数据点位名称") + private String dataPointName; + + /** 数据单位 */ + @Excel(name = "数据单位") + private String dataUnit; + + /** 数据枚举 */ + @Excel(name = "数据枚举") + private String dataEnum; + + /** 是否告警点位 */ + @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") + private String isAlarm; + + /** 寄存器地址 */ + @Excel(name = "寄存器地址") + private String ipAddress; + + /** 二次项系数 */ + @Excel(name = "a") + private BigDecimal a; + + /** 一次项系数 */ + @Excel(name = "k") + private BigDecimal k; + + /** 常量 */ + @Excel(name = "b") + private BigDecimal b; + + /** 错误信息 */ + @Excel(name = "错误信息") + private String errorMsg; + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public String getMatchField() { + return matchField; + } + + public void setMatchField(String matchField) { + this.matchField = matchField; + } + + public String getMatchFieldEnum() { + return matchFieldEnum; + } + + public void setMatchFieldEnum(String matchFieldEnum) { + this.matchFieldEnum = matchFieldEnum; + } + + public String getDataEnum() { + return dataEnum; + } + + public void setDataEnum(String dataEnum) { + this.dataEnum = dataEnum; + } + + public String getDataPoint() { + return dataPoint; + } + + public void setDataPoint(String dataPoint) { + this.dataPoint = dataPoint; + } + + public String getDataPointName() { + return dataPointName; + } + + public void setDataPointName(String dataPointName) { + this.dataPointName = dataPointName; + } + + public String getDataUnit() { + return dataUnit; + } + + public void setDataUnit(String dataUnit) { + this.dataUnit = dataUnit; + } + + public String getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(String isAlarm) { + this.isAlarm = isAlarm; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public BigDecimal getA() { + return a; + } + + public void setA(BigDecimal a) { + this.a = a; + } + + public BigDecimal getK() { + return k; + } + + public void setK(BigDecimal k) { + this.k = k; + } + + public BigDecimal getB() { + return b; + } + + public void setB(BigDecimal b) { + this.b = b; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DeviceUpdateRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DeviceUpdateRequest.java new file mode 100644 index 0000000..24f582f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DeviceUpdateRequest.java @@ -0,0 +1,58 @@ +package com.xzzn.ems.domain.vo; + +import javax.validation.constraints.NotBlank; + +/** + * 设备信息更新入参 + * + */ +public class DeviceUpdateRequest { + + /** 站点id */ + @NotBlank(message = "站点ID不能为空") + private String siteId; + + /** 设备id */ + @NotBlank(message = "设备ID不能为空") + private String deviceId; + + /** 工作状态:0-运行 1-停机 2-故障 */ + @NotBlank(message = "工作状态状态不能为空") + private String workStatus; + + /** 设备类型 */ + private String deviceCategory; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getWorkStatus() { + return workStatus; + } + + public void setWorkStatus(String workStatus) { + this.workStatus = workStatus; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicesSettingVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicesSettingVo.java new file mode 100644 index 0000000..26510aa --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicesSettingVo.java @@ -0,0 +1,20 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsPcsSetting; + +public class DevicesSettingVo extends EmsDevicesSetting +{ + private static final long serialVersionUID = 1L; + + /** PCS设备配置 */ + private EmsPcsSetting pcsSetting; + + public EmsPcsSetting getPcsSetting() { + return pcsSetting; + } + + public void setPcsSetting(EmsPcsSetting pcsSetting) { + this.pcsSetting = pcsSetting; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DhDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DhDataVo.java new file mode 100644 index 0000000..1ad414a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DhDataVo.java @@ -0,0 +1,80 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 动环数据 + */ +public class DhDataVo { + + /** 设备唯一标识符 */ + private String deviceId; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 动环名称 */ + private String deviceName; + + /** 湿度 */ + private BigDecimal humidity; + + /** 温度 */ + private BigDecimal temperature; + + /** 报警个数 */ + private int alarmNum; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public BigDecimal getHumidity() { + return humidity; + } + + public void setHumidity(BigDecimal humidity) { + this.humidity = humidity; + } + + public BigDecimal getTemperature() { + return temperature; + } + + public void setTemperature(BigDecimal temperature) { + this.temperature = temperature; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricDataInfoVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricDataInfoVo.java new file mode 100644 index 0000000..1743d70 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricDataInfoVo.java @@ -0,0 +1,76 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 概率统计-电量指标返回 + * + */ +public class ElectricDataInfoVo { + + /** + * 显示时间单位 + */ + private String unit; + + /** + * 总充电量 + */ + private BigDecimal totalChargedCap; + + /** + * 总放电量 + */ + private BigDecimal totalDisChargedCap; + + /** + * 综合效率 = 放电量/充电量 + */ + private BigDecimal efficiency; + + /** + * 按天放电统计 + */ + private List sevenDayDisChargeStats; + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public BigDecimal getTotalChargedCap() { + return totalChargedCap; + } + + public void setTotalChargedCap(BigDecimal totalChargedCap) { + this.totalChargedCap = totalChargedCap; + } + + public BigDecimal getTotalDisChargedCap() { + return totalDisChargedCap; + } + + public void setTotalDisChargedCap(BigDecimal totalDisChargedCap) { + this.totalDisChargedCap = totalDisChargedCap; + } + + public BigDecimal getEfficiency() { + return efficiency; + } + + public void setEfficiency(BigDecimal efficiency) { + this.efficiency = efficiency; + } + + public List getSevenDayDisChargeStats() { + return sevenDayDisChargeStats; + } + + public void setSevenDayDisChargeStats(List sevenDayDisChargeStats) { + this.sevenDayDisChargeStats = sevenDayDisChargeStats; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricIndexList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricIndexList.java index bc99c36..4047b09 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricIndexList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ElectricIndexList.java @@ -3,13 +3,13 @@ package com.xzzn.ems.domain.vo; import java.math.BigDecimal; /** - * 首页看板数据概览-电量指标 + * 数据统计-电量指标 */ public class ElectricIndexList { /** * 月份 */ - private int dateMonth; + private String dateMonth; /** * 充电量 @@ -21,11 +21,11 @@ public class ElectricIndexList { */ private BigDecimal disChargeEnergy; - public int getDateMonth() { + public String getDateMonth() { return dateMonth; } - public void setDateMonth(int dateMonth) { + public void setDateMonth(String dateMonth) { this.dateMonth = dateMonth; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EmsDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EmsDataVo.java new file mode 100644 index 0000000..936ab79 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EmsDataVo.java @@ -0,0 +1,168 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * EMS数据 + */ +public class EmsDataVo { + + /** 设备唯一标识符 */ + private String deviceId; + + /** 设备名称 */ + private String deviceName; + + /** EMS控制模式 */ + private BigDecimal emsStatus; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** BMS1SOC */ + private BigDecimal bms1Soc; + + /** BMS2SOC */ + private BigDecimal bms2Soc; + + /** BMS3SOC */ + private BigDecimal bms3Soc; + + /** BMS4SOC */ + private BigDecimal bms4Soc; + + /** PCS-1有功功率 */ + private BigDecimal pcs1Yggl; + + /** PCS-2有功功率 */ + private BigDecimal pcs2Yggl; + + /** PCS-3有功功率 */ + private BigDecimal pcs3Yggl; + + /** PCS-4有功功率 */ + private BigDecimal pcs4Yggl; + + /** EMS有功功率 */ + private BigDecimal emsYggl; + + /** 报警个数 */ + private int alarmNum; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public BigDecimal getEmsStatus() { + return emsStatus; + } + + public void setEmsStatus(BigDecimal emsStatus) { + this.emsStatus = emsStatus; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public BigDecimal getBms1Soc() { + return bms1Soc; + } + + public void setBms1Soc(BigDecimal bms1Soc) { + this.bms1Soc = bms1Soc; + } + + public BigDecimal getBms2Soc() { + return bms2Soc; + } + + public void setBms2Soc(BigDecimal bms2Soc) { + this.bms2Soc = bms2Soc; + } + + public BigDecimal getBms3Soc() { + return bms3Soc; + } + + public void setBms3Soc(BigDecimal bms3Soc) { + this.bms3Soc = bms3Soc; + } + + public BigDecimal getBms4Soc() { + return bms4Soc; + } + + public void setBms4Soc(BigDecimal bms4Soc) { + this.bms4Soc = bms4Soc; + } + + public BigDecimal getPcs1Yggl() { + return pcs1Yggl; + } + + public void setPcs1Yggl(BigDecimal pcs1Yggl) { + this.pcs1Yggl = pcs1Yggl; + } + + public BigDecimal getPcs2Yggl() { + return pcs2Yggl; + } + + public void setPcs2Yggl(BigDecimal pcs2Yggl) { + this.pcs2Yggl = pcs2Yggl; + } + + public BigDecimal getPcs3Yggl() { + return pcs3Yggl; + } + + public void setPcs3Yggl(BigDecimal pcs3Yggl) { + this.pcs3Yggl = pcs3Yggl; + } + + public BigDecimal getPcs4Yggl() { + return pcs4Yggl; + } + + public void setPcs4Yggl(BigDecimal pcs4Yggl) { + this.pcs4Yggl = pcs4Yggl; + } + + public BigDecimal getEmsYggl() { + return emsYggl; + } + + public void setEmsYggl(BigDecimal emsYggl) { + this.emsYggl = emsYggl; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceConfigVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceConfigVo.java new file mode 100644 index 0000000..ef7635d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceConfigVo.java @@ -0,0 +1,101 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 电价配置-电价列表-对象 + * + */ +public class EnergyPriceConfigVo { + + /** 时间格式 yyyy-MM */ + private String yearMonth; + /** 尖电价(元/kWh) */ + @Excel(name = "尖电价(元/kWh)") + private BigDecimal peak; + /** 峰电价(元/kWh) */ + @Excel(name = "峰电价(元/kWh)") + private BigDecimal high; + /** 平电价(元/kWh) */ + @Excel(name = "平电价(元/kWh)") + private BigDecimal flat; + /** 谷电价(元/kWh) */ + @Excel(name = "谷电价(元/kWh)") + private BigDecimal valley; + /** 时段开始时间 */ + @Excel(name = "时段开始时间") + private String startTime; + /** 时段结束时间 */ + @Excel(name = "时段结束时间") + private String endTime; + /** 电价类型: 尖-peak,峰-high,平-flat,谷=valley */ + @Excel(name = "电价类型: 尖-peak,峰-high,平-flat,谷=valley") + private String costType; + + public String getYearMonth() { + return yearMonth; + } + + public void setYearMonth(String yearMonth) { + this.yearMonth = yearMonth; + } + + public BigDecimal getPeak() { + return peak; + } + + public void setPeak(BigDecimal peak) { + this.peak = peak; + } + + public BigDecimal getHigh() { + return high; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public BigDecimal getFlat() { + return flat; + } + + public void setFlat(BigDecimal flat) { + this.flat = flat; + } + + public BigDecimal getValley() { + return valley; + } + + public void setValley(BigDecimal valley) { + this.valley = valley; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getCostType() { + return costType; + } + + public void setCostType(String costType) { + this.costType = costType; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceTimeRange.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceTimeRange.java new file mode 100644 index 0000000..eff9d04 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceTimeRange.java @@ -0,0 +1,45 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +/** + * 电价配置-电价列表-电价范围 + * + */ +public class EnergyPriceTimeRange { + /** 时段开始时间 */ + @Excel(name = "时段开始时间") + private String startTime; + + /** 时段结束时间 */ + @Excel(name = "时段结束时间") + private String endTime; + + /** 电价类型: 尖-peak,峰-high,平-flat,谷=valley */ + @Excel(name = "电价类型: 尖-peak,峰-high,平-flat,谷=valley") + private String costType; + + public String getCostType() { + return costType; + } + + public void setCostType(String costType) { + this.costType = costType; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceVo.java new file mode 100644 index 0000000..1a2bf0c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyPriceVo.java @@ -0,0 +1,110 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 电价配置-电价列表-对象 + * + */ +public class EnergyPriceVo { + /** */ + private Long id; + /** 站点id */ + @Excel(name = "站点id") + private String siteId; + /** 年份 */ + @Excel(name = "年份") + private String year; + /** 月份,如"9"表示9月 */ + @Excel(name = "月份,如\"9\"表示9月") + private String month; + /** 尖电价(元/kWh) */ + @Excel(name = "尖电价(元/kWh)") + private BigDecimal peak; + /** 峰电价(元/kWh) */ + @Excel(name = "峰电价(元/kWh)") + private BigDecimal high; + /** 平电价(元/kWh) */ + @Excel(name = "平电价(元/kWh)") + private BigDecimal flat; + /** 谷电价(元/kWh) */ + @Excel(name = "谷电价(元/kWh)") + private BigDecimal valley; + /** 电价时间范围对象 */ + private List range; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } + + public BigDecimal getPeak() { + return peak; + } + + public void setPeak(BigDecimal peak) { + this.peak = peak; + } + + public BigDecimal getHigh() { + return high; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public BigDecimal getFlat() { + return flat; + } + + public void setFlat(BigDecimal flat) { + this.flat = flat; + } + + public BigDecimal getValley() { + return valley; + } + + public void setValley(BigDecimal valley) { + this.valley = valley; + } + + public List getRange() { + return range; + } + + public void setRange(List range) { + this.range = range; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyStoragePowVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyStoragePowVo.java index 82d583b..16c3162 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyStoragePowVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/EnergyStoragePowVo.java @@ -3,14 +3,20 @@ package com.xzzn.ems.domain.vo; import java.math.BigDecimal; /** - * 实时运行-储能功率数据 + * 实时运行-有功无功功率数据 * */ public class EnergyStoragePowVo { /** - * 月份 月+日 + * 游标显示日期 */ - private String monthDay; + private String dateDay; + + /** + * 显示日期 + */ + + private String createDate; /** * pcs实时有功功率 @@ -22,22 +28,24 @@ public class EnergyStoragePowVo { */ private BigDecimal pcsTotalReactivePower; - /** - * pcs昨日有功功率 - */ - private BigDecimal pcsYtdActPower; + private String deviceId; - /** - * pcs昨日无功功率 - */ - private BigDecimal pcsYtdReactivePower; + private String groupTime; - public String getMonthDay() { - return monthDay; + public String getDeviceId() { + return deviceId; } - public void setMonthDay(String monthDay) { - this.monthDay = monthDay; + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getCreateDate() { + return createDate; + } + + public void setCreateDate(String createDate) { + this.createDate = createDate; } public BigDecimal getPcsTotalActPower() { @@ -52,23 +60,23 @@ public class EnergyStoragePowVo { return pcsTotalReactivePower; } + public String getDateDay() { + return dateDay; + } + + public void setDateDay(String dateDay) { + this.dateDay = dateDay; + } + + public String getGroupTime() { + return groupTime; + } + + public void setGroupTime(String groupTime) { + this.groupTime = groupTime; + } + public void setPcsTotalReactivePower(BigDecimal pcsTotalReactivePower) { this.pcsTotalReactivePower = pcsTotalReactivePower; } - - public BigDecimal getPcsYtdActPower() { - return pcsYtdActPower; - } - - public void setPcsYtdActPower(BigDecimal pcsYtdActPower) { - this.pcsYtdActPower = pcsYtdActPower; - } - - public BigDecimal getPcsYtdReactivePower() { - return pcsYtdReactivePower; - } - - public void setPcsYtdReactivePower(BigDecimal pcsYtdReactivePower) { - this.pcsYtdReactivePower = pcsYtdReactivePower; - } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryDataVo.java new file mode 100644 index 0000000..0484094 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryDataVo.java @@ -0,0 +1,123 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 综合查询-数据库返回结果 + */ +public class GeneralQueryDataVo { + + // 站点 + private String siteId; + private String deviceId; + private String valueDate; + private Object pointValue; + private String parentDeviceId; + + //箱线图数据 + /** 最小值(Minimum) */ + private BigDecimal min; + /** 第一四分位数(Q1) */ + private BigDecimal q1; + /** 中位数(Median/Q2) */ + private BigDecimal median; + /** 第三四分位数(Q3) */ + private BigDecimal q3; + /** 最大值(Maximum) */ + private BigDecimal max; + + public GeneralQueryDataVo() { + } + + public GeneralQueryDataVo(String siteId, String deviceId, String valueDate, String parentDeviceId, BigDecimal min, BigDecimal q1, BigDecimal median, BigDecimal q3, BigDecimal max) { + this.siteId = siteId; + this.deviceId = deviceId; + this.valueDate = valueDate; + this.parentDeviceId = parentDeviceId; + this.min = min; + this.q1 = q1; + this.median = median; + this.q3 = q3; + this.max = max; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getValueDate() { + return valueDate; + } + + public void setValueDate(String valueDate) { + this.valueDate = valueDate; + } + + public Object getPointValue() { + return pointValue; + } + + public void setPointValue(Object pointValue) { + this.pointValue = pointValue; + } + + public String getParentDeviceId() { + return parentDeviceId; + } + + public void setParentDeviceId(String parentDeviceId) { + this.parentDeviceId = parentDeviceId; + } + + public BigDecimal getMin() { + return min; + } + + public void setMin(BigDecimal min) { + this.min = min; + } + + public BigDecimal getQ1() { + return q1; + } + + public void setQ1(BigDecimal q1) { + this.q1 = q1; + } + + public BigDecimal getMedian() { + return median; + } + + public void setMedian(BigDecimal median) { + this.median = median; + } + + public BigDecimal getQ3() { + return q3; + } + + public void setQ3(BigDecimal q3) { + this.q3 = q3; + } + + public BigDecimal getMax() { + return max; + } + + public void setMax(BigDecimal max) { + this.max = max; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryResponse.java new file mode 100644 index 0000000..99b440a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/GeneralQueryResponse.java @@ -0,0 +1,65 @@ +package com.xzzn.ems.domain.vo; + +import java.util.List; + +/** + * 综合查询结果 + * + */ +public class GeneralQueryResponse { + + // 站点 + private String siteId; + + // 设备数据 + private List deviceList; + + // 点位数据类型,1-瞬时值,2-累计值 + private Long dataType; + + // 点位数据图表类型,1-曲线图,2-箱线图 + private Long chartType; + + public GeneralQueryResponse(String siteId, List deviceList, Long dataType, Long chartType) { + this.siteId = siteId; + this.deviceList = deviceList; + this.dataType = dataType; + this.chartType = chartType; + } + + public GeneralQueryResponse() { + + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public List getDeviceList() { + return deviceList; + } + + public void setDeviceList(List deviceList) { + this.deviceList = deviceList; + } + + public Long getDataType() { + return dataType; + } + + public void setDataType(Long dataType) { + this.dataType = dataType; + } + + public Long getChartType() { + return chartType; + } + + public void setChartType(Long chartType) { + this.chartType = chartType; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java new file mode 100644 index 0000000..d5a6416 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import org.springframework.web.multipart.MultipartFile; + +/** + * 上传设备点位清单请求参数 + */ +public class ImportPointDataRequest { + + /** 站点id */ + @NotBlank(message = "站点ID不能为空") + private String siteId; + /** 设备id */ + @NotBlank(message = "设备ID不能为空") + private String deviceId; + /** 设备类型 */ + @NotBlank(message = "设备类型不能为空") + private String deviceCategory; + /** 上传点位清单文件 */ + @NotNull(message = "点位清单文件不能为空") + private MultipartFile file; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public MultipartFile getFile() { + return file; + } + + public void setFile(MultipartFile file) { + this.file = file; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/LoadDataDetailInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/LoadDataDetailInfo.java new file mode 100644 index 0000000..a019f26 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/LoadDataDetailInfo.java @@ -0,0 +1,76 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电表-总表数据展示 + */ +public class LoadDataDetailInfo +{ + /** 类别 */ + private String category; + + /** 总 (kWh) */ + private BigDecimal totalKwh = BigDecimal.ZERO; + + /** 尖 (kWh) */ + private BigDecimal peakKwh = BigDecimal.ZERO; + + /** 峰 (kWh) */ + private BigDecimal highKwh = BigDecimal.ZERO; + + /** 平 (kWh) */ + private BigDecimal flatKwh = BigDecimal.ZERO; + + /** 谷 (kWh) */ + private BigDecimal valleyKwh = BigDecimal.ZERO; + + + public BigDecimal getValleyKwh() { + return valleyKwh; + } + + public void setValleyKwh(BigDecimal valleyKwh) { + this.valleyKwh = valleyKwh; + } + + public BigDecimal getFlatKwh() { + return flatKwh; + } + + public void setFlatKwh(BigDecimal flatKwh) { + this.flatKwh = flatKwh; + } + + public BigDecimal getPeakKwh() { + return peakKwh; + } + + public void setPeakKwh(BigDecimal peakKwh) { + this.peakKwh = peakKwh; + } + + public BigDecimal getHighKwh() { + return highKwh; + } + + public void setHighKwh(BigDecimal highKwh) { + this.highKwh = highKwh; + } + + public BigDecimal getTotalKwh() { + return totalKwh; + } + + public void setTotalKwh(BigDecimal totalKwh) { + this.totalKwh = totalKwh; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/MeteDataDetailInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/MeteDataDetailInfo.java new file mode 100644 index 0000000..ede89d8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/MeteDataDetailInfo.java @@ -0,0 +1,42 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电表-储能表数据展示 + */ +public class MeteDataDetailInfo +{ + /** 类别:A相 B相 C相*/ + private String category; + + /** 有功功率 */ + private BigDecimal activePower = BigDecimal.ZERO; + + /** 无功功率 */ + private BigDecimal reactivePower = BigDecimal.ZERO; + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public BigDecimal getActivePower() { + return activePower; + } + + public void setActivePower(BigDecimal activePower) { + this.activePower = activePower; + } + + public BigDecimal getReactivePower() { + return reactivePower; + } + + public void setReactivePower(BigDecimal reactivePower) { + this.reactivePower = reactivePower; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/MonthlyTimeRange.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/MonthlyTimeRange.java new file mode 100644 index 0000000..675b410 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/MonthlyTimeRange.java @@ -0,0 +1,49 @@ +package com.xzzn.ems.domain.vo; + +import java.time.LocalDateTime; + +/** + * 每月时间范围实体 + */ +public class MonthlyTimeRange { + // 站点ID + private String siteId; + // 月份(YYYY-MM) + private String month; + // 当月最早时间 + private LocalDateTime firstDataTime; + // 当月最晚时间 + private LocalDateTime lastDataTime; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } + + public LocalDateTime getFirstDataTime() { + return firstDataTime; + } + + public void setFirstDataTime(LocalDateTime firstDataTime) { + this.firstDataTime = firstDataTime; + } + + public LocalDateTime getLastDataTime() { + return lastDataTime; + } + + public void setLastDataTime(LocalDateTime lastDataTime) { + this.lastDataTime = lastDataTime; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSAveTempVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSAveTempVo.java deleted file mode 100644 index 7dac945..0000000 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSAveTempVo.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.xzzn.ems.domain.vo; - -import java.math.BigDecimal; - -/** - * 实时运行-pcs平均温度数据 - * - */ -public class PCSAveTempVo { - /** - * 月份 月+日 - */ - private String monthDay; - - /** - * 实时温度 - */ - private BigDecimal pcsTemp; - - /** - * 昨日同时段温度(到分) - */ - private BigDecimal pcsYtdTemp; - - public String getMonthDay() { - return monthDay; - } - - public void setMonthDay(String monthDay) { - this.monthDay = monthDay; - } - - public BigDecimal getPcsTemp() { - return pcsTemp; - } - - public void setPcsTemp(BigDecimal pcsTemp) { - this.pcsTemp = pcsTemp; - } - - public BigDecimal getPcsYtdTemp() { - return pcsYtdTemp; - } - - public void setPcsYtdTemp(BigDecimal pcsYtdTemp) { - this.pcsYtdTemp = pcsYtdTemp; - } -} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSCurveResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSCurveResponse.java new file mode 100644 index 0000000..cfa956b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PCSCurveResponse.java @@ -0,0 +1,30 @@ +package com.xzzn.ems.domain.vo; + +import java.util.List; + +/** + * 单数据统计-pcs曲线-返回对象 + * + */ +public class PCSCurveResponse { + /** pcs设备id */ + private String deviceId; + /** 数据对象 */ + private List dataList; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public List getDataList() { + return dataList; + } + + public void setDataList(List dataList) { + this.dataList = dataList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsBranchInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsBranchInfo.java index 6b61911..e75cc2c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsBranchInfo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsBranchInfo.java @@ -25,13 +25,13 @@ public class PcsBranchInfo private BigDecimal dcCurrent; /** 站点id */ - private Long siteId; + private String siteId; /** 设备唯一标识符 */ - private Long deviceId; + private String deviceId; /** 支路id */ - private Long branchId; + private String branchId; public String getDischargeStatus() { return dischargeStatus; @@ -65,27 +65,27 @@ public class PcsBranchInfo this.dcCurrent = dcCurrent; } - public Long getSiteId() { + public String getSiteId() { return siteId; } - public void setSiteId(Long siteId) { + public void setSiteId(String siteId) { this.siteId = siteId; } - public Long getDeviceId() { + public String getDeviceId() { return deviceId; } - public void setDeviceId(Long deviceId) { + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getBranchId() { + public String getBranchId() { return branchId; } - public void setBranchId(Long branchId) { + public void setBranchId(String branchId) { this.branchId = branchId; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsDetailInfoVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsDetailInfoVo.java index 1fa77c1..f532a94 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsDetailInfoVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsDetailInfoVo.java @@ -81,29 +81,32 @@ public class PcsDetailInfoVo { private BigDecimal acFrequency; /** 站点id */ - private Long siteId; + private String siteId; /** 设备唯一标识符 */ - private Long deviceId; + private String deviceId; /** 设备名称 */ private String deviceName; + /** 报警个数 */ + private int alarmNum; + private List pcsBranchInfoList; - public Long getDeviceId() { + public String getDeviceId() { return deviceId; } - public void setDeviceId(Long deviceId) { + public void setDeviceId(String deviceId) { this.deviceId = deviceId; } - public Long getSiteId() { + public String getSiteId() { return siteId; } - public void setSiteId(Long siteId) { + public void setSiteId(String siteId) { this.siteId = siteId; } @@ -290,4 +293,12 @@ public class PcsDetailInfoVo { public void setDeviceName(String deviceName) { this.deviceName = deviceName; } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempList.java new file mode 100644 index 0000000..57838fd --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempList.java @@ -0,0 +1,30 @@ +package com.xzzn.ems.domain.vo; + +import java.util.List; + +/** + * 实时运行-PCS最高温度list + * + */ +public class PcsMaxTempList { + + private String deviceId; + // 最高温度数据 + private List maxTempVoList; + + public List getMaxTempVoList() { + return maxTempVoList; + } + + public void setMaxTempVoList(List maxTempVoList) { + this.maxTempVoList = maxTempVoList; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempVo.java new file mode 100644 index 0000000..a336e51 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsMaxTempVo.java @@ -0,0 +1,59 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 实时运行-PCS最高温度 + * + */ +public class PcsMaxTempVo { + + /** + * 游标显示日期 + */ + private String dateDay; + + /** + * 数据时间 + */ + private String createDate; + + /** + * 实时温度 + */ + private BigDecimal temp; + + private String deviceId; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getCreateDate() { + return createDate; + } + + public void setCreateDate(String createDate) { + this.createDate = createDate; + } + + public BigDecimal getTemp() { + return temp; + } + + public void setTemp(BigDecimal temp) { + this.temp = temp; + } + + public String getDateDay() { + return dateDay; + } + + public void setDateDay(String dateDay) { + this.dateDay = dateDay; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsPowerList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsPowerList.java new file mode 100644 index 0000000..88d3190 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsPowerList.java @@ -0,0 +1,32 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 实时运行-PCS数据list + * + */ +public class PcsPowerList { + + private String deviceId; + // 有功和无功功率数据 + private List energyStoragePowList; + + public List getEnergyStoragePowList() { + return energyStoragePowList; + } + + public void setEnergyStoragePowList(List energyStoragePowList) { + this.energyStoragePowList = energyStoragePowList; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsStatisListVo.java new file mode 100644 index 0000000..c5f9384 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PcsStatisListVo.java @@ -0,0 +1,97 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 数据统计-pcs曲线-数据list对象 + */ +public class PcsStatisListVo { + /** + * 数据日期 + */ + private String statisDate; + + /** + * 有功 + */ + private BigDecimal activePower; + + /** + * 无功 + */ + private BigDecimal reactivePower; + + /** + * u电流 + */ + private BigDecimal uCurrent; + + /** + * v电流 + */ + private BigDecimal vCurrent; + + /** + * w电流 + */ + private BigDecimal wCurrent; + + /** pcs设备id */ + private String deviceId; + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getActivePower() { + return activePower; + } + + public void setActivePower(BigDecimal activePower) { + this.activePower = activePower; + } + + public BigDecimal getReactivePower() { + return reactivePower; + } + + public void setReactivePower(BigDecimal reactivePower) { + this.reactivePower = reactivePower; + } + + public BigDecimal getuCurrent() { + return uCurrent; + } + + public void setuCurrent(BigDecimal uCurrent) { + this.uCurrent = uCurrent; + } + + public BigDecimal getvCurrent() { + return vCurrent; + } + + public void setvCurrent(BigDecimal vCurrent) { + this.vCurrent = vCurrent; + } + + public BigDecimal getwCurrent() { + return wCurrent; + } + + public void setwCurrent(BigDecimal wCurrent) { + this.wCurrent = wCurrent; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java new file mode 100644 index 0000000..0ec198f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java @@ -0,0 +1,155 @@ +package com.xzzn.ems.domain.vo; + + +import java.math.BigDecimal; + +import javax.validation.constraints.NotBlank; + +/** + * 设备列表-点位详情-入参 + * + */ +public class PointDataRequest { + /** 站点id */ + @NotBlank(message = "站点ID不能为空") + private String siteId; + /** 设备id */ + @NotBlank(message = "设备ID不能为空") + private String deviceId; + /** 设备类型 */ + @NotBlank(message = "设备类型不能为空") + private String deviceCategory; + /** 排序方式 */ + private String sortMethod; + /** 点位名称-模糊查询 */ + private String dataPointName; + /** 点位-模糊查询 */ + private String dataPoint; + /** 点位匹配字段 */ + private String matchField; + /** 点位数据-范围上下限 */ + private BigDecimal lower; + private BigDecimal upper; + /** 排序字段 */ + private String sortData; + /** 父类deviceId */ + private String parentId; + /** modbus地址 */ + private String ipAddress; + /** modbus端口 */ + private Integer ipPort; + /** 是否告警点位 */ + private Integer isAlarm; + + public Integer getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(Integer isAlarm) { + this.isAlarm = isAlarm; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public Integer getIpPort() { + return ipPort; + } + + public void setIpPort(Integer ipPort) { + this.ipPort = ipPort; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getSortData() { + return sortData; + } + + public void setSortData(String sortData) { + this.sortData = sortData; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public String getSortMethod() { + return sortMethod; + } + + public void setSortMethod(String sortMethod) { + this.sortMethod = sortMethod; + } + + public String getDataPointName() { + return dataPointName; + } + + public void setDataPointName(String dataPointName) { + this.dataPointName = dataPointName; + } + + public String getDataPoint() { + return dataPoint; + } + + public void setDataPoint(String dataPoint) { + this.dataPoint = dataPoint; + } + + public String getMatchField() { + return matchField; + } + + public void setMatchField(String matchField) { + this.matchField = matchField; + } + + public BigDecimal getLower() { + return lower; + } + + public void setLower(BigDecimal lower) { + this.lower = lower; + } + + public BigDecimal getUpper() { + return upper; + } + + public void setUpper(BigDecimal upper) { + this.upper = upper; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java new file mode 100644 index 0000000..392117b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java @@ -0,0 +1,103 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 单站监控-首页-点位重点数据展示 + */ +public class PointDataResponse{ + /** 数据日期 */ + private String statisDate; + /** 电网功率-total_active_power(LOAD) */ + private BigDecimal gridPower; + /** 负载功率 */ + private BigDecimal loadPower; + /** 储能功率-total_active_power(METE) */ + private BigDecimal storagePower; + /** 光伏功率-total_active_power(METEGT) */ + private BigDecimal pvPower; + /** SOC */ + private BigDecimal avgSoc; + /** SOH */ + private BigDecimal avgSoh; + /** 电池平均温度 */ + private BigDecimal avgTemp; + + public PointDataResponse(String statisDate, + BigDecimal pvPower, BigDecimal storagePower, BigDecimal loadPower, BigDecimal gridPower, + BigDecimal avgSoh, BigDecimal avgSoc,BigDecimal avgTemp + ) { + this.avgTemp = avgTemp; + this.avgSoh = avgSoh; + this.avgSoc = avgSoc; + this.pvPower = pvPower; + this.storagePower = storagePower; + this.loadPower = loadPower; + this.gridPower = gridPower; + this.statisDate = statisDate; + } + + public BigDecimal getAvgTemp() { + return avgTemp; + } + + public void setAvgTemp(BigDecimal avgTemp) { + this.avgTemp = avgTemp; + } + + public BigDecimal getAvgSoc() { + return avgSoc; + } + + public void setAvgSoc(BigDecimal avgSoc) { + this.avgSoc = avgSoc; + } + + public BigDecimal getAvgSoh() { + return avgSoh; + } + + public void setAvgSoh(BigDecimal avgSoh) { + this.avgSoh = avgSoh; + } + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getGridPower() { + return gridPower; + } + + public void setGridPower(BigDecimal gridPower) { + this.gridPower = gridPower; + } + + public BigDecimal getLoadPower() { + return loadPower; + } + + public void setLoadPower(BigDecimal loadPower) { + this.loadPower = loadPower; + } + + public BigDecimal getStoragePower() { + return storagePower; + } + + public void setStoragePower(BigDecimal storagePower) { + this.storagePower = storagePower; + } + + public BigDecimal getPvPower() { + return pvPower; + } + + public void setPvPower(BigDecimal pvPower) { + this.pvPower = pvPower; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointNameRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointNameRequest.java new file mode 100644 index 0000000..8552c37 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointNameRequest.java @@ -0,0 +1,92 @@ +package com.xzzn.ems.domain.vo; + +import java.util.List; +import java.util.Map; + +/** + * 点位模糊查询入参 + * + */ +public class PointNameRequest { + + private List siteIds; + + private String deviceCategory; + + private String pointName; + + /** 数据分组 1-分钟 2-小时 3-天 */ + private int dataUnit; + + private String startDate; + + private String endDate; + + private String deviceId; + + private Map> siteDeviceMap; + + public List getSiteIds() { + return siteIds; + } + + public void setSiteIds(List siteIds) { + this.siteIds = siteIds; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public int getDataUnit() { + return dataUnit; + } + + public void setDataUnit(int dataUnit) { + this.dataUnit = dataUnit; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public Map> getSiteDeviceMap() { + return siteDeviceMap; + } + + public void setSiteDeviceMap(Map> siteDeviceMap) { + this.siteDeviceMap = siteDeviceMap; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java new file mode 100644 index 0000000..7ab0445 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java @@ -0,0 +1,144 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; + +import java.util.Date; + +/** + * 设备列表-点位详情返回 + */ +public class PointQueryResponse +{ + /** 点位名称 */ + @Excel(name = "点位名称") + private String pointName; + + /** 点位匹配字段 */ + @Excel(name = "点位匹配字段") + private String matchField; + + /** 数据点位 */ + @Excel(name = "数据点位") + private String dataPoint; + + /** 数据点位名称 */ + @Excel(name = "数据点位名称") + private String dataPointName; + + /** 数据点位来源设备 */ + @Excel(name = "数据点位来源设备") + private String dataDevice; + + /** 数据点位来源设备 */ + @Excel(name = "点位最新数据") + private Object pointValue; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 点位是否需要匹配多设备 */ + @Excel(name = "点位最新数据") + private int isNeedDeviceId; + + /** 数据单位 */ + @Excel(name = "数据单位") + private String dataUnit; + + /** 地址 */ + @Excel(name = "寄存器地址") + private String ipAddress; + + /** 端口 */ + @Excel(name = "端口") + private String ipPort; + + public void setDataUnit(String dataUnit) { + this.dataUnit = dataUnit; + } + + public int getIsNeedDeviceId() { + return isNeedDeviceId; + } + + public void setIsNeedDeviceId(int isNeedDeviceId) { + this.isNeedDeviceId = isNeedDeviceId; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Object getPointValue() { + return pointValue; + } + + public void setPointValue(Object pointValue) { + this.pointValue = pointValue; + } + + public String getDataDevice() { + return dataDevice; + } + + public void setDataDevice(String dataDevice) { + this.dataDevice = dataDevice; + } + + public String getDataPointName() { + return dataPointName; + } + + public void setDataPointName(String dataPointName) { + this.dataPointName = dataPointName; + } + + public String getDataPoint() { + return dataPoint; + } + + public void setDataPoint(String dataPoint) { + this.dataPoint = dataPoint; + } + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public String getMatchField() { + return matchField; + } + + public void setMatchField(String matchField) { + this.matchField = matchField; + } + + public String getDataUnit() { + return dataUnit; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public String getIpPort() { + return ipPort; + } + + public void setIpPort(String ipPort) { + this.ipPort = ipPort; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PowerStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PowerStatisListVo.java new file mode 100644 index 0000000..dfe5702 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PowerStatisListVo.java @@ -0,0 +1,82 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 数据统计-功率曲线 + */ +public class PowerStatisListVo { + /** + * 数据日期 + */ + private String statisDate; + + /** + * 电网功率-total_active_power(LOAD) + */ + private BigDecimal gridPower; + + /** + * 负载功率 + */ + private BigDecimal loadPower; + + /** + * 储能功率-total_active_power(METE) + */ + private BigDecimal storagePower; + + /** + * 光伏功率-total_active_power(METEGT) + */ + private BigDecimal pvPower; + + public PowerStatisListVo() {} + + public PowerStatisListVo(String statisDate, BigDecimal gridPower, BigDecimal storagePower, BigDecimal pvPower) { + this.statisDate = statisDate; + this.gridPower = gridPower; + this.storagePower = storagePower; + this.pvPower = pvPower; + } + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getGridPower() { + return gridPower; + } + + public void setGridPower(BigDecimal gridPower) { + this.gridPower = gridPower; + } + + public BigDecimal getLoadPower() { + return loadPower; + } + + public void setLoadPower(BigDecimal loadPower) { + this.loadPower = loadPower; + } + + public BigDecimal getStoragePower() { + return storagePower; + } + + public void setStoragePower(BigDecimal storagePower) { + this.storagePower = storagePower; + } + + public BigDecimal getPvPower() { + return pvPower; + } + + public void setPvPower(BigDecimal pvPower) { + this.pvPower = pvPower; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionPlanVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionPlanVo.java new file mode 100644 index 0000000..c6d12b0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionPlanVo.java @@ -0,0 +1,74 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 告警保护方案-保护方案设置 + */ +public class ProtectionPlanVo { + /** 设备 */ + private String deviceId; + + /** 点位 */ + private String point; + + /** 点位名称 */ + private String pointName; + + /** 设置值 */ + private BigDecimal value; + + /** 设备类型 */ + private String deviceCategory; + + /** 设备类型名称 */ + private String categoryName; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public BigDecimal getValue() { + return value; + } + + public void setValue(BigDecimal value) { + this.value = value; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionSettingVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionSettingVo.java new file mode 100644 index 0000000..0105255 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ProtectionSettingVo.java @@ -0,0 +1,129 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 告警保护方案-保护前提设置 + */ +public class ProtectionSettingVo { + /** 设备 */ + private String deviceId; + + /** 设备名称 */ + private String deviceName; + + /** 点位 */ + private String point; + + /** 点位名称 */ + private String pointName; + + /** 故障值 */ + private BigDecimal faultValue; + + /** 故障值比较方式 如"<="、"<"、"=="、">="、">" */ + private String faultOperator; + + /** 释放值 */ + private BigDecimal releaseValue; + + /** 释放值比较方式 如"<="、"<"、"=="、">="、">"*/ + private String releaseOperator; + + /** 与下一点位关系: && 、|| */ + private String relationNext; + + /** 设备类型 */ + private String deviceCategory; + + /** 设备类型名称 */ + private String categoryName; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getPointName() { + return pointName; + } + + public void setPointName(String pointName) { + this.pointName = pointName; + } + + public BigDecimal getFaultValue() { + return faultValue; + } + + public void setFaultValue(BigDecimal faultValue) { + this.faultValue = faultValue; + } + + public String getFaultOperator() { + return faultOperator; + } + + public void setFaultOperator(String faultOperator) { + this.faultOperator = faultOperator; + } + + public BigDecimal getReleaseValue() { + return releaseValue; + } + + public void setReleaseValue(BigDecimal releaseValue) { + this.releaseValue = releaseValue; + } + + public String getReleaseOperator() { + return releaseOperator; + } + + public void setReleaseOperator(String releaseOperator) { + this.releaseOperator = releaseOperator; + } + + public String getRelationNext() { + return relationNext; + } + + public void setRelationNext(String relationNext) { + this.relationNext = relationNext; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/RunningGraphRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/RunningGraphRequest.java new file mode 100644 index 0000000..a144147 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/RunningGraphRequest.java @@ -0,0 +1,45 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 实时运行曲线图请求参数 + */ +public class RunningGraphRequest { + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + private String siteId; + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SingleSiteBaseInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SingleSiteBaseInfo.java index 2ed5d77..4bd14b9 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SingleSiteBaseInfo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SingleSiteBaseInfo.java @@ -51,12 +51,12 @@ public class SingleSiteBaseInfo { /** * 装机功率(MW) */ - private BigDecimal installedPower; + private BigDecimal installPower; /** * 装机容量(MW) */ - private BigDecimal installedCap; + private BigDecimal installCapacity; /** * 七天放电统计 @@ -79,20 +79,20 @@ public class SingleSiteBaseInfo { this.dayChargedCap = dayChargedCap; } - public BigDecimal getInstalledCap() { - return installedCap; + public BigDecimal getInstallPower() { + return installPower; } - public void setInstalledCap(BigDecimal installedCap) { - this.installedCap = installedCap; + public void setInstallPower(BigDecimal installPower) { + this.installPower = installPower; } - public BigDecimal getInstalledPower() { - return installedPower; + public BigDecimal getInstallCapacity() { + return installCapacity; } - public void setInstalledPower(BigDecimal installedPower) { - this.installedPower = installedPower; + public void setInstallCapacity(BigDecimal installCapacity) { + this.installCapacity = installCapacity; } public String getRunningTime() { diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryDataList.java new file mode 100644 index 0000000..aed6e02 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryDataList.java @@ -0,0 +1,36 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; + +import java.util.List; + +/** + * 单站监控-单体电池返回数据 + * + */ +public class SiteBatteryDataList { + + // 簇相关单体最大最小值list + @Excel(name = "簇单体最大最小值list") + List clusterList; + + // 单体电池list + @Excel(name = "单体电池list") + List batteryList; + + public List getClusterList() { + return clusterList; + } + + public void setClusterList(List clusterList) { + this.clusterList = clusterList; + } + + public List getBatteryList() { + return batteryList; + } + + public void setBatteryList(List batteryList) { + this.batteryList = batteryList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryListVo.java new file mode 100644 index 0000000..94eb5dc --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteBatteryListVo.java @@ -0,0 +1,27 @@ +package com.xzzn.ems.domain.vo; + +/** + * 综合查询-站点下单体电池实际数据 + * + */ +public class SiteBatteryListVo { + /** 站点id */ + private String siteId; + private String deviceId; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteDeviceListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteDeviceListVo.java new file mode 100644 index 0000000..9de8512 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteDeviceListVo.java @@ -0,0 +1,138 @@ +package com.xzzn.ems.domain.vo; + +/** + * 站点管理-站点设备列表 + * + */ +public class SiteDeviceListVo { + /** 站点id */ + private String siteId; + /** 站点名称 */ + private String siteName; + /** 设备id */ + private String deviceId; + /** 设备名称 */ + private String deviceName; + /** 设备类型 */ + private String deviceType; + /** 运行状态 */ + private String deviceStatus; + /** 工作状态 */ + private String workStatus; + /** 设备类型 */ + private String deviceCategory; + /** 设备类型 */ + private String pictureUrl; + /** 唯一标识 */ + private String id; + /** 父类id */ + private String parentId; + /** 单体电池个数-仅stack设备下有 */ + private int batteryNum; + /** 设备类型名称 */ + private String categoryName; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public String getSiteName() { + return siteName; + } + + public void setSiteName(String siteName) { + this.siteName = siteName; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceType() { + return deviceType; + } + + public void setDeviceType(String deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(String deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getWorkStatus() { + return workStatus; + } + + public void setWorkStatus(String workStatus) { + this.workStatus = workStatus; + } + + public String getDeviceCategory() { + return deviceCategory; + } + + public void setDeviceCategory(String deviceCategory) { + this.deviceCategory = deviceCategory; + } + + public String getPictureUrl() { + return pictureUrl; + } + + public void setPictureUrl(String pictureUrl) { + this.pictureUrl = pictureUrl; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public int getBatteryNum() { + return batteryNum; + } + + public void setBatteryNum(int batteryNum) { + this.batteryNum = batteryNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorDataVo.java index e68c14d..a2aaf1f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorDataVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorDataVo.java @@ -22,6 +22,12 @@ public class SiteMonitorDataVo { */ private BigDecimal chargedCap; + private BigDecimal dailyEfficiency; + + private BigDecimal totalChargedCap; + + private BigDecimal totalDisChargedCap; + public String getAmmeterDate() { return ammeterDate; } @@ -45,4 +51,28 @@ public class SiteMonitorDataVo { public void setChargedCap(BigDecimal chargedCap) { this.chargedCap = chargedCap; } + + public BigDecimal getDailyEfficiency() { + return dailyEfficiency; + } + + public void setDailyEfficiency(BigDecimal dailyEfficiency) { + this.dailyEfficiency = dailyEfficiency; + } + + public BigDecimal getTotalChargedCap() { + return totalChargedCap; + } + + public void setTotalChargedCap(BigDecimal totalChargedCap) { + this.totalChargedCap = totalChargedCap; + } + + public BigDecimal getTotalDisChargedCap() { + return totalDisChargedCap; + } + + public void setTotalDisChargedCap(BigDecimal totalDisChargedCap) { + this.totalDisChargedCap = totalDisChargedCap; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeAlarmVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeAlarmVo.java index f8f29e3..87722c7 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeAlarmVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeAlarmVo.java @@ -20,6 +20,14 @@ public class SiteMonitorHomeAlarmVo { */ private String alarmContent; + /** + * 工单号 + */ + private String ticketNo; + + /** 告警唯一标识 */ + private String id; + public String getDeviceName() { return deviceName; } @@ -43,4 +51,20 @@ public class SiteMonitorHomeAlarmVo { public void setStatus(int status) { this.status = status; } + + public String getTicketNo() { + return ticketNo; + } + + public void setTicketNo(String ticketNo) { + this.ticketNo = ticketNo; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java index 0c8b748..55dba0d 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java @@ -20,6 +20,16 @@ public class SiteMonitorHomeVo { */ private BigDecimal dayDisChargedCap; + /** + * 昨日充电量 + */ + private BigDecimal yesterdayChargedCap; + + /** + * 昨日放电量 + */ + private BigDecimal yesterdayDisChargedCap; + /** * 总充电量 */ @@ -60,6 +70,50 @@ public class SiteMonitorHomeVo { */ private List siteMonitorDataVo; + /** + * 策略显示 + */ + private StrategyTempInfo strategyTempInfo; + + /** + * 总收入 + */ + private BigDecimal totalRevenue; + + /** + * 当日实时收入 + */ + private BigDecimal dayRevenue; + + /** + * 昨日实时收入 + */ + private BigDecimal yesterdayRevenue; + + public BigDecimal getTotalRevenue() { + return totalRevenue; + } + + public void setTotalRevenue(BigDecimal totalRevenue) { + this.totalRevenue = totalRevenue; + } + + public BigDecimal getDayRevenue() { + return dayRevenue; + } + + public void setDayRevenue(BigDecimal dayRevenue) { + this.dayRevenue = dayRevenue; + } + + public BigDecimal getYesterdayRevenue() { + return yesterdayRevenue; + } + + public void setYesterdayRevenue(BigDecimal yesterdayRevenue) { + this.yesterdayRevenue = yesterdayRevenue; + } + public BigDecimal getDayChargedCap() { return dayChargedCap; } @@ -76,6 +130,22 @@ public class SiteMonitorHomeVo { this.dayDisChargedCap = dayDisChargedCap; } + public BigDecimal getYesterdayChargedCap() { + return yesterdayChargedCap; + } + + public void setYesterdayChargedCap(BigDecimal yesterdayChargedCap) { + this.yesterdayChargedCap = yesterdayChargedCap; + } + + public BigDecimal getYesterdayDisChargedCap() { + return yesterdayDisChargedCap; + } + + public void setYesterdayDisChargedCap(BigDecimal yesterdayDisChargedCap) { + this.yesterdayDisChargedCap = yesterdayDisChargedCap; + } + public BigDecimal getTotalChargedCap() { return totalChargedCap; } @@ -139,4 +209,12 @@ public class SiteMonitorHomeVo { public void setSiteMonitorDataVo(List siteMonitorDataVo) { this.siteMonitorDataVo = siteMonitorDataVo; } + + public StrategyTempInfo getStrategyTempInfo() { + return strategyTempInfo; + } + + public void setStrategyTempInfo(StrategyTempInfo strategyTempInfo) { + this.strategyTempInfo = strategyTempInfo; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningInfoVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningInfoVo.java index 8b52473..1063752 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningInfoVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningInfoVo.java @@ -8,17 +8,17 @@ import java.util.List; */ public class SiteMonitorRuningInfoVo { /** - * 储能功率list + * PCS有功和无功功率 */ - private List energyStoragePowList; + private List pcsPowerList; /** - * pcs平均温度list + * PCS最高温度 */ - private List pcsAveTempList; + private List pcsMaxTempList; /** - * 电池平均soclist + * 平均soclist */ private List batteryAveSOCList; @@ -27,20 +27,20 @@ public class SiteMonitorRuningInfoVo { */ private List batteryAveTempList; - public List getEnergyStoragePowList() { - return energyStoragePowList; + public List getPcsPowerList() { + return pcsPowerList; } - public void setEnergyStoragePowList(List energyStoragePowList) { - this.energyStoragePowList = energyStoragePowList; + public void setPcsPowerList(List pcsPowerList) { + this.pcsPowerList = pcsPowerList; } - public List getPcsAveTempList() { - return pcsAveTempList; + public List getPcsMaxTempList() { + return pcsMaxTempList; } - public void setPcsAveTempList(List pcsAveTempList) { - this.pcsAveTempList = pcsAveTempList; + public void setPcsMaxTempList(List pcsMaxTempList) { + this.pcsMaxTempList = pcsMaxTempList; } public List getBatteryAveSOCList() { diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningHeadInfoVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRunningHeadInfoVo.java similarity index 87% rename from ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningHeadInfoVo.java rename to ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRunningHeadInfoVo.java index 1e87d0f..068f75f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRuningHeadInfoVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorRunningHeadInfoVo.java @@ -6,7 +6,7 @@ import java.math.BigDecimal; * 单站监控-设备监控-实时运行头部行数据 * */ -public class SiteMonitorRuningHeadInfoVo { +public class SiteMonitorRunningHeadInfoVo { /** * 实时有功功率 */ @@ -37,6 +37,11 @@ public class SiteMonitorRuningHeadInfoVo { */ private BigDecimal dayDisChargedCap; + /** + * 站点id + */ + private String siteId; + public BigDecimal getTotalActivePower() { return totalActivePower; } @@ -84,4 +89,12 @@ public class SiteMonitorRuningHeadInfoVo { public void setDayDisChargedCap(BigDecimal dayDisChargedCap) { this.dayDisChargedCap = dayDisChargedCap; } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackCurveResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackCurveResponse.java new file mode 100644 index 0000000..e267d42 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackCurveResponse.java @@ -0,0 +1,30 @@ +package com.xzzn.ems.domain.vo; + +import java.util.List; + +/** + * 数据统计-堆曲线-返回对象 + * + */ +public class StackCurveResponse { + /** pcs设备id */ + private String deviceId; + /** 数据对象 */ + private List dataList; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public List getDataList() { + return dataList; + } + + public void setDataList(List dataList) { + this.dataList = dataList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java new file mode 100644 index 0000000..b2e5cf8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java @@ -0,0 +1,51 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 单站监控-首页-电池堆点位数据 + */ +public class StackPointVo{ + + private String statisDate; + /** SOC */ + private BigDecimal avgSoc; + + /** SOH */ + private BigDecimal avgSoh; + + /** 电池平均温度 */ + private BigDecimal avgTemp; + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getAvgTemp() { + return avgTemp; + } + + public void setAvgTemp(BigDecimal avgTemp) { + this.avgTemp = avgTemp; + } + + public BigDecimal getAvgSoc() { + return avgSoc; + } + + public void setAvgSoc(BigDecimal avgSoc) { + this.avgSoc = avgSoc; + } + + public BigDecimal getAvgSoh() { + return avgSoh; + } + + public void setAvgSoh(BigDecimal avgSoh) { + this.avgSoh = avgSoh; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java new file mode 100644 index 0000000..58fe490 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java @@ -0,0 +1,84 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 数据统计-堆曲线-数据list对象 + */ +public class StackStatisListVo { + /** + * 数据日期 + */ + private String statisDate; + + /** + * 温度 + */ + private BigDecimal temp; + + /** + * 电压 + */ + private BigDecimal voltage; + + /** + * u电流 + */ + private BigDecimal current; + + /** + * v电流 + */ + private BigDecimal soc; + + /** pcs设备id */ + private String deviceId; + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getTemp() { + return temp; + } + + public void setTemp(BigDecimal temp) { + this.temp = temp; + } + + public BigDecimal getVoltage() { + return voltage; + } + + public void setVoltage(BigDecimal voltage) { + this.voltage = voltage; + } + + public BigDecimal getCurrent() { + return current; + } + + public void setCurrent(BigDecimal current) { + this.current = current; + } + + public BigDecimal getSoc() { + return soc; + } + + public void setSoc(BigDecimal soc) { + this.soc = soc; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisAmmeterDateRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisAmmeterDateRequest.java new file mode 100644 index 0000000..9b83def --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisAmmeterDateRequest.java @@ -0,0 +1,37 @@ +package com.xzzn.ems.domain.vo; + + +/** + * 报表统计-电表报表入参 + * + */ +public class StatisAmmeterDateRequest { + + private String startTime; + private String endTime; + private String siteId; + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisClusterDateRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisClusterDateRequest.java new file mode 100644 index 0000000..214949e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StatisClusterDateRequest.java @@ -0,0 +1,57 @@ +package com.xzzn.ems.domain.vo; + + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 电池簇-电池温度等数据入参 + * + */ +public class StatisClusterDateRequest { + + /** + * 筛选时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date dateTime; + + private String stackId; + + private String clusterId; + + private String siteId; + + public Date getDateTime() { + return dateTime; + } + + public void setDateTime(Date dateTime) { + this.dateTime = dateTime; + } + + public String getStackId() { + return stackId; + } + + public void setStackId(String stackId) { + this.stackId = stackId; + } + + public String getClusterId() { + return clusterId; + } + + public void setClusterId(String clusterId) { + this.clusterId = clusterId; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyCurveVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyCurveVo.java new file mode 100644 index 0000000..2d7959f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyCurveVo.java @@ -0,0 +1,82 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; +import com.xzzn.ems.domain.EmsStrategyCurve; + +import java.util.List; + +/** + *策略模块曲线图 + * + * @author xzzn + * @date 2025-07-13 + */ +public class StrategyCurveVo +{ + + /** 站点id */ + private String siteId; + + /** 关联的策略ID */ + private Long strategyId; + + /** 模板名称 */ + private String templateName; + + /** 模板id */ + private String templateId; + + /** 月份 */ + private Long month; + + /** 模板时间功率 */ + List powerList; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public Long getStrategyId() { + return strategyId; + } + + public void setStrategyId(Long strategyId) { + this.strategyId = strategyId; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public Long getMonth() { + return month; + } + + public void setMonth(Long month) { + this.month = month; + } + + public List getPowerList() { + return powerList; + } + + public void setPowerList(List powerList) { + this.powerList = powerList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyPowerDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyPowerDataVo.java new file mode 100644 index 0000000..0501d70 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyPowerDataVo.java @@ -0,0 +1,47 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; +import java.math.BigDecimal; + +/** + * 策略模板的功率数据 + * + * @author xzzn + * @date 2025-07-13 + */ +public class StrategyPowerDataVo +{ + /** 开始时间 */ + private String startTime; + + /** 结束时间 */ + private String endTime; + + /** 充放功率 (kW) */ + @Excel(name = "充放功率 (kW)") + private BigDecimal powerData; + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public BigDecimal getPowerData() { + return powerData; + } + + public void setPowerData(BigDecimal powerData) { + this.powerData = powerData; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyRunningVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyRunningVo.java new file mode 100644 index 0000000..4bac091 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyRunningVo.java @@ -0,0 +1,104 @@ +package com.xzzn.ems.domain.vo; + +/** + * 策略运行对象 + * + * @author xzzn + * @date 2025-07-10 + */ +public class StrategyRunningVo +{ + /** 策略状态:0-未启用 1-已运行 2-已暂停 3-禁用 4-删除 */ + private String status; + + /** 主策略名称 */ + private String mainStrategyName; + + /** 辅助策略名称 */ + private String auxStrategyName; + + /** 站点id */ + private String siteId; + + /** 设备唯一标识符 */ + private String deviceId; + + /** 策略运行id */ + private Long id; + + /** 主策略id */ + private Long mainStrategyId; + + /** 辅助策略id */ + private Long auxStrategyId; + + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + public String getMainStrategyName() { + return mainStrategyName; + } + + public void setMainStrategyName(String mainStrategyName) { + this.mainStrategyName = mainStrategyName; + } + + public String getAuxStrategyName() { + return auxStrategyName; + } + + public void setAuxStrategyName(String auxStrategyName) { + this.auxStrategyName = auxStrategyName; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setDeviceId(String deviceId) + { + this.deviceId = deviceId; + } + + public String getDeviceId() + { + return deviceId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAuxStrategyId() { + return auxStrategyId; + } + + public void setAuxStrategyId(Long auxStrategyId) { + this.auxStrategyId = auxStrategyId; + } + + public Long getMainStrategyId() { + return mainStrategyId; + } + + public void setMainStrategyId(Long mainStrategyId) { + this.mainStrategyId = mainStrategyId; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempConfigRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempConfigRequest.java new file mode 100644 index 0000000..f05d001 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempConfigRequest.java @@ -0,0 +1,115 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.ems.domain.EmsStrategyTempTimeConfig; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 新增模板+模板时间数据 + * + * @author xzzn + * @date 2025-07-12 + */ +public class StrategyTempConfigRequest +{ + + /** 模板id */ + private String templateId; + /** 站点id */ + private String siteId; + + /** 关联的策略ID */ + private Long strategyId; + + /** 模板名称,如“模板一” */ + private String templateName; + + /** SDC限制 (%) 1 = 开,0 = 关 */ + private Integer sdcLimit; + + /** SDC下限 (%) */ + private BigDecimal sdcDown; + + /** SDC上限 (%) */ + private BigDecimal sdcUp; + + /** 模板时间 */ + private List timeConfigList; + + public String getTemplateId() { + return templateId; + } + + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setTemplateName(String templateName) + { + this.templateName = templateName; + } + + public String getTemplateName() + { + return templateName; + } + + public void setSdcLimit(Integer sdcLimit) + { + this.sdcLimit = sdcLimit; + } + + public Integer getSdcLimit() + { + return sdcLimit; + } + + public void setSdcDown(BigDecimal sdcDown) + { + this.sdcDown = sdcDown; + } + + public BigDecimal getSdcDown() + { + return sdcDown; + } + + public void setSdcUp(BigDecimal sdcUp) + { + this.sdcUp = sdcUp; + } + + public BigDecimal getSdcUp() + { + return sdcUp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public List getTimeConfigList() { + return timeConfigList; + } + + public void setTimeConfigList(List timeConfigList) { + this.timeConfigList = timeConfigList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempInfo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempInfo.java new file mode 100644 index 0000000..13f7a4f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempInfo.java @@ -0,0 +1,37 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.ems.domain.EmsStrategyTemp; + +import java.util.List; + +/** + * 单站首页-策略显示 + * + */ +public class StrategyTempInfo { + + /* + * 主策略名称 + */ + private String mainStrategyName; + /** + * 模板时间 + */ + private List siteMonitorDataVo; + + public String getMainStrategyName() { + return mainStrategyName; + } + + public void setMainStrategyName(String mainStrategyName) { + this.mainStrategyName = mainStrategyName; + } + + public List getSiteMonitorDataVo() { + return siteMonitorDataVo; + } + + public void setSiteMonitorDataVo(List siteMonitorDataVo) { + this.siteMonitorDataVo = siteMonitorDataVo; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempTimeConfigVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempTimeConfigVo.java new file mode 100644 index 0000000..a3ef8d4 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTempTimeConfigVo.java @@ -0,0 +1,152 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 模板+模板时间数据 + * + * @author xzzn + * @date 2025-07-12 + */ +public class StrategyTempTimeConfigVo +{ + /** 模版id */ + private Long id; + + /** 关联的策略ID */ + private Long strategyId; + + /** 模板名称,如“模板一” */ + private String templateName; + + /** SDC限制 (%) 1 = 开,0 = 关 */ + private Integer sdcLimit; + + /** SDC下限 (%) */ + private BigDecimal sdcDown; + + /** SDC上限 (%) */ + private BigDecimal sdcUp; + + /** 站点id */ + private String siteId; + + /** 开始时间 */ + @JsonFormat(pattern = "HH:mm:ss") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "HH:mm:ss") + private Date endTime; + + /** 充放功率 (kW) */ + private BigDecimal chargeDischargePower; + + /** 充电状态,如“1-充电”、“2-待机” */ + private String chargeStatus; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setTemplateName(String templateName) + { + this.templateName = templateName; + } + + public String getTemplateName() + { + return templateName; + } + + public void setSdcLimit(Integer sdcLimit) + { + this.sdcLimit = sdcLimit; + } + + public Integer getSdcLimit() + { + return sdcLimit; + } + + public void setSdcDown(BigDecimal sdcDown) + { + this.sdcDown = sdcDown; + } + + public BigDecimal getSdcDown() + { + return sdcDown; + } + + public void setSdcUp(BigDecimal sdcUp) + { + this.sdcUp = sdcUp; + } + + public BigDecimal getSdcUp() + { + return sdcUp; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public BigDecimal getChargeDischargePower() { + return chargeDischargePower; + } + + public void setChargeDischargePower(BigDecimal chargeDischargePower) { + this.chargeDischargePower = chargeDischargePower; + } + + public String getChargeStatus() { + return chargeStatus; + } + + public void setChargeStatus(String chargeStatus) { + this.chargeStatus = chargeStatus; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTimeConfigVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTimeConfigVo.java new file mode 100644 index 0000000..4d7a202 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StrategyTimeConfigVo.java @@ -0,0 +1,99 @@ +package com.xzzn.ems.domain.vo; + +/** + * 时间配置显示对象 + * + * @author xzzn + * @date 2025-07-12 + */ +public class StrategyTimeConfigVo +{ + /** */ + private Long id; + + /** 关联的策略ID */ + private Long strategyId; + + /** 月份,1-12 */ + private Long month; + + /** 站点id */ + private String siteId; + + /** 充放电模式 */ + private String chargeDischargeMode; + + /** 模板id */ + private String templateId; + + /** 模板名称 */ + private String templateName; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + + public void setStrategyId(Long strategyId) + { + this.strategyId = strategyId; + } + + public Long getStrategyId() + { + return strategyId; + } + + public void setMonth(Long month) + { + this.month = month; + } + + public Long getMonth() + { + return month; + } + + public void setChargeDischargeMode(String chargeDischargeMode) + { + this.chargeDischargeMode = chargeDischargeMode; + } + + public String getChargeDischargeMode() + { + return chargeDischargeMode; + } + + public void setSiteId(String siteId) + { + this.siteId = siteId; + } + + public String getSiteId() + { + return siteId; + } + + public void setTemplateId(String templateId) + { + this.templateId = templateId; + } + + public String getTemplateId() + { + return templateId; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTempVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTempVo.java new file mode 100644 index 0000000..49407c9 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTempVo.java @@ -0,0 +1,39 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; +import com.xzzn.ems.domain.EmsStrategyTemp; + +/** + * 同步策略模版对象 + * + * @author xzzn + * @date 2025-11-16 + */ +public class SyncStrategyTempVo extends EmsStrategyTemp +{ + private static final long serialVersionUID = 1L; + + /** 策略名称,如“削峰填谷” */ + @Excel(name = "策略名称,如“削峰填谷”") + private String strategyName; + + /** 策略类型:1 - 主策略;2 - 辅助策略 */ + @Excel(name = "策略类型:1 - 主策略;2 - 辅助策略") + private Long strategyType; + + public String getStrategyName() { + return strategyName; + } + + public void setStrategyName(String strategyName) { + this.strategyName = strategyName; + } + + public Long getStrategyType() { + return strategyType; + } + + public void setStrategyType(Long strategyType) { + this.strategyType = strategyType; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTimeConfigVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTimeConfigVo.java new file mode 100644 index 0000000..71fe0bd --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SyncStrategyTimeConfigVo.java @@ -0,0 +1,40 @@ +package com.xzzn.ems.domain.vo; + +import com.xzzn.common.annotation.Excel; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; + +/** + * 同步策略时间配置对象 + * + * @author xzzn + * @date 2025-11-16 + */ +public class SyncStrategyTimeConfigVo extends EmsStrategyTimeConfig +{ + private static final long serialVersionUID = 1L; + + /** 策略名称,如“削峰填谷” */ + @Excel(name = "策略名称,如“削峰填谷”") + private String strategyName; + + /** 策略类型:1 - 主策略;2 - 辅助策略 */ + @Excel(name = "策略类型:1 - 主策略;2 - 辅助策略") + private Long strategyType; + + public String getStrategyName() { + return strategyName; + } + + public void setStrategyName(String strategyName) { + this.strategyName = strategyName; + } + + public Long getStrategyType() { + return strategyType; + } + + public void setStrategyType(Long strategyType) { + this.strategyType = strategyType; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SystemEfficiencyList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SystemEfficiencyList.java index 7fe89f8..6fe7c40 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SystemEfficiencyList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SystemEfficiencyList.java @@ -9,18 +9,18 @@ public class SystemEfficiencyList { /** * 月份 */ - private int dateMonth; + private String dateMonth; /** * 系统效率 */ private BigDecimal systemEfficiency; - public int getDateMonth() { + public String getDateMonth() { return dateMonth; } - public void setDateMonth(int dateMonth) { + public void setDateMonth(String dateMonth) { this.dateMonth = dateMonth; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/TicketListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TicketListVo.java new file mode 100644 index 0000000..22d90ec --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TicketListVo.java @@ -0,0 +1,40 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.core.domain.BaseEntity; +import com.xzzn.ems.domain.EmsTicket; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 工单列表对象 + * + */ +public class TicketListVo extends EmsTicket +{ + private static final long serialVersionUID = 1L; + + // 提交人姓名 + private String userName; + // 处理人姓名 + private String workName; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getWorkName() { + return workName; + } + + public void setWorkName(String workName) { + this.workName = workName; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointQuery.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointQuery.java new file mode 100644 index 0000000..207d291 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointQuery.java @@ -0,0 +1,33 @@ +package com.xzzn.ems.domain.vo; + +import java.time.LocalDateTime; + +/** + * 时间点参数实体 + */ +public class TimePointQuery { + private String siteId; + // 要查询的时间点 + private LocalDateTime dataTime; + + public TimePointQuery(String siteId, LocalDateTime dataTime) { + this.siteId = siteId; + this.dataTime = dataTime; + } + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public LocalDateTime getDataTime() { + return dataTime; + } + + public void setDataTime(LocalDateTime dataTime) { + this.dataTime = dataTime; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointValue.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointValue.java new file mode 100644 index 0000000..95c75f5 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/TimePointValue.java @@ -0,0 +1,48 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 时间点-总充放电数据 + */ +public class TimePointValue { + private String siteId; + private LocalDateTime dataUpdateTime; + // 总充电量 + private BigDecimal totalChargeData; + // 总放电量 + private BigDecimal totalDischargeData; + + public String getSiteId() { + return siteId; + } + + public void setSiteId(String siteId) { + this.siteId = siteId; + } + + public LocalDateTime getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(LocalDateTime dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public BigDecimal getTotalChargeData() { + return totalChargeData; + } + + public void setTotalChargeData(BigDecimal totalChargeData) { + this.totalChargeData = totalChargeData; + } + + public BigDecimal getTotalDischargeData() { + return totalDischargeData; + } + + public void setTotalDischargeData(BigDecimal totalDischargeData) { + this.totalDischargeData = totalDischargeData; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/XfDataVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/XfDataVo.java new file mode 100644 index 0000000..31b8be8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/XfDataVo.java @@ -0,0 +1,113 @@ +package com.xzzn.ems.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xzzn.common.annotation.Excel; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 消防数据 + */ +public class XfDataVo { + + /** 设备唯一标识符 */ + private String deviceId; + + /** 消防名称 */ + private String deviceName; + + /** 通信状态 */ + private String emsCommunicationStatus; + + /** 数据更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date dataUpdateTime; + + /** 主电源备用电池状态 */ + private BigDecimal dczt; + + /** 手自动状态延时状态 */ + private BigDecimal yszt; + + /** 启动喷洒气体喷洒状态 */ + private BigDecimal pszt; + + /** 压力开关状态电磁阀状态 */ + private BigDecimal dcfzt; + + /** 报警个数 */ + private int alarmNum; + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getEmsCommunicationStatus() { + return emsCommunicationStatus; + } + + public void setEmsCommunicationStatus(String emsCommunicationStatus) { + this.emsCommunicationStatus = emsCommunicationStatus; + } + + public Date getDataUpdateTime() { + return dataUpdateTime; + } + + public void setDataUpdateTime(Date dataUpdateTime) { + this.dataUpdateTime = dataUpdateTime; + } + + public BigDecimal getDczt() { + return dczt; + } + + public void setDczt(BigDecimal dczt) { + this.dczt = dczt; + } + + public BigDecimal getYszt() { + return yszt; + } + + public void setYszt(BigDecimal yszt) { + this.yszt = yszt; + } + + public BigDecimal getPszt() { + return pszt; + } + + public void setPszt(BigDecimal pszt) { + this.pszt = pszt; + } + + public BigDecimal getDcfzt() { + return dcfzt; + } + + public void setDcfzt(BigDecimal dcfzt) { + this.dcfzt = dcfzt; + } + + public int getAlarmNum() { + return alarmNum; + } + + public void setAlarmNum(int alarmNum) { + this.alarmNum = alarmNum; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java b/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java new file mode 100644 index 0000000..fc91bf9 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java @@ -0,0 +1,100 @@ +package com.xzzn.ems.enums; + +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsBatteryCluster; +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryGroup; +import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.domain.EmsClusterAlarmData; +import com.xzzn.ems.domain.EmsCoolingAlarmData; +import com.xzzn.ems.domain.EmsCoolingData; +import com.xzzn.ems.domain.EmsDhData; +import com.xzzn.ems.domain.EmsEmsData; +import com.xzzn.ems.domain.EmsPcsAlarmData; +import com.xzzn.ems.domain.EmsPcsBranchData; +import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.EmsStackAlarmData; +import com.xzzn.ems.domain.EmsXfData; + +import java.util.HashMap; +import java.util.Map; + +/** + * 设备匹配表枚举类 + */ +public enum DeviceMatchTable +{ + PCS("PCS", "ems_pcs_data", EmsPcsData.class), + BRANCH("BRANCH", "ems_pcs_branch_data", EmsPcsBranchData.class), + STACK("STACK", "ems_battery_stack", EmsBatteryStack.class), + CLUSTER("CLUSTER", "ems_battery_cluster", EmsBatteryCluster.class), + BATTERY("BATTERY", "ems_battery_data", EmsBatteryData.class), + AMMETER("AMMETER", "ems_ammeter_data", EmsAmmeterData.class), + COOLING("COOLING", "ems_cooling_data", EmsCoolingData.class), + DH("DH", "ems_dh_data", EmsDhData.class), + XF("XF", "ems_xf_data", EmsXfData.class), + BATTERY_GROUP("BATTERY_GROUP", "ems_battery_group", EmsBatteryGroup.class), + EMS("EMS", "ems_ems_data", EmsEmsData.class), + + /** 告警点位 */ + COOLING_ALARM("COOLING_ALARM", "ems_cooling_alarm_data", EmsCoolingAlarmData.class), + STACK_ALARM("STACK_ALARM", "ems_stack_alarm_data", EmsStackAlarmData.class), + CLUSTER_ALARM("CLUSTER_ALARM", "ems_cluster_alarm_data", EmsClusterAlarmData.class), + PCS_ALARM("PCS_ALARM", "ems_pcs_alarm_data", EmsPcsAlarmData.class), + ; + + private final String code; + private final String matchTable; + + private final Class matchTableClass; + + DeviceMatchTable(String code, String matchTable, Class matchTableClass) + { + this.code = code; + this.matchTable = matchTable; + this.matchTableClass = matchTableClass; + } + + public String getCode() + { + return code; + } + + public String getMatchTable() { + return matchTable; + } + + public Class getMatchTableClass() { + return matchTableClass; + } + + // 缓存code与matchTable的映射(优化查询效率) + private static final Map DEVICE_MATCH_TABLE_MAP = new HashMap<>(); + + // 缓存table与实体类的映射(优化查询效率) + private static final Map> TABLE_TO_CLASS_MAP = new HashMap<>(); + + // 静态块初始化缓存 + static { + for (DeviceMatchTable category : DeviceMatchTable.values()) { + DEVICE_MATCH_TABLE_MAP.put(category.code, category.matchTable); + TABLE_TO_CLASS_MAP.put(category.matchTable, category.matchTableClass); + } + } + + + // 通过code获取matchTable的方法 + public static String getMatchTableByCode(String code) { + return DEVICE_MATCH_TABLE_MAP.get(code); // 从缓存中直接获取,效率高 + } + + // 通过table获取实体类的方法 + public static Class getClassByTable(String matchTable) { + return TABLE_TO_CLASS_MAP.get(matchTable); // 从缓存中直接获取,效率高 + } + + public static String getAlarmMatchTableByCode(String code) { + return DEVICE_MATCH_TABLE_MAP.get(code + "_ALARM"); // 从缓存中直接获取,效率高 + } + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmMatchDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmMatchDataMapper.java new file mode 100644 index 0000000..c4cbe65 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmMatchDataMapper.java @@ -0,0 +1,63 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import java.util.Map; + +import com.xzzn.ems.domain.EmsAlarmMatchData; + +/** + * 告警点位匹配数据Mapper接口 + * + * @author xzzn + * @date 2025-09-22 + */ +public interface EmsAlarmMatchDataMapper +{ + /** + * 查询告警点位匹配数据 + * + * @param id 告警点位匹配数据主键 + * @return 告警点位匹配数据 + */ + public EmsAlarmMatchData selectEmsAlarmMatchDataById(Long id); + + /** + * 查询告警点位匹配数据列表 + * + * @param emsAlarmMatchData 告警点位匹配数据 + * @return 告警点位匹配数据集合 + */ + public List selectEmsAlarmMatchDataList(EmsAlarmMatchData emsAlarmMatchData); + + /** + * 新增告警点位匹配数据 + * + * @param emsAlarmMatchData 告警点位匹配数据 + * @return 结果 + */ + public int insertEmsAlarmMatchData(EmsAlarmMatchData emsAlarmMatchData); + + /** + * 修改告警点位匹配数据 + * + * @param emsAlarmMatchData 告警点位匹配数据 + * @return 结果 + */ + public int updateEmsAlarmMatchData(EmsAlarmMatchData emsAlarmMatchData); + + /** + * 删除告警点位匹配数据 + * + * @param id 告警点位匹配数据主键 + * @return 结果 + */ + public int deleteEmsAlarmMatchDataById(Long id); + + /** + * 批量删除告警点位匹配数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsAlarmMatchDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmRecordsMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmRecordsMapper.java index d7592c4..e09669d 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmRecordsMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAlarmRecordsMapper.java @@ -2,9 +2,8 @@ package com.xzzn.ems.mapper; import java.util.List; import com.xzzn.ems.domain.EmsAlarmRecords; -import com.xzzn.ems.domain.vo.AlarmTrendList; -import com.xzzn.ems.domain.vo.DeviceAlarmProportionList; -import com.xzzn.ems.domain.vo.SiteMonitorHomeAlarmVo; +import com.xzzn.ems.domain.vo.*; +import org.apache.ibatis.annotations.Param; /** * 告警记录Mapper接口 @@ -66,7 +65,7 @@ public interface EmsAlarmRecordsMapper * 根据站点id获取告警记录 * */ - public List getAlarmRecordsBySiteId(Long siteId); + public List getAlarmRecordsBySiteId(String siteId); /** * 获取告警趋势数据 @@ -79,4 +78,33 @@ public interface EmsAlarmRecordsMapper * */ public List getDeviceAlarmPropList(); + + /** + * 获取设备等级分布 + * + */ + public List getAlarmGradeList(); + + + public List getAlarmRecordDetailList(AlarmRecordListRequestVo requestVo); + + // 获取站点设备告警数量 + public int getDeviceAlarmNum(@Param("siteId") String siteId, @Param("deviceId") String deviceId); + + //获取未处理的订阅失败告警 + public EmsAlarmRecords getFailedRecord(@Param("siteId")String siteId, + @Param("content") String content, + @Param("level")String level); + + // 批量处理告警数据 + public void batchUpsert(@Param("recordsList")List recordsList); + + // 获取所有没有处理完成的告警记录 + public List getAllUnfinishedRecords(@Param("needUpdateKeys")List needUpdateKeys,@Param("siteId") String siteId, + @Param("deviceId") String deviceId); + + // 根据ticketNo更新告警状态 + public EmsAlarmRecords getAlarmByTicketNo(@Param("ticketNo")String ticketNo); + //获取指定设备未处理和处理中的告警 + public List getNeedPutRedisAlarm(@Param("siteId")String siteId, @Param("deviceId")String deviceId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java new file mode 100644 index 0000000..649c04e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java @@ -0,0 +1,113 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.vo.AmmeterStatisListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.MonthlyTimeRange; +import com.xzzn.ems.domain.vo.PowerStatisListVo; +import com.xzzn.ems.domain.vo.SiteMonitorDataVo; +import com.xzzn.ems.domain.vo.StatisAmmeterDateRequest; +import com.xzzn.ems.domain.vo.TimePointQuery; +import com.xzzn.ems.domain.vo.TimePointValue; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * 总数据Mapper接口 + * + * @author xzzn + * @date 2025-07-03 + */ +public interface EmsAmmeterDataMapper +{ + /** + * 查询总数据 + * + * @param id 总数据主键 + * @return 总数据 + */ + public EmsAmmeterData selectEmsAmmeterDataById(Long id); + + /** + * 查询总数据列表 + * + * @param emsAmmeterData 总数据 + * @return 总数据集合 + */ + public List selectEmsAmmeterDataList(EmsAmmeterData emsAmmeterData); + + /** + * 新增总数据 + * + * @param emsAmmeterData 总数据 + * @return 结果 + */ + public int insertEmsAmmeterData(EmsAmmeterData emsAmmeterData); + + /** + * 修改总数据 + * + * @param emsAmmeterData 总数据 + * @return 结果 + */ + public int updateEmsAmmeterData(EmsAmmeterData emsAmmeterData); + + /** + * 删除总数据 + * + * @param id 总数据主键 + * @return 结果 + */ + public int deleteEmsAmmeterDataById(Long id); + + /** + * 批量删除总数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsAmmeterDataByIds(Long[] ids); + + /** + * 按小时获取当天电表曲线数据 + * @param requestVo + * @return + */ + public List getLoadDataByHour(StatisAmmeterDateRequest requestVo); + + // 获取昨天最晚数据 + public EmsAmmeterData getYestLatestDate(@Param("siteId")String siteId, @Param("deviceId")String deviceId, @Param("yestData")String yestData); + + // 获取可统计站点每个月的时间范围 + public List getMonthlyTimeRanges(); + + // 批量获取站点时间节点的充放电数据 + public List batchGetTimePointValues(List timePointQueries); + + // 概率统计-电量指标(按小时) + public List getChargeDataByHour(@Param("siteId")String siteId, @Param("deviceId")String deviceId,@Param("startDate")Date startDate); + + // 概率统计-电量指标(按月) + public List getChargeDataByMonth(@Param("siteId")String siteId, @Param("deviceId")String deviceId,@Param("startDate")Date startDate,@Param("endDate")Date endDate); + + // 报表统计-功率曲线 + public List getPowerDataByHour(DateSearchRequest requestVo); + public List getPowerDataByDay(DateSearchRequest requestVo); + public List getPowerDataByMonth(DateSearchRequest requestVo); + public List getPowerDataByMinutes(DateSearchRequest requestVo); + + // 获取最新数据 + public EmsAmmeterData getLastData(@Param("siteId")String siteId, @Param("deviceId")String deviceId); + + List selectHourlyAmmeterData(@Param("siteId") String siteId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + List selectDailyAmmeterData(@Param("siteId") String siteId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + + List getPowerDataByMinute(DateSearchRequest requestVo); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java index f98b7ce..41ee060 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java @@ -1,9 +1,17 @@ package com.xzzn.ems.mapper; -import java.util.List; import com.xzzn.ems.domain.EmsBatteryCluster; -import com.xzzn.ems.domain.vo.BMSBatteryClusterVo; import com.xzzn.ems.domain.vo.BMSBatteryDataList; +import com.xzzn.ems.domain.vo.BatteryAveTempVo; +import com.xzzn.ems.domain.vo.ClusterStatisListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.StatisClusterDateRequest; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + import org.apache.ibatis.annotations.Param; /** @@ -62,18 +70,24 @@ public interface EmsBatteryClusterMapper */ public int deleteEmsBatteryClusterByIds(Long[] ids); - /** - * 根据site_id获取电池簇数据 - * @param siteId - * @return - */ - public List getBMSBatteryCluster(Long siteId); - /** * 根据site_di和堆id获取簇数据和单体数据 * @param siteId * @param stackDeviceId * @return */ - public List getBmsBatteryData(@Param("siteId")Long siteId, @Param("stackDeviceId")Long stackDeviceId); + public List getBmsBatteryData(@Param("siteId")String siteId, @Param("stackDeviceId")String stackDeviceId); + + // 实时运行-FX平均温度 + public List getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + /** 堆电池温度数据-获取当天每小时簇 */ + public List getClusterDataByHour(StatisClusterDateRequest requestVo); + + // 奉贤-电池平均温度 + public List> getAvgTempByHour(DateSearchRequest requestVo); + public List> getAvgTempByDay(DateSearchRequest requestVo); + public List> getAvgTempByMonth(DateSearchRequest requestVo); + + List> getAvgTempByMinute(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDailyLatestMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDailyLatestMapper.java new file mode 100644 index 0000000..b21d49e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDailyLatestMapper.java @@ -0,0 +1,68 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryDataDailyLatest; +import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import org.apache.ibatis.annotations.Param; + +/** + * 单体电池每日最新数据Mapper接口 + * + * @author xzzn + * @date 2025-07-18 + */ +public interface EmsBatteryDailyLatestMapper +{ + /** + * 查询单体电池每日最新数据 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 单体电池每日最新数据 + */ + public EmsBatteryDataDailyLatest selectEmsBatteryDataDailyLatestByBatteryPack(String batteryPack); + + /** + * 查询单体电池每日最新数据列表 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 单体电池每日最新数据集合 + */ + public List selectEmsBatteryDataDailyLatestList(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 新增单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + public int insertEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 修改单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + public int updateEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 删除单体电池每日最新数据 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataDailyLatestByBatteryPack(String batteryPack); + + /** + * 批量删除单体电池每日最新数据 + * + * @param batteryPacks 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataDailyLatestByBatteryPacks(String[] batteryPacks); + + public void batchUpsert(@Param("list") List dataList); + + public List getBatteryDailyLatest(DateSearchRequest requestVo); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataDayMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataDayMapper.java new file mode 100644 index 0000000..1928e99 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataDayMapper.java @@ -0,0 +1,76 @@ +package com.xzzn.ems.mapper; + +import java.time.LocalDateTime; +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryDataDay; +import com.xzzn.ems.domain.EmsBatteryDataHour; +import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import org.apache.ibatis.annotations.Param; + +/** + * 单体电池天级数据Mapper接口 + * + * @author xzzn + * @date 2025-08-20 + */ +public interface EmsBatteryDataDayMapper +{ + /** + * 查询单体电池天级数据 + * + * @param id 单体电池天级数据主键 + * @return 单体电池天级数据 + */ + public EmsBatteryDataDay selectEmsBatteryDataDayById(Long id); + + /** + * 查询单体电池天级数据列表 + * + * @param emsBatteryDataDay 单体电池天级数据 + * @return 单体电池天级数据集合 + */ + public List selectEmsBatteryDataDayList(EmsBatteryDataDay emsBatteryDataDay); + + /** + * 新增单体电池天级数据 + * + * @param emsBatteryDataDay 单体电池天级数据 + * @return 结果 + */ + public int insertEmsBatteryDataDay(EmsBatteryDataDay emsBatteryDataDay); + + /** + * 修改单体电池天级数据 + * + * @param emsBatteryDataDay 单体电池天级数据 + * @return 结果 + */ + public int updateEmsBatteryDataDay(EmsBatteryDataDay emsBatteryDataDay); + + /** + * 删除单体电池天级数据 + * + * @param id 单体电池天级数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataDayById(Long id); + + /** + * 批量删除单体电池天级数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataDayByIds(Long[] ids); + + EmsBatteryDataDay findDayMaxTemp(@Param("siteId") String siteId, @Param("stackId") String stackId, + @Param("clusterId") String clusterId, @Param("batteryId") String batteryId, @Param("dayStart") LocalDateTime dayStart); + + /** + * 批量插入或更新天级数据(存在则更新,不存在则插入) + */ + void batchInsertOrUpdate(@Param("list") List dayDataList); + + public List getBatteryDayData(DateSearchRequest requestVo); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataHourMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataHourMapper.java new file mode 100644 index 0000000..f7713fe --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataHourMapper.java @@ -0,0 +1,72 @@ +package com.xzzn.ems.mapper; + +import java.time.LocalDateTime; +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryDataHour; +import org.apache.ibatis.annotations.Param; + +/** + * 单体电池小时级数据Mapper接口 + * + * @author xzzn + * @date 2025-08-19 + */ +public interface EmsBatteryDataHourMapper +{ + /** + * 查询单体电池小时级数据 + * + * @param id 单体电池小时级数据主键 + * @return 单体电池小时级数据 + */ + public EmsBatteryDataHour selectEmsBatteryDataHourById(Long id); + + /** + * 查询单体电池小时级数据列表 + * + * @param emsBatteryDataHour 单体电池小时级数据 + * @return 单体电池小时级数据集合 + */ + public List selectEmsBatteryDataHourList(EmsBatteryDataHour emsBatteryDataHour); + + /** + * 新增单体电池小时级数据 + * + * @param emsBatteryDataHour 单体电池小时级数据 + * @return 结果 + */ + public int insertEmsBatteryDataHour(EmsBatteryDataHour emsBatteryDataHour); + + /** + * 修改单体电池小时级数据 + * + * @param emsBatteryDataHour 单体电池小时级数据 + * @return 结果 + */ + public int updateEmsBatteryDataHour(EmsBatteryDataHour emsBatteryDataHour); + + /** + * 删除单体电池小时级数据 + * + * @param id 单体电池小时级数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataHourById(Long id); + + /** + * 批量删除单体电池小时级数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataHourByIds(Long[] ids); + + EmsBatteryDataHour findHourMaxTemp(@Param("siteId") String siteId, @Param("stackId") String stackId, + @Param("clusterId") String clusterId, @Param("batteryId") String batteryId, @Param("hourStart") LocalDateTime hourStart); + + /** + * 批量插入或更新小时级数据(存在则更新,不存在则插入) + */ + void batchInsertOrUpdate(@Param("list") List hourDataList); + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java index 7862183..2a222b4 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.Map; import com.xzzn.ems.domain.EmsBatteryData; -import com.xzzn.ems.domain.vo.BMSBatteryClusterDataList; import com.xzzn.ems.domain.vo.BatteryClusterDataDetailVo; -import org.apache.ibatis.annotations.Mapper; +import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; import org.apache.ibatis.annotations.Param; /** @@ -66,24 +66,13 @@ public interface EmsBatteryDataMapper public int deleteEmsBatteryDataByIds(Long[] ids); /** - * 根据siteId查询站点电池实时数据 - * @param siteId - * @return - */ - public EmsBatteryData getBatteryDataBySiteId(Long siteId); - - /** - * 根据siteId和簇id获取单体数据 - * @param siteId + * 根据电池簇设备id获取下面所有单体电池 * @param clusterDeviceId * @return */ - public BatteryClusterDataDetailVo getBatteryDataByClusterId(@Param("siteId")Long siteId, @Param("clusterDeviceId")Long clusterDeviceId); + public List getAllBatteryDataByClusterId(@Param("clusterDeviceId") String clusterDeviceId,@Param("siteId") String siteId); + + + int insertEmsBatteryDataList(List emsBatteryDataList); - /** - * 获取最大最小的单体id - * @param dataVo - * @return - */ - public List> getDataIdsMap(BatteryClusterDataDetailVo dataVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMinutesMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMinutesMapper.java new file mode 100644 index 0000000..f2b76d7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMinutesMapper.java @@ -0,0 +1,74 @@ +package com.xzzn.ems.mapper; + +import java.util.Date; +import java.util.List; + +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryDataMinutes; +import org.apache.ibatis.annotations.Param; + +/** + * 单体电池分钟级数据Mapper接口 + * + * @author xzzn + * @date 2025-08-17 + */ +public interface EmsBatteryDataMinutesMapper +{ + /** + * 查询单体电池分钟级数据 + * + * @param dateDay 单体电池分钟级数据主键 + * @return 单体电池分钟级数据 + */ + public EmsBatteryDataMinutes selectEmsBatteryDataMinutesByDateDay(Date dateDay); + + /** + * 查询单体电池分钟级数据列表 + * + * @param emsBatteryDataMinutes 单体电池分钟级数据 + * @return 单体电池分钟级数据集合 + */ + public List selectEmsBatteryDataMinutesList(EmsBatteryDataMinutes emsBatteryDataMinutes); + + /** + * 新增单体电池分钟级数据 + * + * @param emsBatteryDataMinutes 单体电池分钟级数据 + * @return 结果 + */ + public int insertEmsBatteryDataMinutes(EmsBatteryDataMinutes emsBatteryDataMinutes); + + /** + * 修改单体电池分钟级数据 + * + * @param emsBatteryDataMinutes 单体电池分钟级数据 + * @return 结果 + */ + public int updateEmsBatteryDataMinutes(EmsBatteryDataMinutes emsBatteryDataMinutes); + + /** + * 删除单体电池分钟级数据 + * + * @param dateDay 单体电池分钟级数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataMinutesByDateDay(Date dateDay); + + /** + * 批量删除单体电池分钟级数据 + * + * @param dateDays 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataMinutesByDateDays(Date[] dateDays); + + int insertMinutesBatteryDataList(List emsBatteryDataList); + + public void deleteByTimeBeforeOneHour(String oneHourAgoStr); + + // 获取指定站点指定电池簇下面的单体电池最新数据 + public EmsBatteryData getLastBatteryData(@Param("siteId") String siteId, + @Param("clusterDeviceId") String clusterDeviceId, + @Param("deviceId") String deviceId); +} \ No newline at end of file diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMonthMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMonthMapper.java new file mode 100644 index 0000000..56cf737 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMonthMapper.java @@ -0,0 +1,76 @@ +package com.xzzn.ems.mapper; + +import java.time.LocalDateTime; +import java.util.List; + +import com.xzzn.ems.domain.EmsBatteryDataMonth; +import com.xzzn.ems.domain.vo.SiteBatteryListVo; +import org.apache.ibatis.annotations.Param; + +/** + * 单体电池月级数据Mapper接口 + * + * @author xzzn + * @date 2025-08-22 + */ +public interface EmsBatteryDataMonthMapper +{ + /** + * 查询单体电池月级数据 + * + * @param id 单体电池月级数据主键 + * @return 单体电池月级数据 + */ + public EmsBatteryDataMonth selectEmsBatteryDataMonthById(Long id); + + /** + * 查询单体电池月级数据列表 + * + * @param emsBatteryDataMonth 单体电池月级数据 + * @return 单体电池月级数据集合 + */ + public List selectEmsBatteryDataMonthList(EmsBatteryDataMonth emsBatteryDataMonth); + + /** + * 新增单体电池月级数据 + * + * @param emsBatteryDataMonth 单体电池月级数据 + * @return 结果 + */ + public int insertEmsBatteryDataMonth(EmsBatteryDataMonth emsBatteryDataMonth); + + /** + * 修改单体电池月级数据 + * + * @param emsBatteryDataMonth 单体电池月级数据 + * @return 结果 + */ + public int updateEmsBatteryDataMonth(EmsBatteryDataMonth emsBatteryDataMonth); + + /** + * 删除单体电池月级数据 + * + * @param id 单体电池月级数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataMonthById(Long id); + + /** + * 批量删除单体电池月级数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataMonthByIds(Long[] ids); + + EmsBatteryDataMonth findMonthMaxTemp(@Param("siteId") String siteId, @Param("stackId") String stackId, + @Param("clusterId") String clusterId, @Param("batteryId") String batteryId, @Param("monthStart") LocalDateTime monthStart); + + /** + * 批量插入或更新月级数据(存在则更新,不存在则插入) + */ + void batchInsertOrUpdate(@Param("list") List monthDataList); + + // 查找siteId下面所有的单体电池编码 + public List getAllBatteryIdsBySites(@Param("siteIds")String[] siteIds); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryGroupMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryGroupMapper.java new file mode 100644 index 0000000..ee68bfe --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryGroupMapper.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryGroup; + +/** + * 电池组数据Mapper接口 + * + * @author xzzn + * @date 2025-07-29 + */ +public interface EmsBatteryGroupMapper +{ + /** + * 查询电池组数据 + * + * @param id 电池组数据主键 + * @return 电池组数据 + */ + public EmsBatteryGroup selectEmsBatteryGroupById(Long id); + + /** + * 查询电池组数据列表 + * + * @param emsBatteryGroup 电池组数据 + * @return 电池组数据集合 + */ + public List selectEmsBatteryGroupList(EmsBatteryGroup emsBatteryGroup); + + /** + * 新增电池组数据 + * + * @param emsBatteryGroup 电池组数据 + * @return 结果 + */ + public int insertEmsBatteryGroup(EmsBatteryGroup emsBatteryGroup); + + /** + * 修改电池组数据 + * + * @param emsBatteryGroup 电池组数据 + * @return 结果 + */ + public int updateEmsBatteryGroup(EmsBatteryGroup emsBatteryGroup); + + /** + * 删除电池组数据 + * + * @param id 电池组数据主键 + * @return 结果 + */ + public int deleteEmsBatteryGroupById(Long id); + + /** + * 批量删除电池组数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryGroupByIds(Long[] ids); + + // 批量插入 + void batchInsertGroupData(List emsBatteryGroups); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java index e1b8155..e42041d 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java @@ -1,8 +1,16 @@ package com.xzzn.ems.mapper; -import java.util.List; import com.xzzn.ems.domain.EmsBatteryStack; -import com.xzzn.ems.domain.vo.BMSOverViewVo; +import com.xzzn.ems.domain.vo.BatteryAveSOCVo; +import com.xzzn.ems.domain.vo.BatteryAveTempVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.StackPointVo; +import com.xzzn.ems.domain.vo.StackStatisListVo; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Param; /** * 电池堆数据Mapper接口 @@ -61,9 +69,30 @@ public interface EmsBatteryStackMapper public int deleteEmsBatteryStackByIds(Long[] ids); /** - * 获取电池堆信息 - * @param siteId + * 堆曲线数据-按小时区分 + * @param requestVo * @return */ - public List selectEmsBatteryStackBySiteId(Long siteId); + public List getStackDataByHour(DateSearchRequest requestVo); + + public List getStackDataByDay(DateSearchRequest requestVo); + + public List getStackDataByMonth(DateSearchRequest requestVo); + + public EmsBatteryStack getSiteSumStackInfo(String siteId); + + // 点位数据 - soc/soh/temp + public List getStackPointByHour(DateSearchRequest requestVo); + public List getStackPointByDay(DateSearchRequest requestVo); + public List getStackPointByMonth(DateSearchRequest requestVo); + + + // 实时运行-平均soc + public List getAveSocList(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate); + // 实时运行-DDS平均温度 + public List getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date yesterday, @Param("endDate") Date today); + + List getStackPointByMinute(DateSearchRequest requestVo); + + List getStackDataByMinute(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsClusterAlarmDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsClusterAlarmDataMapper.java new file mode 100644 index 0000000..b02249c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsClusterAlarmDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsClusterAlarmData; + +/** + * bmsc告警数据Mapper接口 + * + * @author xzzn + * @date 2025-10-22 + */ +public interface EmsClusterAlarmDataMapper +{ + /** + * 查询bmsc告警数据 + * + * @param id bmsc告警数据主键 + * @return bmsc告警数据 + */ + public EmsClusterAlarmData selectEmsClusterAlarmDataById(Long id); + + /** + * 查询bmsc告警数据列表 + * + * @param emsClusterAlarmData bmsc告警数据 + * @return bmsc告警数据集合 + */ + public List selectEmsClusterAlarmDataList(EmsClusterAlarmData emsClusterAlarmData); + + /** + * 新增bmsc告警数据 + * + * @param emsClusterAlarmData bmsc告警数据 + * @return 结果 + */ + public int insertEmsClusterAlarmData(EmsClusterAlarmData emsClusterAlarmData); + + /** + * 修改bmsc告警数据 + * + * @param emsClusterAlarmData bmsc告警数据 + * @return 结果 + */ + public int updateEmsClusterAlarmData(EmsClusterAlarmData emsClusterAlarmData); + + /** + * 删除bmsc告警数据 + * + * @param id bmsc告警数据主键 + * @return 结果 + */ + public int deleteEmsClusterAlarmDataById(Long id); + + /** + * 批量删除bmsc告警数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsClusterAlarmDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingAlarmDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingAlarmDataMapper.java new file mode 100644 index 0000000..778354b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingAlarmDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsCoolingAlarmData; + +/** + * ZSLQ告警故障数据Mapper接口 + * + * @author xzzn + * @date 2025-10-22 + */ +public interface EmsCoolingAlarmDataMapper +{ + /** + * 查询ZSLQ告警故障数据 + * + * @param id ZSLQ告警故障数据主键 + * @return ZSLQ告警故障数据 + */ + public EmsCoolingAlarmData selectEmsCoolingAlarmDataById(Long id); + + /** + * 查询ZSLQ告警故障数据列表 + * + * @param emsCoolingAlarmData ZSLQ告警故障数据 + * @return ZSLQ告警故障数据集合 + */ + public List selectEmsCoolingAlarmDataList(EmsCoolingAlarmData emsCoolingAlarmData); + + /** + * 新增ZSLQ告警故障数据 + * + * @param emsCoolingAlarmData ZSLQ告警故障数据 + * @return 结果 + */ + public int insertEmsCoolingAlarmData(EmsCoolingAlarmData emsCoolingAlarmData); + + /** + * 修改ZSLQ告警故障数据 + * + * @param emsCoolingAlarmData ZSLQ告警故障数据 + * @return 结果 + */ + public int updateEmsCoolingAlarmData(EmsCoolingAlarmData emsCoolingAlarmData); + + /** + * 删除ZSLQ告警故障数据 + * + * @param id ZSLQ告警故障数据主键 + * @return 结果 + */ + public int deleteEmsCoolingAlarmDataById(Long id); + + /** + * 批量删除ZSLQ告警故障数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsCoolingAlarmDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingDataMapper.java index e1bc42f..4b4d984 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsCoolingDataMapper.java @@ -64,5 +64,5 @@ public interface EmsCoolingDataMapper * @param siteId * @return */ - public List getCoolingDataList(Long siteId); + public List getCoolingDataList(String siteId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyChargeDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyChargeDataMapper.java new file mode 100644 index 0000000..27c3864 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyChargeDataMapper.java @@ -0,0 +1,85 @@ +package com.xzzn.ems.mapper; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.xzzn.ems.domain.EmsDailyChargeData; +import com.xzzn.ems.domain.vo.ElectricIndexList; +import com.xzzn.ems.domain.vo.SiteMonitorDataVo; +import org.apache.ibatis.annotations.Param; + +/** + * 站点每日充放电数据Mapper接口 + * + * @author xzzn + * @date 2025-08-27 + */ +public interface EmsDailyChargeDataMapper +{ + /** + * 查询站点每日充放电数据 + * + * @param id 站点每日充放电数据主键 + * @return 站点每日充放电数据 + */ + public EmsDailyChargeData selectEmsDailyChargeDataById(Long id); + + /** + * 查询站点每日充放电数据列表 + * + * @param emsDailyChargeData 站点每日充放电数据 + * @return 站点每日充放电数据集合 + */ + public List selectEmsDailyChargeDataList(EmsDailyChargeData emsDailyChargeData); + + /** + * 新增站点每日充放电数据 + * + * @param emsDailyChargeData 站点每日充放电数据 + * @return 结果 + */ + public int insertEmsDailyChargeData(EmsDailyChargeData emsDailyChargeData); + + /** + * 修改站点每日充放电数据 + * + * @param emsDailyChargeData 站点每日充放电数据 + * @return 结果 + */ + public int updateEmsDailyChargeData(EmsDailyChargeData emsDailyChargeData); + + /** + * 删除站点每日充放电数据 + * + * @param id 站点每日充放电数据主键 + * @return 结果 + */ + public int deleteEmsDailyChargeDataById(Long id); + + /** + * 批量删除站点每日充放电数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsDailyChargeDataByIds(Long[] ids); + + // 插入或更新站点每日充放电数据 + public void insertOrUpdateData(EmsDailyChargeData emsDailyChargeData); + + // 获取所有站点总充总放 + public Map getAllSiteChargeData(@Param("nowData")String nowData, @Param("siteId")String siteId); + + // 获取单站点时间范围内每日充放电数据 + public List getSingleSiteChargeData(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + // 按天获取站点每日总充总放 + public List getTotalChargeDataByDay(@Param("siteId")String siteId,@Param("startDate")Date startDate, @Param("endDate")Date endDate); + + // 按月获取站点每日总充总放 + public List getTotalChargeDataByMonth(@Param("siteId")String siteId,@Param("startDate")Date startDate, @Param("endDate")Date endDate); + + public List getAllSiteChargeDataByMonth(); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java new file mode 100644 index 0000000..536f73d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java @@ -0,0 +1,81 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsDailyEnergyData; +import com.xzzn.ems.domain.vo.AmmeterRevenueStatisListVo; +import com.xzzn.ems.domain.vo.AmmeterStatisListVo; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +/** + * 站点电每日数据Mapper接口 + * + * @author xzzn + * @date 2025-10-09 + */ +public interface EmsDailyEnergyDataMapper +{ + /** + * 查询站点电每日数据 + * + * @param id 站点电每日数据主键 + * @return 站点电每日数据 + */ + public EmsDailyEnergyData selectEmsDailyEnergyDataById(Long id); + + /** + * 查询站点电每日数据列表 + * + * @param emsDailyEnergyData 站点电每日数据 + * @return 站点电每日数据集合 + */ + public List selectEmsDailyEnergyDataList(EmsDailyEnergyData emsDailyEnergyData); + + /** + * 新增站点电每日数据 + * + * @param emsDailyEnergyData 站点电每日数据 + * @return 结果 + */ + public int insertEmsDailyEnergyData(EmsDailyEnergyData emsDailyEnergyData); + + /** + * 修改站点电每日数据 + * + * @param emsDailyEnergyData 站点电每日数据 + * @return 结果 + */ + public int updateEmsDailyEnergyData(EmsDailyEnergyData emsDailyEnergyData); + + /** + * 删除站点电每日数据 + * + * @param id 站点电每日数据主键 + * @return 结果 + */ + public int deleteEmsDailyEnergyDataById(Long id); + + /** + * 批量删除站点电每日数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsDailyEnergyDataByIds(Long[] ids); + + // 获取站点某日电表数据 + public EmsDailyEnergyData getDataByDate(@Param("siteId")String siteId,@Param("today") String today); + // 插入或更新每日尖峰平谷差值 + public void insertOrUpdateData(EmsDailyEnergyData energyData); + // 电表报表 + public List getDataBySiteId(@Param("siteId")String siteId, @Param("startTime")String startTime, @Param("endTime")String endTime); + // dds-获取今天之前最晚的总收入 + public BigDecimal getLastTotalRevenue(String siteId); + // fx-获取实时总收益和当日实时收益 + public Map getRealTimeRevenue(String siteId); + + public List getRevenueDataBySiteId(@Param("siteId") String siteId, @Param("startTime") String startTime, @Param("endTime") String endTime); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDeviceChangeLogMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDeviceChangeLogMapper.java new file mode 100644 index 0000000..bf81415 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDeviceChangeLogMapper.java @@ -0,0 +1,65 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsDeviceChangeLog; +import com.xzzn.ems.domain.EmsFaultIssueLog; + +/** + * 设备状态变更记录Mapper接口 + * + * @author xzzn + * @date 2025-11-15 + */ +public interface EmsDeviceChangeLogMapper +{ + /** + * 查询设备状态变更记录 + * + * @param id 设备状态变更记录主键 + * @return 设备状态变更记录 + */ + public EmsDeviceChangeLog selectEmsDeviceChangeLogById(Long id); + + /** + * 查询设备状态变更记录列表 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 设备状态变更记录集合 + */ + public List selectEmsDeviceChangeLogList(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 新增设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + public int insertEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 修改设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + public int updateEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 删除设备状态变更记录 + * + * @param id 设备状态变更记录主键 + * @return 结果 + */ + public int deleteEmsDeviceChangeLogById(Long id); + + /** + * 批量删除设备状态变更记录 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsDeviceChangeLogByIds(Long[] ids); + + // 根据logId获取日志 + public EmsDeviceChangeLog selectDeviceChangeLogByLogId(String logId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDevicesSettingMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDevicesSettingMapper.java index a21507b..0afbaee 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDevicesSettingMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDevicesSettingMapper.java @@ -1,7 +1,10 @@ package com.xzzn.ems.mapper; import java.util.List; +import java.util.Map; + import com.xzzn.ems.domain.EmsDevicesSetting; +import org.apache.ibatis.annotations.Param; /** * Modbus设备配置Mapper接口 @@ -58,4 +61,32 @@ public interface EmsDevicesSettingMapper * @return 结果 */ public int deleteEmsDevicesSettingByIds(Long[] ids); + /** + * 根据父类设备id获取子设备id + * @param parentId + * @return + */ + public List> getDeviceInfoByParentId(@Param("siteId")String siteId, @Param("parentId")String parentId); + + /** + * 根据site_id和device_category获取指定设备信息 + * @param siteId + * @param deviceCategory + * @return + */ + public List> getDeviceInfosBySiteIdAndCategory(@Param("siteId")String siteId, @Param("deviceCategory")String deviceCategory); + + /** + * 获取该设备下所有的电表 + * @param siteId + * @return + */ + public List> getAmmeterNameList(String siteId); + + public EmsDevicesSetting getDeviceBySiteAndDeviceId(@Param("deviceId")String deviceId, @Param("siteId")String siteId); + + public List> getClusterIdsByFuzzyQuery(@Param("siteId")String siteId, @Param("deviceCategory")String deviceCategory, + @Param("parentId")String parentId); + + public List getAllDeviceCategoryBySiteId(String siteId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDhDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDhDataMapper.java new file mode 100644 index 0000000..d02b757 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDhDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsDhData; + +/** + * 动环数据Mapper接口 + * + * @author xzzn + * @date 2025-07-28 + */ +public interface EmsDhDataMapper +{ + /** + * 查询动环数据 + * + * @param id 动环数据主键 + * @return 动环数据 + */ + public EmsDhData selectEmsDhDataById(Long id); + + /** + * 查询动环数据列表 + * + * @param emsDhData 动环数据 + * @return 动环数据集合 + */ + public List selectEmsDhDataList(EmsDhData emsDhData); + + /** + * 新增动环数据 + * + * @param emsDhData 动环数据 + * @return 结果 + */ + public int insertEmsDhData(EmsDhData emsDhData); + + /** + * 修改动环数据 + * + * @param emsDhData 动环数据 + * @return 结果 + */ + public int updateEmsDhData(EmsDhData emsDhData); + + /** + * 删除动环数据 + * + * @param id 动环数据主键 + * @return 结果 + */ + public int deleteEmsDhDataById(Long id); + + /** + * 批量删除动环数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsDhDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEmsDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEmsDataMapper.java new file mode 100644 index 0000000..ac80f06 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEmsDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsEmsData; + +/** + * 数据Mapper接口 + * + * @author xzzn + * @date 2025-12-09 + */ +public interface EmsEmsDataMapper +{ + /** + * 查询数据 + * + * @param id 数据主键 + * @return 数据 + */ + public EmsEmsData selectEmsEmsDataById(Long id); + + /** + * 查询数据列表 + * + * @param emsEmsData 数据 + * @return 数据集合 + */ + public List selectEmsEmsDataList(EmsEmsData emsEmsData); + + /** + * 新增数据 + * + * @param emsEmsData 数据 + * @return 结果 + */ + public int insertEmsEmsData(EmsEmsData emsEmsData); + + /** + * 修改数据 + * + * @param emsEmsData 数据 + * @return 结果 + */ + public int updateEmsEmsData(EmsEmsData emsEmsData); + + /** + * 删除数据 + * + * @param id 数据主键 + * @return 结果 + */ + public int deleteEmsEmsDataById(Long id); + + /** + * 批量删除数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsEmsDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java new file mode 100644 index 0000000..95041c4 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java @@ -0,0 +1,84 @@ +package com.xzzn.ems.mapper; + +import java.util.List; + +import com.xzzn.ems.domain.EmsEnergyPriceConfig; +import com.xzzn.ems.domain.vo.EnergyPriceConfigVo; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import org.apache.ibatis.annotations.Param; + +/** + * 电价配置Mapper接口 + * + * @author xzzn + * @date 2025-09-28 + */ +public interface EmsEnergyPriceConfigMapper +{ + /** + * 查询电价配置 + * + * @param id 电价配置主键 + * @return 电价配置 + */ + public EmsEnergyPriceConfig selectEmsEnergyPriceConfigById(Long id); + + /** + * 查询当年电价配置列表 + * + * @return 电价配置集合 + */ + public List selectEmsEnergyPriceConfigList(int currentYear); + + /** + * 新增电价配置 + * + * @param emsEnergyPriceConfig 电价配置 + * @return 结果 + */ + public int insertEmsEnergyPriceConfig(EmsEnergyPriceConfig emsEnergyPriceConfig); + + /** + * 修改电价配置 + * + * @param emsEnergyPriceConfig 电价配置 + * @return 结果 + */ + public int updateEmsEnergyPriceConfig(EmsEnergyPriceConfig emsEnergyPriceConfig); + + /** + * 删除电价配置 + * + * @param id 电价配置主键 + * @return 结果 + */ + public int deleteEmsEnergyPriceConfigById(Long id); + + /** + * 批量删除电价配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsEnergyPriceConfigByIds(Long[] ids); + + // 查询当年电价配置列表 + public List getCurrentYearConfigList(@Param("siteId")String siteId,@Param("currentYear")int currentYear); + // 站点指定年月获取电价配置 + public EmsEnergyPriceConfig getConfigListByYearAndMonth(@Param("siteId")String siteId, + @Param("currentYear") String currentYear, + @Param("month")String month); + // 插入或更新 + public void insertOrUpdateEmsEnergyPriceConfig(EmsEnergyPriceConfig priceConfig); + // 获取指定年月的电价时间配置 + public List getTimeRangeByDate(@Param("siteId")String siteId, + @Param("currentYear")int currentYear, + @Param("currentMonth")int currentMonth); + // 获取所有有效站点的电价配置 + public List getAllSitePriceConfig( @Param("currentYear")int currentYear, + @Param("currentMonth")int currentMonth); + // 查询指定时间范围的电价配置列表 + public List getConfigListByTimeFrame(@Param("siteId")String siteId, + @Param("startDate")String startDate, + @Param("endDate")String endDate); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultIssueLogMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultIssueLogMapper.java new file mode 100644 index 0000000..47380ad --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultIssueLogMapper.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsFaultIssueLog; + +/** + * 告警保护方案下发日志Mapper接口 + * + * @author xzzn + * @date 2025-11-15 + */ +public interface EmsFaultIssueLogMapper +{ + /** + * 查询告警保护方案下发日志 + * + * @param id 告警保护方案下发日志主键 + * @return 告警保护方案下发日志 + */ + public EmsFaultIssueLog selectEmsFaultIssueLogById(Long id); + + /** + * 查询告警保护方案下发日志列表 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 告警保护方案下发日志集合 + */ + public List selectEmsFaultIssueLogList(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 新增告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + public int insertEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 修改告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + public int updateEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 删除告警保护方案下发日志 + * + * @param id 告警保护方案下发日志主键 + * @return 结果 + */ + public int deleteEmsFaultIssueLogById(Long id); + + /** + * 批量删除告警保护方案下发日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsFaultIssueLogByIds(Long[] ids); + + // 根据logId获取日志 + public EmsFaultIssueLog selectEmsFaultIssueLogByLogId(String logId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultProtectionPlanMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultProtectionPlanMapper.java new file mode 100644 index 0000000..c5e08ce --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsFaultProtectionPlanMapper.java @@ -0,0 +1,67 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; +import org.apache.ibatis.annotations.Param; + +/** + * 故障告警保护方案Mapper接口 + * + * @author xzzn + * @date 2025-10-24 + */ +public interface EmsFaultProtectionPlanMapper +{ + /** + * 查询故障告警保护方案 + * + * @param id 故障告警保护方案主键 + * @return 故障告警保护方案 + */ + public EmsFaultProtectionPlan selectEmsFaultProtectionPlanById(Long id); + + /** + * 查询故障告警保护方案列表 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 故障告警保护方案集合 + */ + public List selectEmsFaultProtectionPlanList(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 新增故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + public int insertEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 修改故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + public int updateEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 删除故障告警保护方案 + * + * @param id 故障告警保护方案主键 + * @return 结果 + */ + public int deleteEmsFaultProtectionPlanById(Long id); + + /** + * 批量删除故障告警保护方案 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsFaultProtectionPlanByIds(Long[] ids); + + // 根据站点+faultName+faultLevel 同步删除 + public void deleteEmsFaultProtectionPlan(@Param("siteId")String siteId, + @Param("faultName")String faultName, + @Param("faultLevel")Integer faultLevel); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttMessageMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttMessageMapper.java new file mode 100644 index 0000000..adf7841 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttMessageMapper.java @@ -0,0 +1,62 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsMqttMessage; + +import java.util.List; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author xzzn + * @date 2025-06-27 + */ +public interface EmsMqttMessageMapper +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public EmsMqttMessage selectEmsMqttMessageById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEmsMqttMessageList(EmsMqttMessage emsMqttMessage); + + /** + * 新增【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + public int insertEmsMqttMessage(EmsMqttMessage emsMqttMessage); + + /** + * 修改【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + public int updateEmsMqttMessage(EmsMqttMessage emsMqttMessage); + + /** + * 删除【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteEmsMqttMessageById(Long id); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsMqttMessageByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java new file mode 100644 index 0000000..4128555 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java @@ -0,0 +1,66 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsMqttTopicConfig; + +/** + * 站点topic配置Mapper接口 + * + * @author xzzn + * @date 2025-11-06 + */ +public interface EmsMqttTopicConfigMapper +{ + /** + * 查询站点topic配置 + * + * @param id 站点topic配置主键 + * @return 站点topic配置 + */ + public EmsMqttTopicConfig selectEmsMqttTopicConfigById(Long id); + + /** + * 查询站点topic配置列表 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 站点topic配置集合 + */ + public List selectEmsMqttTopicConfigList(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 新增站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + public int insertEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 修改站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + public int updateEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 删除站点topic配置 + * + * @param id 站点topic配置主键 + * @return 结果 + */ + public int deleteEmsMqttTopicConfigById(Long id); + + /** + * 批量删除站点topic配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsMqttTopicConfigByIds(Long[] ids); + + // 判断topic是否存在 + public String checkTopicIsExist(String strategyTopic); + + EmsMqttTopicConfig selectOneByTopic(String topic); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsAlarmDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsAlarmDataMapper.java new file mode 100644 index 0000000..82b96c7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsAlarmDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsPcsAlarmData; + +/** + * pcs设备告警故障数据Mapper接口 + * + * @author xzzn + * @date 2025-10-22 + */ +public interface EmsPcsAlarmDataMapper +{ + /** + * 查询pcs设备告警故障数据 + * + * @param id pcs设备告警故障数据主键 + * @return pcs设备告警故障数据 + */ + public EmsPcsAlarmData selectEmsPcsAlarmDataById(Long id); + + /** + * 查询pcs设备告警故障数据列表 + * + * @param emsPcsAlarmData pcs设备告警故障数据 + * @return pcs设备告警故障数据集合 + */ + public List selectEmsPcsAlarmDataList(EmsPcsAlarmData emsPcsAlarmData); + + /** + * 新增pcs设备告警故障数据 + * + * @param emsPcsAlarmData pcs设备告警故障数据 + * @return 结果 + */ + public int insertEmsPcsAlarmData(EmsPcsAlarmData emsPcsAlarmData); + + /** + * 修改pcs设备告警故障数据 + * + * @param emsPcsAlarmData pcs设备告警故障数据 + * @return 结果 + */ + public int updateEmsPcsAlarmData(EmsPcsAlarmData emsPcsAlarmData); + + /** + * 删除pcs设备告警故障数据 + * + * @param id pcs设备告警故障数据主键 + * @return 结果 + */ + public int deleteEmsPcsAlarmDataById(Long id); + + /** + * 批量删除pcs设备告警故障数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPcsAlarmDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsBranchDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsBranchDataMapper.java index 80baed6..9c4b526 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsBranchDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsBranchDataMapper.java @@ -9,7 +9,7 @@ import org.apache.ibatis.annotations.Param; * pcs支路数据Mapper接口 * * @author xzzn - * @date 2025-06-24 + * @date 2025-06-29 */ public interface EmsPcsBranchDataMapper { @@ -67,5 +67,7 @@ public interface EmsPcsBranchDataMapper * @param deviceId * @return */ - public List getPcsBranchInfoList(@Param("siteId")Long siteId, @Param("deviceId")Long deviceId); + public List getPcsBranchInfoList(@Param("siteId")String siteId, @Param("deviceId")String deviceId); + + int insertPcsBranchDataList(List list); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsDataMapper.java index 55dd7b5..9a79e50 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsDataMapper.java @@ -1,14 +1,19 @@ package com.xzzn.ems.mapper; -import java.math.BigDecimal; -import java.util.List; -import java.util.Map; - import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.vo.DateSearchRequest; import com.xzzn.ems.domain.vo.ElectricIndexList; +import com.xzzn.ems.domain.vo.EnergyStoragePowVo; import com.xzzn.ems.domain.vo.PcsDetailInfoVo; +import com.xzzn.ems.domain.vo.PcsMaxTempVo; +import com.xzzn.ems.domain.vo.PcsStatisListVo; import com.xzzn.ems.domain.vo.SiteMonitorDataVo; -import com.xzzn.ems.domain.vo.SiteMonitorRuningHeadInfoVo; +import com.xzzn.ems.domain.vo.SiteMonitorRunningHeadInfoVo; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Param; /** * PCS数据Mapper接口 @@ -71,21 +76,14 @@ public interface EmsPcsDataMapper * @param siteId * @return */ - public List getPcsDataBySiteId(Long siteId); - - /** - * 根据站点获取电网实时功率=sum(总交流有功电率) - * @param siteId - * @return - */ - public BigDecimal getGridNrtPower(Long siteId); + public List getPcsDataBySiteId(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); /** * 根据站点获取设备监控的实时运行头信息 * @param siteId * @return */ - public SiteMonitorRuningHeadInfoVo getSiteRunningHeadInfo(Long siteId); + public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId); /** * 获取每月的充电量和放电量 @@ -98,11 +96,52 @@ public interface EmsPcsDataMapper * @param siteId * @return */ - public List getPcsDetailInfoBySiteId(Long siteId); + public List getPcsDetailInfoBySiteId(String siteId); /** - * 获取总充+总放 + * 根据时间按天获取充放电量 + * @param siteId + * @param startDate + * @param endDate * @return */ - public Map getPcsTotalChargeData(); + public List getPcsDataByDay(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + /** + * 根据时间按小时获取充放电量 + * @param siteId + * @param startDate + * @param endDate + * @return + */ + public List getPcsDataByHour(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + /** + * 获取实时运行-储能功率 + * @param siteId + * @param startDate + * @param endDate + * @return + */ + public List getStoragePowerList(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + /** + * pcs曲线运行数据 + * @param requestVo + * @return + */ + public List getPcsActivePowerByDay(DateSearchRequest requestVo); + + public List getPcsActivePowerByHour(DateSearchRequest requestVo); + + public List getPcsActivePowerByMonth(DateSearchRequest requestVo); + + public List getPcsActivePowerByMinutes(DateSearchRequest requestVo); + + // 实时运行-fx-pcs最高温度 + public List getFXMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + // 实时运行-dds-pcs最高温度 + public List getDDSMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); + + List getPcsMaxTemp(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsSettingMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsSettingMapper.java new file mode 100644 index 0000000..71b0e44 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPcsSettingMapper.java @@ -0,0 +1,68 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsPcsSetting; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * PCS设备配置Mapper接口 + * + * @author xzzn + * @date 2025-12-29 + */ +public interface EmsPcsSettingMapper +{ + /** + * 查询PCS设备配置 + * + * @param id PCS设备配置主键 + * @return PCS设备配置 + */ + public EmsPcsSetting selectEmsPcsSettingById(Long id); + + /** + * 查询PCS设备配置列表 + * + * @param emsPcsSetting PCS设备配置 + * @return PCS设备配置集合 + */ + public List selectEmsPcsSettingList(EmsPcsSetting emsPcsSetting); + + /** + * 新增PCS设备配置 + * + * @param emsPcsSetting PCS设备配置 + * @return 结果 + */ + public int insertEmsPcsSetting(EmsPcsSetting emsPcsSetting); + + /** + * 修改PCS设备配置 + * + * @param emsPcsSetting PCS设备配置 + * @return 结果 + */ + public int updateEmsPcsSetting(EmsPcsSetting emsPcsSetting); + + /** + * 删除PCS设备配置 + * + * @param id PCS设备配置主键 + * @return 结果 + */ + public int deleteEmsPcsSettingById(Long id); + + /** + * 批量删除PCS设备配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPcsSettingByIds(Long[] ids); + + EmsPcsSetting selectEmsPcsSettingByDeviceId(@Param("deviceSettingId") Long deviceSettingId); + + void updateByDeviceSettingId(EmsPcsSetting pcsSetting); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java new file mode 100644 index 0000000..f517c59 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointEnumMatchMapper.java @@ -0,0 +1,70 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsPointEnumMatch; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * 点位枚举匹配Mapper接口 + * + * @author xzzn + * @date 2025-12-08 + */ +public interface EmsPointEnumMatchMapper +{ + /** + * 查询点位枚举匹配 + * + * @param id 点位枚举匹配主键 + * @return 点位枚举匹配 + */ + public EmsPointEnumMatch selectEmsPointEnumMatchById(Long id); + + /** + * 查询点位枚举匹配列表 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 点位枚举匹配集合 + */ + public List selectEmsPointEnumMatchList(EmsPointEnumMatch emsPointEnumMatch); + + /** + * 新增点位枚举匹配 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 结果 + */ + public int insertEmsPointEnumMatch(EmsPointEnumMatch emsPointEnumMatch); + + /** + * 修改点位枚举匹配 + * + * @param emsPointEnumMatch 点位枚举匹配 + * @return 结果 + */ + public int updateEmsPointEnumMatch(EmsPointEnumMatch emsPointEnumMatch); + + public void updateDataEnumCodeById(EmsPointEnumMatch pointEnumMatch); + + /** + * 删除点位枚举匹配 + * + * @param id 点位枚举匹配主键 + * @return 结果 + */ + public int deleteEmsPointEnumMatchById(Long id); + + /** + * 批量删除点位枚举匹配 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPointEnumMatchByIds(Long[] ids); + + public List selectList(@Param("siteId") String siteId, + @Param("deviceCategory") String deviceCategory, + @Param("matchField") String matchField); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java new file mode 100644 index 0000000..ee94d2d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java @@ -0,0 +1,176 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointMatchExportVo; +import com.xzzn.ems.domain.vo.DeviceUpdateRequest; +import com.xzzn.ems.domain.vo.GeneralQueryDataVo; +import com.xzzn.ems.domain.vo.PointQueryResponse; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +/** + * 点位匹配Mapper接口 + * + * @author xzzn + * @date 2025-09-02 + */ +public interface EmsPointMatchMapper +{ + /** + * 查询点位匹配 + * + * @param id 点位匹配主键 + * @return 点位匹配 + */ + public EmsPointMatch selectEmsPointMatchById(Long id); + + /** + * 查询点位匹配列表 + * + * @param emsPointMatch 点位匹配 + * @return 点位匹配集合 + */ + public List selectEmsPointMatchList(EmsPointMatch emsPointMatch); + + /** + * 新增点位匹配 + * + * @param emsPointMatch 点位匹配 + * @return 结果 + */ + public int insertEmsPointMatch(EmsPointMatch emsPointMatch); + + /** + * 修改点位匹配 + * + * @param emsPointMatch 点位匹配 + * @return 结果 + */ + public int updateEmsPointMatch(EmsPointMatch emsPointMatch); + + /** + * 删除点位匹配 + * + * @param id 点位匹配主键 + * @return 结果 + */ + public int deleteEmsPointMatchById(Long id); + + /** + * 批量删除点位匹配 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPointMatchByIds(Long[] ids); + + // 模糊查询所有点位 + public List getPointNameList(@Param("siteIds") List siteIds, + @Param("deviceCategory")String deviceCategory, + @Param("pointName") String pointName); + + // 获取匹配信息 + public List getMatchInfo(@Param("siteIds") List siteIds, + @Param("deviceId") String deviceId, + @Param("deviceCategory") String deviceCategory, + @Param("pointName") String pointName); + // 根据条件查询数据-按分钟-单体电池特殊处理 + public List getBatteryPointDataByMinutes(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("params") Map> params, + @Param("clusterDeviceId")String clusterDeviceId); + // 根据条件查询数据-按小时-单体电池特殊处理 + public List getBatteryPointDataByHours(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate") Date startDate, + @Param("endDate")Date endDate, + @Param("params") Map> params, + @Param("clusterDeviceId")String clusterDeviceId); + // 根据条件查询数据-按天-单体电池特殊处理 + public List getBatteryPointDataByDays(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("params") Map> params, + @Param("clusterDeviceId")String clusterDeviceId); + + // 根据条件查询箱线图数据-按天-单体电池特殊处理 + public List getBatteryPointDataForBoxPlot(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("params") Map> params, + @Param("clusterDeviceId")String clusterDeviceId); + + // 根据条件查询数据-按分钟-其他设备 + public List getCommonPointDataByMinutes(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("deviceId")String deviceId); + // 根据条件查询数据-按小时-其他设备 + public List getCommonPointDataByHours(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate") Date startDate, + @Param("endDate")Date endDate, + @Param("deviceId")String deviceId); + // 根据条件查询数据-按天-其他设备 + public List getCommonPointDataByDays(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("deviceId")String deviceId); + // 根据条件查询箱线图数据-按天-其他设备 + public List getCommonPointDataForBoxPlot(@Param("siteIds")List siteIds, + @Param("tableName")String tableName, + @Param("tableField")String tableField, + @Param("startDate")Date startDate, + @Param("endDate")Date endDate, + @Param("deviceId")String deviceId); + + // 单个站点单个设备点位查询-除了电池簇其他设备使用 + public List getSingleSiteDevicePoints(@Param("siteId")String siteId, + @Param("deviceId")String deviceId, + @Param("deviceCategory")String deviceCategory, + @Param("pointName")String pointName, + @Param("dataPoint")String dataPoint, + @Param("ipAddress")String ipAddress, + @Param("ipPort")Integer ipPort, + @Param("isAlarm")Integer isAlarm); + // 单个站点单个设备点位查询-电池簇使用 + public List getClusterDevicePoints(@Param("siteId")String siteId, + @Param("deviceId")String deviceId, + @Param("parentDeviceId")String parentDeviceId, + @Param("deviceCategory")String deviceCategory, + @Param("pointName")String pointName, + @Param("dataPoint")String dataPoint, + @Param("ipAddress")String ipAddress, + @Param("ipPort")Integer ipPort, + @Param("isAlarm")Integer isAlarm); + + // 根据站点,设备类别,点位,获取唯一数据 + public EmsPointMatch getUniquePoint(@Param("siteId")String siteId, @Param("deviceCategory")String deviceCategory, @Param("dataPoint")String dataPoint); + + EmsPointMatch getOnePointMatch(@Param("siteId") String siteId, @Param("deviceId") String deviceId, @Param("deviceCategory") String deviceCategory, @Param("dataPoint") String dataPoint); + + List getDevicePointMatchList(@Param("siteId") String siteId, @Param("deviceId") String deviceId, @Param("deviceCategory") String deviceCategory); + + List selectEmsPointMatchExportList(EmsPointMatch emsPointMatch); + + int getDevicePointAlarmNum(@Param("siteId") String siteId, @Param("deviceId") String deviceId, @Param("deviceCategory") String deviceCategory); + + List selectDeviceStatusPoint(@Param("request") DeviceUpdateRequest request); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPriceTimeConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPriceTimeConfigMapper.java new file mode 100644 index 0000000..a4ef73d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPriceTimeConfigMapper.java @@ -0,0 +1,70 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsPriceTimeConfig; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import org.apache.ibatis.annotations.Param; + +/** + * 电价时间配置Mapper接口 + * + * @author xzzn + * @date 2025-10-09 + */ +public interface EmsPriceTimeConfigMapper +{ + /** + * 查询电价时间配置 + * + * @param id 电价时间配置主键 + * @return 电价时间配置 + */ + public EmsPriceTimeConfig selectEmsPriceTimeConfigById(Long id); + + /** + * 查询电价时间配置列表 + * + * @param emsPriceTimeConfig 电价时间配置 + * @return 电价时间配置集合 + */ + public List selectEmsPriceTimeConfigList(EmsPriceTimeConfig emsPriceTimeConfig); + + /** + * 新增电价时间配置 + * + * @param emsPriceTimeConfig 电价时间配置 + * @return 结果 + */ + public int insertEmsPriceTimeConfig(EmsPriceTimeConfig emsPriceTimeConfig); + + /** + * 修改电价时间配置 + * + * @param emsPriceTimeConfig 电价时间配置 + * @return 结果 + */ + public int updateEmsPriceTimeConfig(EmsPriceTimeConfig emsPriceTimeConfig); + + /** + * 删除电价时间配置 + * + * @param id 电价时间配置主键 + * @return 结果 + */ + public int deleteEmsPriceTimeConfigById(Long id); + + /** + * 批量删除电价时间配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsPriceTimeConfigByIds(Long[] ids); + + // 获取年月的电价时间范围 + public List getTimeRangeByPriceId(Long priceId); + // 批量插入 + public int batchInsert(List timeConfigs); + // 删除priceId对应的时间范围配置 + public void deleteTimeRangeByPriceId(Long[] priceIds); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsSiteSettingMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsSiteSettingMapper.java index 807a767..5507928 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsSiteSettingMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsSiteSettingMapper.java @@ -2,7 +2,9 @@ package com.xzzn.ems.mapper; import java.util.List; import com.xzzn.ems.domain.EmsSiteSetting; +import com.xzzn.ems.domain.vo.SiteDeviceListVo; import com.xzzn.ems.domain.vo.SiteTotalInfoVo; +import org.apache.ibatis.annotations.Param; /** * 站点Mapper接口 @@ -65,4 +67,32 @@ public interface EmsSiteSettingMapper * @return */ public SiteTotalInfoVo getSiteTotalInfo(); + + /** + * 根据站点id获取站点信息 + * @param siteId + * @return + */ + public EmsSiteSetting selectEmsSiteSettingBySiteId(String siteId); + + + /** + * 根据站点名称和投运时间获取站点列表 + * @param siteName + * @param startTime + * @param endTime + * @return + */ + public List getSiteInfoList(@Param("siteName")String siteName, @Param("startTime")String startTime, @Param("endTime")String endTime); + + /** + * 获取站点的设备列表 + * @return + */ + public List getAllSiteDeviceList(@Param("siteId") String siteId, @Param("deviceCategory") String deviceCategory); + + + public List getAllSiteDeviceListNoDisp(@Param("siteId") String siteId, @Param("deviceCategory") String deviceCategory); + + public List getAllSiteId(); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStackAlarmDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStackAlarmDataMapper.java new file mode 100644 index 0000000..0c398a5 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStackAlarmDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsStackAlarmData; + +/** + * bmsd告警数据Mapper接口 + * + * @author xzzn + * @date 2025-10-22 + */ +public interface EmsStackAlarmDataMapper +{ + /** + * 查询bmsd告警数据 + * + * @param id bmsd告警数据主键 + * @return bmsd告警数据 + */ + public EmsStackAlarmData selectEmsStackAlarmDataById(Long id); + + /** + * 查询bmsd告警数据列表 + * + * @param emsStackAlarmData bmsd告警数据 + * @return bmsd告警数据集合 + */ + public List selectEmsStackAlarmDataList(EmsStackAlarmData emsStackAlarmData); + + /** + * 新增bmsd告警数据 + * + * @param emsStackAlarmData bmsd告警数据 + * @return 结果 + */ + public int insertEmsStackAlarmData(EmsStackAlarmData emsStackAlarmData); + + /** + * 修改bmsd告警数据 + * + * @param emsStackAlarmData bmsd告警数据 + * @return 结果 + */ + public int updateEmsStackAlarmData(EmsStackAlarmData emsStackAlarmData); + + /** + * 删除bmsd告警数据 + * + * @param id bmsd告警数据主键 + * @return 结果 + */ + public int deleteEmsStackAlarmDataById(Long id); + + /** + * 批量删除bmsd告警数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStackAlarmDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyCurveMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyCurveMapper.java new file mode 100644 index 0000000..e7a759e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyCurveMapper.java @@ -0,0 +1,73 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategyCurve; +import org.apache.ibatis.annotations.Param; + +/** + * 策曲线Mapper接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface EmsStrategyCurveMapper +{ + /** + * 查询策曲线 + * + * @param id 策曲线主键 + * @return 策曲线 + */ + public EmsStrategyCurve selectEmsStrategyCurveById(Long id); + + /** + * 查询策曲线列表 + * + * @param emsStrategyCurve 策曲线 + * @return 策曲线集合 + */ + public List selectEmsStrategyCurveList(EmsStrategyCurve emsStrategyCurve); + + /** + * 新增策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + public int insertEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve); + + /** + * 修改策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + public int updateEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve); + + /** + * 删除策曲线 + * + * @param id 策曲线主键 + * @return 结果 + */ + public int deleteEmsStrategyCurveById(Long id); + + /** + * 批量删除策曲线 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyCurveByIds(Long[] ids); + + /** + * 根据模板id获取曲线图数据 + * @param templateId + * @return + */ + public List getTemplateCurve(String templateId); + + public void physicalDeleteCurve(@Param("strategyId")Long strategyId,@Param("siteId")String siteId); + // 根据模版id 删除推送的曲线图数据 + public void physicalDeleteByTemplateId(String templateId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyLogMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyLogMapper.java new file mode 100644 index 0000000..e54769d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyLogMapper.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsStrategyLog; + +import java.util.List; + +/** + * 策略运行日志Mapper接口 + * + * @author xzzn + * @date 2025-12-26 + */ +public interface EmsStrategyLogMapper +{ + /** + * 查询策略运行日志 + * + * @param id 策略运行日志主键 + * @return 策略运行日志 + */ + public EmsStrategyLog selectEmsStrategyLogById(Long id); + + /** + * 查询策略运行日志列表 + * + * @param emsStrategyLog 策略运行日志 + * @return 策略运行日志集合 + */ + public List selectEmsStrategyLogList(EmsStrategyLog emsStrategyLog); + + /** + * 新增策略运行日志 + * + * @param emsStrategyLog 策略运行日志 + * @return 结果 + */ + public int insertEmsStrategyLog(EmsStrategyLog emsStrategyLog); + + /** + * 修改策略运行日志 + * + * @param emsStrategyLog 策略运行日志 + * @return 结果 + */ + public int updateEmsStrategyLog(EmsStrategyLog emsStrategyLog); + + /** + * 删除策略运行日志 + * + * @param id 策略运行日志主键 + * @return 结果 + */ + public int deleteEmsStrategyLogById(Long id); + + /** + * 批量删除策略运行日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyLogByIds(Long[] ids); + + EmsStrategyLog getLastStrategyLog(EmsStrategyLog query); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyMapper.java new file mode 100644 index 0000000..396c04d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyMapper.java @@ -0,0 +1,66 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategy; + +/** + * 策略Mapper接口 + * + * @author xzzn + * @date 2025-07-10 + */ +public interface EmsStrategyMapper +{ + /** + * 查询策略 + * + * @param id 策略主键 + * @return 策略 + */ + public EmsStrategy selectEmsStrategyById(Long id); + + /** + * 查询策略列表 + * + * @param emsStrategy 策略 + * @return 策略集合 + */ + public List selectEmsStrategyList(EmsStrategy emsStrategy); + + /** + * 新增策略 + * + * @param emsStrategy 策略 + * @return 结果 + */ + public int insertEmsStrategy(EmsStrategy emsStrategy); + + /** + * 修改策略 + * + * @param emsStrategy 策略 + * @return 结果 + */ + public int updateEmsStrategy(EmsStrategy emsStrategy); + + /** + * 删除策略 + * + * @param id 策略主键 + * @return 结果 + */ + public int deleteEmsStrategyById(Long id); + + /** + * 批量删除策略 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyByIds(Long[] ids); + + public List getStrategyListByType(Long type); + + // 通过名称获取策略 + public EmsStrategy getStrategyByName(String strategyName); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyRunningMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyRunningMapper.java new file mode 100644 index 0000000..b25295a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyRunningMapper.java @@ -0,0 +1,83 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.vo.StrategyRunningVo; +import org.apache.ibatis.annotations.Param; + +/** + * 策略运行Mapper接口 + * + * @author xzzn + * @date 2025-07-10 + */ +public interface EmsStrategyRunningMapper +{ + /** + * 查询策略运行 + * + * @param id 策略运行主键 + * @return 策略运行 + */ + public EmsStrategyRunning selectEmsStrategyRunningById(Long id); + + /** + * 查询策略运行列表 + * + * @param emsStrategyRunning 策略运行 + * @return 策略运行集合 + */ + public List selectEmsStrategyRunningList(EmsStrategyRunning emsStrategyRunning); + + /** + * 新增策略运行 + * + * @param emsStrategyRunning 策略运行 + * @return 结果 + */ + public int insertEmsStrategyRunning(EmsStrategyRunning emsStrategyRunning); + + /** + * 修改策略运行 + * + * @param emsStrategyRunning 策略运行 + * @return 结果 + */ + public int updateEmsStrategyRunning(EmsStrategyRunning emsStrategyRunning); + + /** + * 删除策略运行 + * + * @param id 策略运行主键 + * @return 结果 + */ + public int deleteEmsStrategyRunningById(Long id); + + /** + * 批量删除策略运行 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyRunningByIds(Long[] ids); + + // 获取站点运行策略列表 + public List getRunningList(String siteId); + + // 停止策略 + public int stopEmsStrategyRunning(Long id); + + // 根据主策略id、辅助策略id、siteId 获取运行策略 + public EmsStrategyRunning selectEmsStrategyRunning(EmsStrategyRunning emsStrategyRunning); + + // 更新站点策略为运行 + public void updateStatusRunning(@Param("siteId") String siteId,@Param("status") String status); + + // 获取运行中的策略 + public List getPendingPollerStrategy(String siteId); + + // 获取正在运行的策略 + public EmsStrategyRunning getRunningStrategy(String siteId); + // 获取已存在并且状态为:未启用和已暂停的最晚一条策略, + public EmsStrategyRunning getPendingStrategy(String siteId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTempMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTempMapper.java new file mode 100644 index 0000000..a15653a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTempMapper.java @@ -0,0 +1,76 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import java.util.Map; + +import com.xzzn.ems.domain.EmsStrategyTemp; +import org.apache.ibatis.annotations.Param; + +/** + * 模板Mapper接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface EmsStrategyTempMapper +{ + /** + * 查询模板 + * + * @param id 模板主键 + * @return 模板 + */ + public EmsStrategyTemp selectEmsStrategyTempById(Long id); + + /** + * 查询模板列表 + * + * @param emsStrategyTemp 模板 + * @return 模板集合 + */ + public List selectEmsStrategyTempList(EmsStrategyTemp emsStrategyTemp); + + /** + * 新增模板 + * + * @param emsStrategyTemp 模板 + * @return 结果 + */ + public int insertEmsStrategyTemp(EmsStrategyTemp emsStrategyTemp); + + /** + * 修改模板 + * + * @param emsStrategyTemp 模板 + * @return 结果 + */ + public int updateEmsStrategyTemp(EmsStrategyTemp emsStrategyTemp); + + /** + * 删除模板 + * + * @param id 模板主键 + * @return 结果 + */ + public int deleteEmsStrategyTempById(Long id); + + /** + * 批量删除模板 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyTempByIds(Long[] ids); + + // 获取模板名称和id + public List> getTempNameList(@Param("strategyId")Long strategyId, @Param("siteId")String siteId); + + // 根据模板id获取模板所有的时间配置 + public List selectStrategyTempByTempId(String templateId); + + // 根据模板id全部删除 + public int deleteTempByTempId(String templateId); + + // 获取站点和策略下的模板信息 + public List getTempListBySiteIdAndStrategyId(@Param("siteId") String siteId, @Param("strategyId")Long strategyId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTimeConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTimeConfigMapper.java new file mode 100644 index 0000000..131d09b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsStrategyTimeConfigMapper.java @@ -0,0 +1,85 @@ +package com.xzzn.ems.mapper; + +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.domain.vo.StrategyTimeConfigVo; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +/** + * 时间配置Mapper接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface EmsStrategyTimeConfigMapper +{ + /** + * 查询时间配置 + * + * @param id 时间配置主键 + * @return 时间配置 + */ + public EmsStrategyTimeConfig selectEmsStrategyTimeConfigById(Long id); + + /** + * 查询时间配置列表 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 时间配置集合 + */ + public List selectEmsStrategyTimeConfigList(EmsStrategyTimeConfig emsStrategyTimeConfig); + + /** + * 新增时间配置 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 结果 + */ + public int insertEmsStrategyTimeConfig(EmsStrategyTimeConfig emsStrategyTimeConfig); + + /** + * 修改时间配置 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 结果 + */ + public int updateEmsStrategyTimeConfig(EmsStrategyTimeConfig emsStrategyTimeConfig); + + /** + * 删除时间配置 + * + * @param id 时间配置主键 + * @return 结果 + */ + public int deleteEmsStrategyTimeConfigById(Long id); + + /** + * 批量删除时间配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsStrategyTimeConfigByIds(Long[] ids); + + // 获取该策略下的时间配置 + public List getStrategyTimeList(EmsStrategyTimeConfig emsStrategyTimeConfig); + + // 清空该月的模板信息 + public void cleanTemplateId(String templateId); + + // 获取该策略下的时间配置 + List getAllTimeConfigByTempId(String templateId); + + // 获取指定月份和策略下的时间配置 + List getTimeConfigByTempIdAndMonth(@Param("templateId") String templateId, @Param("month") int month); + + // 设置该模版的时间配置为待下发 + public void updateTimeConfigWaitingPost(String templateId); + + // 判断时间配置是否存在 + public EmsStrategyTimeConfig getExistTimeConfig(@Param("siteId")String siteId, + @Param("strategyId")Long strategyId, + @Param("month")Long month); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsTicketMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsTicketMapper.java index e29578a..eb26916 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsTicketMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsTicketMapper.java @@ -1,6 +1,8 @@ package com.xzzn.ems.mapper; import com.xzzn.ems.domain.EmsTicket; +import com.xzzn.ems.domain.vo.TicketListVo; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -59,4 +61,25 @@ public interface EmsTicketMapper * @return 结果 */ public int deleteEmsTicketByIds(String[] ids); + + /** + * 废弃工单-isDelete=0 + * @param id + * @return + */ + public int dropEmsTicketById(String id); + + /** + * 获取工单列表 + * @param statusList + * @return + */ + public List getAllTicketList(@Param("statusList")Long[] statusList); + + /** + * 工单详情 + * @param id + * @return + */ + public TicketListVo getTicketDetailInfo(String id); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsXfDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsXfDataMapper.java new file mode 100644 index 0000000..2771b2e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsXfDataMapper.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.EmsXfData; + +/** + * 消防数据Mapper接口 + * + * @author xzzn + * @date 2025-10-21 + */ +public interface EmsXfDataMapper +{ + /** + * 查询消防数据 + * + * @param id 消防数据主键 + * @return 消防数据 + */ + public EmsXfData selectEmsXfDataById(Long id); + + /** + * 查询消防数据列表 + * + * @param emsXfData 消防数据 + * @return 消防数据集合 + */ + public List selectEmsXfDataList(EmsXfData emsXfData); + + /** + * 新增消防数据 + * + * @param emsXfData 消防数据 + * @return 结果 + */ + public int insertEmsXfData(EmsXfData emsXfData); + + /** + * 修改消防数据 + * + * @param emsXfData 消防数据 + * @return 结果 + */ + public int updateEmsXfData(EmsXfData emsXfData); + + /** + * 删除消防数据 + * + * @param id 消防数据主键 + * @return 结果 + */ + public int deleteEmsXfDataById(Long id); + + /** + * 批量删除消防数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteEmsXfDataByIds(Long[] ids); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/MqttSyncLogMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/MqttSyncLogMapper.java new file mode 100644 index 0000000..e8199d0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/MqttSyncLogMapper.java @@ -0,0 +1,63 @@ +package com.xzzn.ems.mapper; + +import java.util.List; +import com.xzzn.ems.domain.MqttSyncLog; + +/** + * MQTT云上本地同步日志Mapper接口 + * + * @author xzzn + * @date 2025-11-12 + */ +public interface MqttSyncLogMapper +{ + /** + * 查询MQTT云上本地同步日志 + * + * @param id MQTT云上本地同步日志主键 + * @return MQTT云上本地同步日志 + */ + public MqttSyncLog selectMqttSyncLogById(Long id); + + /** + * 查询MQTT云上本地同步日志列表 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return MQTT云上本地同步日志集合 + */ + public List selectMqttSyncLogList(MqttSyncLog mqttSyncLog); + + /** + * 新增MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + public int insertMqttSyncLog(MqttSyncLog mqttSyncLog); + + /** + * 修改MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + public int updateMqttSyncLog(MqttSyncLog mqttSyncLog); + + /** + * 删除MQTT云上本地同步日志 + * + * @param id MQTT云上本地同步日志主键 + * @return 结果 + */ + public int deleteMqttSyncLogById(Long id); + + /** + * 批量删除MQTT云上本地同步日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteMqttSyncLogByIds(Long[] ids); + + public MqttSyncLog selectMqttSyncLogBySyncId(String syncId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IDDSDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IDDSDataProcessService.java new file mode 100644 index 0000000..c1ab276 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IDDSDataProcessService.java @@ -0,0 +1,7 @@ +package com.xzzn.ems.service; + +public interface IDDSDataProcessService { + + public void handleDdsData(String message); + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java new file mode 100644 index 0000000..2c07bd8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java @@ -0,0 +1,8 @@ +package com.xzzn.ems.service; + +public interface IDeviceDataProcessService { + + public void handleDeviceData(String message, String siteId); + + public void handleAlarmData(String message, String siteId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java new file mode 100644 index 0000000..ba7d36f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java @@ -0,0 +1,108 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.domain.vo.AlarmRecordListRequestVo; +import com.xzzn.ems.domain.vo.AlarmRecordListResponseVo; + +import java.util.List; + +/** + * 告警记录Service接口 + * + * @author xzzn + * @date 2025-06-29 + */ +public interface IEmsAlarmRecordsService +{ + /** + * 查询告警记录 + * + * @param id 告警记录主键 + * @return 告警记录 + */ + public EmsAlarmRecords selectEmsAlarmRecordsById(Long id); + + /** + * 查询告警记录列表 + * + * @param emsAlarmRecords 告警记录 + * @return 告警记录集合 + */ + public List selectEmsAlarmRecordsList(EmsAlarmRecords emsAlarmRecords); + + /** + * 新增告警记录 + * + * @param emsAlarmRecords 告警记录 + * @return 结果 + */ + public int insertEmsAlarmRecords(EmsAlarmRecords emsAlarmRecords); + + /** + * 修改告警记录 + * + * @param emsAlarmRecords 告警记录 + * @return 结果 + */ + public int updateEmsAlarmRecords(EmsAlarmRecords emsAlarmRecords); + + /** + * 批量删除告警记录 + * + * @param ids 需要删除的告警记录主键集合 + * @return 结果 + */ + public int deleteEmsAlarmRecordsByIds(Long[] ids); + + /** + * 删除告警记录信息 + * + * @param id 告警记录主键 + * @return 结果 + */ + public int deleteEmsAlarmRecordsById(Long id); + + /** + * 获取故障告警列表 + * @param requestVo + * @return + */ + public List getAlarmRecordDetailList(AlarmRecordListRequestVo requestVo); + + /** + * 生产工单号并设置告警处理中 + * + * @param id + * @param userId + * @return + */ + public String createTicketNo(Long id, Long userId); + // 订阅失败-增加告警 + public void addSubFailedAlarmRecord(String topic); + // 订阅成功-处理告警 + public void checkFailedRecord(String topic); + + // topic 内没有数据,按照设备维度告警 + public void addEmptyDataAlarmRecord(String siteId, String deviceId); + + public void deleteEmptyDataAlarmRecord(String siteId, String deviceId); + + // 告警字段和告警信息 + public void initAlarmMatchInfo(); + + // 获取所有没有处理完成的告警记录 + public List getAllUnfinishedRecords(List needUpdateKeys, String siteId, String deviceId); + + // 批量处理告警数据 + public void batchProcessAlarmRecords(List recordsList); + + // 根据site_id和deviceId更新对应的redis + public void updateRedisAlarmRecords(String siteId, String deviceId); + + // 处理本地端同步的保护策略告警信息 + public void dealSyncData(String content, String operateType); + + public void addDeviceOfflineRecord(String siteId, String deviceNumber); + + public void deleteDeviceOfflineRecord(String siteId, String deviceNumber); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryClusterService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryClusterService.java new file mode 100644 index 0000000..29a6998 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryClusterService.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryCluster; + +/** + * 电池簇数据Service接口 + * + * @author xzzn + * @date 2025-06-29 + */ +public interface IEmsBatteryClusterService +{ + /** + * 查询电池簇数据 + * + * @param id 电池簇数据主键 + * @return 电池簇数据 + */ + public EmsBatteryCluster selectEmsBatteryClusterById(Long id); + + /** + * 查询电池簇数据列表 + * + * @param emsBatteryCluster 电池簇数据 + * @return 电池簇数据集合 + */ + public List selectEmsBatteryClusterList(EmsBatteryCluster emsBatteryCluster); + + /** + * 新增电池簇数据 + * + * @param emsBatteryCluster 电池簇数据 + * @return 结果 + */ + public int insertEmsBatteryCluster(EmsBatteryCluster emsBatteryCluster); + + /** + * 修改电池簇数据 + * + * @param emsBatteryCluster 电池簇数据 + * @return 结果 + */ + public int updateEmsBatteryCluster(EmsBatteryCluster emsBatteryCluster); + + /** + * 批量删除电池簇数据 + * + * @param ids 需要删除的电池簇数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryClusterByIds(Long[] ids); + + /** + * 删除电池簇数据信息 + * + * @param id 电池簇数据主键 + * @return 结果 + */ + public int deleteEmsBatteryClusterById(Long id); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDailyLatestService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDailyLatestService.java new file mode 100644 index 0000000..43df589 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDailyLatestService.java @@ -0,0 +1,67 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryDataDailyLatest; + +/** + * 单体电池每日最新数据Service接口 + * + * @author xzzn + * @date 2025-07-18 + */ +public interface IEmsBatteryDailyLatestService +{ + /** + * 查询单体电池每日最新数据 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 单体电池每日最新数据 + */ + public EmsBatteryDataDailyLatest selectEmsBatteryDataDailyLatestByBatteryPack(String batteryPack); + + /** + * 查询单体电池每日最新数据列表 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 单体电池每日最新数据集合 + */ + public List selectEmsBatteryDataDailyLatestList(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 新增单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + public int insertEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 修改单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + public int updateEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest); + + /** + * 批量删除单体电池每日最新数据 + * + * @param batteryPacks 需要删除的单体电池每日最新数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataDailyLatestByBatteryPacks(String[] batteryPacks); + + /** + * 删除单体电池每日最新数据信息 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataDailyLatestByBatteryPack(String batteryPack); + + /** + * 批量处理每日数据 + * @param dailyList + */ + public void batchProcessBatteryData(List dailyList); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDataService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDataService.java new file mode 100644 index 0000000..2c958a0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryDataService.java @@ -0,0 +1,71 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.EmsBatteryData; + +import java.util.List; + +/** + * 单体电池实时数据Service接口 + * + * @author xzzn + * @date 2025-06-27 + */ +public interface IEmsBatteryDataService +{ + /** + * 查询单体电池实时数据 + * + * @param id 单体电池实时数据主键 + * @return 单体电池实时数据 + */ + public EmsBatteryData selectEmsBatteryDataById(Long id); + + /** + * 查询单体电池实时数据列表 + * + * @param emsBatteryData 单体电池实时数据 + * @return 单体电池实时数据集合 + */ + public List selectEmsBatteryDataList(EmsBatteryData emsBatteryData); + + /** + * 新增单体电池实时数据 + * + * @param emsBatteryData 单体电池实时数据 + * @return 结果 + */ + public int insertEmsBatteryData(EmsBatteryData emsBatteryData); + + /** + * 修改单体电池实时数据 + * + * @param emsBatteryData 单体电池实时数据 + * @return 结果 + */ + public int updateEmsBatteryData(EmsBatteryData emsBatteryData); + + /** + * 批量删除单体电池实时数据 + * + * @param ids 需要删除的单体电池实时数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryDataByIds(Long[] ids); + + /** + * 删除单体电池实时数据信息 + * + * @param id 单体电池实时数据主键 + * @return 结果 + */ + public int deleteEmsBatteryDataById(Long id); + + /** + * 新增单体电池实时数据 + * + * @param emsBatteryDataList 单体电池实时数据 + * @return 结果 + */ + public int insertEmsBatteryDataList(List emsBatteryDataList); + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryStackService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryStackService.java new file mode 100644 index 0000000..5d48c59 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsBatteryStackService.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsBatteryStack; + +/** + * 电池堆数据Service接口 + * + * @author xzzn + * @date 2025-06-29 + */ +public interface IEmsBatteryStackService +{ + /** + * 查询电池堆数据 + * + * @param id 电池堆数据主键 + * @return 电池堆数据 + */ + public EmsBatteryStack selectEmsBatteryStackById(Long id); + + /** + * 查询电池堆数据列表 + * + * @param emsBatteryStack 电池堆数据 + * @return 电池堆数据集合 + */ + public List selectEmsBatteryStackList(EmsBatteryStack emsBatteryStack); + + /** + * 新增电池堆数据 + * + * @param emsBatteryStack 电池堆数据 + * @return 结果 + */ + public int insertEmsBatteryStack(EmsBatteryStack emsBatteryStack); + + /** + * 修改电池堆数据 + * + * @param emsBatteryStack 电池堆数据 + * @return 结果 + */ + public int updateEmsBatteryStack(EmsBatteryStack emsBatteryStack); + + /** + * 批量删除电池堆数据 + * + * @param ids 需要删除的电池堆数据主键集合 + * @return 结果 + */ + public int deleteEmsBatteryStackByIds(Long[] ids); + + /** + * 删除电池堆数据信息 + * + * @param id 电池堆数据主键 + * @return 结果 + */ + public int deleteEmsBatteryStackById(Long id); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceChangeLogService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceChangeLogService.java new file mode 100644 index 0000000..ba6e7d7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceChangeLogService.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsDeviceChangeLog; + +/** + * 设备状态变更记录Service接口 + * + * @author xzzn + * @date 2025-11-15 + */ +public interface IEmsDeviceChangeLogService +{ + /** + * 查询设备状态变更记录 + * + * @param id 设备状态变更记录主键 + * @return 设备状态变更记录 + */ + public EmsDeviceChangeLog selectEmsDeviceChangeLogById(Long id); + + /** + * 查询设备状态变更记录列表 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 设备状态变更记录集合 + */ + public List selectEmsDeviceChangeLogList(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 新增设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + public int insertEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 修改设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + public int updateEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog); + + /** + * 批量删除设备状态变更记录 + * + * @param ids 需要删除的设备状态变更记录主键集合 + * @return 结果 + */ + public int deleteEmsDeviceChangeLogByIds(Long[] ids); + + /** + * 删除设备状态变更记录信息 + * + * @param id 设备状态变更记录主键 + * @return 结果 + */ + public int deleteEmsDeviceChangeLogById(Long id); + + // 处理本地端同步设备状态变更数据 + public void dealSyncData(String content, String operateType); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceSettingService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceSettingService.java new file mode 100644 index 0000000..554bdee --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsDeviceSettingService.java @@ -0,0 +1,39 @@ +package com.xzzn.ems.service; + +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.vo.DeviceUpdateRequest; +import com.xzzn.ems.domain.vo.DevicesSettingVo; +import com.xzzn.ems.domain.vo.PointDataRequest; +import com.xzzn.ems.domain.vo.PointQueryResponse; + +import java.util.List; +import java.util.Map; + +/** + * 设备信息 服务层 + * + */ +public interface IEmsDeviceSettingService +{ + + public DevicesSettingVo getDeviceDetailInfo(Long deviceId); + + public int addDevice(DevicesSettingVo devicesSetting); + + public int updateDevice(DevicesSettingVo emsDevicesSetting); + + public int deleteEmsDevicesSettingById(Long id); + + public List getDeviceCategory(); + + public List getSingleSiteDevicePoints(PointDataRequest request); + + public List getSiteAllDeviceCategory(String siteId); + // 初始化设备信息 + public Map> initDeviceInfo(); + + public List> getDeviceListBySiteAndCategory(String siteId, String deviceCategory); + + public boolean updateDeviceStatus(DeviceUpdateRequest request); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java new file mode 100644 index 0000000..b5eed5a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java @@ -0,0 +1,71 @@ +package com.xzzn.ems.service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +import com.xzzn.ems.domain.EmsEnergyPriceConfig; +import com.xzzn.ems.domain.vo.EnergyPriceVo; + +/** + * 电价配置Service接口 + * + * @author xzzn + * @date 2025-09-28 + */ +public interface IEmsEnergyPriceConfigService +{ + /** + * 查询电价配置 + * + * @param id 电价配置主键 + * @return 电价配置 + */ + public EnergyPriceVo selectEmsEnergyPriceConfigById(Long id); + + /** + * 查询电价配置列表 + * + * @return 电价配置集合 + */ + public List selectEmsEnergyPriceConfigList(String siteId, String startTime,String endTime); + + /** + * 新增电价配置-按月 + * + * @param priceVo 电价配置 + * @return 结果 + */ + public int insertEmsEnergyPriceConfig(EnergyPriceVo priceVo); + + /** + * 修改电价配置 + * + * @param priceVo 电价配置 + * @return 结果 + */ + public int updateEmsEnergyPriceConfig(EnergyPriceVo priceVo); + + /** + * 批量删除电价配置 + * + * @param ids 需要删除的电价配置主键集合 + * @return 结果 + */ + public int deleteEmsEnergyPriceConfigByIds(Long[] ids); + + /** + * 删除电价配置信息 + * + * @param id 电价配置主键 + * @return 结果 + */ + public int deleteEmsEnergyPriceConfigById(Long id); + + // 初始化当月电价 + public void initCurrentMonthPrice(); + // 获取指定站点的当月电价 + public EnergyPriceVo getCurrentMonthPrice(String siteId); + // 获取指定站点的总收益和当日实时收益 + public Map getDayRevenueMap(String siteId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultIssueLogService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultIssueLogService.java new file mode 100644 index 0000000..d4071c3 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultIssueLogService.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsFaultIssueLog; + +/** + * 告警保护方案下发日志Service接口 + * + * @author xzzn + * @date 2025-11-15 + */ +public interface IEmsFaultIssueLogService +{ + /** + * 查询告警保护方案下发日志 + * + * @param id 告警保护方案下发日志主键 + * @return 告警保护方案下发日志 + */ + public EmsFaultIssueLog selectEmsFaultIssueLogById(Long id); + + /** + * 查询告警保护方案下发日志列表 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 告警保护方案下发日志集合 + */ + public List selectEmsFaultIssueLogList(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 新增告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + public int insertEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 修改告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + public int updateEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog); + + /** + * 批量删除告警保护方案下发日志 + * + * @param ids 需要删除的告警保护方案下发日志主键集合 + * @return 结果 + */ + public int deleteEmsFaultIssueLogByIds(Long[] ids); + + /** + * 删除告警保护方案下发日志信息 + * + * @param id 告警保护方案下发日志主键 + * @return 结果 + */ + public int deleteEmsFaultIssueLogById(Long id); + + // 处理本地端同步的告警保护下发日志信息 + public void dealSyncData(String content, String operateType); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultProtectionPlanService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultProtectionPlanService.java new file mode 100644 index 0000000..36cbf28 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsFaultProtectionPlanService.java @@ -0,0 +1,64 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; + +/** + * 故障告警保护方案Service接口 + * + * @author xzzn + * @date 2025-10-24 + */ +public interface IEmsFaultProtectionPlanService +{ + /** + * 查询故障告警保护方案 + * + * @param id 故障告警保护方案主键 + * @return 故障告警保护方案 + */ + public EmsFaultProtectionPlan selectEmsFaultProtectionPlanById(Long id); + + /** + * 查询故障告警保护方案列表 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 故障告警保护方案集合 + */ + public List selectEmsFaultProtectionPlanList(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 新增故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + public int insertEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 修改故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + public int updateEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan); + + /** + * 批量删除故障告警保护方案 + * + * @param ids 需要删除的故障告警保护方案主键集合 + * @return 结果 + */ + public int deleteEmsFaultProtectionPlanByIds(Long[] ids); + + /** + * 删除故障告警保护方案信息 + * + * @param id 故障告警保护方案主键 + * @return 结果 + */ + public int deleteEmsFaultProtectionPlanById(Long id); + + // 处理云上同步设备保护告警信息 + public void dealSyncData(String content, String operateType); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttMessageService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttMessageService.java new file mode 100644 index 0000000..5979855 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttMessageService.java @@ -0,0 +1,71 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.EmsMqttMessage; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author xzzn + * @date 2025-06-27 + */ +public interface IEmsMqttMessageService +{ + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + public EmsMqttMessage selectEmsMqttMessageById(Long id); + + /** + * 查询【请填写功能名称】列表 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + public List selectEmsMqttMessageList(EmsMqttMessage emsMqttMessage); + + /** + * 新增【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + public int insertEmsMqttMessage(EmsMqttMessage emsMqttMessage); + + /** + * 修改【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + public int updateEmsMqttMessage(EmsMqttMessage emsMqttMessage); + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键集合 + * @return 结果 + */ + public int deleteEmsMqttMessageByIds(Long[] ids); + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + public int deleteEmsMqttMessageById(Long id); + + /** + * 新增【请填写功能名称】 + * + * @param topic 【请填写功能名称】 + * @param message 【请填写功能名称】 + * @return 结果 + */ + public int insertMqttOriginalMessage(String topic, String message); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttTopicConfigService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttTopicConfigService.java new file mode 100644 index 0000000..efc756a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsMqttTopicConfigService.java @@ -0,0 +1,61 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsMqttTopicConfig; + +/** + * 站点topic配置Service接口 + * + * @author xzzn + * @date 2025-11-06 + */ +public interface IEmsMqttTopicConfigService +{ + /** + * 查询站点topic配置 + * + * @param id 站点topic配置主键 + * @return 站点topic配置 + */ + public EmsMqttTopicConfig selectEmsMqttTopicConfigById(Long id); + + /** + * 查询站点topic配置列表 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 站点topic配置集合 + */ + public List selectEmsMqttTopicConfigList(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 新增站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + public int insertEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 修改站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + public int updateEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig); + + /** + * 批量删除站点topic配置 + * + * @param ids 需要删除的站点topic配置主键集合 + * @return 结果 + */ + public int deleteEmsMqttTopicConfigByIds(Long[] ids); + + /** + * 删除站点topic配置信息 + * + * @param id 站点topic配置主键 + * @return 结果 + */ + public int deleteEmsMqttTopicConfigById(Long id); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsBranchDataService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsBranchDataService.java new file mode 100644 index 0000000..8929301 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsBranchDataService.java @@ -0,0 +1,63 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsPcsBranchData; + +/** + * pcs支路数据Service接口 + * + * @author xzzn + * @date 2025-06-29 + */ +public interface IEmsPcsBranchDataService +{ + /** + * 查询pcs支路数据 + * + * @param id pcs支路数据主键 + * @return pcs支路数据 + */ + public EmsPcsBranchData selectEmsPcsBranchDataById(Long id); + + /** + * 查询pcs支路数据列表 + * + * @param emsPcsBranchData pcs支路数据 + * @return pcs支路数据集合 + */ + public List selectEmsPcsBranchDataList(EmsPcsBranchData emsPcsBranchData); + + /** + * 新增pcs支路数据 + * + * @param emsPcsBranchData pcs支路数据 + * @return 结果 + */ + public int insertEmsPcsBranchData(EmsPcsBranchData emsPcsBranchData); + + /** + * 修改pcs支路数据 + * + * @param emsPcsBranchData pcs支路数据 + * @return 结果 + */ + public int updateEmsPcsBranchData(EmsPcsBranchData emsPcsBranchData); + + /** + * 批量删除pcs支路数据 + * + * @param ids 需要删除的pcs支路数据主键集合 + * @return 结果 + */ + public int deleteEmsPcsBranchDataByIds(Long[] ids); + + /** + * 删除pcs支路数据信息 + * + * @param id pcs支路数据主键 + * @return 结果 + */ + public int deleteEmsPcsBranchDataById(Long id); + + int insertEmsPcsBranchDataList(List list); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsDataService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsDataService.java new file mode 100644 index 0000000..bff774d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPcsDataService.java @@ -0,0 +1,62 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.EmsPcsData; + +import java.util.List; + +/** + * PCS数据Service接口 + * + * @author xzzn + * @date 2025-06-27 + */ +public interface IEmsPcsDataService +{ + /** + * 查询PCS数据 + * + * @param id PCS数据主键 + * @return PCS数据 + */ + public EmsPcsData selectEmsPcsDataById(Long id); + + /** + * 查询PCS数据列表 + * + * @param emsPcsData PCS数据 + * @return PCS数据集合 + */ + public List selectEmsPcsDataList(EmsPcsData emsPcsData); + + /** + * 新增PCS数据 + * + * @param emsPcsData PCS数据 + * @return 结果 + */ + public int insertEmsPcsData(EmsPcsData emsPcsData); + + /** + * 修改PCS数据 + * + * @param emsPcsData PCS数据 + * @return 结果 + */ + public int updateEmsPcsData(EmsPcsData emsPcsData); + + /** + * 批量删除PCS数据 + * + * @param ids 需要删除的PCS数据主键集合 + * @return 结果 + */ + public int deleteEmsPcsDataByIds(Long[] ids); + + /** + * 删除PCS数据信息 + * + * @param id PCS数据主键 + * @return 结果 + */ + public int deleteEmsPcsDataById(Long id); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsPointMatchService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPointMatchService.java new file mode 100644 index 0000000..121ec50 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsPointMatchService.java @@ -0,0 +1,43 @@ +package com.xzzn.ems.service; + +import java.util.List; + +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointMatchExportVo; +import com.xzzn.ems.domain.vo.DevicePointMatchVo; +import com.xzzn.ems.domain.vo.ImportPointDataRequest; + +/** + * 点位匹配Service接口 + * + * @author xzzn + * @date 2025-11-04 + */ +public interface IEmsPointMatchService +{ + /** + * 查询点位匹配列表 + * + * @param emsPointMatch 点位匹配 + * @return 点位匹配集合 + */ + public List selectEmsPointMatchList(EmsPointMatch emsPointMatch); + + + /** + * 上传点位清单 + * @param userList + * @param updateSupport + * @param operName + * @return + */ + public String importPoint(List userList, boolean updateSupport, String operName); + + /** + * 上传设备的点位清单 + * @param request + * @return + * @throws Exception + */ + public List importDataByDevice(ImportPointDataRequest request, String operName); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsSiteService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsSiteService.java index 4ac665c..298266f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsSiteService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsSiteService.java @@ -1,9 +1,11 @@ package com.xzzn.ems.service; import com.xzzn.ems.domain.EmsSiteSetting; +import com.xzzn.ems.domain.vo.SiteDeviceListVo; import com.xzzn.ems.domain.vo.SiteTotalInfoVo; import java.util.List; +import java.util.Map; /** * 站点信息 服务层 @@ -16,4 +18,18 @@ public interface IEmsSiteService public SiteTotalInfoVo getSiteTotalInfo(); + + public List> getAllStackInfo(String siteId); + + public List> getAllClusterInfo(String siteId, String stackDeviceId); + + public List getAllSiteInfoList(String siteName, String startTime, String endTime); + + public List getAllDeviceList(String siteId, String deviceCategory); + + public List getAllDeviceListNoDisp(String siteId, String deviceCategory); + + public List> getAllPcsInfo(String siteId); + + public List> getParentCategoryDeviceId(String siteId, String deviceCategory); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java new file mode 100644 index 0000000..3283931 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java @@ -0,0 +1,40 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.vo.*; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +/** + * 统计报表数据Service接口 + * + * @author xzzn + * @date 2025-06-29 + */ +public interface IEmsStatsReportService +{ + + public ElectricDataInfoVo getElectricDataResult(DateSearchRequest requestVo); + + public List getPCSDataResult(DateSearchRequest requestVo); + + public List getStackDataResult(DateSearchRequest requestVo); + + public List getClusterDataResult(StatisClusterDateRequest requestVo); + + public List> getLoadNameList(String siteId); + + public List getAmmeterDataResult(StatisAmmeterDateRequest requestVo); + + List getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo); + + public List getPowerDataList(DateSearchRequest requestVo); + + public List getSingleBatteryData(DateSearchRequest requestVo); + + void exportAmmeterData(HttpServletResponse response, StatisAmmeterDateRequest requestVo); + + void exportAmmeterRevenueData(HttpServletResponse response, StatisAmmeterDateRequest requestVo); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyCurveService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyCurveService.java new file mode 100644 index 0000000..d5510bb --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyCurveService.java @@ -0,0 +1,66 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategyCurve; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.vo.StrategyCurveVo; + +/** + * 策曲线Service接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface IEmsStrategyCurveService +{ + /** + * 查询策曲线 + * + * @param id 策曲线主键 + * @return 策曲线 + */ + public EmsStrategyCurve selectEmsStrategyCurveById(Long id); + + /** + * 查询策曲线列表 + * + * @param emsStrategyCurve 策曲线 + * @return 策曲线集合 + */ + public List selectEmsStrategyCurveList(EmsStrategyCurve emsStrategyCurve); + + /** + * 新增策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + public int insertEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve); + + /** + * 修改策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + public int updateEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve); + + /** + * 批量删除策曲线 + * + * @param ids 需要删除的策曲线主键集合 + * @return 结果 + */ + public int deleteEmsStrategyCurveByIds(Long[] ids); + + /** + * 删除策曲线信息 + * + * @param id 策曲线主键 + * @return 结果 + */ + public int deleteEmsStrategyCurveById(Long id); + + // 获取站点策略的运行曲线数据 + public List getStrategyCurveList(EmsStrategyTemp tempConfig); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java new file mode 100644 index 0000000..69fc6a9 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java @@ -0,0 +1,33 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.vo.StrategyRunningVo; + + +/** + * 策略Service接口 + * + * @author xzzn + * @date 2025-07-10 + */ +public interface IEmsStrategyService +{ + // 获取策略运行列表 + public List selectEmsStrategyRunningList(String siteId); + + // 停止策略 + public int stopRunningStrategy(Long id); + + // 获取主策略 + public List getMainStrategyList(); + + // 获取辅助策略 + public List getAuxStrategyList(); + + public int configStrategy(EmsStrategyRunning emsStrategyRunning); + + // 接收云上运行策略配置 + public void dealStrategyRunningData(String content, String operateType); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTempService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTempService.java new file mode 100644 index 0000000..9a4fe55 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTempService.java @@ -0,0 +1,39 @@ +package com.xzzn.ems.service; + +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.vo.StrategyTempConfigRequest; + +/** + * 模板Service接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface IEmsStrategyTempService +{ + /** + * 修改模板 + * + * @param requestVo 模板 + * @return 结果 + */ + public boolean updateEmsStrategyTemp(StrategyTempConfigRequest requestVo); + + public List> getTempNameList(Long strategyId, String siteId); + + // 获取该模板下的时间配置 + public List selectEmsStrategyTempList(String templateId); + + // 新增模板及时间配置 + public boolean addNewTempAndTimeConfig(StrategyTempConfigRequest requestVo); + + //根据templateId删除模板 + public int deleteStrategyTempById(String templateId); + + // 处理同步数据 + public void dealStrategyTempData(String content, String operateType) throws JsonProcessingException; +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTimeConfigService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTimeConfigService.java new file mode 100644 index 0000000..383c84d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyTimeConfigService.java @@ -0,0 +1,73 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.domain.vo.StrategyTimeConfigVo; + +/** + * 时间配置Service接口 + * + * @author xzzn + * @date 2025-07-11 + */ +public interface IEmsStrategyTimeConfigService +{ + /** + * 查询时间配置 + * + * @param id 时间配置主键 + * @return 时间配置 + */ + public EmsStrategyTimeConfig selectEmsStrategyTimeConfigById(Long id); + + /** + * 查询时间配置列表 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 时间配置集合 + */ + public List selectEmsStrategyTimeConfigList(EmsStrategyTimeConfig emsStrategyTimeConfig); + + /** + * 新增时间配置 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 结果 + */ + public boolean insertEmsStrategyTimeConfig(List emsStrategyTimeConfig); + + /** + * 修改时间配置 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 结果 + */ + public int updateEmsStrategyTimeConfig(EmsStrategyTimeConfig emsStrategyTimeConfig); + + /** + * 批量删除时间配置 + * + * @param ids 需要删除的时间配置主键集合 + * @return 结果 + */ + public int deleteEmsStrategyTimeConfigByIds(Long[] ids); + + /** + * 删除时间配置信息 + * + * @param id 时间配置主键 + * @return 结果 + */ + public int deleteEmsStrategyTimeConfigById(Long id); + + /** + * 获取策略的时间配置列表 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 时间配置集合 + */ + public List getStrategyTimeList(EmsStrategyTimeConfig emsStrategyTimeConfig); + + // 处理同步数据 + public void dealStrategyTimeData(String content, String operateType); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsTicketService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsTicketService.java index 069b94c..e32bec4 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsTicketService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsTicketService.java @@ -1,6 +1,7 @@ package com.xzzn.ems.service; import com.xzzn.ems.domain.EmsTicket; +import com.xzzn.ems.domain.vo.TicketListVo; import java.util.List; @@ -18,7 +19,7 @@ public interface IEmsTicketService * @param id 工单主主键 * @return 工单主 */ - public EmsTicket selectEmsTicketById(String id); + public TicketListVo selectEmsTicketById(String id); /** * 查询工单主列表 @@ -59,4 +60,19 @@ public interface IEmsTicketService * @return 结果 */ public int deleteEmsTicketById(String id); + + /** + * 废弃工单-物理删除 + * @param id + * @return + */ + public int dropEmsTicketById(String id); + + /** + * 获取工单列表 - 根据工单状态获取 + * + * @param statusList 工单主 + * @return 工单主集合 + */ + public List getAllTicketList(Long[] statusList); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IFXXAlarmDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IFXXAlarmDataProcessService.java new file mode 100644 index 0000000..ad949e1 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IFXXAlarmDataProcessService.java @@ -0,0 +1,6 @@ +package com.xzzn.ems.service; + +public interface IFXXAlarmDataProcessService { + + public void handleFxAlarmData(String message); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java new file mode 100644 index 0000000..c9610c7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java @@ -0,0 +1,6 @@ +package com.xzzn.ems.service; + +public interface IFXXDataProcessService { + + public void handleFxData(String message); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IGeneralQueryService.java b/ems-system/src/main/java/com/xzzn/ems/service/IGeneralQueryService.java new file mode 100644 index 0000000..325993f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IGeneralQueryService.java @@ -0,0 +1,23 @@ +package com.xzzn.ems.service; + +import com.xzzn.ems.domain.vo.*; + +import java.util.List; +import java.util.Map; + +/** + * 综合查询 服务层 + * + */ +public interface IGeneralQueryService +{ + + // 模糊查询获取点位名称List + public List getPointNameList(PointNameRequest request); + + // 根据条件获取点位数据变化 + public List getPointValueList(PointNameRequest request); + + // 根据siteId获取下面对应的单体电池编号 + public Map> getAllBatteryIdsBySites(String[] siteIds); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IHomePageService.java b/ems-system/src/main/java/com/xzzn/ems/service/IHomePageService.java index 81ba148..49cc3b1 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IHomePageService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IHomePageService.java @@ -1,8 +1,8 @@ package com.xzzn.ems.service; -import com.xzzn.ems.domain.vo.HomePageDataViewVo; -import com.xzzn.ems.domain.vo.SingleSiteBaseInfo; -import com.xzzn.ems.domain.vo.SiteTotalInfoVo; +import com.xzzn.ems.domain.vo.*; + +import java.util.List; /** * 站点信息 服务层 @@ -13,7 +13,9 @@ public interface IHomePageService public SiteTotalInfoVo getSiteTotalInfo(); - public SingleSiteBaseInfo getSingleSiteBaseInfo(Long siteId); + public SingleSiteBaseInfo getSingleSiteBaseInfo(String siteId); public HomePageDataViewVo getHomePageDataList(); + + public List getSevenChargeData(DateSearchRequest request); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IMqttSyncLogService.java b/ems-system/src/main/java/com/xzzn/ems/service/IMqttSyncLogService.java new file mode 100644 index 0000000..0e1d51b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IMqttSyncLogService.java @@ -0,0 +1,72 @@ +package com.xzzn.ems.service; + +import java.util.List; +import com.xzzn.ems.domain.MqttSyncLog; + +/** + * MQTT云上本地同步日志Service接口 + * + * @author xzzn + * @date 2025-11-12 + */ +public interface IMqttSyncLogService +{ + /** + * 查询MQTT云上本地同步日志 + * + * @param id MQTT云上本地同步日志主键 + * @return MQTT云上本地同步日志 + */ + public MqttSyncLog selectMqttSyncLogById(Long id); + + /** + * 查询MQTT云上本地同步日志列表 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return MQTT云上本地同步日志集合 + */ + public List selectMqttSyncLogList(MqttSyncLog mqttSyncLog); + + /** + * 新增MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + public int insertMqttSyncLog(MqttSyncLog mqttSyncLog); + + /** + * 修改MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + public int updateMqttSyncLog(MqttSyncLog mqttSyncLog); + + /** + * 批量删除MQTT云上本地同步日志 + * + * @param ids 需要删除的MQTT云上本地同步日志主键集合 + * @return 结果 + */ + public int deleteMqttSyncLogByIds(Long[] ids); + + /** + * 删除MQTT云上本地同步日志信息 + * + * @param id MQTT云上本地同步日志主键 + * @return 结果 + */ + public int deleteMqttSyncLogById(Long id); + + // 处理策略信息 + public void handleMqttStrategyData(String payload); + // 处理设备告警保护信息 + public void handleMqttPlanData(String payload); + // 处理设备保护策略触发的告警信息 + public void handleFaultAlarmData(String payload); + // 处理保护策略告警信息 + public void handleFaultPlanIssueData(String payload); + // 处理设备运行状态变更 + public void handleDeviceChangeLogData(String payload); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java b/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java index b0a3221..926d1b7 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java @@ -1,6 +1,5 @@ package com.xzzn.ems.service; -import com.xzzn.ems.domain.EmsCoolingData; import com.xzzn.ems.domain.vo.*; import java.util.List; @@ -12,18 +11,39 @@ import java.util.List; public interface ISingleSiteService { - public SiteMonitorHomeVo getSiteMonitorDataVo(Long siteId); + public SiteMonitorHomeVo getSiteMonitorDataVo(String siteId); - public SiteMonitorRuningHeadInfoVo getSiteRunningHeadInfo(Long siteId); + public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId); - public SiteMonitorRuningInfoVo getRunningGraph(Long siteId); + public SiteMonitorRuningInfoVo getRunningGraphStorage(RunningGraphRequest request); - public List getPcsDetailInfo(Long siteId); + public List getPcsDetailInfo(String siteId); - public List getBMSOverView(Long siteId); + public List getBMSOverView(String siteId); - public List getBMSBatteryCluster(Long siteId); + public List getBMSBatteryCluster(String siteId); - public List getCoolingDataList(Long siteId); + public List getCoolingDataList(String siteId); + + public List getClusterDataInfoList(String clusterDeviceId,String siteId, + String stackDeviceId, String batteryId); + + public List getAmmeterDataList(String siteId); + + public List getDhDataList(String siteId); + + public List getXfDataList(String siteId); + + public List getEmsDataList(String siteId); + + public SiteMonitorRuningInfoVo getRunningGraphPcsMaxTemp(RunningGraphRequest request); + + public SiteMonitorRuningInfoVo getRunningGraphBatterySoc(RunningGraphRequest request); + + public SiteMonitorRuningInfoVo getRunningGraphBatteryTemp(RunningGraphRequest request); + + public List getClusterBatteryList(String siteId, String stackDeviceId, String clusterDeviceId); + + public List getPointData(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java new file mode 100644 index 0000000..ba48224 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java @@ -0,0 +1,1228 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.constant.Constants; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.BranchStatus; +import com.xzzn.common.enums.ChargeStatus; +import com.xzzn.common.enums.CommunicationStatus; +import com.xzzn.common.enums.ControlModeStatus; +import com.xzzn.common.enums.DeviceRunningStatus; +import com.xzzn.common.enums.GridStatus; +import com.xzzn.common.enums.SwitchStatus; +import com.xzzn.common.enums.WorkStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsBatteryCluster; +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryDataDailyLatest; +import com.xzzn.ems.domain.EmsBatteryDataMinutes; +import com.xzzn.ems.domain.EmsBatteryGroup; +import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.domain.EmsDailyChargeData; +import com.xzzn.ems.domain.EmsDailyEnergyData; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsDhData; +import com.xzzn.ems.domain.EmsPcsBranchData; +import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.EmsXfData; +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper; +import com.xzzn.ems.mapper.EmsBatteryGroupMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsDhDataMapper; +import com.xzzn.ems.mapper.EmsPcsBranchDataMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.mapper.EmsXfDataMapper; +import com.xzzn.ems.service.IDDSDataProcessService; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IEmsDeviceSettingService; +import com.xzzn.ems.utils.AbstractBatteryDataProcessor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +@Service +public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IDDSDataProcessService { + private static final Log log = LogFactory.getLog(DDSDataProcessServiceImpl.class); + private static final String SITE_ID = "021_DDS_01"; + // 正则表达式匹配BMS设备编号和属性 + private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)"); + // 匹配DTDC+数字格式的正则(提取序号) + private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)"); + + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + + @Autowired + private RedisCache redisCache; + + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsBatteryDailyLatestServiceImpl emsBatteryDailyLatestServiceImpl; + @Autowired + private EmsDhDataMapper emsDhDataMapper; + @Autowired + private EmsBatteryGroupMapper emsBatteryGroupMapper; + @Autowired + private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private IEmsDeviceSettingService iEmsDeviceSettingService; + @Autowired + private EmsXfDataMapper emsXfDataMapper; + + public DDSDataProcessServiceImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public void handleDdsData(String message) { + JSONObject obj = JSONObject.parseObject(message); + + String deviceId = obj.get("Device").toString(); + String jsonData = obj.get("Data").toString(); + Long timestamp = Long.valueOf(obj.get("timestamp").toString()); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + boolean isEmpty = checkJsonDataEmpty(jsonData); + if (isEmpty) { + // 添加设备告警 + iEmsAlarmRecordsService.addEmptyDataAlarmRecord(SITE_ID,deviceId); + return; + } + + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + SITE_ID + "_" + deviceId, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA + SITE_ID + "_" + deviceId, obj, 2, TimeUnit.MINUTES); + + // 处理相关数据 + if (deviceId.contains("BMSD")) { + batteryStackDataProcess(deviceId, jsonData); + batteryGroupDataProcess(deviceId, jsonData); + batteryDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("PCS")) { + pcsDataProcess(deviceId, jsonData); + pcsBranchDataProcess(deviceId, jsonData); + batteryClusterDataProcess(deviceId, jsonData); + } else if (deviceId.contains("LOAD")) { + loadDataProcess(deviceId, jsonData); + } else if (deviceId.contains("METEGF")) { + meteGFDataProcess(deviceId, jsonData); + } else if (deviceId.equals("METE")) { + meteDataProcess(deviceId, jsonData); + } else if (deviceId.contains("METE0")) { + meteBranchDataProcess(deviceId, jsonData); + } else if (deviceId.contains("XF")) { + meteXFProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("DH")) { + dhDataProcess(deviceId, jsonData); + } + } + + private void dhDataProcess(String deviceId, String dataJson) { + //动环 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //DH + EmsDhData dhData = new EmsDhData(); + + dhData.setHumidity(StringUtils.getBigDecimal(obj.get("SD"))); + dhData.setTemperature(StringUtils.getBigDecimal(obj.get("WD"))); + + dhData.setCreateBy("system"); + dhData.setCreateTime(DateUtils.getNowDate()); + dhData.setUpdateBy("system"); + dhData.setUpdateTime(DateUtils.getNowDate()); + dhData.setSiteId(SITE_ID); + dhData.setDeviceId(deviceId); + emsDhDataMapper.insertEmsDhData(dhData); + + redisCache.setCacheObject(RedisKeyConstants.DH + SITE_ID + "_" +deviceId, dhData); + } + + private void meteXFProcess(String deviceId, String dataJson, Date dataUpdateTime) { + //消防 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 暂时只更新设备表的设备状态 ZDYBYDCZT-主电源备用电池状态 + // 数据存表 + EmsXfData xfData = new EmsXfData(); + xfData.setDataTimestamp(dataUpdateTime); + xfData.setDcfzt(StringUtils.getBigDecimal(obj.get("YLKGDCFZT"))); + xfData.setDczt(StringUtils.getBigDecimal(obj.get("ZDYBYDCZT"))); + xfData.setPszt(StringUtils.getBigDecimal(obj.get("QDQTPSZT"))); + xfData.setYszt(StringUtils.getBigDecimal(obj.get("SZDYSZT"))); + + xfData.setCreateBy("system"); + xfData.setCreateTime(DateUtils.getNowDate()); + xfData.setUpdateBy("system"); + xfData.setUpdateTime(DateUtils.getNowDate()); + xfData.setSiteId(SITE_ID); + xfData.setDeviceId(deviceId); + emsXfDataMapper.insertEmsXfData(xfData); + + redisCache.setCacheObject(RedisKeyConstants.XF + SITE_ID + "_" +deviceId, xfData); + // 状态枚举还没有提供 + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, SITE_ID); + emsDevicesSetting.setCommunicationStatus(StringUtils.getString(obj.get("ZDYBYDCZT"))); + emsDevicesSetting.setUpdatedAt(DateUtils.getNowDate()); + emsDevicesSettingMapper.updateEmsDevicesSetting(emsDevicesSetting); + } + + private void batteryStackDataProcess(String deviceId, String dataJson) { + + //电池堆 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 将原始数据存一下方便后面簇数据使用 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_BMSD + SITE_ID + "_" + deviceId, obj); + //BMS 电池堆 + EmsBatteryStack dataStack = new EmsBatteryStack(); + + // 其他非 BigDecimal 字段 + dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + + // 电压极值信息 + dataStack.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("DTZDDY"))); + dataStack.setMaxVoltageGroupId(StringUtils.getLong(obj.get("DTZDDYXH"))); + dataStack.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("DTZXDY"))); + dataStack.setMinVoltageGroupId(StringUtils.getLong(obj.get("DTZXDYXH"))); + + // 温度极值信息 + dataStack.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("DTZGWD"))); + dataStack.setMaxTempGroupId(StringUtils.getLong(obj.get("DTZGWDXH"))); + dataStack.setMinCellTemp(StringUtils.getBigDecimal(obj.get("DTZDWD"))); + dataStack.setMinTempGroupId(StringUtils.getLong(obj.get("DTZDWDXH"))); + + // 干节点信号状态 + dataStack.setBatteryNumber(StringUtils.getLong(obj.get("DTGS"))); + dataStack.setBatteryAvgVoltage(StringUtils.getBigDecimal(obj.get("DTPJDY"))); + dataStack.setBatteryDifferentPressure(StringUtils.getBigDecimal(obj.get("DTDCYC"))); + dataStack.setAvgTemperature(StringUtils.getBigDecimal(obj.get("DTPJWD"))); + dataStack.setBatteryDifferentTemperature(StringUtils.getBigDecimal(obj.get("DTDCWC"))); + dataStack.setMaxInternalResistance(StringUtils.getBigDecimal(obj.get("DTZDNZ"))); + dataStack.setMinInternalResistance(StringUtils.getBigDecimal(obj.get("DTZXNZ"))); + dataStack.setAvgInternalResistance(StringUtils.getBigDecimal(obj.get("DTPJNZ"))); + dataStack.setBatteryDefferentResistance(StringUtils.getBigDecimal(obj.get("DTDCNZC"))); + dataStack.setMaxResistanceCellId(StringUtils.getLong(obj.get("DTZDNZXH"))); + dataStack.setMinResistanceCellId(StringUtils.getLong(obj.get("DTZXNZXH"))); + dataStack.setEnvironmentTemperature(StringUtils.getBigDecimal(obj.get("HJWD"))); + dataStack.setEnvironmentHumidity(StringUtils.getBigDecimal(obj.get("HJSD"))); + dataStack.setCircuitBreakerStatus(StringUtils.getString(obj.get("LDQZT"))); + + // 页面字段临时填充 + dataStack.setStackVoltage(StringUtils.getBigDecimal(obj.get("BMSD01DY"))); + dataStack.setStackCurrent(StringUtils.getBigDecimal(obj.get("BMSD01DL"))); + dataStack.setStackSoc(StringUtils.getBigDecimal(obj.get("BMSD01SOC"))); + dataStack.setStackSoh(StringUtils.getBigDecimal(obj.get("BMSD01SOH"))); + dataStack.setOperatingTemp(StringUtils.getBigDecimal(obj.get("HJWD"))); + + dataStack.setCreateBy("system"); + dataStack.setCreateTime(DateUtils.getNowDate()); + dataStack.setUpdateBy("system"); + dataStack.setUpdateTime(DateUtils.getNowDate()); + dataStack.setSiteId(SITE_ID); + dataStack.setDeviceId(deviceId); + + emsBatteryStackMapper.insertEmsBatteryStack(dataStack); + + redisCache.setCacheObject(RedisKeyConstants.STACK + SITE_ID + "_" +deviceId, dataStack); + } + + private void batteryGroupDataProcess(String deviceId, String jsonData) { + //电池组 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + Map groupMap = new HashMap<>(); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + // 跳过空键 + if (key == null || key.trim().isEmpty()) { + continue; + } + Matcher matcher = PATTERN.matcher(key); + if (matcher.matches()) { + String groupDeviceId = matcher.group(1); + String property = matcher.group(2); + EmsBatteryGroup dataGroup = groupMap.getOrDefault(groupDeviceId, new EmsBatteryGroup()); + dataGroup.setDeviceId(groupDeviceId); + dataGroup.setSiteId(SITE_ID); + dataGroup.setCreateBy("system"); + dataGroup.setCreateTime(DateUtils.getNowDate()); + dataGroup.setUpdateBy("system"); + dataGroup.setUpdateTime(DateUtils.getNowDate()); + + setPropertyValue(dataGroup, property, entry.getValue()); + groupMap.put(groupDeviceId, dataGroup); + } + } + + // 批量插入数据库 + if (!CollectionUtils.isEmpty(groupMap)) { + List batteryGroupList = new ArrayList<>(groupMap.values()); + emsBatteryGroupMapper.batchInsertGroupData(batteryGroupList); + redisCache.setCacheObject(RedisKeyConstants.GROUP + SITE_ID + "_" +deviceId, batteryGroupList); + } + + } + //根据属性名设置对应的值 + private static void setPropertyValue(EmsBatteryGroup groupData, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + + switch (property) { + case "ZT": + if (numberValue != null) { + groupData.setStatus(numberValue.toString()); + } + break; + case "SOC": + groupData.setSoc(numberValue); + break; + case "SOH": + groupData.setSoh(numberValue); + break; + case "DL": + groupData.setCurrent(numberValue); + break; + case "DY": + groupData.setVoltage(numberValue); + break; + case "BDSC": + groupData.setEstimatedBackupDuration(numberValue); + break; + } + } + private void batteryDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { + //电池组 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + List dataList = new ArrayList<>(); + + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + + Map dataMap = new HashMap<>(); + Map dailyMap = new HashMap<>(); + Map minutesMap = new HashMap<>(); + + String clusterId = getClusterDeviceIdByParentDeviceId(deviceId); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + + if (key.startsWith("DTDC")) { + Matcher matcher = DTDC_PATTERN.matcher(key); + if (matcher.matches()) { + String batteryCellId = matcher.group(1); + String property = matcher.group(2); + + EmsBatteryData data = dataMap.getOrDefault(batteryCellId, new EmsBatteryData()); + if (StringUtils.isNotEmpty(batteryCellId)) { + data.setDataTimestamp(dataUpdateTime); + data.setBatteryPack(deviceId); + data.setBatteryCluster(clusterId); + data.setClusterDeviceId(clusterId); + data.setBatteryCellId(batteryCellId); + data.setSiteId(SITE_ID); + data.setDeviceId(batteryCellId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + } + // 根据后缀设置对应属性 + setDTDCPropertyValue(data, property, entry.getValue()); + dataMap.put(batteryCellId, data); + + // 每日最新数据:按batteryCellId去重 + EmsBatteryDataDailyLatest daily = dailyMap.getOrDefault(batteryCellId, new EmsBatteryDataDailyLatest()); + BeanUtils.copyProperties(data, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyMap.put(batteryCellId, daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = minutesMap.getOrDefault(batteryCellId, new EmsBatteryDataMinutes()); + BeanUtils.copyProperties(data, minutes); + minutesMap.put(batteryCellId, minutes); + } + } + } + if (!CollectionUtils.isEmpty(dataMap)) { + dataList = new ArrayList<>(dataMap.values()); + emsBatteryDataMapper.insertEmsBatteryDataList(new ArrayList<>(dataList)); + + redisCache.deleteList(RedisKeyConstants.BATTERY + SITE_ID + "_" + clusterId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + SITE_ID + "_" + clusterId , dataList); + } + // 批量处理每日最新数据 + List dailyList = new ArrayList<>(dailyMap.values()); + if (!dailyList.isEmpty()) { + dailyList = new ArrayList<>(dailyMap.values()); + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + + // 实时插入每分钟数据 + List minutesList = new ArrayList<>(minutesMap.values()); + if (!minutesList.isEmpty()) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (dataList.size() > 0) { + super.processBatch(dataList); + } + } + + private String getClusterDeviceIdByParentDeviceId(String deviceId) { + String clusterId = "BMSC01"; + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找子类的簇id + if (map != null && !map.isEmpty()) { + List list = map.get(SITE_ID); + if (list != null && list.size() > 0) { + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getParentId())) { + clusterId = emsDevicesSetting.getDeviceId(); + } + } + } + } + return clusterId; + } + + private void setDTDCPropertyValue(EmsBatteryData data, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + switch (property) { + case "DY": + data.setVoltage(numberValue); + break; + case "WD": + data.setTemperature(numberValue); + break; + case "NZ": + data.setInterResistance(numberValue); + break; + } + } + + private void batteryClusterDataProcess(String deviceId, String dataJson) { + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + EmsDevicesSetting joken = new EmsDevicesSetting(); + + + //BMSC 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + // 其他非 BigDecimal 字段 + data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(SITE_ID); + // BMSC02 电流电压功率 + deviceId = "BMSC02"; + String stackDeviceId = getDeviceParent(deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + // 获取redis获取最新的BMSD数据 + Map stackObj = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_BMSD +SITE_ID+"_"+stackDeviceId); + data.setDeviceId(deviceId); + data.setClusterVoltage(StringUtils.getBigDecimal(obj.get("BMSC02ZLDY"))); + data.setClusterCurrent(StringUtils.getBigDecimal(obj.get("BMSC02ZLDL"))); + data.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("BMSC02ZLSCGL"))); + // 取堆里面数据 + data.setSoh(StringUtils.getBigDecimal(stackObj.get("BMSD02SOH"))); + data.setCurrentSoc(StringUtils.getBigDecimal(stackObj.get("BMSD02SOC"))); + data.setBatteryPackVoltage(StringUtils.getBigDecimal(stackObj.get("BMSD02DY"))); + data.setBatteryPackCurrent(StringUtils.getBigDecimal(stackObj.get("BMSD02DL"))); + data.setBatteryPackSoc(StringUtils.getBigDecimal(stackObj.get("BMSD02SOC"))); + data.setBatteryPackSoh(StringUtils.getBigDecimal(stackObj.get("BMSD02SOH"))); + data.setAvgCellTemp(StringUtils.getBigDecimal(stackObj.get("DTPJWD"))); + data.setMaxCellVoltage(StringUtils.getBigDecimal(stackObj.get("DTZDDY"))); + data.setMaxCellVoltageId(StringUtils.getString(stackObj.get("DTZDDYXH"))); + data.setMinCellVoltage(StringUtils.getBigDecimal(stackObj.get("DTZXDY"))); + data.setMinCellVoltageId(StringUtils.getString(stackObj.get("DTZXDYXH"))); + data.setMaxCellTemp(StringUtils.getBigDecimal(stackObj.get("DTZGWD"))); + data.setMaxCellTempId(StringUtils.getString(stackObj.get("DTZGWDXH"))); + data.setMinCellTemp(StringUtils.getBigDecimal(stackObj.get("DTZDWD"))); + data.setMinCellTempId(StringUtils.getString(stackObj.get("DTZDWDXH"))); + + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + SITE_ID + "_" +deviceId, data); + + // BMSC01 电流电压功率 + deviceId = "BMSC01"; + stackDeviceId = getDeviceParent(deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + // 获取redis获取最新的BMSD数据 + stackObj = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_BMSD +SITE_ID+"_"+stackDeviceId); + data.setDeviceId(deviceId); + data.setClusterVoltage(StringUtils.getBigDecimal(obj.get("BMSC01ZLDY"))); + data.setClusterCurrent(StringUtils.getBigDecimal(obj.get("BMSC01ZLDL"))); + data.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("BMSC01ZLSCGL"))); + // 取堆里面数据 + data.setSoh(StringUtils.getBigDecimal(stackObj.get("BMSD01SOH"))); + data.setCurrentSoc(StringUtils.getBigDecimal(stackObj.get("BMSD01SOC"))); + data.setBatteryPackVoltage(StringUtils.getBigDecimal(stackObj.get("BMSD01DY"))); + data.setBatteryPackCurrent(StringUtils.getBigDecimal(stackObj.get("BMSD01DL"))); + data.setBatteryPackSoc(StringUtils.getBigDecimal(stackObj.get("BMSD01SOC"))); + data.setBatteryPackSoh(StringUtils.getBigDecimal(stackObj.get("BMSD01SOH"))); + data.setAvgCellTemp(StringUtils.getBigDecimal(stackObj.get("DTPJWD"))); + data.setMaxCellVoltage(StringUtils.getBigDecimal(stackObj.get("DTZDDY"))); + data.setMaxCellVoltageId(StringUtils.getString(stackObj.get("DTZDDYXH"))); + data.setMinCellVoltage(StringUtils.getBigDecimal(stackObj.get("DTZXDY"))); + data.setMinCellVoltageId(StringUtils.getString(stackObj.get("DTZXDYXH"))); + data.setMaxCellTemp(StringUtils.getBigDecimal(stackObj.get("DTZGWD"))); + data.setMaxCellTempId(StringUtils.getString(stackObj.get("DTZGWDXH"))); + data.setMinCellTemp(StringUtils.getBigDecimal(stackObj.get("DTZDWD"))); + data.setMinCellTempId(StringUtils.getString(stackObj.get("DTZDWDXH"))); + + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + SITE_ID + "_" +deviceId, data); + } + + private String getDeviceParent(String deviceId) { + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找父类 + String stackDeviceId = "1"; + if (map != null && !map.isEmpty()) { + List list = map.get(SITE_ID); + if (list == null || list.isEmpty()) { + EmsDevicesSetting deviceInfo = new EmsDevicesSetting(); + deviceInfo.setDeviceId(deviceId); + deviceInfo.setSiteId(SITE_ID); + list = emsDevicesSettingMapper.selectEmsDevicesSettingList(deviceInfo); + if (list == null || list.isEmpty()) { + return stackDeviceId; + } + } + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getDeviceId())) { + stackDeviceId = emsDevicesSetting.getParentId(); + } + } + } + return stackDeviceId; + } + + private void meteBranchDataProcess(String deviceId, String dataJson) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + //pcs电表数据 + EmsAmmeterData data = new EmsAmmeterData(); + // 更新时间 + data.setDataUpdateTime(new Date()); + + // 当月有功电能 + data.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQYZZXYGDN"))); + data.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQYJZXYGDN"))); + data.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQYFZXYGDN"))); + data.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQYPZXYGDN"))); + data.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQYGZXYGDN"))); + data.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQYZFXYGDN"))); + data.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQYJFXYGDN"))); + data.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQYFFXYGDN"))); + data.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQYPFXYGDN"))); + data.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQYGFXYGDN"))); + + // 总有功电能 + data.setTotalForwardActiveTwo(StringUtils.getBigDecimal(obj.get("ZZXYGDN2"))); + data.setTotalPeakForwardActive(StringUtils.getBigDecimal(obj.get("ZJZXYGDN"))); + data.setTotalHighForwardActive(StringUtils.getBigDecimal(obj.get("ZFZXYGDN"))); + data.setTotalFlatForwardActive(StringUtils.getBigDecimal(obj.get("ZPZXYGDN"))); + data.setTotalValleyForwardActive(StringUtils.getBigDecimal(obj.get("ZGZXYGDN"))); + data.setTotalReverseActiveTwo(StringUtils.getBigDecimal(obj.get("ZFXYGDN2"))); + data.setTotalPeakReverseActive(StringUtils.getBigDecimal(obj.get("ZJFXYGDN"))); + data.setTotalHighReverseActive(StringUtils.getBigDecimal(obj.get("ZFFXYGDN"))); + data.setTotalFlatReverseActive(StringUtils.getBigDecimal(obj.get("ZPFXYGDN"))); + data.setTotalValleyReverseActive(StringUtils.getBigDecimal(obj.get("ZGFXYGDN"))); + + // 其他字段 + data.setVoltagePercent(StringUtils.getBigDecimal(obj.get("DYBB"))); + data.setDisconnectDetectionIndication(StringUtils.getString(obj.get("DXJCZS"))); + data.setRatedPrimaryCurrentValue(StringUtils.getBigDecimal(obj.get("EDYCDLZ"))); + data.setSwitchInputOutputStatus(StringUtils.getString(obj.get("KGLSRSCZT"))); + data.setAlarmStatus(StringUtils.getString(obj.get("BJZT"))); + data.setCurrentTotalVoltagePercent(StringUtils.getBigDecimal(obj.get("DQZDYBFB"))); + data.setVoltageContentPercent(StringUtils.getBigDecimal(obj.get("DYZLHLBFB"))); + data.setVoltageAcPercent(StringUtils.getBigDecimal(obj.get("DYJLHLBFB"))); + data.setCurrentTotalCurrentPercent(StringUtils.getBigDecimal(obj.get("DQZDLBFB"))); + data.setCurrentContentPercent(StringUtils.getBigDecimal(obj.get("DLZLHLBFB"))); + data.setCurrentAcPercent(StringUtils.getBigDecimal(obj.get("DLJLHLBFB"))); + data.setCurrentTotalPowerPercent(StringUtils.getBigDecimal(obj.get("DQZGLBFB"))); + data.setPowerContentPercent(StringUtils.getBigDecimal(obj.get("GLZLHLBFB"))); + data.setPowerAcPercent(StringUtils.getBigDecimal(obj.get("GLJLHLBFB"))); + data.setDataSettingYearMonth(StringUtils.getString(obj.get("RQSJSZNY"))); + data.setDataSettingDayHour(StringUtils.getString(obj.get("RQSJSZRS"))); + data.setDataSettingMinutesSeconds(StringUtils.getString(obj.get("RQSJSZFM"))); + data.setCurrentRate(StringUtils.getBigDecimal(obj.get("DQCBRFL"))); + data.setVersionNumber(StringUtils.getString(obj.get("RJBBH"))); + data.setVoltage(StringUtils.getBigDecimal(obj.get("DY"))); + data.setCurrent(StringUtils.getBigDecimal(obj.get("DL"))); + data.setPower(StringUtils.getBigDecimal(obj.get("GL"))); + data.setInternalTemp(StringUtils.getBigDecimal(obj.get("NBWD"))); + data.setTotalForwardActiveOne(StringUtils.getBigDecimal(obj.get("ZZXYGDN1"))); + data.setTotalReverseActiveOne(StringUtils.getBigDecimal(obj.get("ZFXYGDN1"))); + + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(SITE_ID); + data.setDeviceId(deviceId); + emsAmmeterDataMapper.insertEmsAmmeterData(data); + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, data); + } + + private void pcsDataProcess(String deviceId, String dataJson) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + //pcs + EmsPcsData pcsData = new EmsPcsData(); + // 时间与状态类字段 + pcsData.setDataUpdateTime(new Date()); + pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); + pcsData.setGridStatus(GridStatus.GRID.getCode()); + pcsData.setDeviceStatus(DeviceRunningStatus.ONLINE.getCode()); + pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); + + // 电流 + pcsData.setaPhaseCurrent(StringUtils.getBigDecimal(obj.get("PCSJLDLIA"))); + pcsData.setbPhaseCurrent(StringUtils.getBigDecimal(obj.get("PCSJLDLIB"))); + pcsData.setcPhaseCurrent(StringUtils.getBigDecimal(obj.get("PCSJLDLIC"))); + + // 功率与能量类字段 + pcsData.setDcPower(StringUtils.getBigDecimal(obj.get("ZLZGL"))); + pcsData.setDcVoltage(StringUtils.getBigDecimal(obj.get("ZLDY"))); + pcsData.setDcCurrent(StringUtils.getBigDecimal(obj.get("ZLDL"))); + pcsData.setTotalActivePower(StringUtils.getBigDecimal(obj.get("JLYGGL"))); + pcsData.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("JLWGGL"))); + pcsData.setTotalAcChargeEnergy(StringUtils.getBigDecimal(obj.get("CDDN"))); + pcsData.setTotalAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("FDDN"))); + + // 电网频率 + pcsData.setDwFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); + + // 状态指示类 + pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); + pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); + String acSwitchStatus = StringUtils.getString(obj.get("JLKGZT")); + pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String dcSwitchStatus = StringUtils.getString(obj.get("ZLKGZT")); + pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String controlMode = StringUtils.getString(obj.get("YCTT")); + pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); + + // 电流参数 + pcsData.setSysUCurrent(StringUtils.getBigDecimal(obj.get("XTSCUXDL"))); + pcsData.setSysVCurrent(StringUtils.getBigDecimal(obj.get("XTSCVXDL"))); + pcsData.setSysWCurrent(StringUtils.getBigDecimal(obj.get("XTSCWXDL"))); + + // 页面字段填充 + pcsData.setAcFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); + pcsData.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZLZGL"))); + pcsData.setTotalPowerFactor(new BigDecimal(0)); + + // 模块温度 + pcsData.setModule1Temp(StringUtils.getBigDecimal(obj.get("IGBYZGWD1"))); + pcsData.setModule2Temp(StringUtils.getBigDecimal(obj.get("IGBYZGWD2"))); + pcsData.setModule3Temp(StringUtils.getBigDecimal(obj.get("IGBYZGWD3"))); + pcsData.setModule4Temp(StringUtils.getBigDecimal(obj.get("IGBYZGWD4"))); + + // 系统管理字段 + pcsData.setCreateBy("system"); + pcsData.setCreateTime(DateUtils.getNowDate()); + pcsData.setUpdateBy("system"); + pcsData.setUpdateTime(DateUtils.getNowDate()); + pcsData.setSiteId(SITE_ID); + pcsData.setDeviceId(deviceId); + pcsData.setDateMonth(DateUtils.getNowMonthLong()); + pcsData.setDateDay(DateUtils.getNowDayLong()); + + emsPcsDataMapper.insertEmsPcsData(pcsData); + redisCache.setCacheObject(RedisKeyConstants.PCS + SITE_ID + "_" +deviceId, pcsData); + + } + + private void pcsBranchDataProcess(String deviceId, String dataJson) { + + Map records = JSON.parseObject(dataJson, new TypeReference>() { + }); + List list = new ArrayList<>(); + + EmsPcsBranchData data = new EmsPcsBranchData(); + data.setDeviceId(deviceId); + data.setSiteId(SITE_ID); + data.setGridStatus(GridStatus.GRID.getCode()); + + data.setGridUVoltage(StringUtils.getBigDecimal(records.get("DWXDYUAB"))); + data.setGridVVoltage(StringUtils.getBigDecimal(records.get("DWXDYUBC"))); + data.setGridWVoltage(StringUtils.getBigDecimal(records.get("DWXDYUCA"))); + data.setOutputUCurrent(StringUtils.getBigDecimal(records.get("PCSJLDLIA"))); + data.setOutputVCurrent(StringUtils.getBigDecimal(records.get("PCSJLDLIB"))); + data.setOutputWCurrent(StringUtils.getBigDecimal(records.get("PCSJLDLIC"))); + + // 页面字段填充 + data.setDcPower(StringUtils.getBigDecimal(records.get("ZLZGL"))); + data.setDcVoltage(StringUtils.getBigDecimal(records.get("ZLDY"))); + data.setDcCurrent(StringUtils.getBigDecimal(records.get("ZLDL"))); + + data.setBranchId("DY1"); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + list.add(data); + emsPcsBranchDataMapper.insertPcsBranchDataList(list); + redisCache.setCacheObject(RedisKeyConstants.BRANCH + SITE_ID + "_" +deviceId, list); + } + + private void meteGFDataProcess(String deviceId, String dataJson) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + EmsAmmeterData dataGF = new EmsAmmeterData(); + // 更新时间 + dataGF.setDataUpdateTime(new Date()); + + // 电压+电流 - dds字段 + dataGF.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataGF.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataGF.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataGF.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataGF.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataGF.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + + dataGF.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataGF.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY"))); + dataGF.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY"))); + + // 频率 + dataGF.setFrequency(StringUtils.getBigDecimal(obj.get("PL"))); + + // 功率 有功+总+无功+无总+视在 + dataGF.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataGF.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataGF.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataGF.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataGF.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataGF.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataGF.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataGF.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + dataGF.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); + dataGF.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); + dataGF.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); + dataGF.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + + // 功率因数 + dataGF.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); + dataGF.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); + dataGF.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); + dataGF.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + + // 其他字段 + dataGF.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("WGDN"))); + dataGF.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("YGDN"))); + dataGF.setCurrentPercent(StringUtils.getBigDecimal(obj.get("DLBB"))); + dataGF.setVoltagePercent(StringUtils.getBigDecimal(obj.get("DYBB"))); + dataGF.setAvgCurrent(StringUtils.getBigDecimal(obj.get("PJDL"))); + + dataGF.setCreateBy("system"); + dataGF.setCreateTime(DateUtils.getNowDate()); + dataGF.setUpdateBy("system"); + dataGF.setUpdateTime(DateUtils.getNowDate()); + dataGF.setSiteId(SITE_ID); + dataGF.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataGF); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataGF); + } + + private void loadDataProcess(String deviceId, String dataJson) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + EmsAmmeterData dataLoad = new EmsAmmeterData(); + // 更新时间 + dataLoad.setDataUpdateTime(new Date()); + + // 电压+电流 - dds字段 + dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("XDYUA"))); + dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("XDYUB"))); + dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("XDYUC"))); + dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("XDLIA"))); + dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("XDLIB"))); + dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("XDLIC"))); + + dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("XDYUAB"))); + dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("XDYUBC"))); + dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("XDYUCA"))); + + // 频率 + dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("PL"))); + + // 功率 有功+总+无功+无总+视在 + dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("YGZGL"))); + dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("WGZGL"))); + dataLoad.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); + dataLoad.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); + dataLoad.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); + dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + + // 功率因数 + dataLoad.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); + dataLoad.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); + dataLoad.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); + dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + + // 电度 + dataLoad.setSecondaryReverseReactiveEnergy(StringUtils.getBigDecimal(obj.get("GXWGDDECC"))); + dataLoad.setSecondaryNegativeActiveEnergy(StringUtils.getBigDecimal(obj.get("SFTGDDECC"))); + dataLoad.setSecondaryPositiveReactiveEnergy(StringUtils.getBigDecimal(obj.get("RXWGDDECC"))); + dataLoad.setSecondaryPositiveActiveEnergy(StringUtils.getBigDecimal(obj.get("XSYGDDECC"))); + dataLoad.setReverseReactiveEnergyEqMinus(StringUtils.getBigDecimal(obj.get("RXWGDDYCC"))); + dataLoad.setReverseActiveEnergyEpMinus(StringUtils.getBigDecimal(obj.get("SFYGDDYCC"))); + dataLoad.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("GXWGDDYCC"))); + dataLoad.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("XSYGDDYCC"))); + + // 正向反向有功无功电能 + dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("XSYGDDYCC"))); + dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("SFYGDDYCC"))); + dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("GXWGDDYCC"))); + dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("RXWGDDYCC"))); + + dataLoad.setCreateBy("system"); + dataLoad.setCreateTime(DateUtils.getNowDate()); + dataLoad.setUpdateBy("system"); + dataLoad.setUpdateTime(DateUtils.getNowDate()); + dataLoad.setSiteId(SITE_ID); + dataLoad.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); + } + + private void meteDataProcess(String deviceId, String dataJson) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + EmsAmmeterData dataMete = new EmsAmmeterData(); + // 更新时间 + dataMete.setDataUpdateTime(new Date()); + + // 电压+电流 + dataMete.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataMete.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataMete.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataMete.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataMete.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataMete.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + + dataMete.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataMete.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY"))); + dataMete.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY"))); + + // 频率 + dataMete.setFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); + + // 功率 + dataMete.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataMete.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataMete.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataMete.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataMete.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataMete.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataMete.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataMete.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + dataMete.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); + dataMete.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); + dataMete.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); + dataMete.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + dataMete.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); + dataMete.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); + dataMete.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); + dataMete.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + + // 电能设置-组合有功 + dataMete.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN"))); + dataMete.setCurrentCombActivePeak(StringUtils.getBigDecimal(obj.get("DQZHYGJDN"))); + dataMete.setCurrentCombActiveHigh(StringUtils.getBigDecimal(obj.get("DQZHYGFDN"))); + dataMete.setCurrentCombActiveFlat(StringUtils.getBigDecimal(obj.get("DQZHYGPDN"))); + dataMete.setCurrentCombActiveValley(StringUtils.getBigDecimal(obj.get("DQZHYGGDN"))); + // 电能设置-正向有功 + dataMete.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQZXZYGDN"))); + dataMete.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQZXYGJDN"))); + dataMete.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQZXYGFDN"))); + dataMete.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQZXYGPDN"))); + dataMete.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQZXYGGDN"))); + // 电能设置-反向有功 + dataMete.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQFXZYGDN"))); + dataMete.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQFXYGJDN"))); + dataMete.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQFXYGFDN"))); + dataMete.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQFXYGPDN"))); + dataMete.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQFXYGGDN"))); + // 电能设置-组合无功 + dataMete.setCurrentCombReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZHWGZDN"))); + dataMete.setCurrentCombReactivePeak(StringUtils.getBigDecimal(obj.get("DQZHWGJDN"))); + dataMete.setCurrentCombReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZHWGFDN"))); + dataMete.setCurrentCombReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZHWGPDN"))); + dataMete.setCurrentCombReactiveValley(StringUtils.getBigDecimal(obj.get("DQZHWGGDN"))); + // 电能设置-正向无功 + dataMete.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZXZWGDN"))); + dataMete.setCurrentForwardReactivePeak(StringUtils.getBigDecimal(obj.get("DQZXWGJDN"))); + dataMete.setCurrentForwardReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZXWGFDN"))); + dataMete.setCurrentForwardReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZXWGPDN"))); + dataMete.setCurrentForwardReactiveValley(StringUtils.getBigDecimal(obj.get("DQZXWGGDN"))); + // 电能设置-反向无功 + dataMete.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("DQFXZWGDN"))); + dataMete.setCurrentReverseReactivePeak(StringUtils.getBigDecimal(obj.get("DQFXWGJDN"))); + dataMete.setCurrentReverseReactiveHigh(StringUtils.getBigDecimal(obj.get("DQFXWGFDN"))); + dataMete.setCurrentReverseReactiveFlat(StringUtils.getBigDecimal(obj.get("DQFXWGPDN"))); + dataMete.setCurrentReverseReactiveValley(StringUtils.getBigDecimal(obj.get("DQFXWGGDN"))); + // abc相 + dataMete.setaForwardActiveEnergy(StringUtils.getBigDecimal(obj.get("AXZXYGDN"))); + dataMete.setbForwardActiveEnergy(StringUtils.getBigDecimal(obj.get("BXZXYGDN"))); + dataMete.setcForwardActiveEnergy(StringUtils.getBigDecimal(obj.get("CXZXYGDN"))); + + // 变比 + dataMete.setCurrentPercent(StringUtils.getBigDecimal(obj.get("DLBBCT"))); + dataMete.setVoltagePercent(StringUtils.getBigDecimal(obj.get("DYBBPT"))); + + // 需量 + dataMete.setForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("ZXYGZDXL"))); + dataMete.setReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("FXYGZDXL"))); + dataMete.setDailyForwardMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXYGZDXL"))); + dataMete.setForwardReactiveMaxDemand(StringUtils.getBigDecimal(obj.get("ZXWGZDXL"))); + dataMete.setReverseReactiveMaxDemand(StringUtils.getBigDecimal(obj.get("FXWGZDXL"))); + dataMete.setDailyReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("DRFXYGZDXL"))); + dataMete.setDailyForwardReacMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXWGZDXL"))); + dataMete.setDailyReverseReacMaxDemand(StringUtils.getBigDecimal(obj.get("DRFXWGZDXL"))); + + dataMete.setPreDayForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("S1RZXYGZDXL"))); + dataMete.setPreDayReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("S1RFXYGZDXL"))); + dataMete.setPreDayForwardReacMaxDemand(StringUtils.getBigDecimal(obj.get("S1RZXWGZDX"))); + dataMete.setPreDayReverseReacMaxDemand(StringUtils.getBigDecimal(obj.get("S1RFXWGZDX"))); + dataMete.setPre2dForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("S2RZXYGZDXL"))); + dataMete.setPre2dReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("S2RFXYGZDXL"))); + dataMete.setPre2dForwardReacMaxDemand(StringUtils.getBigDecimal(obj.get("S2RZXWGZDXL"))); + dataMete.setPre2dReverseReacMaxDemand(StringUtils.getBigDecimal(obj.get("S2RFXWGZDXL"))); + + dataMete.setCurrentForwardAcDemand(StringUtils.getBigDecimal(obj.get("DQZXYGXL"))); + dataMete.setCurrentReverseAcDemand(StringUtils.getBigDecimal(obj.get("DQFXYGXL"))); + dataMete.setCurrentForwardReacDemand(StringUtils.getBigDecimal(obj.get("DQZXWGXL"))); + dataMete.setCurrentReverseReacDemand(StringUtils.getBigDecimal(obj.get("DQFXWGXL"))); + + // 其他字段 + dataMete.setDidoStatus(StringUtils.getString(obj.get("DIDOZTSYZT"))); + dataMete.setRunningStatus(StringUtils.getString(obj.get("YXZT"))); + dataMete.setZeroSeqCurrent(StringUtils.getBigDecimal(obj.get("LXDL"))); + dataMete.setVoltageUnbalanceDegree(StringUtils.getBigDecimal(obj.get("DYBPHD"))); + dataMete.setCurrentUnbalanceDegree(StringUtils.getBigDecimal(obj.get("DLBPHD"))); + + // 储能功率 + dataMete.setSecondaryTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + + dataMete.setCreateBy("system"); + dataMete.setCreateTime(DateUtils.getNowDate()); + dataMete.setUpdateBy("system"); + dataMete.setUpdateTime(DateUtils.getNowDate()); + dataMete.setSiteId(SITE_ID); + dataMete.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataMete); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataMete); + + // 处理每日充放电数据 + dealDDSDailyChargeDate(obj,deviceId); + } + + private EmsDailyEnergyData initEnergyData() { + EmsDailyEnergyData energyData = new EmsDailyEnergyData(); + energyData.setSiteId(SITE_ID); + energyData.setDataDate(DateUtils.getNowDate()); + energyData.setCreateBy("system"); + energyData.setCreateTime(DateUtils.getNowDate()); + energyData.setUpdateBy("system"); + energyData.setUpdateTime(DateUtils.getNowDate()); + return energyData; + } + + private void dealDDSDailyChargeDate(Map obj, String deviceId) { + // 初始化今日充放电 + BigDecimal dailyDisChargeDate = new BigDecimal(0); + BigDecimal dailyChargeDate = new BigDecimal(0); + + BigDecimal nowTotalDisChargeDate = StringUtils.getBigDecimal(obj.get("DQFXZYGDN")); + BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQZXZYGDN")); + // 初始化当日数据-总的 + EmsDailyChargeData emsDailyChargeData = initDailyChargeData(deviceId,nowTotalChargeDate,nowTotalDisChargeDate); + // 获取redis存放昨日最晚数据 + String yestDate = DateUtils.getYesterdayDate(); + String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestDate; + EmsAmmeterData yestData = redisCache.getCacheObject(yestDateRedisKey); + if (yestData == null) { + // redis没有这查电表总数据表取截止到昨日最新第一条数据 + yestData = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestDate); + // 数据存redis-有效期1天 + redisCache.setCacheObject(yestDateRedisKey, yestData , Constants.DATE_VALID_TIME, TimeUnit.DAYS); + } + if (yestData != null) { + // 今日总数据-昨日总数据=今日充放电 + BigDecimal yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + BigDecimal yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); + + dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate); + dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate); + emsDailyChargeData.setChargeData(dailyChargeDate); + emsDailyChargeData.setDischargeData(dailyDisChargeDate); + } + + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + + // 初始化数据-尖峰平谷 + EmsDailyEnergyData energyData = initEnergyData(); + // 计算尖峰平谷差值,更新表 + calcEnergyDiffAndRevenue(energyData,obj,yestData); + energyData.setCalcTime(DateUtils.getNowDate()); + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private void calcEnergyDiffAndRevenue(EmsDailyEnergyData energyData, Map obj, EmsAmmeterData yestData) { + + // 获取当月电价 + String key = RedisKeyConstants.ENERGY_PRICE_TIME + SITE_ID + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(key); + + // 计算尖峰平谷差值 + // 正反向-尖 + BigDecimal peakChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActivePeak()); + energyData.setPeakChargeDiff(peakChargeDiff); + BigDecimal peakDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActivePeak()); + energyData.setPeakDischargeDiff(peakDischargeDiff); + // 正反向-峰 + BigDecimal highChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveHigh()); + energyData.setHighChargeDiff(highChargeDiff); + BigDecimal highDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveHigh()); + energyData.setHighDischargeDiff(highDischargeDiff); + // 正反向-平 + BigDecimal flatChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveFlat()); + energyData.setFlatChargeDiff(flatChargeDiff); + BigDecimal flatDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveFlat()); + energyData.setFlatDischargeDiff(flatDisChargeDiff); + // 正反向-谷 + BigDecimal valleyChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveValley()); + energyData.setValleyChargeDiff(valleyChargeDiff); + BigDecimal valleyDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveValley()); + energyData.setValleyDischargeDiff(valleyDisChargeDiff); + + + BigDecimal totalRevenue = getYestLastData(SITE_ID); + BigDecimal dayRevenue = BigDecimal.ZERO; + BigDecimal price = BigDecimal.ZERO; + // 计算当日收益,尖峰平谷收益累加,(放电量-充电量)*电价 + if (priceVo != null) { + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + BigDecimal peakRevenue = peakDischargeDiff.subtract(peakChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(peakRevenue); + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + BigDecimal highRevenue = highDischargeDiff.subtract(highChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(highRevenue); + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + BigDecimal flatRevenue = flatDisChargeDiff.subtract(flatChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(flatRevenue); + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + BigDecimal valleyRevenue = valleyDisChargeDiff.subtract(valleyChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(valleyRevenue); + energyData.setDayRevenue(dayRevenue); + } + // 总收益 = 昨日总收益+今日实时收益 + totalRevenue = totalRevenue.add(dayRevenue); + energyData.setTotalRevenue(totalRevenue); + } + + private BigDecimal getYestLastData(String siteId) { + // dds存的是累计到昨日总收益 + String yestDate = DateUtils.getYesterdayDayString(); + String redisKey = RedisKeyConstants.DDS_TOTAL_REVENUE + siteId + "_" + yestDate; + BigDecimal yestLastTotalRevenue = redisCache.getCacheObject(redisKey); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = emsDailyEnergyDataMapper.getLastTotalRevenue(siteId); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = BigDecimal.ZERO; + } + redisCache.setCacheObject(redisKey, yestLastTotalRevenue, 1 , TimeUnit.DAYS); + } + return yestLastTotalRevenue; + } + + private EmsDailyChargeData initDailyChargeData(String deviceId, BigDecimal nowTotalChargeDate, + BigDecimal nowTotalDisChargeDate) { + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(SITE_ID); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(nowTotalChargeDate); + emsDailyChargeData.setTotalDischargeData(nowTotalDisChargeDate); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + return emsDailyChargeData; + } + + // 数据分组处理 + private static Map> processData(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 提取记录ID(最后3位) + String recordId = key.substring(key.length() - 3); + try { + Long.parseLong(recordId); + } catch (Exception e) { + continue; + } + + // 提取字段类型(前缀) + String fieldType = key.substring(0, key.length() - 3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + return records; + } + + // 空数据不处理 + private boolean checkJsonDataEmpty(String jsonData) { + boolean flag = false; + try { + if (StringUtils.isEmpty(jsonData)) { + flag = true; + } + JsonNode jsonNode = objectMapper.readTree(jsonData); + // 判断是否为空对象({}) + if (jsonNode.isObject() && jsonNode.isEmpty()) { + flag = true ; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return flag; + } + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java new file mode 100644 index 0000000..fcb4274 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java @@ -0,0 +1,1923 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONException; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.constant.Constants; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.AlarmLevelStatus; +import com.xzzn.common.enums.AlarmStatus; +import com.xzzn.common.enums.BranchStatus; +import com.xzzn.common.enums.ChargeStatus; +import com.xzzn.common.enums.CommunicationStatus; +import com.xzzn.common.enums.ControlModeStatus; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.DeviceRunningStatus; +import com.xzzn.common.enums.DeviceType; +import com.xzzn.common.enums.GridStatus; +import com.xzzn.common.enums.SiteDevice; +import com.xzzn.common.enums.SiteEnum; +import com.xzzn.common.enums.SwitchStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.MapUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.*; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper; +import com.xzzn.ems.mapper.EmsBatteryGroupMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsClusterAlarmDataMapper; +import com.xzzn.ems.mapper.EmsCoolingAlarmDataMapper; +import com.xzzn.ems.mapper.EmsCoolingDataMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsDhDataMapper; +import com.xzzn.ems.mapper.EmsEmsDataMapper; +import com.xzzn.ems.mapper.EmsPcsAlarmDataMapper; +import com.xzzn.ems.mapper.EmsPcsBranchDataMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.mapper.EmsStackAlarmDataMapper; +import com.xzzn.ems.mapper.EmsXfDataMapper; +import com.xzzn.ems.service.IDeviceDataProcessService; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IEmsDeviceSettingService; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; +import com.xzzn.ems.utils.AbstractBatteryDataProcessor; +import com.xzzn.ems.utils.DevicePointMatchDataProcessor; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IDeviceDataProcessService { + private static final Logger log = LoggerFactory.getLogger(DeviceDataProcessServiceImpl.class); + + private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)"); + // 匹配DTDC+数字格式的正则(提取序号) + private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)"); + private final Map topicEmptyCounts = new ConcurrentHashMap<>(); + + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsXfDataMapper emsXfDataMapper; + @Autowired + private EmsDhDataMapper emsDhDataMapper; + @Autowired + private EmsCoolingDataMapper emsCoolingDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsBatteryGroupMapper emsBatteryGroupMapper; + @Autowired + private EmsEmsDataMapper emsEmsDataMapper; + + @Autowired + private EmsCoolingAlarmDataMapper emsCoolingAlarmDataMapper; + @Autowired + private EmsStackAlarmDataMapper emsStackAlarmDataMapper; + @Autowired + private EmsClusterAlarmDataMapper emsClusterAlarmDataMapper; + @Autowired + private EmsPcsAlarmDataMapper emsPcsAlarmDataMapper; + + @Autowired + private EmsBatteryDailyLatestServiceImpl emsBatteryDailyLatestServiceImpl; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + @Autowired + private IEmsEnergyPriceConfigService emsEnergyPriceConfigService; + @Autowired + private IEmsDeviceSettingService iEmsDeviceSettingService; + @Autowired + private DevicePointMatchDataProcessor devicePointMatchDataProcessor; + + @Autowired + private RedisCache redisCache; + + // 构造方法(调用父类构造) + public DeviceDataProcessServiceImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public void handleDeviceData(String message, String siteId) { + JSONArray arraylist = parseJsonData(message); + if (arraylist == null) return; + // 过滤掉空数据(空数据不处理,直接返回 + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.getString("Device"); + String jsonData = obj.getString("Data"); + Long timestamp = obj.getLong("timestamp"); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + String deviceNumber = siteId + deviceId; + boolean isEmpty = checkJsonDataEmpty(jsonData); + if (isEmpty) { + // 增加失败计数 + int failureCount = topicEmptyCounts.getOrDefault(deviceNumber, 0) + 1; + topicEmptyCounts.put(deviceNumber, failureCount); + + log.warn("设备 {} topic内没有数据,当前连续次数: {}", deviceId, failureCount); + + // 连续5次失败触发报警 + if (failureCount >= 5) { + // 添加设备告警 + iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); + log.error("设备 {} 连续 {} 次topic内没有数据,触发告警", deviceNumber, failureCount); + } + return; + } + // 数据读取成功,重置计数器 + topicEmptyCounts.remove(deviceNumber); + // 读取到数据后告警自恢复 + iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId); + + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA + siteId + "_" + deviceId, obj, 1, TimeUnit.MINUTES); + + // 处理设备数据 + processingDeviceData(siteId, deviceId, jsonData, dataUpdateTime); + } + } + + private JSONArray parseJsonData(String message) { + try { + JSONObject object = JSONObject.parseObject(message); + return object.getJSONArray("payload"); + } catch (JSONException e) { + log.info("mqtt message is not a json object: " + e.getMessage()); + try { + return JSONArray.parseArray(message); + } catch (Exception arrayException) { + log.info("mqtt message is not a json array: " + e.getMessage()); + } + } + return null; + } + + public void processingDeviceData(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // 判断设备类型,并调用对应的方法处理数据 + String deviceCategory = getDeviceCategory(siteId, deviceId); + if (deviceId.contains(SiteDevice.BMSD.name())) { + batteryStackDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + if (SiteEnum.DDS.getCode().equals(siteId)) { + batteryGroupDataProcess(siteId, deviceId, jsonData); + batteryDataProcessFromBmsd(siteId, deviceId, jsonData, dataUpdateTime); + } + } else if (deviceId.contains(SiteDevice.BMSC.name())) { + batteryClusterDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + batteryDataProcessFromBmsc(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.PCS.name()) + || DeviceCategory.PCS.getCode().equals(deviceCategory)) { + pcsDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + pcsBranchDataProcess(siteId, deviceId, jsonData); + if (SiteEnum.DDS.getCode().equals(siteId)) { + batteryClusterDataProcess(siteId, jsonData, dataUpdateTime); + } + } else if (deviceId.contains(SiteDevice.LOAD.name()) + || deviceId.contains(SiteDevice.METEGF.name()) + || deviceId.contains(SiteDevice.METE.name()) + || deviceId.contains(SiteDevice.METE0.name()) + || DeviceCategory.AMMETER.getCode().equals(deviceCategory)) { + meteDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.XF.name()) + || DeviceCategory.XF.getCode().equals(deviceCategory)) { + meteXFProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.DH.name()) + || deviceId.contains(SiteDevice.donghuan.name()) + || DeviceCategory.DH.getCode().equals(deviceCategory)) { + dhDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.ZSLQ.name()) + || DeviceCategory.COOLING.getCode().equals(deviceCategory)) { + coolingDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.EMS.name()) + || DeviceCategory.EMS.getCode().equals(deviceCategory)) { + emsDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else { + log.info("未找到匹配的设备类型,无法处理数据,siteId: " + siteId + ",deviceId: " + deviceId); + } + } + + private String getDeviceCategory(String siteId, String deviceId) { + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + if (emsDevicesSetting != null) { + return emsDevicesSetting.getDeviceCategory(); + } + return ""; + } + + private void emsDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //EMS + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.EMS.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理EMS数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsEmsData emsData = new EmsEmsData(); + + saveDeviceData(pointMatchList, obj, emsData); + + emsData.setDataUpdateTime(dataUpdateTime); + emsData.setCreateBy("system"); + emsData.setCreateTime(DateUtils.getNowDate()); + emsData.setUpdateBy("system"); + emsData.setUpdateTime(DateUtils.getNowDate()); + emsData.setSiteId(siteId); + emsData.setDeviceId(deviceId); + + emsEmsDataMapper.insertEmsEmsData(emsData); + + redisCache.setCacheObject(RedisKeyConstants.EMS + siteId + "_" + deviceId, emsData); + } + + private void coolingDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.COOLING.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsCoolingData coolingData = new EmsCoolingData(); + + saveDeviceData(pointMatchList, obj, coolingData); + + coolingData.setDataUpdateTime(dataUpdateTime); + coolingData.setCreateBy("system"); + coolingData.setCreateTime(DateUtils.getNowDate()); + coolingData.setUpdateBy("system"); + coolingData.setUpdateTime(DateUtils.getNowDate()); + coolingData.setSiteId(siteId); + coolingData.setDeviceId(deviceId); + + emsCoolingDataMapper.insertEmsCoolingData(coolingData); + + redisCache.setCacheObject(RedisKeyConstants.COOLING + siteId + "_" + deviceId, coolingData); + + } + + public void meteXFProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + //消防 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.XF.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理消防数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + // 暂时只更新设备表的设备状态 ZDYBYDCZT-主电源备用电池状态 + // 数据存表 + EmsXfData xfData = new EmsXfData(); + xfData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, xfData); + + xfData.setCreateBy("system"); + xfData.setCreateTime(DateUtils.getNowDate()); + xfData.setUpdateBy("system"); + xfData.setUpdateTime(DateUtils.getNowDate()); + xfData.setSiteId(siteId); + xfData.setDeviceId(deviceId); + emsXfDataMapper.insertEmsXfData(xfData); + + redisCache.setCacheObject(RedisKeyConstants.XF + siteId + "_" + deviceId, xfData); + // 状态枚举还没有提供 + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + emsDevicesSetting.setCommunicationStatus(StringUtils.getString(xfData.getDczt())); + emsDevicesSetting.setUpdatedAt(DateUtils.getNowDate()); + emsDevicesSettingMapper.updateEmsDevicesSetting(emsDevicesSetting); + } + + private void dhDataProcess(String siteId, String deviceId, String dataJson, Date dateUpdateTime) { + //动环 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.DH.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理动环数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //DH + EmsDhData dhData = new EmsDhData(); + + saveDeviceData(pointMatchList, obj, dhData); + + dhData.setDataUpdateTime(dateUpdateTime); + dhData.setCreateBy("system"); + dhData.setCreateTime(DateUtils.getNowDate()); + dhData.setUpdateBy("system"); + dhData.setUpdateTime(DateUtils.getNowDate()); + dhData.setSiteId(siteId); + dhData.setDeviceId(deviceId); + emsDhDataMapper.insertEmsDhData(dhData); + + redisCache.setCacheObject(RedisKeyConstants.DH + siteId + "_" + deviceId, dhData); + + } + + private void batteryStackDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //电池堆 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 将原始数据存一下方便后面簇数据使用 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_BMSD + siteId + "_" + deviceId, obj); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.STACK.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池堆数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //BMS 电池簇 + EmsBatteryStack dataStack = new EmsBatteryStack(); + + // 其他非 BigDecimal 字段 + dataStack.setDataUpdateTime(dataUpdateTime); +// dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + + saveDeviceData(pointMatchList, obj, dataStack); + + dataStack.setCreateBy("system"); + dataStack.setCreateTime(DateUtils.getNowDate()); + dataStack.setUpdateBy("system"); + dataStack.setUpdateTime(DateUtils.getNowDate()); + dataStack.setSiteId(siteId); + dataStack.setDeviceId(deviceId); + + //TODO 临时解决上送数据为浮点的问题 + String status = dataStack.getWorkStatus(); + int result = 5; + + if (status != null && !status.trim().isEmpty()) { + // 1.0 -> 1, 2.0 -> 2 + result = (int) Double.parseDouble(status.trim()); + } + + dataStack.setWorkStatus(String.valueOf(result)); + + emsBatteryStackMapper.insertEmsBatteryStack(dataStack); + + redisCache.setCacheObject(RedisKeyConstants.STACK + siteId + "_" + deviceId, dataStack); + + // 同步更新设备工作状态 + saveDeviceWorkStatus(siteId, deviceId, DeviceMatchTable.STACK.getCode(), dataStack.getWorkStatus()); + } + + private void batteryGroupDataProcess(String siteId, String deviceId, String jsonData) { +// if (!SiteEnum.DDS.getCode().equals(siteId)) { +// return; +// } + //电池组 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + Map groupMap = new HashMap<>(); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + // 跳过空键 + if (key == null || key.trim().isEmpty()) { + continue; + } + Matcher matcher = PATTERN.matcher(key); + if (matcher.matches()) { + String groupDeviceId = matcher.group(1); + String property = matcher.group(2); + EmsBatteryGroup dataGroup = groupMap.getOrDefault(groupDeviceId, new EmsBatteryGroup()); + dataGroup.setDeviceId(groupDeviceId); + dataGroup.setSiteId(siteId); + dataGroup.setCreateBy("system"); + dataGroup.setCreateTime(DateUtils.getNowDate()); + dataGroup.setUpdateBy("system"); + dataGroup.setUpdateTime(DateUtils.getNowDate()); + + setPropertyValue(dataGroup, property, entry.getValue()); + groupMap.put(groupDeviceId, dataGroup); + } + } + + // 批量插入数据库 + if (org.apache.commons.collections4.MapUtils.isNotEmpty(groupMap)) { + List batteryGroupList = new ArrayList<>(groupMap.values()); + emsBatteryGroupMapper.batchInsertGroupData(batteryGroupList); + redisCache.setCacheObject(RedisKeyConstants.GROUP + siteId + "_" + deviceId, batteryGroupList); + } + + } + + private void batteryDataProcessFromBmsd(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { +// if (!SiteEnum.DDS.getCode().equals(siteId)) { +// return; +// } + //电池组 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + List dataList = new ArrayList<>(); + + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + + Map dataMap = new HashMap<>(); + Map dailyMap = new HashMap<>(); + Map minutesMap = new HashMap<>(); + + String clusterId = getClusterDeviceIdByParentDeviceId(siteId, deviceId); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + + if (key.startsWith("DTDC")) { + Matcher matcher = DTDC_PATTERN.matcher(key); + if (matcher.matches()) { + String batteryCellId = matcher.group(1); + String property = matcher.group(2); + + EmsBatteryData data = dataMap.getOrDefault(batteryCellId, new EmsBatteryData()); + if (StringUtils.isNotEmpty(batteryCellId)) { + data.setDataTimestamp(dataUpdateTime); + data.setBatteryPack(deviceId); + data.setBatteryCluster(clusterId); + data.setClusterDeviceId(clusterId); + data.setBatteryCellId(batteryCellId); + data.setSiteId(siteId); + data.setDeviceId(batteryCellId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + } + // 根据后缀设置对应属性 + setDTDCPropertyValue(data, property, entry.getValue()); + dataMap.put(batteryCellId, data); + + // 每日最新数据:按batteryCellId去重 + EmsBatteryDataDailyLatest daily = dailyMap.getOrDefault(batteryCellId, new EmsBatteryDataDailyLatest()); + BeanUtils.copyProperties(data, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyMap.put(batteryCellId, daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = minutesMap.getOrDefault(batteryCellId, new EmsBatteryDataMinutes()); + BeanUtils.copyProperties(data, minutes); + minutesMap.put(batteryCellId, minutes); + } + } + } + if (!CollectionUtils.sizeIsEmpty(dataMap)) { + dataList = new ArrayList<>(dataMap.values()); + emsBatteryDataMapper.insertEmsBatteryDataList(new ArrayList<>(dataList)); + + redisCache.deleteList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId, dataList); + } + // 批量处理每日最新数据 + List dailyList = new ArrayList<>(dailyMap.values()); + if (!dailyList.isEmpty()) { + dailyList = new ArrayList<>(dailyMap.values()); + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + + // 实时插入每分钟数据 + List minutesList = new ArrayList<>(minutesMap.values()); + if (!minutesList.isEmpty()) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (CollectionUtils.isNotEmpty(dataList)) { + super.processBatch(dataList); + } + } + + private String getClusterDeviceIdByParentDeviceId(String siteId, String deviceId) { + String clusterId = "BMSC01"; + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找子类的簇id + if (map != null && !map.isEmpty()) { + List list = map.get(siteId); + if (CollectionUtils.isNotEmpty(list)) { + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getParentId())) { + clusterId = emsDevicesSetting.getDeviceId(); + } + } + } + } + return clusterId; + } + + private void setDTDCPropertyValue(EmsBatteryData data, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + switch (property) { + case "DY": + data.setVoltage(numberValue); + break; + case "WD": + data.setTemperature(numberValue); + break; + case "NZ": + data.setInterResistance(numberValue); + break; + } + } + + //根据属性名设置对应的值 + private static void setPropertyValue(EmsBatteryGroup groupData, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + + switch (property) { + case "ZT": + if (numberValue != null) { + groupData.setStatus(numberValue.toString()); + } + break; + case "SOC": + groupData.setSoc(numberValue); + break; + case "SOH": + groupData.setSoh(numberValue); + break; + case "DL": + groupData.setCurrent(numberValue); + break; + case "DY": + groupData.setVoltage(numberValue); + break; + case "BDSC": + groupData.setEstimatedBackupDuration(numberValue); + break; + } + } + + /** + * + * @param pointMatchList 字段匹配规则列表 + * @param obj 原始数据Map + * @param entity 目标Java对象 + */ + private void saveDeviceData(List pointMatchList, Map obj, Object entity) { + if (null == obj || obj.isEmpty()) { + return; + } + Map pointMatchMap = pointMatchList.stream() + .filter(data -> StringUtils.isNotEmpty(data.getDataPoint())) + .collect(Collectors.toMap( + data -> StringUtils.toCamelCase(data.getMatchField()), // 源字段名转为驼峰 + EmsPointMatch::getDataPoint, // 获取目标点位名 + (existing, replacement) -> replacement)); // 处理重复键 + Field[] fields = entity.getClass().getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + if (pointMatchMap.containsKey(fieldName)) { + // 处理匹配的字段名,并设置值 + field.setAccessible(true); // 允许访问私有字段 + try { + // 1. 从原始数据中获取匹配值 + Object matchValue = obj.get(pointMatchMap.get(fieldName)); + + // 2. 类型转换 + Class fieldType = field.getType(); + if (String.class.equals(fieldType)) { + matchValue = StringUtils.getString(matchValue); + } else if (Long.class.equals(fieldType)) { + matchValue = StringUtils.getLong(matchValue); + } else if (BigDecimal.class.equals(fieldType)) { + matchValue = StringUtils.getBigDecimal(matchValue); + } else if (Integer.class.equals(fieldType)) { + matchValue = MapUtils.getInteger(obj, pointMatchMap.get(fieldName)); + } + + // 4. 设置字段值 + field.set(entity, matchValue); + } catch (IllegalAccessException e) { + log.warn("deviceDataProcess 设置字段值时出错", e); + } + } + } + } + + private void batteryClusterDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池簇数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + String stackDeviceId = getStackDeviceId(deviceId); + //BMS 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + + saveDeviceData(pointMatchList, obj, data); + + data.setDataUpdateTime(dataUpdateTime); +// data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(siteId); + data.setDeviceId(deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + deviceId, data); + + // 同步更新设备工作状态 + saveDeviceWorkStatus(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode(), data.getWorkStatus()); + } + + private String getStackDeviceId(String deviceId) { + EmsDevicesSetting joken = new EmsDevicesSetting(); + joken.setDeviceId(deviceId); + List up = emsDevicesSettingMapper.selectEmsDevicesSettingList(joken); + String stackDeviceId = ""; + if (CollectionUtils.isNotEmpty(up)) { + stackDeviceId = up.get(0).getParentId(); + if (StringUtils.isNotEmpty(stackDeviceId)) { + stackDeviceId = "1"; + } + } + + return stackDeviceId; + } + + private void batteryDataProcessFromBmsc(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //单体电池 + Map> records = processData(JSON.parseObject(dataJson, new TypeReference>() { + })); + + log.info("站点:{},单体电池数据:{}", siteId, records); + List list = new ArrayList<>(); + List dailyList = new ArrayList<>(); + List minutesList = new ArrayList<>(); + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + //单体电池 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + String batteryDeviceId = recordId + deviceId; + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, batteryDeviceId, DeviceMatchTable.BATTERY.getCode()); + + if (CollectionUtils.isEmpty(pointMatchList)) { + pointMatchList = devicePointMatchDataProcessor.getDeviceDefaultPointMatch(siteId, DeviceMatchTable.BATTERY.getCode()); + } else { + Map newFields = new HashMap<>(); + for (Map.Entry entry : fields.entrySet()) { + newFields.put(entry.getKey() + recordId, entry.getValue()); + } + fields = newFields; + } + + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理单体电池数据,siteId: " + siteId + ",deviceId: " + batteryDeviceId); + return; + } + + EmsBatteryData batteryData = new EmsBatteryData(); + //TODO 单体电池 deviceid 拼接簇的 deviceid + batteryData.setDeviceId(recordId+deviceId); + batteryData.setBatteryCellId(recordId); + + saveDeviceData(pointMatchList, fields, batteryData); + + batteryData.setBatteryCluster(deviceId); + batteryData.setBatteryPack(getStackDeviceId(deviceId)); + + // 时间戳 + batteryData.setDataTimestamp(dataUpdateTime); + // 系统管理字段 + batteryData.setCreateBy("system"); + batteryData.setCreateTime(DateUtils.getNowDate()); + batteryData.setUpdateBy("system"); + batteryData.setUpdateTime(DateUtils.getNowDate()); + // ID字段 + batteryData.setSiteId(siteId); + batteryData.setClusterDeviceId(deviceId); + list.add(batteryData); + + // 每日最新数据 + EmsBatteryDataDailyLatest daily = new EmsBatteryDataDailyLatest(); + BeanUtils.copyProperties(batteryData, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyList.add(daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = new EmsBatteryDataMinutes(); + BeanUtils.copyProperties(batteryData, minutes); + minutesList.add(minutes); + } + + if (CollectionUtils.isNotEmpty(list)) { + emsBatteryDataMapper.insertEmsBatteryDataList(list); + + redisCache.deleteList(RedisKeyConstants.BATTERY + siteId + "_" + deviceId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + siteId + "_" + deviceId, list); + + } + + // 批量处理每日最新数据 + if (CollectionUtils.isNotEmpty(dailyList)) { + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + // 实时插入每分钟数据 + if (CollectionUtils.isNotEmpty(minutesList)) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (CollectionUtils.isNotEmpty(list)) { + super.processBatch(list); + } + } + + private void pcsDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.PCS.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理PCS数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //pcs + EmsPcsData pcsData = new EmsPcsData(); + + saveDeviceData(pointMatchList, obj, pcsData); + + // 状态指示类 + pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); + pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); + pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); + pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); + pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); + + // 时间与状态类字段 + pcsData.setDataUpdateTime(dataUpdateTime); +// pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); + pcsData.setGridStatus(GridStatus.GRID.getCode()); + pcsData.setDeviceStatus(DeviceRunningStatus.ONLINE.getCode()); + pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); + + // 系统管理字段 + pcsData.setCreateBy("system"); + pcsData.setCreateTime(DateUtils.getNowDate()); + pcsData.setUpdateBy("system"); + pcsData.setUpdateTime(DateUtils.getNowDate()); + pcsData.setSiteId(siteId); + pcsData.setDeviceId(deviceId); + pcsData.setDateMonth(DateUtils.getNowMonthLong()); + pcsData.setDateDay(DateUtils.getNowDayLong()); + + //TODO 临时解决设备状态不展示数据问题 + pcsData.setDeviceStatus(DeviceRunningStatus.ONLINE.getCode()); + //TODO end + + //TODO 临时解决上送数据为浮点的问题 start + String status = pcsData.getWorkStatus(); + int result = 0; + if (status != null && !status.trim().isEmpty()) { + // 1.0 -> 1, 2.0 -> 2 + result = (int) Double.parseDouble(status.trim()); + } + pcsData.setWorkStatus(String.valueOf(result)); + //TODO end + + + emsPcsDataMapper.insertEmsPcsData(pcsData); + redisCache.setCacheObject(RedisKeyConstants.PCS + siteId + "_" + deviceId, pcsData); + + // 同步更新PCS设备工作状态 + saveDeviceWorkStatus(siteId, deviceId, DeviceMatchTable.PCS.getCode(), pcsData.getWorkStatus()); + +// if (SiteEnum.FX.getCode().equals(siteId)) { +// //更新每日充放电数据 +// dealFXXDailyChargeDate(siteId, deviceId, pcsData); +// } + } + + private void pcsBranchDataProcess(String siteId, String deviceId, String dataJson) { + + Map> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference>() { + })); + List list = new ArrayList<>(); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.BRANCH.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理PCS支路数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //PCS支路 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsPcsBranchData data = new EmsPcsBranchData(); + data.setDeviceId(deviceId); + data.setSiteId(siteId); + data.setGridStatus(GridStatus.GRID.getCode()); + + saveDeviceData(pointMatchList, fields, data); + + data.setBranchId(recordId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + list.add(data); + } + if (CollectionUtils.isNotEmpty(list)) { + emsPcsBranchDataMapper.insertPcsBranchDataList(list); + + redisCache.setCacheObject(RedisKeyConstants.BRANCH + siteId + "_" + deviceId, list); + + } + + } + + private void loadDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.AMMETER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理LOAD总表数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsAmmeterData dataLoad = new EmsAmmeterData(); + // 更新时间 + dataLoad.setDataUpdateTime(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, dataLoad); + + dataLoad.setCreateBy("system"); + dataLoad.setCreateTime(DateUtils.getNowDate()); + dataLoad.setUpdateBy("system"); + dataLoad.setUpdateTime(DateUtils.getNowDate()); + dataLoad.setSiteId(siteId); + dataLoad.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId, dataLoad); + + } + + private void batteryClusterDataProcess(String siteId, String dataJson, Date dataUpdateTime) { +// if (!SiteEnum.DDS.getCode().equals(siteId)) { +// return; +// } + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + List deviceIds = Arrays.asList("BMSC02", "BMSC01"); + for (String deviceId : deviceIds) { + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池簇数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + //BMSC 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + // 其他非 BigDecimal 字段 + data.setDataUpdateTime(dataUpdateTime); +// data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(siteId); + String stackDeviceId = getDeviceParent(siteId, deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + + + // 获取redis获取最新的BMSD数据 + Map stackObj = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_BMSD + siteId + "_" + stackDeviceId); + data.setDeviceId(deviceId); + saveDeviceData(pointMatchList, obj, data); + + // 取堆里面数据 + saveDeviceData(pointMatchList, stackObj, data); + + + //TODO 临时解决上送数据为浮点的问题 start + log.info("临时解决上送数据为浮点的问题"); + String status = data.getWorkStatus(); + int result = 5; + if (status != null && !status.trim().isEmpty()) { + // 1.0 -> 1, 2.0 -> 2 + result = (int) Double.parseDouble(status.trim()); + } + data.setWorkStatus(String.valueOf(result)); + //TODO end + + + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + deviceId, data); + + // 同步更新设备工作状态 + saveDeviceWorkStatus(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode(), data.getWorkStatus()); + + } + + } + + private void saveDeviceWorkStatus(String siteId, String deviceId, String deviceCategory, String workStatus) { + if (StringUtils.isEmpty(workStatus)) { + return; + } +// Map> pointEnumMatchMap = devicePointMatchDataProcessor.getPointEnumMatchMap(siteId, deviceCategory); +// // 枚举值转换 +// List pointEnumMatchList = pointEnumMatchMap.get("workStatus"); +// if (CollectionUtils.isNotEmpty(pointEnumMatchList) && workStatus != null) { +// String finalMatchValue = workStatus.replace(".0", ""); +// Optional enumMatch = pointEnumMatchList.stream() +// .filter(data -> data.getDataEnumCode().equals(finalMatchValue)).findFirst(); +// if (enumMatch.isPresent()) { +// workStatus = enumMatch.get().getEnumCode(); +// } +// } + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + emsDevicesSetting.setWorkStatus(workStatus); + emsDevicesSetting.setUpdatedAt(DateUtils.getNowDate()); + emsDevicesSettingMapper.updateEmsDevicesSetting(emsDevicesSetting); + } + + private String getDeviceParent(String siteId, String deviceId) { + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找父类 + String stackDeviceId = "1"; + if (map != null && !map.isEmpty()) { + List list = map.get(siteId); + if (list == null || list.isEmpty()) { + EmsDevicesSetting deviceInfo = new EmsDevicesSetting(); + deviceInfo.setDeviceId(deviceId); + deviceInfo.setSiteId(siteId); + list = emsDevicesSettingMapper.selectEmsDevicesSettingList(deviceInfo); + if (list == null || list.isEmpty()) { + return stackDeviceId; + } + } + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getDeviceId())) { + stackDeviceId = emsDevicesSetting.getParentId(); + } + } + } + return stackDeviceId; + } + + private void dealFXXDailyChargeDate(String siteId, String deviceId, EmsPcsData pcsData) { + log.info("start dealFXXDailyChargeDate"); + //日充放电数据 + if (pcsData == null) { + log.info("日充放电数据为空, deviceId: " + deviceId); + return; + } + + // 初始化当日数据 + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(siteId); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(pcsData.getTotalAcChargeEnergy()); + emsDailyChargeData.setTotalDischargeData(pcsData.getTotalAcDischargeEnergy()); + emsDailyChargeData.setChargeData(pcsData.getDailyAcChargeEnergy()); + emsDailyChargeData.setDischargeData(pcsData.getDailyAcDischargeEnergy()); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + log.info("end dealFXXDailyChargeDate"); + } + + private void meteDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.AMMETER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电表数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + // 获取上次数据,便于后面计算差值均无则默认0 + EmsAmmeterData lastAmmeterData = getLastAmmeterData(siteId, deviceId); + + EmsAmmeterData dataMete = new EmsAmmeterData(); + // 更新时间 + dataMete.setDataUpdateTime(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, dataMete); + + dataMete.setCreateBy("system"); + dataMete.setCreateTime(DateUtils.getNowDate()); + dataMete.setUpdateBy("system"); + dataMete.setUpdateTime(DateUtils.getNowDate()); + dataMete.setSiteId(siteId); + dataMete.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataMete); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId, dataMete); + + if (deviceId.equals(SiteDevice.METE.name())) { + // 处理储能电表-METE每日充放电数据 + dealDailyChargeDate(siteId, deviceId, dataMete); + + // 处理储能电表-METE每日数据(尖、峰、平、谷差值) +// if (SiteEnum.FX.getCode().equals(siteId)) { + dealAmmeterDailyDate(siteId, dataMete, dataUpdateTime, lastAmmeterData); +// } else if (SiteEnum.DDS.getCode().equals(siteId)) { +// dealDailyEnergyData(siteId, dataMete, yestData); +// } + } + } + + private EmsAmmeterData getLastAmmeterData(String siteId, String deviceId) { + // 先从redis取,取不到查数据 + EmsAmmeterData lastData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId); + if (lastData == null) { + lastData = emsAmmeterDataMapper.getLastData(siteId, deviceId); + if (lastData == null) { + lastData = new EmsAmmeterData(); + lastData.setSiteId(siteId); + lastData.setDeviceId(deviceId); + lastData.setCurrentForwardActiveTotal(BigDecimal.ZERO); + lastData.setCurrentReverseActiveTotal(BigDecimal.ZERO); + } + } + return lastData; + } + + private void dealDDSDailyChargeDate(String siteId, EmsAmmeterData currentData, String deviceId) { + // 初始化今日充放电 + BigDecimal dailyDisChargeDate = new BigDecimal(0); + BigDecimal dailyChargeDate = new BigDecimal(0); + +// BigDecimal nowTotalDisChargeDate = StringUtils.getBigDecimal(obj.get("DQFXZYGDN")); +// BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQZXZYGDN")); + BigDecimal nowTotalDisChargeDate = currentData.getCurrentReverseActiveTotal(); + BigDecimal nowTotalChargeDate = currentData.getCurrentForwardActiveTotal(); + // 初始化当日数据-总的 + EmsDailyChargeData emsDailyChargeData = initDailyChargeData(siteId, deviceId, nowTotalChargeDate, nowTotalDisChargeDate); + // 获取redis存放昨日最晚数据 + String yestDate = DateUtils.getYesterdayDate(); + String yestDateRedisKey = RedisKeyConstants.AMMETER + siteId + "_" + deviceId + "_" + yestDate; + EmsAmmeterData yestData = redisCache.getCacheObject(yestDateRedisKey); + if (yestData == null) { + // redis没有这查电表总数据表取截止到昨日最新第一条数据 + yestData = emsAmmeterDataMapper.getYestLatestDate(siteId, deviceId, yestDate); + // 数据存redis-有效期1天 + redisCache.setCacheObject(yestDateRedisKey, yestData, Constants.DATE_VALID_TIME, TimeUnit.DAYS); + } + if (yestData != null) { + // 今日总数据-昨日总数据=今日充放电 + BigDecimal yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + BigDecimal yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); + + dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate); + dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate); + emsDailyChargeData.setChargeData(dailyChargeDate); + emsDailyChargeData.setDischargeData(dailyDisChargeDate); + } + + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + + // 初始化数据-尖峰平谷 + EmsDailyEnergyData energyData = initEnergyData(siteId); + // 计算尖峰平谷差值,更新表 + calcEnergyDiffAndRevenue(siteId, energyData, currentData, yestData); + energyData.setCalcTime(DateUtils.getNowDate()); + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private EmsDailyChargeData initDailyChargeData(String siteId, String deviceId, BigDecimal nowTotalChargeDate, + BigDecimal nowTotalDisChargeDate) { + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(siteId); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(nowTotalChargeDate); + emsDailyChargeData.setTotalDischargeData(nowTotalDisChargeDate); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + return emsDailyChargeData; + } + + private void dealDailyEnergyData(String siteId, EmsAmmeterData currentData, EmsAmmeterData yestData) { + // 初始化数据-尖峰平谷 + EmsDailyEnergyData energyData = initEnergyData(siteId); + // 计算尖峰平谷差值,更新表 + calcEnergyDiffAndRevenue(siteId, energyData, currentData, yestData); + energyData.setCalcTime(DateUtils.getNowDate()); + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + private EmsAmmeterData dealDailyChargeDate(String siteId, String deviceId, EmsAmmeterData currentData) { + // 初始化今日充放电 + BigDecimal dailyDisChargeDate = new BigDecimal(0); + BigDecimal dailyChargeDate = new BigDecimal(0); + + BigDecimal nowTotalDisChargeDate = currentData.getCurrentReverseActiveTotal(); + BigDecimal nowTotalChargeDate = currentData.getCurrentForwardActiveTotal(); + // 初始化当日数据-总的 + EmsDailyChargeData emsDailyChargeData = initDailyChargeData(siteId, deviceId, nowTotalChargeDate, nowTotalDisChargeDate); + // 获取redis存放昨日最晚数据 + String yestDate = DateUtils.getYesterdayDate(); + String yestDateRedisKey = RedisKeyConstants.AMMETER + siteId + "_" + deviceId + "_" + yestDate; + EmsAmmeterData yestData = redisCache.getCacheObject(yestDateRedisKey); + if (yestData == null) { + // redis没有这查电表总数据表取截止到昨日最新第一条数据 + yestData = emsAmmeterDataMapper.getYestLatestDate(siteId, deviceId, yestDate); + // 数据存redis-有效期1天 + redisCache.setCacheObject(yestDateRedisKey, yestData, Constants.DATE_VALID_TIME, TimeUnit.DAYS); + } + if (yestData != null) { + // 今日总数据-昨日总数据=今日充放电 + BigDecimal yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + BigDecimal yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); + + dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate); + dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate); + emsDailyChargeData.setChargeData(dailyChargeDate); + emsDailyChargeData.setDischargeData(dailyDisChargeDate); + } + + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + + return yestData; + } + + private void calcEnergyDiffAndRevenue(String siteId, EmsDailyEnergyData energyData, EmsAmmeterData currentData, EmsAmmeterData yestData) { + + // 获取当月电价 + String key = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(key); + + // 计算尖峰平谷差值 + // 正反向-尖 +// BigDecimal peakChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGJDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActivePeak()); + BigDecimal peakChargeDiff = currentData.getCurrentForwardActivePeak() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActivePeak()); + energyData.setPeakChargeDiff(peakChargeDiff); +// BigDecimal peakDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGJDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActivePeak()); + BigDecimal peakDischargeDiff = currentData.getCurrentReverseActivePeak() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActivePeak()); + energyData.setPeakDischargeDiff(peakDischargeDiff); + // 正反向-峰 +// BigDecimal highChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGFDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveHigh()); + BigDecimal highChargeDiff = currentData.getCurrentForwardActiveHigh() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveHigh()); + energyData.setHighChargeDiff(highChargeDiff); +// BigDecimal highDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGFDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveHigh()); + BigDecimal highDischargeDiff = currentData.getCurrentReverseActiveHigh() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveHigh()); + energyData.setHighDischargeDiff(highDischargeDiff); + // 正反向-平 +// BigDecimal flatChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGPDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveFlat()); + BigDecimal flatChargeDiff = currentData.getCurrentForwardActiveFlat() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveFlat()); + energyData.setFlatChargeDiff(flatChargeDiff); +// BigDecimal flatDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGPDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveFlat()); + BigDecimal flatDisChargeDiff = currentData.getCurrentReverseActiveFlat() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveFlat()); + energyData.setFlatDischargeDiff(flatDisChargeDiff); + // 正反向-谷 +// BigDecimal valleyChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGGDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveValley()); + BigDecimal valleyChargeDiff = currentData.getCurrentForwardActiveValley() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveValley()); + energyData.setValleyChargeDiff(valleyChargeDiff); +// BigDecimal valleyDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGGDN")) +// .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveValley()); + BigDecimal valleyDisChargeDiff = currentData.getCurrentReverseActiveValley() + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveValley()); + energyData.setValleyDischargeDiff(valleyDisChargeDiff); + + + BigDecimal totalRevenue = getYestLastData(siteId); + BigDecimal dayRevenue = BigDecimal.ZERO; + BigDecimal price = BigDecimal.ZERO; + // 计算当日收益,尖峰平谷收益累加,(放电量-充电量)*电价 + if (priceVo != null) { + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + BigDecimal peakRevenue = peakDischargeDiff.subtract(peakChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(peakRevenue); + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + BigDecimal highRevenue = highDischargeDiff.subtract(highChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(highRevenue); + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + BigDecimal flatRevenue = flatDisChargeDiff.subtract(flatChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(flatRevenue); + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + BigDecimal valleyRevenue = valleyDisChargeDiff.subtract(valleyChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(valleyRevenue); + energyData.setDayRevenue(dayRevenue); + } + // 总收益 = 昨日总收益+今日实时收益 + totalRevenue = totalRevenue.add(dayRevenue); + energyData.setTotalRevenue(totalRevenue); + } + + private BigDecimal getYestLastData(String siteId) { + // dds存的是累计到昨日总收益 + String yestDate = DateUtils.getYesterdayDayString(); + String redisKey = RedisKeyConstants.DDS_TOTAL_REVENUE + siteId + "_" + yestDate; + Object cacheObject = redisCache.getCacheObject(redisKey); + BigDecimal yestLastTotalRevenue; + if (cacheObject == null) { + yestLastTotalRevenue = emsDailyEnergyDataMapper.getLastTotalRevenue(siteId); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = BigDecimal.ZERO; + } + redisCache.setCacheObject(redisKey, yestLastTotalRevenue, 1, TimeUnit.DAYS); + } else { + log.info("从redis获取昨日总收益cacheObject:{}", cacheObject); + yestLastTotalRevenue = new BigDecimal(cacheObject.toString()); + } + return yestLastTotalRevenue; + } + + private void dealAmmeterDailyDate(String siteId, EmsAmmeterData currentData, Date dataUpdateTime, EmsAmmeterData lastData) { + // 先获取当月电价配置,redis没有这查数据库,都没有则返回 + String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(priceKey); + if (priceVo == null) { + priceVo = emsEnergyPriceConfigService.getCurrentMonthPrice(siteId); + redisCache.setCacheObject(priceKey, priceVo, 31, TimeUnit.DAYS); + if (priceVo == null) { + return; + } + } + List timeRanges = priceVo.getRange(); + if (timeRanges == null) { + return; + } + + // 根据时间范围判断数据类型(尖峰平谷),无法确定数据类型则不处理 + String costType = ""; + String startTime = ""; + for (EnergyPriceTimeRange timeRange : timeRanges) { + startTime = timeRange.getStartTime(); + if (isInPriceTimeRange(startTime, timeRange.getEndTime(), dataUpdateTime)) { + costType = timeRange.getCostType(); + break; + } + } + if (StringUtils.isEmpty(costType)) { + return; + } + + //初始化电表每日差值对象 + EmsDailyEnergyData energyData = initEnergyData(siteId); + + // 根据 costType,计算本次与上次数据差值,累加到对应的数据类型里面 + setDiffByCostType(siteId, costType, energyData, lastData, currentData, priceVo); + + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private void setDiffByCostType(String siteId, String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, + EmsAmmeterData currentData, EnergyPriceVo priceVo) { +// BigDecimal currentChargeData = StringUtils.getBigDecimal(obj.get("ZXYGDN")); +// BigDecimal currentDischargeData = StringUtils.getBigDecimal(obj.get("FXYGDN")); + BigDecimal currentChargeData = currentData.getCurrentForwardActiveTotal(); + BigDecimal currentDischargeData = currentData.getCurrentReverseActiveTotal(); + currentChargeData = currentChargeData != null ? currentChargeData : BigDecimal.ZERO; + currentDischargeData = currentDischargeData != null ? currentDischargeData : BigDecimal.ZERO; + + // 获取上次实时总收益+当日实时总收益,初始化电价 + Map revenueMap = getRealTimeData(siteId); + BigDecimal totalRevenue = revenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : revenueMap.get("totalRevenue"); + BigDecimal dayRevenue = revenueMap.get("dayRevenue") == null ? BigDecimal.ZERO : revenueMap.get("dayRevenue"); + BigDecimal price = BigDecimal.ZERO; + // 计算时段差值,按照数据类型累加 + // 计算当日累加收益,尖峰平谷收益在当日原基础累加,(放电量-充电量)*电价 + BigDecimal chargeDiffData = currentChargeData.subtract( + lastData.getCurrentForwardActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentForwardActiveTotal()); + BigDecimal disChargeDiffData = currentDischargeData.subtract( + lastData.getCurrentReverseActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentReverseActiveTotal() + ); + switch (costType) { + case "peak": + // 增加电量 + BigDecimal peakCharge = energyData.getPeakChargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakChargeDiff(); + energyData.setPeakChargeDiff(peakCharge.add(chargeDiffData)); + BigDecimal peakDischarge = energyData.getPeakDischargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakDischargeDiff(); + energyData.setPeakDischargeDiff(peakDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + break; + case "high": + // 增加电量 + BigDecimal highCharge = energyData.getHighChargeDiff() == null ? BigDecimal.ZERO : energyData.getHighChargeDiff(); + energyData.setHighChargeDiff(highCharge.add(chargeDiffData)); + BigDecimal highDischarge = energyData.getHighDischargeDiff() == null ? BigDecimal.ZERO : energyData.getHighDischargeDiff(); + energyData.setHighDischargeDiff(highDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + break; + case "flat": + // 增加电量 + BigDecimal flatCharge = energyData.getFlatChargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatChargeDiff(); + energyData.setFlatChargeDiff(flatCharge.add(chargeDiffData)); + BigDecimal flatDischarge = energyData.getFlatDischargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatDischargeDiff(); + energyData.setFlatDischargeDiff(flatDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + break; + case "valley": + // 增加电量 + BigDecimal valleyCharge = energyData.getValleyChargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyChargeDiff(); + energyData.setValleyChargeDiff(valleyCharge.add(chargeDiffData)); + BigDecimal valleyDischarge = energyData.getValleyDischargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyDischargeDiff(); + energyData.setValleyDischargeDiff(valleyDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + break; + default: + return; + } + + // 计算本次累加收益 + BigDecimal addRevenue = disChargeDiffData.subtract(chargeDiffData).multiply(price); + dayRevenue = dayRevenue.add(addRevenue); + energyData.setDayRevenue(dayRevenue); + // 总收益 = 上次实时总收益+今日实时增加的收益 + totalRevenue = totalRevenue.add(addRevenue); + energyData.setTotalRevenue(totalRevenue); + + // 存redis便于下次取用 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId + "_" + today; + Map realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", totalRevenue); + realTimeRevenue.put("dayRevenue", dayRevenue); + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + + private Map getRealTimeData(String siteId) { + // fx取实时总收益和当天实时收益 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId + "_" + today; + Map realTimeRevenue = redisCache.getCacheObject(redisKey); + if (realTimeRevenue == null) { + // 查数据库 + realTimeRevenue = emsEnergyPriceConfigService.getDayRevenueMap(siteId); + if (realTimeRevenue == null) { + realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", BigDecimal.ZERO); + realTimeRevenue.put("dayRevenue", BigDecimal.ZERO); + } + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + return realTimeRevenue; + } + + private boolean isInPriceTimeRange(String startTime, String endTime, Date dataUpdateTime) { + if (startTime == null || endTime == null || dataUpdateTime == null) { + return false; + } + LocalDateTime time = DateUtils.toLocalDateTime(dataUpdateTime); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + String dataTimeStr = time.format(formatter); + // 比较时间范围 + return dataTimeStr.compareTo(startTime) >= 0 + && dataTimeStr.compareTo(endTime) < 0; + } + + private EmsDailyEnergyData initEnergyData(String siteId) { + // 先获取数据库当天数据,存在则更新时间,不存在则初始化 + EmsDailyEnergyData energyData = emsDailyEnergyDataMapper.getDataByDate(siteId, DateUtils.getDate()); + if (energyData == null) { + energyData = new EmsDailyEnergyData(); + energyData.setSiteId(siteId); + energyData.setDataDate(DateUtils.getNowDate()); + energyData.setCreateBy("system"); + energyData.setCreateTime(DateUtils.getNowDate()); + } + energyData.setUpdateBy("system"); + energyData.setCalcTime(DateUtils.getNowDate()); + return energyData; + } + + // 数据分组处理 + private static Map> processData(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 提取记录ID(最后3位) + String recordId = key.substring(key.length() - 3); + try { + Long.parseLong(recordId); + } catch (Exception e) { + continue; + } + + // 提取字段类型(前缀) + String fieldType = key.substring(0, key.length() - 3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + return records; + } + + private static Map> processDataPrefix(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 确保键长度足够 + if (key.length() < 3) { + continue; + } + + // 提取记录ID(前3位) + String recordId = key.substring(0, 3); + if (!recordId.startsWith("DY")) { + continue; + } + + // 提取字段类型(剩余部分) + String fieldType = key.substring(3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + if (records.isEmpty() && rawData.size() > 0) { + records.put("DY1", rawData); + } + return records; + } + + @Override + public void handleAlarmData(String message, String siteId) { + JSONArray arraylist = JSONArray.parseArray(message); + + // 获取redis缓存-告警信息 + Map alarmMatchInfo = redisCache.getCacheObject(RedisKeyConstants.ALARM_MATCH_INFO); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.getString("Device"); + String jsonData = obj.getString("Data"); + Long timestamp = obj.getLong("timestamp"); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA_ALARM + siteId + "_" + deviceId, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA_ALARM + siteId + "_" + deviceId, obj, 1, TimeUnit.MINUTES); + // 处理设备数据,根据不同设备类型进行不同的数据处理 + String deviceCategory = processingDeviceAlarmData(siteId, deviceId, jsonData, dataUpdateTime); + if (StringUtils.isEmpty(deviceCategory)) { + // 处理告警信息 + alarmDataProcess(siteId, deviceId, jsonData, alarmMatchInfo, deviceCategory); + } + } + } + + public String processingDeviceAlarmData(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // 判断设备类型,并调用对应的方法处理数据 + String deviceCategory = getDeviceCategory(siteId, deviceId); + log.info("alarm siteId: {}, deviceId: {}siteId, category: {} ", siteId, deviceId, deviceCategory); + if (deviceId.contains(SiteDevice.ZSLQ.name()) + || DeviceCategory.COOLING.getCode().equals(deviceCategory)) { + coolingAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.BMSD.name()) + || DeviceCategory.STACK.getCode().equals(deviceCategory)) { + stackAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.BMSC.name()) + || DeviceCategory.CLUSTER.getCode().equals(deviceCategory)) { + clusterAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.PCS.name()) + || DeviceCategory.PCS.getCode().equals(deviceCategory) ) { + pcsAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else { + log.info("未找到匹配的点位数据,无法处理设备告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return null; + } + + return deviceCategory; + } + + private void pcsAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //pcs + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.PCS.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + EmsPcsAlarmData pcsAlarmData = new EmsPcsAlarmData(); + // 更新时间 + pcsAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, pcsAlarmData); + + pcsAlarmData.setCreateBy("system"); + pcsAlarmData.setCreateTime(DateUtils.getNowDate()); + pcsAlarmData.setUpdateBy("system"); + pcsAlarmData.setUpdateTime(DateUtils.getNowDate()); + pcsAlarmData.setSiteId(siteId); + pcsAlarmData.setDeviceId(deviceId); + emsPcsAlarmDataMapper.insertEmsPcsAlarmData(pcsAlarmData); + } + + private void stackAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // bmsd + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.STACK.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池堆告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsStackAlarmData stackAlarmData = new EmsStackAlarmData(); + // 更新时间 + stackAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, stackAlarmData); + + stackAlarmData.setCreateBy("system"); + stackAlarmData.setCreateTime(DateUtils.getNowDate()); + stackAlarmData.setUpdateBy("system"); + stackAlarmData.setUpdateTime(DateUtils.getNowDate()); + stackAlarmData.setSiteId(siteId); + stackAlarmData.setDeviceId(deviceId); + emsStackAlarmDataMapper.insertEmsStackAlarmData(stackAlarmData); + } + + private void clusterAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // bmsc + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池簇告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + EmsClusterAlarmData clusterAlarmData = new EmsClusterAlarmData(); + // 更新时间 + clusterAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, clusterAlarmData); + + clusterAlarmData.setCreateBy("system"); + clusterAlarmData.setCreateTime(DateUtils.getNowDate()); + clusterAlarmData.setUpdateBy("system"); + clusterAlarmData.setUpdateTime(DateUtils.getNowDate()); + clusterAlarmData.setSiteId(siteId); + clusterAlarmData.setDeviceId(deviceId); + emsClusterAlarmDataMapper.insertEmsClusterAlarmData(clusterAlarmData); + } + + private void coolingAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDeviceAlarmPointMatch(siteId, deviceId, DeviceMatchTable.COOLING.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsCoolingAlarmData coolingAlarmData = new EmsCoolingAlarmData(); + // 更新时间 + coolingAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, coolingAlarmData); + + coolingAlarmData.setCreateBy("system"); + coolingAlarmData.setCreateTime(DateUtils.getNowDate()); + coolingAlarmData.setUpdateBy("system"); + coolingAlarmData.setUpdateTime(DateUtils.getNowDate()); + coolingAlarmData.setSiteId(siteId); + coolingAlarmData.setDeviceId(deviceId); + emsCoolingAlarmDataMapper.insertEmsCoolingAlarmData(coolingAlarmData); + } + + private void alarmDataProcess(String siteId, String deviceId, String jsonData, + Map alarmInfoData, String category) { + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + String redisKey = RedisKeyConstants.LATEST_ALARM_RECORD + "_" + siteId + "_" + deviceId; + // 获取redis里面的当前有效告警遍历添加到已存在告警key里面 + Map currentAlarm = redisCache.getCacheMap(redisKey); + final Set currentAlarmKeys = new HashSet<>(); + if (currentAlarm != null && !currentAlarm.isEmpty()) { + currentAlarm.keySet().stream() + .filter(Objects::nonNull) + .map(Object::toString) + .forEach(currentAlarmKeys::add); + } + + // 结合同步数据,筛选簇需要更新的告警信息 + List needUpdateKeys = obj.entrySet().stream() + .filter(entry -> { + Object valueObj = entry.getValue(); + if (valueObj == null) { + return false; + } + int value = Integer.parseInt(valueObj.toString()); + return value == 0 && currentAlarmKeys.contains(entry.getKey()); + }) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 批量查询数据库-需要更新的数据 + Map needUpdateMap = new HashMap<>(); + if (!needUpdateKeys.isEmpty()) { + List records = iEmsAlarmRecordsService.getAllUnfinishedRecords(needUpdateKeys, siteId, deviceId); + // 转为Map便于快速获取 + needUpdateMap = records.stream() + .collect(Collectors.toMap( + EmsAlarmRecords::getAlarmPoint, + record -> record + )); + } + + + List saveOrUpdateList = new ArrayList<>(); + List newAddRecordList = new ArrayList<>(); + List toRemoveFromRedis = new ArrayList<>(); + + // 遍历数据map + for (Map.Entry entry : obj.entrySet()) { + if (entry.getValue() == null) { + continue; + } + String key = entry.getKey(); + Long value = (Long) entry.getValue(); + Boolean isCurrentAlarm = currentAlarmKeys.contains(key); + String matchRedisKey = siteId + "_" + category + "_" + key; + // 默认告警值0是正常,1是异常 + Long alarmData = 1L; + Object cacheObj = alarmInfoData.get(matchRedisKey); + if (cacheObj != null) { + EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class); + alarmData = matchInfo.getAlarmData(); + } + // 处理告警 + if (value.equals(alarmData) && !isCurrentAlarm) { + // 上送值和匹配值相同,新增告警 + EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class); + EmsAlarmRecords emsAlarmRecord = convertAlarmRecord(siteId, deviceId, matchInfo); + saveOrUpdateList.add(emsAlarmRecord); + newAddRecordList.add(emsAlarmRecord); + } else { + if (isCurrentAlarm) { + // 在当前告警里面 - 更新告警已处理 + EmsAlarmRecords existingAlarm = needUpdateMap.get(key); + if (existingAlarm != null) { + existingAlarm.setStatus(AlarmStatus.DONE.getCode()); + existingAlarm.setUpdateTime(new Date()); + existingAlarm.setAlarmEndTime(new Date()); + saveOrUpdateList.add(existingAlarm); + toRemoveFromRedis.add(key); + } + } + } +// // 值为 1且不在当前告警里面 - 新增告警 +// if (value == 1 && !isCurrentAlarm) { +// String matchRedisKey = category + "_" + key; +// Object cacheObj = alarmInfoData.get(matchRedisKey); +// if (cacheObj == null) { +// // 处理空数据逻辑 +// return; +// } +// EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class); +// EmsAlarmRecords emsAlarmRecord = convertAlarmRecord(siteId, deviceId, matchInfo); +// saveOrUpdateList.add(emsAlarmRecord); +// newAddRecordList.add(emsAlarmRecord); +// } else if (value == 0 && isCurrentAlarm) {// 值为 0且在当前告警里面 - 更新告警已处理 +// EmsAlarmRecords existingAlarm = needUpdateMap.get(key); +// if (existingAlarm != null) { +// existingAlarm.setStatus(AlarmStatus.DONE.getCode()); +// existingAlarm.setUpdateTime(new Date()); +// existingAlarm.setAlarmEndTime(new Date()); +// saveOrUpdateList.add(existingAlarm); +// toRemoveFromRedis.add(key); +// } +// } + } + + // 批量处理插入和更新操作 + if (CollectionUtils.isNotEmpty(saveOrUpdateList)) { + iEmsAlarmRecordsService.batchProcessAlarmRecords(saveOrUpdateList); + } + // 已处理的从redis里面删除 + if (!toRemoveFromRedis.isEmpty()) { + redisCache.deleteAllCacheMapValue(RedisKeyConstants.LATEST_ALARM_RECORD + siteId, toRemoveFromRedis.toArray()); + } + // 批量添加新增的告警到Redis + Map newAlarms = newAddRecordList.stream() + .filter(a -> !AlarmStatus.DONE.getCode().equals(a.getStatus())) + .collect(Collectors.toMap(EmsAlarmRecords::getAlarmPoint, a -> a)); + if (!newAlarms.isEmpty()) { + // 本次新增的放入redis + redisCache.setAllCacheMapValue(redisKey, newAlarms); + } + } + + private EmsAlarmRecords convertAlarmRecord(String siteId, String deviceId, EmsAlarmMatchData matchInfo) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + emsAlarmRecords.setSiteId(siteId); + emsAlarmRecords.setDeviceId(deviceId); + emsAlarmRecords.setDeviceType(DeviceType.TCP.toString()); + emsAlarmRecords.setAlarmLevel(AlarmLevelStatus.GENERAL.getCode()); + emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode()); + emsAlarmRecords.setAlarmStartTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateBy("system"); + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + emsAlarmRecords.setUpdateBy("system"); + + if (matchInfo != null) { + emsAlarmRecords.setAlarmPoint(matchInfo.getPoint()); + emsAlarmRecords.setAlarmContent(matchInfo.getAlarmDescription()); + } + return emsAlarmRecords; + } + + @Override + public void processBatch(List batchData) { + super.processBatch(batchData); + } + + // 空数据不处理 + private boolean checkJsonDataEmpty(String jsonData) { + boolean flag = false; + try { + if (StringUtils.isEmpty(jsonData)) { + return true; + } + JsonNode jsonNode = objectMapper.readTree(jsonData); + // 判断是否为空对象({}) + if (jsonNode.isObject() && jsonNode.isEmpty()) { + return true; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return flag; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java new file mode 100644 index 0000000..a679c7e --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java @@ -0,0 +1,371 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.domain.entity.SysUser; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.AlarmLevelStatus; +import com.xzzn.common.enums.AlarmStatus; +import com.xzzn.common.enums.TicketStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmMatchData; +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.domain.EmsTicket; +import com.xzzn.ems.domain.vo.AlarmRecordListRequestVo; +import com.xzzn.ems.domain.vo.AlarmRecordListResponseVo; +import com.xzzn.ems.mapper.EmsAlarmMatchDataMapper; +import com.xzzn.ems.mapper.EmsAlarmRecordsMapper; +import com.xzzn.ems.mapper.EmsTicketMapper; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.system.mapper.SysUserMapper; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 告警记录Service业务层处理 + * + * @author xzzn + * @date 2025-06-29 + */ +@Service +public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService +{ + @Autowired + private EmsAlarmRecordsMapper emsAlarmRecordsMapper; + @Autowired + private EmsTicketMapper emsTicketMapper; + @Autowired + private SysUserMapper sysUserMapper; + @Autowired + private RedisCache redisCache; + + private Map alarmMap = new HashMap() {{ + put("021_DDS_01", "PCS"); + put("021_FXX_01", "PCS01"); + }}; + @Autowired + private EmsAlarmMatchDataMapper emsAlarmMatchDataMapper; + + /** + * 查询告警记录 + * + * @param id 告警记录主键 + * @return 告警记录 + */ + @Override + public EmsAlarmRecords selectEmsAlarmRecordsById(Long id) + { + return emsAlarmRecordsMapper.selectEmsAlarmRecordsById(id); + } + + /** + * 查询告警记录列表 + * + * @param emsAlarmRecords 告警记录 + * @return 告警记录 + */ + @Override + public List selectEmsAlarmRecordsList(EmsAlarmRecords emsAlarmRecords) + { + return emsAlarmRecordsMapper.selectEmsAlarmRecordsList(emsAlarmRecords); + } + + /** + * 新增告警记录 + * + * @param emsAlarmRecords 告警记录 + * @return 结果 + */ + @Override + public int insertEmsAlarmRecords(EmsAlarmRecords emsAlarmRecords) + { + emsAlarmRecords.setCreateTime(DateUtils.getNowDate()); + return emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); + } + + /** + * 修改告警记录 + * + * @param emsAlarmRecords 告警记录 + * @return 结果 + */ + @Override + public int updateEmsAlarmRecords(EmsAlarmRecords emsAlarmRecords) + { + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + return emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + } + + /** + * 批量删除告警记录 + * + * @param ids 需要删除的告警记录主键 + * @return 结果 + */ + @Override + public int deleteEmsAlarmRecordsByIds(Long[] ids) + { + return emsAlarmRecordsMapper.deleteEmsAlarmRecordsByIds(ids); + } + + /** + * 删除告警记录信息 + * + * @param id 告警记录主键 + * @return 结果 + */ + @Override + public int deleteEmsAlarmRecordsById(Long id) + { + return emsAlarmRecordsMapper.deleteEmsAlarmRecordsById(id); + } + + @Override + public List getAlarmRecordDetailList(AlarmRecordListRequestVo requestVo) { + return emsAlarmRecordsMapper.getAlarmRecordDetailList(requestVo); + } + + @Override + public String createTicketNo(Long id, Long userId) { + String ticketNo = ""; + // 校验告警记录是否存在 + EmsAlarmRecords emsAlarmRecords = emsAlarmRecordsMapper.selectEmsAlarmRecordsById(id); + if (emsAlarmRecords == null) { + return "告警记录不存在"; + } + // 工单号是否存在 + if (StringUtils.isNotEmpty(emsAlarmRecords.getTicketNo())) { + return "工单号已存在"; + } + // 随机生成工单:T+日期+6位随机 + ticketNo = createRandomTicketNo(); + // 更新告警表 + emsAlarmRecords.setTicketNo(ticketNo); + emsAlarmRecords.setStatus(AlarmStatus.PROCESSING.getCode()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + // 不存在-默认userId + if (userId == null) { + userId = 1L; + } + SysUser user = sysUserMapper.selectUserById(userId); + // 插入工单表 + EmsTicket emsTicket = new EmsTicket(); + emsTicket.setTicketNo(ticketNo); + emsTicket.setTitle("工单"+id.toString()); + emsTicket.setContent(emsAlarmRecords.getAlarmContent()); + emsTicket.setUserId(userId); + emsTicket.setWorkUserId(userId); + emsTicket.setStatus(Long.valueOf(TicketStatus.WAITING.getCode())); + emsTicket.setCreateTime(DateUtils.getNowDate()); + emsTicket.setCreateBy(user.getUserName()); + emsTicket.setUpdateTime(DateUtils.getNowDate()); + emsTicket.setUpdateBy(user.getUserName()); + emsTicketMapper.insertEmsTicket(emsTicket); + return ticketNo; + } + + // 订阅失败-增加告警 + @Override + public void addSubFailedAlarmRecord(String topic) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + String siteId = ""; + String deviceId = ""; + String content = "topic订阅失败"; + String status = AlarmLevelStatus.EMERGENCY.getCode(); + + if (topic.startsWith("021_DDS")) { + siteId = "021_DDS_01"; + deviceId = alarmMap.get("021_DDS_01"); + } else if (topic.startsWith("021_FXX")) { + siteId = "021_FXX_01"; + deviceId = alarmMap.get("021_FXX_01"); + } + // 先判断是否存在未处理的订阅失败告警 + emsAlarmRecords = redisCache.getCacheObject(RedisKeyConstants.TOPIC_FAILED_ALRAM_RECORD + siteId + "_" + deviceId); + if (emsAlarmRecords != null) { + return; + } + emsAlarmRecords = createAlarmAtPcs(siteId,deviceId,content,status); + emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); + + // 存redis便于订阅成功后处理 + redisCache.setCacheObject(RedisKeyConstants.TOPIC_FAILED_ALRAM_RECORD + siteId + "_" + deviceId, emsAlarmRecords); + } + + @Override + public void checkFailedRecord(String topic) { + String siteId = ""; + String deviceId = ""; + + if (topic.startsWith("021_DDS")) { + siteId = "021_DDS_01"; + deviceId = alarmMap.get("021_DDS_01"); + } else if (topic.startsWith("021_FXX")) { + siteId = "021_FXX_01"; + deviceId = alarmMap.get("021_FXX_01"); + } + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(RedisKeyConstants.TOPIC_FAILED_ALRAM_RECORD + siteId + "_" + deviceId); + if (emsAlarmRecords != null) { + // 存在更新为已处理,并清除redis + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecords.setAlarmEndTime(new Date()); + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + emsAlarmRecords.setUpdateBy("system"); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + } + } + + @Override + public void addEmptyDataAlarmRecord(String siteId, String topicDevice) { + String key = getRedisKeyForTopicEmptyAlarm(siteId, topicDevice); + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key); + if (emsAlarmRecords != null) { + return; + } + emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode()); + emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); + + // 存redis-防止重复插入-有效期一天 + redisCache.setCacheObject(key, emsAlarmRecords,1, TimeUnit.DAYS); + } + + private EmsAlarmRecords createAlarmAtPcs(String siteId, String deviceId,String content,String level) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + emsAlarmRecords.setSiteId(siteId); + emsAlarmRecords.setDeviceId(deviceId); + emsAlarmRecords.setAlarmContent(content); + emsAlarmRecords.setAlarmLevel(level); + emsAlarmRecords.setAlarmStartTime(new Date()); + emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode()); + emsAlarmRecords.setDeviceType("TCP"); + emsAlarmRecords.setCreateBy("system"); + emsAlarmRecords.setCreateTime(new Date()); + return emsAlarmRecords; + } + + @Override + public void deleteEmptyDataAlarmRecord(String siteId, String topicDevice) { + String key = getRedisKeyForTopicEmptyAlarm(siteId, topicDevice); + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key); + if (emsAlarmRecords == null) { + return; + } + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecords.setUpdateTime(new Date()); + emsAlarmRecords.setAlarmEndTime(new Date()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + + redisCache.deleteObject(key); + } + + private String createRandomTicketNo() { + String ticketNo = ""; + String nowDate = DateUtils.dateTime(); + ticketNo = "T" + nowDate + String.format("%06d", new Random().nextInt(1000000)); + return ticketNo; + } + + + @Override + public void initAlarmMatchInfo() { + List alarmPointList = emsAlarmMatchDataMapper.selectEmsAlarmMatchDataList(null); + Map resultMap = alarmPointList.stream() + .collect(Collectors.toMap( + data->data.getSiteId()+"_"+data.getDeviceCategory()+"_"+data.getPoint(), + data->data, + (existing, replacement) -> replacement + )); + // 存redis + redisCache.setCacheObject(RedisKeyConstants.ALARM_MATCH_INFO,resultMap, 1, TimeUnit.DAYS); + } + + @Override + public List getAllUnfinishedRecords(List needUpdateKeys, String siteId, String deviceId) { + return emsAlarmRecordsMapper.getAllUnfinishedRecords(needUpdateKeys,siteId,deviceId); + } + + @Override + public void batchProcessAlarmRecords(List recordsList) { + emsAlarmRecordsMapper.batchUpsert(recordsList); + } + + @Override + public void updateRedisAlarmRecords(String siteId, String deviceId) { + if (StringUtils.isEmpty(siteId) || StringUtils.isEmpty(deviceId)) { + return; + } + String redisKey = RedisKeyConstants.LATEST_ALARM_RECORD + "_" + siteId +"_" + deviceId; + List allDeviceRecords = emsAlarmRecordsMapper.getNeedPutRedisAlarm(siteId,deviceId); + // 转Map + Map newAlarms = allDeviceRecords.stream() + .filter(a -> !AlarmStatus.DONE.getCode().equals(a.getStatus())) + .collect(Collectors.toMap(EmsAlarmRecords::getAlarmPoint, a -> a)); + redisCache.setAllCacheMapValue(redisKey, newAlarms); + } + + @Override + public void dealSyncData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + + EmsAlarmRecords alarmRecords = JSON.parseObject(content, EmsAlarmRecords.class); + switch(operateType) { + case "INSERT": + insertEmsAlarmRecords(alarmRecords); + break; + default: + break; + } + } + + @Override + public void addDeviceOfflineRecord(String siteId, String deviceId) { + String key = getRedisKeyForModbusFailAlarm(siteId, deviceId); + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key); + if (emsAlarmRecords != null) { + return; + } + emsAlarmRecords = createAlarmAtPcs(siteId, deviceId,"modbus连接设备失败", AlarmLevelStatus.GENERAL.getCode()); + emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); + + // 存redis-防止重复插入-有效期一天 + redisCache.setCacheObject(key, emsAlarmRecords,1, TimeUnit.DAYS); + } + + @Override + public void deleteDeviceOfflineRecord(String siteId, String deviceId) { + String key = getRedisKeyForModbusFailAlarm(siteId, deviceId); + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key); + if (emsAlarmRecords == null) { + return; + } + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecords.setUpdateTime(new Date()); + emsAlarmRecords.setAlarmEndTime(new Date()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + + redisCache.deleteObject(key); + } + + private String getRedisKeyForTopicEmptyAlarm(String siteId, String topicDevice) { + + return RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice; + } + + private String getRedisKeyForModbusFailAlarm(String siteId, String deviceId) { + + return RedisKeyConstants.MODBUS_OFFLINE_ALARM_RECORD + siteId + "_" + deviceId; + } + +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryClusterServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryClusterServiceImpl.java new file mode 100644 index 0000000..d1f6b8f --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryClusterServiceImpl.java @@ -0,0 +1,96 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.domain.EmsBatteryCluster; +import com.xzzn.ems.service.IEmsBatteryClusterService; + +/** + * 电池簇数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-29 + */ +@Service +public class EmsBatteryClusterServiceImpl implements IEmsBatteryClusterService +{ + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + + /** + * 查询电池簇数据 + * + * @param id 电池簇数据主键 + * @return 电池簇数据 + */ + @Override + public EmsBatteryCluster selectEmsBatteryClusterById(Long id) + { + return emsBatteryClusterMapper.selectEmsBatteryClusterById(id); + } + + /** + * 查询电池簇数据列表 + * + * @param emsBatteryCluster 电池簇数据 + * @return 电池簇数据 + */ + @Override + public List selectEmsBatteryClusterList(EmsBatteryCluster emsBatteryCluster) + { + return emsBatteryClusterMapper.selectEmsBatteryClusterList(emsBatteryCluster); + } + + /** + * 新增电池簇数据 + * + * @param emsBatteryCluster 电池簇数据 + * @return 结果 + */ + @Override + public int insertEmsBatteryCluster(EmsBatteryCluster emsBatteryCluster) + { + emsBatteryCluster.setCreateTime(DateUtils.getNowDate()); + return emsBatteryClusterMapper.insertEmsBatteryCluster(emsBatteryCluster); + } + + /** + * 修改电池簇数据 + * + * @param emsBatteryCluster 电池簇数据 + * @return 结果 + */ + @Override + public int updateEmsBatteryCluster(EmsBatteryCluster emsBatteryCluster) + { + emsBatteryCluster.setUpdateTime(DateUtils.getNowDate()); + return emsBatteryClusterMapper.updateEmsBatteryCluster(emsBatteryCluster); + } + + /** + * 批量删除电池簇数据 + * + * @param ids 需要删除的电池簇数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryClusterByIds(Long[] ids) + { + return emsBatteryClusterMapper.deleteEmsBatteryClusterByIds(ids); + } + + /** + * 删除电池簇数据信息 + * + * @param id 电池簇数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryClusterById(Long id) + { + return emsBatteryClusterMapper.deleteEmsBatteryClusterById(id); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDailyLatestServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDailyLatestServiceImpl.java new file mode 100644 index 0000000..fed6827 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDailyLatestServiceImpl.java @@ -0,0 +1,105 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.xzzn.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsBatteryDailyLatestMapper; +import com.xzzn.ems.domain.EmsBatteryDataDailyLatest; +import com.xzzn.ems.service.IEmsBatteryDailyLatestService; +import org.springframework.transaction.annotation.Transactional; + +/** + * 单体电池每日最新数据Service业务层处理 + * + * @author xzzn + * @date 2025-07-18 + */ +@Service +public class EmsBatteryDailyLatestServiceImpl implements IEmsBatteryDailyLatestService +{ + @Autowired + private EmsBatteryDailyLatestMapper emsBatteryDataDailyLatestMapper; + + /** + * 查询单体电池每日最新数据 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 单体电池每日最新数据 + */ + @Override + public EmsBatteryDataDailyLatest selectEmsBatteryDataDailyLatestByBatteryPack(String batteryPack) + { + return emsBatteryDataDailyLatestMapper.selectEmsBatteryDataDailyLatestByBatteryPack(batteryPack); + } + + /** + * 查询单体电池每日最新数据列表 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 单体电池每日最新数据 + */ + @Override + public List selectEmsBatteryDataDailyLatestList(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest) + { + return emsBatteryDataDailyLatestMapper.selectEmsBatteryDataDailyLatestList(emsBatteryDataDailyLatest); + } + + /** + * 新增单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + @Override + public int insertEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest) + { + emsBatteryDataDailyLatest.setCreateTime(DateUtils.getNowDate()); + return emsBatteryDataDailyLatestMapper.insertEmsBatteryDataDailyLatest(emsBatteryDataDailyLatest); + } + + /** + * 修改单体电池每日最新数据 + * + * @param emsBatteryDataDailyLatest 单体电池每日最新数据 + * @return 结果 + */ + @Override + public int updateEmsBatteryDataDailyLatest(EmsBatteryDataDailyLatest emsBatteryDataDailyLatest) + { + emsBatteryDataDailyLatest.setUpdateTime(DateUtils.getNowDate()); + return emsBatteryDataDailyLatestMapper.updateEmsBatteryDataDailyLatest(emsBatteryDataDailyLatest); + } + + /** + * 批量删除单体电池每日最新数据 + * + * @param batteryPacks 需要删除的单体电池每日最新数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryDataDailyLatestByBatteryPacks(String[] batteryPacks) + { + return emsBatteryDataDailyLatestMapper.deleteEmsBatteryDataDailyLatestByBatteryPacks(batteryPacks); + } + + /** + * 删除单体电池每日最新数据信息 + * + * @param batteryPack 单体电池每日最新数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryDataDailyLatestByBatteryPack(String batteryPack) + { + return emsBatteryDataDailyLatestMapper.deleteEmsBatteryDataDailyLatestByBatteryPack(batteryPack); + } + + @Override + @Transactional + public void batchProcessBatteryData(List dailyList) { + // 批量更新每日最新数据表(使用 ON DUPLICATE KEY UPDATE) + emsBatteryDataDailyLatestMapper.batchUpsert(dailyList); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDataServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDataServiceImpl.java new file mode 100644 index 0000000..70e0b16 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryDataServiceImpl.java @@ -0,0 +1,104 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.mapper.EmsBatteryDataMapper; +import com.xzzn.ems.service.IEmsBatteryDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 单体电池实时数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-27 + */ +@Service +public class EmsBatteryDataServiceImpl implements IEmsBatteryDataService +{ + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + + /** + * 查询单体电池实时数据 + * + * @param id 单体电池实时数据主键 + * @return 单体电池实时数据 + */ + @Override + public EmsBatteryData selectEmsBatteryDataById(Long id) + { + return emsBatteryDataMapper.selectEmsBatteryDataById(id); + } + + /** + * 查询单体电池实时数据列表 + * + * @param emsBatteryData 单体电池实时数据 + * @return 单体电池实时数据 + */ + @Override + public List selectEmsBatteryDataList(EmsBatteryData emsBatteryData) + { + return emsBatteryDataMapper.selectEmsBatteryDataList(emsBatteryData); + } + + /** + * 新增单体电池实时数据 + * + * @param emsBatteryData 单体电池实时数据 + * @return 结果 + */ + @Override + public int insertEmsBatteryData(EmsBatteryData emsBatteryData) + { + emsBatteryData.setCreateTime(DateUtils.getNowDate()); + return emsBatteryDataMapper.insertEmsBatteryData(emsBatteryData); + } + + /** + * 修改单体电池实时数据 + * + * @param emsBatteryData 单体电池实时数据 + * @return 结果 + */ + @Override + public int updateEmsBatteryData(EmsBatteryData emsBatteryData) + { + emsBatteryData.setUpdateTime(DateUtils.getNowDate()); + return emsBatteryDataMapper.updateEmsBatteryData(emsBatteryData); + } + + /** + * 批量删除单体电池实时数据 + * + * @param ids 需要删除的单体电池实时数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryDataByIds(Long[] ids) + { + return emsBatteryDataMapper.deleteEmsBatteryDataByIds(ids); + } + + /** + * 删除单体电池实时数据信息 + * + * @param id 单体电池实时数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryDataById(Long id) + { + return emsBatteryDataMapper.deleteEmsBatteryDataById(id); + } + + @Override + public int insertEmsBatteryDataList(List emsBatteryDataList) { + for (EmsBatteryData data : emsBatteryDataList) { + data.setCreateTime(DateUtils.getNowDate()); + } + return emsBatteryDataMapper.insertEmsBatteryDataList(emsBatteryDataList); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryStackServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryStackServiceImpl.java new file mode 100644 index 0000000..f1b52bc --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsBatteryStackServiceImpl.java @@ -0,0 +1,96 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.service.IEmsBatteryStackService; + +/** + * 电池堆数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-29 + */ +@Service +public class EmsBatteryStackServiceImpl implements IEmsBatteryStackService +{ + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + + /** + * 查询电池堆数据 + * + * @param id 电池堆数据主键 + * @return 电池堆数据 + */ + @Override + public EmsBatteryStack selectEmsBatteryStackById(Long id) + { + return emsBatteryStackMapper.selectEmsBatteryStackById(id); + } + + /** + * 查询电池堆数据列表 + * + * @param emsBatteryStack 电池堆数据 + * @return 电池堆数据 + */ + @Override + public List selectEmsBatteryStackList(EmsBatteryStack emsBatteryStack) + { + return emsBatteryStackMapper.selectEmsBatteryStackList(emsBatteryStack); + } + + /** + * 新增电池堆数据 + * + * @param emsBatteryStack 电池堆数据 + * @return 结果 + */ + @Override + public int insertEmsBatteryStack(EmsBatteryStack emsBatteryStack) + { + emsBatteryStack.setCreateTime(DateUtils.getNowDate()); + return emsBatteryStackMapper.insertEmsBatteryStack(emsBatteryStack); + } + + /** + * 修改电池堆数据 + * + * @param emsBatteryStack 电池堆数据 + * @return 结果 + */ + @Override + public int updateEmsBatteryStack(EmsBatteryStack emsBatteryStack) + { + emsBatteryStack.setUpdateTime(DateUtils.getNowDate()); + return emsBatteryStackMapper.updateEmsBatteryStack(emsBatteryStack); + } + + /** + * 批量删除电池堆数据 + * + * @param ids 需要删除的电池堆数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryStackByIds(Long[] ids) + { + return emsBatteryStackMapper.deleteEmsBatteryStackByIds(ids); + } + + /** + * 删除电池堆数据信息 + * + * @param id 电池堆数据主键 + * @return 结果 + */ + @Override + public int deleteEmsBatteryStackById(Long id) + { + return emsBatteryStackMapper.deleteEmsBatteryStackById(id); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceChangeLogServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceChangeLogServiceImpl.java new file mode 100644 index 0000000..87354e6 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceChangeLogServiceImpl.java @@ -0,0 +1,128 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsFaultIssueLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsDeviceChangeLogMapper; +import com.xzzn.ems.domain.EmsDeviceChangeLog; +import com.xzzn.ems.service.IEmsDeviceChangeLogService; + +/** + * 设备状态变更记录Service业务层处理 + * + * @author xzzn + * @date 2025-11-15 + */ +@Service +public class EmsDeviceChangeLogServiceImpl implements IEmsDeviceChangeLogService +{ + @Autowired + private EmsDeviceChangeLogMapper emsDeviceChangeLogMapper; + + /** + * 查询设备状态变更记录 + * + * @param id 设备状态变更记录主键 + * @return 设备状态变更记录 + */ + @Override + public EmsDeviceChangeLog selectEmsDeviceChangeLogById(Long id) + { + return emsDeviceChangeLogMapper.selectEmsDeviceChangeLogById(id); + } + + /** + * 查询设备状态变更记录列表 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 设备状态变更记录 + */ + @Override + public List selectEmsDeviceChangeLogList(EmsDeviceChangeLog emsDeviceChangeLog) + { + return emsDeviceChangeLogMapper.selectEmsDeviceChangeLogList(emsDeviceChangeLog); + } + + /** + * 新增设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + @Override + public int insertEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog) + { + emsDeviceChangeLog.setCreateTime(DateUtils.getNowDate()); + return emsDeviceChangeLogMapper.insertEmsDeviceChangeLog(emsDeviceChangeLog); + } + + /** + * 修改设备状态变更记录 + * + * @param emsDeviceChangeLog 设备状态变更记录 + * @return 结果 + */ + @Override + public int updateEmsDeviceChangeLog(EmsDeviceChangeLog emsDeviceChangeLog) + { + emsDeviceChangeLog.setUpdateTime(DateUtils.getNowDate()); + return emsDeviceChangeLogMapper.updateEmsDeviceChangeLog(emsDeviceChangeLog); + } + + /** + * 批量删除设备状态变更记录 + * + * @param ids 需要删除的设备状态变更记录主键 + * @return 结果 + */ + @Override + public int deleteEmsDeviceChangeLogByIds(Long[] ids) + { + return emsDeviceChangeLogMapper.deleteEmsDeviceChangeLogByIds(ids); + } + + /** + * 删除设备状态变更记录信息 + * + * @param id 设备状态变更记录主键 + * @return 结果 + */ + @Override + public int deleteEmsDeviceChangeLogById(Long id) + { + return emsDeviceChangeLogMapper.deleteEmsDeviceChangeLogById(id); + } + + @Override + public void dealSyncData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + + EmsDeviceChangeLog changeLog = JSON.parseObject(content, EmsDeviceChangeLog.class); + String logId = changeLog.getLogId(); + if (checkLogIsExist(logId)) { + return; + } + switch(operateType) { + case "INSERT": + insertEmsDeviceChangeLog(changeLog); + break; + default: + break; + } + } + + private boolean checkLogIsExist(String logId) { + EmsDeviceChangeLog changeLog = emsDeviceChangeLogMapper.selectDeviceChangeLogByLogId(logId); + if (changeLog != null) { + return true; + } + return false; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java new file mode 100644 index 0000000..b9f1ab0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java @@ -0,0 +1,631 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.modbus.ModbusProcessor; +import com.xzzn.common.core.modbus.domain.DeviceConfig; +import com.xzzn.common.core.modbus.domain.WriteTagConfig; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.DeviceType; +import com.xzzn.common.enums.PointType; +import com.xzzn.common.enums.WorkStatus; +import com.xzzn.common.exception.ServiceException; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsPcsSetting; +import com.xzzn.ems.domain.vo.DeviceUpdateRequest; +import com.xzzn.ems.domain.vo.DevicesSettingVo; +import com.xzzn.ems.domain.vo.PointDataRequest; +import com.xzzn.ems.domain.vo.PointQueryResponse; +import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsPcsSettingMapper; +import com.xzzn.ems.mapper.EmsPointMatchMapper; +import com.xzzn.ems.service.IEmsDeviceSettingService; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 站点信息 服务层实现 + * + */ +@Service +public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService +{ + private static final Logger log = LoggerFactory.getLogger(EmsDeviceSettingServiceImpl.class); + + private static final String DDS_SITE_ID = "021_DDS_01"; + @Autowired + private EmsDevicesSettingMapper emsDevicesMapper; + @Autowired + private EmsPointMatchMapper emsPointMatchMapper; + @Autowired + private EmsPcsSettingMapper emsPcsSettingMapper; + @Autowired + private RedisCache redisCache; + @Autowired + private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper; + @Autowired + private EmsBatteryClusterServiceImpl emsBatteryClusterServiceImpl; + @Autowired + private ModbusProcessor modbusProcessor; + + /** + * 获取设备详细信息 + * @param id + * @return + */ + @Override + public DevicesSettingVo getDeviceDetailInfo(Long id) { + EmsDevicesSetting emsDevicesSetting = emsDevicesMapper.selectEmsDevicesSettingById(id); + DevicesSettingVo devicesSettingVo = new DevicesSettingVo(); + BeanUtils.copyProperties(emsDevicesSetting, devicesSettingVo); + EmsPcsSetting pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(id); + if (pcsSetting != null) { + devicesSettingVo.setPcsSetting(pcsSetting); + } + return devicesSettingVo; + } + + /** + * 新增设备 + * @param devicesSetting + * @return + */ + @Override + public int addDevice(DevicesSettingVo devicesSetting) { + boolean flag = checkDeviceExist(devicesSetting); + if (flag) { + return -1; + } + devicesSetting.setCreateTime(DateUtils.getNowDate()); + int result = emsDevicesMapper.insertEmsDevicesSetting(devicesSetting); + EmsPcsSetting pcsSetting = devicesSetting.getPcsSetting(); + if (pcsSetting != null) { + pcsSetting.setDeviceSettingId(devicesSetting.getId()); + emsPcsSettingMapper.insertEmsPcsSetting(pcsSetting); + } + return result; + } + + /** + * 更新设备 + * @param devicesSetting + * @return + */ + @Override + public int updateDevice(DevicesSettingVo devicesSetting) { + boolean checkExist = false; + if (devicesSetting.getId() != null) { + // 根据id判断该数据是否存在 + EmsDevicesSetting existDevice = emsDevicesMapper.selectEmsDevicesSettingById(devicesSetting.getId()); + if (existDevice == null) { + return -1; + } + // 存在判断是否修改deviceId和siteId + String deviceId = existDevice.getDeviceId(); + String siteId = existDevice.getSiteId(); + if (!deviceId.equals(devicesSetting.getDeviceId()) + || !siteId.equals(devicesSetting.getSiteId())) { + checkExist = checkDeviceExist(devicesSetting); + } + } + // 已修改校验修改后数据是否存在 + if (checkExist) { + return -2; + } + devicesSetting.setUpdateTime(DateUtils.getNowDate()); + EmsPcsSetting pcsSetting = devicesSetting.getPcsSetting(); + if (pcsSetting != null) { + if (pcsSetting.getDeviceSettingId() == null) { + pcsSetting.setDeviceSettingId(devicesSetting.getId()); + emsPcsSettingMapper.insertEmsPcsSetting(pcsSetting); + } else { + pcsSetting.setUpdateTime(DateUtils.getNowDate()); + emsPcsSettingMapper.updateByDeviceSettingId(pcsSetting); + } + } + return emsDevicesMapper.updateEmsDevicesSetting(devicesSetting); + } + + private boolean checkDeviceExist(DevicesSettingVo devicesSetting) { + String deviceId = devicesSetting.getDeviceId(); + String siteId = devicesSetting.getSiteId(); + if (!StringUtils.isEmpty(deviceId) && !StringUtils.isEmpty(siteId)) { + EmsDevicesSetting emsDevicesSetting = emsDevicesMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + if (emsDevicesSetting != null) { + return true; + } + } + return false; + } + + /** + * 删除设备配置信息 + * + * @param id Modbus设备配置主键 + * @return 结果 + */ + @Override + public int deleteEmsDevicesSettingById(Long id){ + + return emsDevicesMapper.deleteEmsDevicesSettingById(id); + } + + @Override + public List getDeviceCategory() { + List deviceList = Arrays.asList(DeviceCategory.values()); + return deviceList; + } + + @Override + public List getSingleSiteDevicePoints(PointDataRequest request) { + String siteId = request.getSiteId(); + String deviceId = request.getDeviceId(); + String deviceCategory = request.getDeviceCategory(); + + List response = new ArrayList<>(); + + String dataPointName = request.getDataPointName(); + String dataPoint = request.getDataPoint(); + String parentDeviceId = request.getParentId(); + String ipAddress = request.getIpAddress(); + Integer ipPort = request.getIpPort(); + log.info("处理点位清单,deviceCategory:"+ deviceCategory); + log.info("处理点位清单,deviceId:"+ deviceId); + log.info("处理点位清单,parentDeviceId:"+ parentDeviceId); + + Integer isAlarm = request.getIsAlarm() == null ? PointType.NO.getCode() : request.getIsAlarm(); + // 电动所的电池簇特殊处理-来源pcs+bmsd + if (siteId.equals(DDS_SITE_ID) && DeviceCategory.CLUSTER.getCode().equals(deviceCategory)) { + response = specialDealWithDDSCluster(siteId,deviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); + } else if (DeviceCategory.BATTERY.getCode().equals(deviceCategory)) { + log.info("单体电池处理,parentdeviceId:"+ parentDeviceId); + response = specialDealWithBattery(siteId,deviceId,deviceCategory, + dataPointName,dataPoint,parentDeviceId,ipAddress,ipPort,isAlarm); + } else { + log.info("处理点位清单,ELSE"); + + response = emsPointMatchMapper.getSingleSiteDevicePoints( + siteId,deviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); + String redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA; + if (PointType.YES.getCode().equals(isAlarm)) { + redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA_ALARM; + } + // 从redis取最新数据 + JSONObject mqttJson = redisCache.getCacheObject(redisDataKey + siteId + "_" + deviceId); + if(mqttJson == null){ + return response; + } + String deviceFromMqtt = mqttJson.get("Device").toString(); + String jsonData = mqttJson.get("Data").toString(); + Long updateTime = mqttJson.getLong("timestamp"); + Date latestUpdateTime = DateUtils.convertUpdateTime(updateTime); + if (StringUtils.isEmpty(jsonData) || !deviceId.equals(deviceFromMqtt)) { + return response; + } + + Map obj = JSON.parseObject(jsonData, new TypeReference>() {}); + for (PointQueryResponse pointInfo : response) { + String dataKey = pointInfo.getDataPoint(); + int isNeedDeviceId = pointInfo.getIsNeedDeviceId(); + if (isNeedDeviceId == 1) {// 需要根据deviceId拼接point + dataKey = deviceId + dataKey; + pointInfo.setDataPoint(dataKey); + } + pointInfo.setPointValue(obj.get(dataKey)); + pointInfo.setUpdateTime(latestUpdateTime); + } + } + + if (response == null || response.isEmpty()) { + return response; + } + BigDecimal lowerBound = request.getLower(); + BigDecimal upperBound = request.getUpper(); + // 数据反向筛选 + if (lowerBound != null || upperBound != null) { + response = response.stream() .filter(point -> { + Object dataValue = point.getPointValue(); + if (dataValue == null) { + return false; + } + // 转换为BigDecimal进行精确比较(避免double精度损失) + BigDecimal value = parseToBigDecimal(dataValue); + if (value == null) { + return false; + } + // 比较:使用BigDecimal的compareTo方法 + boolean meetLower = (lowerBound == null) || (value.compareTo(lowerBound) >= 0); + boolean meetUpper = (upperBound == null) || (value.compareTo(upperBound) <= 0); + return meetLower && meetUpper; + }).collect(Collectors.toList()); + } + + // 确保赋值后不会被修改 + final List resultResponse = response; + + // 根据排序字段和排序方式进行排序 + Comparator comparator; + String sortData = request.getSortData(); + if ("pointValue".equals(sortData)) {// 按pointValue排序 + comparator = Comparator.comparing( + PointQueryResponse::getPointValue, + EmsDeviceSettingServiceImpl::compareMultiType); + } else {// 默认按updateTime排序 + comparator = Comparator.comparing(PointQueryResponse::getUpdateTime, + Comparator.nullsLast(Comparator.naturalOrder())); + } + // 排序方式 + String sortMethod = request.getSortMethod(); + boolean isAsc = sortMethod == null || sortMethod.isEmpty() || "asc".equals(sortMethod); + Comparator finalComparator = Comparator.comparing( + PointQueryResponse::getPointValue, // 用于判断null的字段 + (v1, v2) -> { // 核心逻辑:null值始终返回1(排在后面) + if (v1 == v2) return 0; + if (v1 == null) return 1; + if (v2 == null) return -1; + + // 获取实际比较对象 + PointQueryResponse p1 = findByValue(resultResponse, v1); + PointQueryResponse p2 = findByValue(resultResponse, v2); + + // 确保比较对象不为null + if (p1 == null && p2 == null) return 0; + if (p1 == null) return 1; + if (p2 == null) return -1; + + // 非null值使用基础比较器逻辑 + return isAsc ? + comparator.compare(p1, p2) : + comparator.reversed().compare(p1, p2); + } + ); + return resultResponse.stream() + .sorted(finalComparator) + .collect(Collectors.toList()); + } + + private List specialDealWithBattery(String siteId, String deviceId, String deviceCategory, + String dataPointName, String dataPoint, String parentDeviceId, + String ipAddress, Integer ipPort, Integer isAlarm) { + List response = emsPointMatchMapper.getSingleSiteDevicePoints(siteId,deviceId,deviceCategory, + dataPointName,dataPoint,ipAddress,ipPort,isAlarm); + + // 获取redis同步最新数据 + JSONObject jsonObject = new JSONObject(); + String redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA; + if (PointType.YES.getCode().equals(isAlarm)) { + redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA_ALARM; + } + //TODO 单体电池数据统一有 BMSC 提供 +// if (SiteEnum.DDS.getCode().equals(siteId)) { +// // dds单体电池数据来源于BMSD +// EmsDevicesSetting clusterDevice = emsDevicesMapper.getDeviceBySiteAndDeviceId(parentDeviceId,siteId); +// String bmsdDeviceId = clusterDevice == null ? "" :clusterDevice.getParentId(); +// if (StringUtils.isEmpty(bmsdDeviceId)) { +// return response; +// } +// jsonObject = redisCache.getCacheObject(redisDataKey + siteId + "_" + bmsdDeviceId); +// } else if (SiteEnum.FX.getCode().equals(siteId)) { + // fx单体电池数据来源于父类簇BMSC + jsonObject = redisCache.getCacheObject(redisDataKey + siteId + "_" + parentDeviceId); +// } + log.info("点位 key:"+redisDataKey+ ",点位数据:"+jsonObject); + if (jsonObject != null) { + // 填充数据 + fillBatteryData(jsonObject,siteId, deviceId, response); + } + return response; + } + + private void fillBatteryData(JSONObject jsonObject, String siteId, String deviceId, List response) { + String jsonData = jsonObject.get("Data").toString(); + if (StringUtils.isEmpty(jsonData)) { + return; + } + //TODO deviceId 获取前三位 + String xdeviceId = ""; + if (deviceId != null && deviceId.length()>3) { + xdeviceId = deviceId.substring(0, 3); + } + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + log.info("单体电池的点位数据组合 obj:"+JSON.toJSONString(obj)); + Long updateTime = Long.valueOf(jsonObject.get("timestamp").toString()); + Date dataUpdateTime = DateUtils.convertUpdateTime(updateTime); + // 遍历点位数据,设最新值 + for (PointQueryResponse pointInfo : response) { + String dataKey = ""; + //TODO 统一处理单体电池逻辑 +// if (SiteEnum.DDS.getCode().equals(siteId)) { +// dataKey = "DTDC" + xdeviceId + pointInfo.getDataPoint(); +// log.info("单体电池的点位数据组合 dataKey:"+dataKey); +// } else if (SiteEnum.FX.getCode().equals(siteId)) { +// dataKey = pointInfo.getDataPoint(); + log.info("单体电池的点位数据组合 dataKey:"+dataKey); +// } + pointInfo.setPointValue(obj.get(pointInfo.getDataPoint())); + pointInfo.setUpdateTime(dataUpdateTime); + } + } + + @Override + public List getSiteAllDeviceCategory(String siteId) { + return emsDevicesMapper.getAllDeviceCategoryBySiteId(siteId); + } + + // 辅助方法:根据值查找对应的对象(用于比较器中获取完整对象) + private PointQueryResponse findByValue(List list, Object value) { + return list.stream() + .filter(p -> { + Object val = p.getPointValue(); + return Objects.equals(val, value); + }) + .findFirst() + .orElse(null); + } + // Object转BigDecimal(支持多种类型) + private BigDecimal parseToBigDecimal(Object dataValue) { + if (dataValue instanceof BigDecimal) { + return (BigDecimal) dataValue; + } else if (dataValue instanceof Number) { + return new BigDecimal(((Number) dataValue).toString()); + } else if (dataValue instanceof String) { + try { + return new BigDecimal((String) dataValue); + } catch (NumberFormatException e) { + return null; + } + } else { + return null; + } + } + + // 对于dds的电池簇点位最新数据获取特殊处理 + private List specialDealWithDDSCluster(String siteId, String deviceId, String deviceCategory, + String dataPointName, String dataPoint, String ipAddress, + Integer ipPort, Integer isAlarm) { + + // 替换为对应的父类id + String bmsdDeviceId = deviceId.replace("BMSC","BMSD"); + List response = emsPointMatchMapper + .getClusterDevicePoints(siteId,deviceId,bmsdDeviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); + + + JSONObject mergedData = new JSONObject(); + String redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA; + if (PointType.YES.getCode().equals(isAlarm)) { + redisDataKey = RedisKeyConstants.ORIGINAL_MQTT_DATA_ALARM; + } + + // 数据来源pcs + JSONObject pcsJson = redisCache.getCacheObject(redisDataKey + siteId + "_PCS"); + if (pcsJson != null) { + JSONObject data = pcsJson.getJSONObject("Data"); + mergedData.putAll(data); + } + // 根据deviceId获取父类bmsd + JSONObject bmsdJson = redisCache.getCacheObject(redisDataKey + siteId + "_" + bmsdDeviceId); + if (bmsdJson != null) { + JSONObject data = bmsdJson.getJSONObject("Data"); + mergedData.putAll(data); + } + + String jsonData = mergedData.toString(); + Map obj = JSON.parseObject(jsonData, new TypeReference>() {}); + for (PointQueryResponse pointInfo : response) { + String dataKey = pointInfo.getDataPoint(); + Long updateTime = Long.valueOf(bmsdJson.get("timestamp").toString()); + if ("PCS".equals(pointInfo.getDataDevice())) { + updateTime = Long.valueOf(pcsJson.get("timestamp").toString()); + } + pointInfo.setDataPoint(dataKey); + pointInfo.setPointValue(obj.get(dataKey)); + Date latestUpdateTime = convertUpdateTime(updateTime); + pointInfo.setUpdateTime(latestUpdateTime); + } + return response; + } + + private Date convertUpdateTime(Long updateTime) { + if (updateTime == null) { + return null; + } + + // 兼容10位(秒级)和13位(毫秒级) + int length = String.valueOf(updateTime).length(); + if (length == 10) { // 10位秒级 -> 转换为毫秒级 + updateTime *= 1000; + } else if (length != 13) { // 既不是10位也不是13位,视为非法 + System.err.println("时间戳格式错误,必须是10位(秒)或13位(毫秒)"); + return null; + } + + // 3. 转换为Date + return new Date(updateTime); + } + /** + * 自定义多类型比较器,支持BigDecimal、Integer、String等类型比较 + */ + private static int compareMultiType(Object o1, Object o2) { + // 统一转换为Comparable进行比较 + try { + // 对于数字类型(BigDecimal、Integer等) + if (o1 instanceof Number && o2 instanceof Number) { + Number numObj1 = (Number) o1; + Number numObj2 = (Number) o2; + + BigDecimal num1 = toBigDecimal(numObj1); + BigDecimal num2 = toBigDecimal(numObj2); + return num1.compareTo(num2); + } + + // 对于字符串类型 + if (o1 instanceof String && o2 instanceof String) { + String str1 = (String) o1; + String str2 = (String) o2; + + if (isNumericString(str1) && isNumericString(str2)) { + return new BigDecimal(str1).compareTo(new BigDecimal(str2)); + } + return str1.compareTo(str2); + } + + // 其他类型默认按toString比较 + return o1.toString().compareTo(o2.toString()); + + } catch (Exception e) { + // 比较失败时按toString兜底 + return o1.toString().compareTo(o2.toString()); + } + } + + /** + * 将Number类型转换为BigDecimal + */ + private static BigDecimal toBigDecimal(Number number) { + if (number instanceof BigDecimal) { + return (BigDecimal) number; + } + return new BigDecimal(number.toString()); + } + + /** + * 判断字符串是否为数字格式 + */ + private static boolean isNumericString(String str) { + if (str == null || str.isEmpty()) { + return false; + } + try { + new BigDecimal(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + @Override + public Map> initDeviceInfo() { + List settingList = emsDevicesMapper.selectEmsDevicesSettingList(null); + // 按siteId分组 + Map> map = settingList.stream() + .collect(Collectors.groupingBy( + EmsDevicesSetting::getSiteId, + HashMap::new, + Collectors.toList() + )); + // 存redis + redisCache.setCacheObject(RedisKeyConstants.INIT_DEVICE_INFO, map, 30, TimeUnit.DAYS); + return map; + } + + @Override + public List> getDeviceListBySiteAndCategory(String siteId, String deviceCategory) { + return emsDevicesMapper.getDeviceInfosBySiteIdAndCategory(siteId, deviceCategory); + } + + @Override + public boolean updateDeviceStatus(DeviceUpdateRequest request) { + EmsDevicesSetting device = emsDevicesMapper.getDeviceBySiteAndDeviceId(request.getDeviceId(), request.getSiteId()); + if (device == null) { + throw new ServiceException("未找到对应设备配置信息"); + } + if (DeviceType.TCP.name().equals(device.getDeviceType())) { + if (device.getSlaveId() == null) { + throw new ServiceException("设备未配置从站地址"); + } + if (device.getIpPort() == null) { + throw new ServiceException("设备未配置端口号"); + } + } + // 查询设备的开关机配置 + EmsPcsSetting pcsSetting = emsPcsSettingMapper.selectEmsPcsSettingByDeviceId(device.getId()); + if (pcsSetting == null) { + throw new ServiceException("未找到对应PCS配置信息"); + } + // 调用Modbus向设备发送指令 + DeviceConfig deviceConfig = getDeviceConfig(device); + deviceConfig.setWriteTags(getWriteTags(request.getWorkStatus(), pcsSetting)); + log.info("设备控制指令发送数据: {}", JSON.toJSONString(deviceConfig)); + boolean result = modbusProcessor.writeDataToDevice(deviceConfig); + if (!result) { + throw new ServiceException("设备控制指令发送失败"); + } + return true; + } + + public DeviceConfig getDeviceConfig(EmsDevicesSetting device) { + DeviceConfig deviceConfig = new DeviceConfig(); + deviceConfig.setDeviceNumber(device.getDeviceId()); + deviceConfig.setDeviceName(device.getDeviceName()); + deviceConfig.setSlaveId(device.getSlaveId().intValue()); +// if (DeviceType.TCP.name().equals(device.getDeviceType())) { + deviceConfig.setHost(device.getIpAddress()); + deviceConfig.setPort(device.getIpPort().intValue()); +// } + + return deviceConfig; + } + + public List getWriteTags(String workStatus, EmsPcsSetting pcsSetting) { + List writeTags = new ArrayList<>(); + BigDecimal power; + + if (WorkStatus.NORMAL.getCode().equals(workStatus)) { + // 开机先发送开机指令再发送有功功率给定值 + WriteTagConfig writeTag = new WriteTagConfig(); + writeTag.setAddress(pcsSetting.getPointAddress()); + writeTag.setValue(pcsSetting.getStartCommand()); + writeTags.add(writeTag); + power = pcsSetting.getStartPower(); + } else if (WorkStatus.STOP.getCode().equals(workStatus)) { + // 关机 + power = pcsSetting.getStopPower(); + } else { + throw new ServiceException("工作状态不合法"); + } + JSONArray array = JSON.parseArray(pcsSetting.getClusterPointAddress()); + for (int i = 0; i < pcsSetting.getClusterNum(); i++) { + Object clusterPointAddress = array.get(i); + WriteTagConfig clusterWriteTag = new WriteTagConfig(); + clusterWriteTag.setAddress(String.valueOf(clusterPointAddress)); + // 电池簇PCS有功功率给定默认置0 + if (power == null) { + power = BigDecimal.ZERO; + } + clusterWriteTag.setValue(power); + writeTags.add(clusterWriteTag); + } + if (WorkStatus.STOP.getCode().equals(workStatus)) { + // 关机先发送有功功率给定值再发送关机指令 + WriteTagConfig writeTag = new WriteTagConfig(); + writeTag.setAddress(pcsSetting.getPointAddress()); + writeTag.setValue(pcsSetting.getStopCommand()); + writeTags.add(writeTag); + } + return writeTags; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java new file mode 100644 index 0000000..682282a --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java @@ -0,0 +1,322 @@ +package com.xzzn.ems.service.impl; + +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsDailyEnergyData; +import com.xzzn.ems.domain.EmsEnergyPriceConfig; +import com.xzzn.ems.domain.EmsPriceTimeConfig; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper; +import com.xzzn.ems.mapper.EmsPriceTimeConfigMapper; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 电价配置Service业务层处理 + * + * @author xzzn + * @date 2025-09-28 + */ +@Service +public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigService +{ + @Autowired + private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; + @Autowired + private EmsPriceTimeConfigMapper emsPriceTimeConfigMapper; + @Autowired + private RedisCache redisCache; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + + /** + * 查询电价配置 + * + * @param id 电价配置主键 + * @return 电价配置 + */ + @Override + public EnergyPriceVo selectEmsEnergyPriceConfigById(Long id) + { + EnergyPriceVo vo = new EnergyPriceVo(); + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.selectEmsEnergyPriceConfigById(id); + if(priceConfig != null) { + BeanUtils.copyProperties(priceConfig,vo); + // 时间范围 + if (priceConfig.getId() != null) { + List priceVos = emsPriceTimeConfigMapper.getTimeRangeByPriceId(priceConfig.getId()); + vo.setRange(priceVos); + } + } else { + return null; + } + return vo; + } + + /** + * 查询电价配置列表 + * + * @return 电价配置 + */ + @Override + public List selectEmsEnergyPriceConfigList(String siteId,String startTime,String endTime) + { + List responses = new ArrayList<>(); + // 根据时间截取年份 + String[] startTimeArr = startTime.split("-"); + int currentYear = Integer.valueOf(startTimeArr[0]); + + List priceConfigs = emsEnergyPriceConfigMapper.getCurrentYearConfigList(siteId,currentYear); + + if (priceConfigs != null && priceConfigs.size() > 0) { + for (EmsEnergyPriceConfig priceConfig : priceConfigs) { + EnergyPriceVo vo = new EnergyPriceVo(); + BeanUtils.copyProperties(priceConfig, vo); + // 时间范围 + if (priceConfig.getId() != null) { + List priceVos = emsPriceTimeConfigMapper.getTimeRangeByPriceId(priceConfig.getId()); + vo.setRange(priceVos); + } + responses.add(vo); + } + } + + return responses.stream() + .sorted(Comparator.comparingInt((EnergyPriceVo vo) -> Integer.parseInt(vo.getMonth())).reversed()) + .collect(Collectors.toList()); + } + + /** + * 新增电价配置 + * + * @param priceVo 电价配置 + * @return 结果 + */ + @Override + public int insertEmsEnergyPriceConfig(EnergyPriceVo priceVo) + { + String year = priceVo.getYear(); + String month = priceVo.getMonth(); + String siteId = priceVo.getSiteId(); + // 判断入参 + if(StringUtils.isEmpty(siteId) || StringUtils.isEmpty(year) || StringUtils.isEmpty(month)){ + return 0; + } + + // 校验当前月电价设置是否已存在,不存在则新增,存在则更新 + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.getConfigListByYearAndMonth(siteId,year,month); + if (priceConfig != null){ + return 0; + } else { + priceConfig = new EmsEnergyPriceConfig(); + } + BeanUtils.copyProperties(priceVo,priceConfig); + priceConfig.setCreateTime(DateUtils.getNowDate()); + priceConfig.setUpdateTime(DateUtils.getNowDate()); + priceConfig.setCreateBy("system"); + priceConfig.setUpdateBy("system"); + emsEnergyPriceConfigMapper.insertOrUpdateEmsEnergyPriceConfig(priceConfig); + + batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + + // 判断是否当月电价,是则更新当月电价缓存 + int currentMonth = LocalDate.now().getMonthValue(); + if (currentMonth == Integer.parseInt(month)) { + initCurrentMonthPrice(); + } + + return 1; + } + + private int batchInsetPriceTimeRange(EnergyPriceVo priceVo, Long priceId) { + List timeConfigs = new ArrayList<>(); + List rangeVos = priceVo.getRange(); + if (rangeVos != null && rangeVos.size() > 0) { + for (EnergyPriceTimeRange rangeVo : rangeVos) { + EmsPriceTimeConfig timeConfig = new EmsPriceTimeConfig(); + BeanUtils.copyProperties(rangeVo,timeConfig); + timeConfig.setCreateTime(DateUtils.getNowDate()); + timeConfig.setUpdateTime(DateUtils.getNowDate()); + timeConfig.setCreateBy("system"); + timeConfig.setUpdateBy("system"); + timeConfig.setPriceId(priceId); + timeConfigs.add(timeConfig); + } + } + // 批量插入 + return emsPriceTimeConfigMapper.batchInsert(timeConfigs); + } + + /** + * 修改电价配置 + * + * @param priceVo 电价配置 + * @return 结果 + */ + @Override + public int updateEmsEnergyPriceConfig(EnergyPriceVo priceVo) + { + if (priceVo == null || priceVo.getId() == null) { + return 0; + } + // 不存在 + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.selectEmsEnergyPriceConfigById(priceVo.getId()); + if (priceConfig == null) { + return 0; + } + + // 存在更新 + BeanUtils.copyProperties(priceVo, priceConfig); + priceConfig.setUpdateTime(DateUtils.getNowDate()); + priceConfig.setUpdateBy("system"); + emsEnergyPriceConfigMapper.updateEmsEnergyPriceConfig(priceConfig); + + // 时间配置,全删,全插入 + Long[] priceIds = {priceVo.getId()}; + emsPriceTimeConfigMapper.deleteTimeRangeByPriceId(priceIds); + batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + + // 判断是否当月电价,是则更新当月电价缓存 + int currentMonth = LocalDate.now().getMonthValue(); + if (currentMonth == Integer.parseInt(priceVo.getMonth())) { + initCurrentMonthPrice(); + } + return 1; + } + + /** + * 批量删除电价配置 + * + * @param ids 需要删除的电价配置主键 + * @return 结果 + */ + @Override + public int deleteEmsEnergyPriceConfigByIds(Long[] ids) + { + // 先删时间配置 + emsPriceTimeConfigMapper.deleteTimeRangeByPriceId(ids); + // 再删月电价 + emsEnergyPriceConfigMapper.deleteEmsEnergyPriceConfigByIds(ids); + // 更新当月电价缓存 + initCurrentMonthPrice(); + return 1; + } + + /** + * 删除电价配置信息 + * + * @param id 电价配置主键 + * @return 结果 + */ + @Override + public int deleteEmsEnergyPriceConfigById(Long id) + { + return emsEnergyPriceConfigMapper.deleteEmsEnergyPriceConfigById(id); + } + + /** + * 初始化当月的电价存redis + */ + @Override + public void initCurrentMonthPrice() { + // 获取当年和当月的电价 + int currentMonth = LocalDate.now().getMonthValue(); + int currentYear = LocalDate.now().getYear(); + + List siteIdConfig = emsEnergyPriceConfigMapper.getAllSitePriceConfig(currentYear,currentMonth); + if (siteIdConfig == null || siteIdConfig.size() == 0) { + return; + } + for (EmsEnergyPriceConfig priceConfig : siteIdConfig) { + EnergyPriceVo priceVo = new EnergyPriceVo(); + BeanUtils.copyProperties(priceConfig,priceVo); + String siteId = priceConfig.getSiteId(); + List timeRanges = emsEnergyPriceConfigMapper.getTimeRangeByDate(siteId,currentYear,currentMonth); + priceVo.setRange(timeRanges); + String key = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + currentYear + currentMonth; + redisCache.setCacheObject(key,priceVo, 31, TimeUnit.DAYS); + } + + } + + public EnergyPriceVo getCurrentMonthPrice(String siteId) { + EnergyPriceVo priceVo = new EnergyPriceVo(); + // 获取当年和当月的电价 + int currentMonth = LocalDate.now().getMonthValue(); + int currentYear = LocalDate.now().getYear(); + + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.getConfigListByYearAndMonth(siteId,String.valueOf(currentYear),String.valueOf(currentMonth)); + if (priceConfig != null) { + BeanUtils.copyProperties(priceConfig,priceVo); + List timeRanges = emsPriceTimeConfigMapper.getTimeRangeByPriceId(priceConfig.getId()); + priceVo.setRange(timeRanges); + } + return priceVo; + } + + @Override + public Map getDayRevenueMap(String siteId) { + Map currentDayRevenue = new HashMap<>(); + // 默认0 + BigDecimal totalRevenue = BigDecimal.ZERO; + BigDecimal dayRevenue = BigDecimal.ZERO; + BigDecimal yesterdayRevenue = BigDecimal.ZERO; + // 获取昨日数据 + String yesterday = DateUtils.getYesterdayDayString(); + EmsDailyEnergyData yesterdayData = emsDailyEnergyDataMapper.getDataByDate(siteId, yesterday); + if (yesterdayData != null) { + yesterdayRevenue = yesterdayData.getDayRevenue() == null ? BigDecimal.ZERO : yesterdayData.getDayRevenue(); + } + + // 当日实时数据 + String today = DateUtils.getDate(); + EmsDailyEnergyData todayData = emsDailyEnergyDataMapper.getDataByDate(siteId,today); + if (todayData == null) { + Map lastData = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId); + if (lastData != null) { + totalRevenue = lastData.get("totalRevenue") == null ? BigDecimal.ZERO : lastData.get("totalRevenue"); + } + } else { + totalRevenue = todayData.getTotalRevenue() == null ? BigDecimal.ZERO : todayData.getTotalRevenue(); + // 获取当月电价 + int currentMonth = LocalDate.now().getMonthValue(); + int currentYear = LocalDate.now().getYear(); + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.getConfigListByYearAndMonth(siteId, String.valueOf(currentYear), String.valueOf(currentMonth)); + if (priceConfig != null) { + // 计算各个时段单独收益=(放电量-充电量)*电价,累加即当日实时收益 + BigDecimal peakRevenue = todayData.getPeakDischargeDiff().subtract(todayData.getPeakChargeDiff()) + .multiply(priceConfig.getPeak() == null ? BigDecimal.ZERO : priceConfig.getPeak()); + BigDecimal highRevenue = todayData.getHighDischargeDiff().subtract(todayData.getHighChargeDiff()) + .multiply(priceConfig.getHigh() == null ? BigDecimal.ZERO : priceConfig.getHigh()); + BigDecimal flatRevenue = todayData.getFlatDischargeDiff().subtract(todayData.getFlatChargeDiff()) + .multiply(priceConfig.getFlat() == null ? BigDecimal.ZERO : priceConfig.getFlat()); + BigDecimal valleyRevenue = todayData.getValleyDischargeDiff().subtract(todayData.getValleyChargeDiff()) + .multiply(priceConfig.getValley() == null ? BigDecimal.ZERO : priceConfig.getValley()); + dayRevenue = dayRevenue.add(peakRevenue).add(highRevenue).add(flatRevenue).add(valleyRevenue) + .setScale(4, RoundingMode.HALF_UP); + } + } + currentDayRevenue.put("totalRevenue", totalRevenue); + currentDayRevenue.put("dayRevenue", dayRevenue); + currentDayRevenue.put("yesterdayRevenue", yesterdayRevenue); + return currentDayRevenue; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultIssueLogServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultIssueLogServiceImpl.java new file mode 100644 index 0000000..99712be --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultIssueLogServiceImpl.java @@ -0,0 +1,129 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmRecords; +import com.xzzn.ems.service.IFXXAlarmDataProcessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsFaultIssueLogMapper; +import com.xzzn.ems.domain.EmsFaultIssueLog; +import com.xzzn.ems.service.IEmsFaultIssueLogService; + +/** + * 告警保护方案下发日志Service业务层处理 + * + * @author xzzn + * @date 2025-11-15 + */ +@Service +public class EmsFaultIssueLogServiceImpl implements IEmsFaultIssueLogService +{ + @Autowired + private EmsFaultIssueLogMapper emsFaultIssueLogMapper; + + /** + * 查询告警保护方案下发日志 + * + * @param id 告警保护方案下发日志主键 + * @return 告警保护方案下发日志 + */ + @Override + public EmsFaultIssueLog selectEmsFaultIssueLogById(Long id) + { + return emsFaultIssueLogMapper.selectEmsFaultIssueLogById(id); + } + + /** + * 新增告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + @Override + public int insertEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog) + { + emsFaultIssueLog.setCreateTime(DateUtils.getNowDate()); + return emsFaultIssueLogMapper.insertEmsFaultIssueLog(emsFaultIssueLog); + } + + /** + * 查询告警保护方案下发日志列表 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 告警保护方案下发日志 + */ + @Override + public List selectEmsFaultIssueLogList(EmsFaultIssueLog emsFaultIssueLog) + { + return emsFaultIssueLogMapper.selectEmsFaultIssueLogList(emsFaultIssueLog); + } + + /** + * 修改告警保护方案下发日志 + * + * @param emsFaultIssueLog 告警保护方案下发日志 + * @return 结果 + */ + @Override + public int updateEmsFaultIssueLog(EmsFaultIssueLog emsFaultIssueLog) + { + emsFaultIssueLog.setUpdateTime(DateUtils.getNowDate()); + return emsFaultIssueLogMapper.updateEmsFaultIssueLog(emsFaultIssueLog); + } + + /** + * 批量删除告警保护方案下发日志 + * + * @param ids 需要删除的告警保护方案下发日志主键 + * @return 结果 + */ + @Override + public int deleteEmsFaultIssueLogByIds(Long[] ids) + { + return emsFaultIssueLogMapper.deleteEmsFaultIssueLogByIds(ids); + } + + /** + * 删除告警保护方案下发日志信息 + * + * @param id 告警保护方案下发日志主键 + * @return 结果 + */ + @Override + public int deleteEmsFaultIssueLogById(Long id) + { + return emsFaultIssueLogMapper.deleteEmsFaultIssueLogById(id); + } + + @Override + public void dealSyncData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + + EmsFaultIssueLog issueLog = JSON.parseObject(content, EmsFaultIssueLog.class); + String logId = issueLog.getLogId(); + if (checkLogIsExist(logId)) { + return; + } + switch(operateType) { + case "INSERT": + insertEmsFaultIssueLog(issueLog); + break; + default: + break; + } + } + + private boolean checkLogIsExist(String logId) { + EmsFaultIssueLog issueLog = emsFaultIssueLogMapper.selectEmsFaultIssueLogByLogId(logId); + if (issueLog != null) { + return true; + } + return false; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultProtectionPlanServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultProtectionPlanServiceImpl.java new file mode 100644 index 0000000..6da7cf1 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsFaultProtectionPlanServiceImpl.java @@ -0,0 +1,142 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyRunning; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsFaultProtectionPlanMapper; +import com.xzzn.ems.domain.EmsFaultProtectionPlan; +import com.xzzn.ems.service.IEmsFaultProtectionPlanService; + +/** + * 故障告警保护方案Service业务层处理 + * + * @author xzzn + * @date 2025-10-24 + */ +@Service +public class EmsFaultProtectionPlanServiceImpl implements IEmsFaultProtectionPlanService +{ + @Autowired + private EmsFaultProtectionPlanMapper emsFaultProtectionPlanMapper; + + /** + * 查询故障告警保护方案 + * + * @param id 故障告警保护方案主键 + * @return 故障告警保护方案 + */ + @Override + public EmsFaultProtectionPlan selectEmsFaultProtectionPlanById(Long id) + { + return emsFaultProtectionPlanMapper.selectEmsFaultProtectionPlanById(id); + } + + /** + * 查询故障告警保护方案列表 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 故障告警保护方案 + */ + @Override + public List selectEmsFaultProtectionPlanList(EmsFaultProtectionPlan emsFaultProtectionPlan) + { + return emsFaultProtectionPlanMapper.selectEmsFaultProtectionPlanList(emsFaultProtectionPlan); + } + + /** + * 新增故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + @Override + public int insertEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan) + { + emsFaultProtectionPlan.setCreateTime(DateUtils.getNowDate()); + return emsFaultProtectionPlanMapper.insertEmsFaultProtectionPlan(emsFaultProtectionPlan); + } + + /** + * 修改故障告警保护方案 + * + * @param emsFaultProtectionPlan 故障告警保护方案 + * @return 结果 + */ + @Override + public int updateEmsFaultProtectionPlan(EmsFaultProtectionPlan emsFaultProtectionPlan) + { + emsFaultProtectionPlan.setUpdateTime(DateUtils.getNowDate()); + return emsFaultProtectionPlanMapper.updateEmsFaultProtectionPlan(emsFaultProtectionPlan); + } + + /** + * 批量删除故障告警保护方案 + * + * @param ids 需要删除的故障告警保护方案主键 + * @return 结果 + */ + @Override + public int deleteEmsFaultProtectionPlanByIds(Long[] ids) + { + return emsFaultProtectionPlanMapper.deleteEmsFaultProtectionPlanByIds(ids); + } + + /** + * 删除故障告警保护方案信息 + * + * @param id 故障告警保护方案主键 + * @return 结果 + */ + @Override + public int deleteEmsFaultProtectionPlanById(Long id) + { + return emsFaultProtectionPlanMapper.deleteEmsFaultProtectionPlanById(id); + } + + @Override + public void dealSyncData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + + EmsFaultProtectionPlan faultProtectionPlan = JSON.parseObject(content, EmsFaultProtectionPlan.class); + switch(operateType) { + case "INSERT": + insertEmsFaultProtectionPlan(faultProtectionPlan); + break; + case "UPDATE": + updateEmsFaultProtectionPlan(faultProtectionPlan); + break; + case "DELETE": + // 根据站点+faultName+faultLevel 删除 + String siteId = faultProtectionPlan.getSiteId(); + String faultName = faultProtectionPlan.getFaultName(); + Integer faultLevel = faultProtectionPlan.getFaultLevel(); + emsFaultProtectionPlanMapper.deleteEmsFaultProtectionPlan(siteId, faultName, faultLevel); + break; + default: + break; + } + } + + private static Long[] convertJsonToLongArray(String json) { + // 解析 JSON 为 JSONObject + JSONObject jsonObject = JSON.parseObject(json); + // 获取 "id" 对应的 JSONArray + JSONArray idArray = jsonObject.getJSONArray("id"); + + if (idArray == null) { + return new Long[0]; // 数组不存在时返回空数组 + } + + // 转换为 Long 数组 + return idArray.toArray(new Long[0]); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttMessageServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttMessageServiceImpl.java new file mode 100644 index 0000000..83f0b46 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttMessageServiceImpl.java @@ -0,0 +1,109 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsMqttMessage; +import com.xzzn.ems.mapper.EmsMqttMessageMapper; +import com.xzzn.ems.service.IEmsMqttMessageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author xzzn + * @date 2025-06-27 + */ +@Service +public class EmsMqttMessageServiceImpl implements IEmsMqttMessageService +{ + @Autowired + private EmsMqttMessageMapper emsMqttMessageMapper; + + /** + * 查询【请填写功能名称】 + * + * @param id 【请填写功能名称】主键 + * @return 【请填写功能名称】 + */ + @Override + public EmsMqttMessage selectEmsMqttMessageById(Long id) + { + return emsMqttMessageMapper.selectEmsMqttMessageById(id); + } + + /** + * 查询【请填写功能名称】列表 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List selectEmsMqttMessageList(EmsMqttMessage emsMqttMessage) + { + return emsMqttMessageMapper.selectEmsMqttMessageList(emsMqttMessage); + } + + /** + * 新增【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + @Override + public int insertEmsMqttMessage(EmsMqttMessage emsMqttMessage) + { + emsMqttMessage.setCreateTime(DateUtils.getNowDate()); + return emsMqttMessageMapper.insertEmsMqttMessage(emsMqttMessage); + } + + /** + * 修改【请填写功能名称】 + * + * @param emsMqttMessage 【请填写功能名称】 + * @return 结果 + */ + @Override + public int updateEmsMqttMessage(EmsMqttMessage emsMqttMessage) + { + emsMqttMessage.setUpdateTime(DateUtils.getNowDate()); + return emsMqttMessageMapper.updateEmsMqttMessage(emsMqttMessage); + } + + /** + * 批量删除【请填写功能名称】 + * + * @param ids 需要删除的【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteEmsMqttMessageByIds(Long[] ids) + { + return emsMqttMessageMapper.deleteEmsMqttMessageByIds(ids); + } + + /** + * 删除【请填写功能名称】信息 + * + * @param id 【请填写功能名称】主键 + * @return 结果 + */ + @Override + public int deleteEmsMqttMessageById(Long id) + { + return emsMqttMessageMapper.deleteEmsMqttMessageById(id); + } + + @Override + public int insertMqttOriginalMessage(String topic, String message) { + EmsMqttMessage mqttMessage = new EmsMqttMessage(); + mqttMessage.setMqttTopic(topic); + mqttMessage.setMqttMessage(message); + mqttMessage.setCreateTime(new java.util.Date()); + mqttMessage.setUpdateTime(new java.util.Date()); + mqttMessage.setCreateBy("system"); + mqttMessage.setUpdateBy("system"); + mqttMessage.setUpdateTime(DateUtils.getNowDate()); + return emsMqttMessageMapper.insertEmsMqttMessage(mqttMessage); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttTopicConfigServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttTopicConfigServiceImpl.java new file mode 100644 index 0000000..c2bf042 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsMqttTopicConfigServiceImpl.java @@ -0,0 +1,96 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.domain.EmsMqttTopicConfig; +import com.xzzn.ems.service.IEmsMqttTopicConfigService; + +/** + * 站点topic配置Service业务层处理 + * + * @author xzzn + * @date 2025-11-06 + */ +@Service +public class EmsMqttTopicConfigServiceImpl implements IEmsMqttTopicConfigService +{ + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + + /** + * 查询站点topic配置 + * + * @param id 站点topic配置主键 + * @return 站点topic配置 + */ + @Override + public EmsMqttTopicConfig selectEmsMqttTopicConfigById(Long id) + { + return emsMqttTopicConfigMapper.selectEmsMqttTopicConfigById(id); + } + + /** + * 查询站点topic配置列表 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 站点topic配置 + */ + @Override + public List selectEmsMqttTopicConfigList(EmsMqttTopicConfig emsMqttTopicConfig) + { + return emsMqttTopicConfigMapper.selectEmsMqttTopicConfigList(emsMqttTopicConfig); + } + + /** + * 新增站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + @Override + public int insertEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig) + { + emsMqttTopicConfig.setCreateTime(DateUtils.getNowDate()); + return emsMqttTopicConfigMapper.insertEmsMqttTopicConfig(emsMqttTopicConfig); + } + + /** + * 修改站点topic配置 + * + * @param emsMqttTopicConfig 站点topic配置 + * @return 结果 + */ + @Override + public int updateEmsMqttTopicConfig(EmsMqttTopicConfig emsMqttTopicConfig) + { + emsMqttTopicConfig.setUpdateTime(DateUtils.getNowDate()); + return emsMqttTopicConfigMapper.updateEmsMqttTopicConfig(emsMqttTopicConfig); + } + + /** + * 批量删除站点topic配置 + * + * @param ids 需要删除的站点topic配置主键 + * @return 结果 + */ + @Override + public int deleteEmsMqttTopicConfigByIds(Long[] ids) + { + return emsMqttTopicConfigMapper.deleteEmsMqttTopicConfigByIds(ids); + } + + /** + * 删除站点topic配置信息 + * + * @param id 站点topic配置主键 + * @return 结果 + */ + @Override + public int deleteEmsMqttTopicConfigById(Long id) + { + return emsMqttTopicConfigMapper.deleteEmsMqttTopicConfigById(id); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsBranchDataServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsBranchDataServiceImpl.java new file mode 100644 index 0000000..111533b --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsBranchDataServiceImpl.java @@ -0,0 +1,105 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsPcsBranchDataMapper; +import com.xzzn.ems.domain.EmsPcsBranchData; +import com.xzzn.ems.service.IEmsPcsBranchDataService; + +/** + * pcs支路数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-29 + */ +@Service +public class EmsPcsBranchDataServiceImpl implements IEmsPcsBranchDataService +{ + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + + /** + * 查询pcs支路数据 + * + * @param id pcs支路数据主键 + * @return pcs支路数据 + */ + @Override + public EmsPcsBranchData selectEmsPcsBranchDataById(Long id) + { + return emsPcsBranchDataMapper.selectEmsPcsBranchDataById(id); + } + + /** + * 查询pcs支路数据列表 + * + * @param emsPcsBranchData pcs支路数据 + * @return pcs支路数据 + */ + @Override + public List selectEmsPcsBranchDataList(EmsPcsBranchData emsPcsBranchData) + { + return emsPcsBranchDataMapper.selectEmsPcsBranchDataList(emsPcsBranchData); + } + + /** + * 新增pcs支路数据 + * + * @param emsPcsBranchData pcs支路数据 + * @return 结果 + */ + @Override + public int insertEmsPcsBranchData(EmsPcsBranchData emsPcsBranchData) + { + emsPcsBranchData.setCreateTime(DateUtils.getNowDate()); + return emsPcsBranchDataMapper.insertEmsPcsBranchData(emsPcsBranchData); + } + + /** + * 修改pcs支路数据 + * + * @param emsPcsBranchData pcs支路数据 + * @return 结果 + */ + @Override + public int updateEmsPcsBranchData(EmsPcsBranchData emsPcsBranchData) + { + emsPcsBranchData.setUpdateTime(DateUtils.getNowDate()); + return emsPcsBranchDataMapper.updateEmsPcsBranchData(emsPcsBranchData); + } + + /** + * 批量删除pcs支路数据 + * + * @param ids 需要删除的pcs支路数据主键 + * @return 结果 + */ + @Override + public int deleteEmsPcsBranchDataByIds(Long[] ids) + { + return emsPcsBranchDataMapper.deleteEmsPcsBranchDataByIds(ids); + } + + /** + * 删除pcs支路数据信息 + * + * @param id pcs支路数据主键 + * @return 结果 + */ + @Override + public int deleteEmsPcsBranchDataById(Long id) + { + return emsPcsBranchDataMapper.deleteEmsPcsBranchDataById(id); + } + + @Override + public int insertEmsPcsBranchDataList(List list) { + for (EmsPcsBranchData item : list) { + item.setCreateTime(DateUtils.getNowDate()); + } + return emsPcsBranchDataMapper.insertPcsBranchDataList(list); + + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsDataServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsDataServiceImpl.java new file mode 100644 index 0000000..d3c1ba0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPcsDataServiceImpl.java @@ -0,0 +1,96 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.service.IEmsPcsDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * PCS数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-27 + */ +@Service +public class EmsPcsDataServiceImpl implements IEmsPcsDataService +{ + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + + /** + * 查询PCS数据 + * + * @param id PCS数据主键 + * @return PCS数据 + */ + @Override + public EmsPcsData selectEmsPcsDataById(Long id) + { + return emsPcsDataMapper.selectEmsPcsDataById(id); + } + + /** + * 查询PCS数据列表 + * + * @param emsPcsData PCS数据 + * @return PCS数据 + */ + @Override + public List selectEmsPcsDataList(EmsPcsData emsPcsData) + { + return emsPcsDataMapper.selectEmsPcsDataList(emsPcsData); + } + + /** + * 新增PCS数据 + * + * @param emsPcsData PCS数据 + * @return 结果 + */ + @Override + public int insertEmsPcsData(EmsPcsData emsPcsData) + { + emsPcsData.setCreateTime(DateUtils.getNowDate()); + return emsPcsDataMapper.insertEmsPcsData(emsPcsData); + } + + /** + * 修改PCS数据 + * + * @param emsPcsData PCS数据 + * @return 结果 + */ + @Override + public int updateEmsPcsData(EmsPcsData emsPcsData) + { + emsPcsData.setUpdateTime(DateUtils.getNowDate()); + return emsPcsDataMapper.updateEmsPcsData(emsPcsData); + } + + /** + * 批量删除PCS数据 + * + * @param ids 需要删除的PCS数据主键 + * @return 结果 + */ + @Override + public int deleteEmsPcsDataByIds(Long[] ids) + { + return emsPcsDataMapper.deleteEmsPcsDataByIds(ids); + } + + /** + * 删除PCS数据信息 + * + * @param id PCS数据主键 + * @return 结果 + */ + @Override + public int deleteEmsPcsDataById(Long id) + { + return emsPcsDataMapper.deleteEmsPcsDataById(id); + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java new file mode 100644 index 0000000..22231a3 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java @@ -0,0 +1,300 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.PointType; +import com.xzzn.common.exception.ServiceException; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.common.utils.bean.BeanValidators; +import com.xzzn.common.utils.poi.ExcelUtil; +import com.xzzn.ems.domain.EmsPointEnumMatch; +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointMatchExportVo; +import com.xzzn.ems.domain.vo.DevicePointMatchVo; +import com.xzzn.ems.domain.vo.ImportPointDataRequest; +import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsPointEnumMatchMapper; +import com.xzzn.ems.mapper.EmsPointMatchMapper; +import com.xzzn.ems.service.IEmsPointMatchService; +import com.xzzn.ems.utils.DevicePointMatchDataProcessor; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import javax.validation.Validator; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; + +/** + * 点位匹配Service业务层处理 + * + * @author xzzn + * @date 2025-11-04 + */ +@Service +public class EmsPointMatchServiceImpl implements IEmsPointMatchService { + private static final Logger log = LoggerFactory.getLogger(EmsPointMatchServiceImpl.class); + private static final String SEPARATOR = "#"; + + private static final String SITE_ID = "DEFAULT"; + @Autowired + private EmsPointMatchMapper emsPointMatchMapper; + @Autowired + private EmsPointEnumMatchMapper emsPointEnumMatchMapper; + @Autowired + protected Validator validator; + @Autowired + private RedisCache redisCache; + + /** + * 查询点位匹配列表 + * + * @param emsPointMatch 点位匹配 + * @return 点位匹配 + */ + @Override + public List selectEmsPointMatchList(EmsPointMatch emsPointMatch) { + if (StringUtils.isBlank(emsPointMatch.getDeviceId())) { + emsPointMatch.setSiteId(SITE_ID); + } + List devicePointMatchExportVos = emsPointMatchMapper.selectEmsPointMatchExportList(emsPointMatch); + if (CollectionUtils.isEmpty(devicePointMatchExportVos)) { + return devicePointMatchExportVos; + } + + for (DevicePointMatchExportVo devicePointMatch : devicePointMatchExportVos) { + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(emsPointMatch.getSiteId(), + emsPointMatch.getDeviceCategory(), devicePointMatch.getMatchField()); + if (!CollectionUtils.isEmpty(pointEnumMatchList)) { + String enumName = pointEnumMatchList.stream().map(EmsPointEnumMatch::getEnumName).filter(StringUtils::isNotBlank).collect(Collectors.joining(SEPARATOR)); + String dataEnumCode = pointEnumMatchList.stream().map(EmsPointEnumMatch::getDataEnumCode).filter(StringUtils::isNotBlank).collect(Collectors.joining(SEPARATOR)); + devicePointMatch.setMatchFieldEnum(enumName); + devicePointMatch.setDataEnum(dataEnumCode); + } + devicePointMatch.setA(devicePointMatch.getA() == null ? devicePointMatch.getA() : devicePointMatch.getA().stripTrailingZeros()); + devicePointMatch.setK(devicePointMatch.getK() == null ? devicePointMatch.getK() : devicePointMatch.getK().stripTrailingZeros()); + devicePointMatch.setB(devicePointMatch.getB() == null ? devicePointMatch.getB() : devicePointMatch.getB().stripTrailingZeros()); + } + + return devicePointMatchExportVos; + } + + /** + * 上传点位清单 + * + * @param pointMatchList + * @param isUpdateSupport + * @param operName + * @return + */ + @Override + public String importPoint(List pointMatchList, boolean isUpdateSupport, String operName) { + if (StringUtils.isNull(pointMatchList) || pointMatchList.size() == 0) { + throw new ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (EmsPointMatch pointMatch : pointMatchList) { + try { + // 验证点位是否存在 + EmsPointMatch point = emsPointMatchMapper.getUniquePoint(pointMatch.getSiteId(), + pointMatch.getDeviceCategory(), pointMatch.getDataPoint()); + if (StringUtils.isNull(point)) { + BeanValidators.validateWithException(validator, pointMatch); + pointMatch.setCreateBy(operName); + emsPointMatchMapper.insertEmsPointMatch(pointMatch); + successNum++; + successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 导入成功"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, pointMatch); + pointMatch.setUpdateBy(operName); + emsPointMatchMapper.updateEmsPointMatch(pointMatch); + successNum++; + successMsg.append("
" + successNum + "、站点 " + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 更新成功"); + } else { + failureNum++; + failureMsg.append("
" + failureNum + "、站点" + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、站点" + pointMatch.getSiteId() + "、点位 " + pointMatch.getDataPoint() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + } + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + /** + * 导入设备点位清单数据到数据库,并同步到Redis + * + * @param request + * @param operName + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public List importDataByDevice(ImportPointDataRequest request, String operName) { + ExcelUtil util = new ExcelUtil<>(DevicePointMatchVo.class); + List pointMatchList; + MultipartFile file = request.getFile(); + if (file.isEmpty()) { + throw new ServiceException("点位清单文件不能为空"); + } + try { + pointMatchList = util.importExcel(file.getInputStream()); + } catch (IOException e) { + log.info("点位清单导入失败:{}", e.getMessage()); + throw new ServiceException("点位清单导入失败!"); + } + if (CollectionUtils.isEmpty(pointMatchList)) { + throw new ServiceException("导入用户数据不能为空!"); + } + + String siteId = request.getSiteId(); + String deviceId = request.getDeviceId(); + String deviceCategory = request.getDeviceCategory(); + List errorList = new ArrayList<>(); + for (DevicePointMatchVo pointMatch : pointMatchList) { + try { + //校验点位清单文件内容 + if (validDevicePointMatch(pointMatch, errorList)) { + continue; + } + EmsPointMatch savePoint = new EmsPointMatch(); + BeanUtils.copyProperties(pointMatch, savePoint); + savePoint.setSiteId(siteId); + savePoint.setDeviceId(deviceId); + savePoint.setDeviceCategory(deviceCategory); + if (StringUtils.isNotBlank(pointMatch.getIsAlarm()) && String.valueOf(PointType.YES.getCode()).equals(pointMatch.getIsAlarm())) { + savePoint.setMatchTable(DeviceMatchTable.getAlarmMatchTableByCode(deviceCategory)); + savePoint.setIsAlarm(PointType.YES.getCode()); + } else { + savePoint.setMatchTable(DeviceMatchTable.getMatchTableByCode(deviceCategory)); + } + savePoint.setPointName(DevicePointMatchDataProcessor.getFieldAnnotation(DeviceMatchTable.getClassByTable(savePoint.getMatchTable()), StringUtils.toCamelCase(savePoint.getMatchField()))); + savePoint.setCreateBy(operName); + savePoint.setUpdateBy(operName); + // 验证点位是否存在 + EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceId, deviceCategory, pointMatch.getDataPoint()); + if (Objects.isNull(dbPoint)) { + emsPointMatchMapper.insertEmsPointMatch(savePoint); + } else { + savePoint.setId(dbPoint.getId()); + emsPointMatchMapper.updateEmsPointMatch(savePoint); + } + // 保存点位枚举映射关系 + savePointMatchEnum(pointMatch.getMatchFieldEnum(), pointMatch.getDataEnum(), savePoint); + + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException("点位清单导入失败!"); + } + } + // 同步到Redis + syncToRedis(siteId, deviceId, deviceCategory); + return errorList; + } + + private boolean validDevicePointMatch(DevicePointMatchVo pointMatch, List errorList) { + StringBuilder errorMsg = new StringBuilder(); + if (StringUtils.isBlank(pointMatch.getMatchField())) { + errorMsg.append("点位匹配字段不能为空;"); + } + if (StringUtils.isBlank(pointMatch.getDataPoint())) { + errorMsg.append("数据点位不能为空;"); + } + if (StringUtils.isBlank(pointMatch.getDataPointName())) { + errorMsg.append("数据点位名称不能为空;"); + } + if (errorMsg.length() > 0) { + pointMatch.setErrorMsg(errorMsg.toString()); + errorList.add(pointMatch); + return true; + } + return false; + } + + private void syncToRedis(String siteId, String deviceId, String deviceCategory) { + // 点位匹配数据同步到Redis + String pointMatchKey = DevicePointMatchDataProcessor.getPointMacthCacheKey(siteId, deviceId, deviceCategory); + List pointMatchData = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceId, deviceCategory); +// log.info("同步点位匹配数据到Redis key:{} data:{}", pointMatchKey, pointMatchData); + if (CollectionUtils.isEmpty(pointMatchData)) { + return; + } + if (redisCache.hasKey(pointMatchKey)) { + redisCache.deleteObject(pointMatchKey); + } + redisCache.setCacheList(pointMatchKey, pointMatchData); + log.info("点位匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheList(pointMatchKey))); + + // 点位枚举匹配数据同步到Redis + String pointEnumMatchKey = DevicePointMatchDataProcessor.getPointEnumMacthCacheKey(siteId, deviceCategory); + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, deviceCategory, null); + if (!CollectionUtils.isEmpty(pointEnumMatchList)) { + if (Boolean.TRUE.equals(redisCache.hasKey(pointEnumMatchKey))) { + redisCache.deleteObject(pointEnumMatchKey); + } + redisCache.setCacheList(pointEnumMatchKey, pointEnumMatchList); + log.info("点位枚举匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheList(pointEnumMatchKey))); + } + + } + + private void savePointMatchEnum(String matchFieldEnum, String dataEnum, EmsPointMatch savePoint) { + if (StringUtils.isAllBlank(matchFieldEnum, dataEnum)) { + return; + } + String siteId = savePoint.getSiteId(); + List pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, savePoint.getDeviceCategory(), savePoint.getMatchField()); + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + siteId = SITE_ID; + pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, savePoint.getDeviceCategory(), savePoint.getMatchField()); + } + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + log.info("未查询到点位点位枚举匹配数据"); + return; + } + String[] matchFieldEnums = matchFieldEnum.split(SEPARATOR); + String[] dataEnums = dataEnum.split(SEPARATOR); + if (matchFieldEnums.length != dataEnums.length) { + return; + } + String finalSiteId = siteId; + for (int i = 0; i < matchFieldEnums.length; i++) { + String enumName = matchFieldEnums[i]; + String dataEnumCode = dataEnums[i]; + pointEnumMatchList.forEach(pointEnumMatch -> { + if (pointEnumMatch.getEnumName().equals(enumName)) { + pointEnumMatch.setDataEnumCode(dataEnumCode); + if (SITE_ID.equals(finalSiteId)) { + EmsPointEnumMatch insertPointEnumMatch = new EmsPointEnumMatch(); + BeanUtils.copyProperties(pointEnumMatch, insertPointEnumMatch); + insertPointEnumMatch.setSiteId(savePoint.getSiteId()); + emsPointEnumMatchMapper.insertEmsPointEnumMatch(insertPointEnumMatch); + } else { + emsPointEnumMatchMapper.updateDataEnumCodeById(pointEnumMatch); + } + } + }); + } + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsSiteServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsSiteServiceImpl.java index 4a9e166..1abb914 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsSiteServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsSiteServiceImpl.java @@ -1,13 +1,20 @@ package com.xzzn.ems.service.impl; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.ems.domain.EmsBatteryData; import com.xzzn.ems.domain.EmsSiteSetting; +import com.xzzn.ems.domain.vo.SiteDeviceListVo; import com.xzzn.ems.domain.vo.SiteTotalInfoVo; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; import com.xzzn.ems.mapper.EmsSiteSettingMapper; import com.xzzn.ems.service.IEmsSiteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; /** * 站点信息 服务层实现 @@ -19,6 +26,10 @@ public class EmsSiteServiceImpl implements IEmsSiteService @Autowired private EmsSiteSettingMapper emsSiteMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesMapper; + @Autowired + private RedisCache redisCache; @Override public List getAllSites() { @@ -30,4 +41,108 @@ public class EmsSiteServiceImpl implements IEmsSiteService return emsSiteMapper.getSiteTotalInfo(); } + /** + * 根据site_id获取所有电池堆 + * @param siteId + * @return + */ + @Override + public List> getAllStackInfo(String siteId) { + return emsDevicesMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.STACK.getCode()); + } + + /** + * 根据父类设备id获取子设备id + * @param parentId + * @return + */ + @Override + public List> getAllClusterInfo(String siteId, String parentId) { + return emsDevicesMapper.getDeviceInfoByParentId(siteId,parentId); + } + + /** + * 获取站点列表 + * @param siteName + * @param startTime + * @param endTime + * @return + */ + @Override + public List getAllSiteInfoList(String siteName, String startTime, String endTime) { + return emsSiteMapper.getSiteInfoList(siteName,startTime,endTime); + } + + /** + * 获取设备列表 + * + * @param siteId + * @return + */ + @Override + public List getAllDeviceList(String siteId, String deviceCategory) { + List resultData = emsSiteMapper.getAllSiteDeviceList(siteId, deviceCategory); + if(resultData == null || resultData.size() == 0){ + return resultData; + } + for (SiteDeviceListVo siteDeviceListVo : resultData) { + String clusterId = siteDeviceListVo.getDeviceId(); + String category = siteDeviceListVo.getDeviceCategory(); + if(DeviceCategory.CLUSTER.getCode().equals(category)){ + // 获取该stack下面有多少单体电池 + List batteryDataList = redisCache.getCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); + siteDeviceListVo.setBatteryNum(batteryDataList == null ? 0 : batteryDataList.size()); + } + String categoryName = DeviceCategory.getInfoByCode(category); + siteDeviceListVo.setCategoryName(categoryName); + } + return resultData; + } + + /** + * 获取设备列表 + * + * @param siteId + * @return + */ + @Override + public List getAllDeviceListNoDisp(String siteId, String deviceCategory) { + List resultData = emsSiteMapper.getAllSiteDeviceListNoDisp(siteId, deviceCategory); + if(resultData == null || resultData.size() == 0){ + return resultData; + } + for (SiteDeviceListVo siteDeviceListVo : resultData) { + String clusterId = siteDeviceListVo.getDeviceId(); + String category = siteDeviceListVo.getDeviceCategory(); + if(DeviceCategory.CLUSTER.getCode().equals(category)){ + // 获取该stack下面有多少单体电池 + List batteryDataList = redisCache.getCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); + siteDeviceListVo.setBatteryNum(batteryDataList == null ? 0 : batteryDataList.size()); + } + String categoryName = DeviceCategory.getInfoByCode(category); + siteDeviceListVo.setCategoryName(categoryName); + } + return resultData; + } + /** + * 根据site_id获取所有pcs + * @param siteId + * @return + */ + @Override + public List> getAllPcsInfo(String siteId) { + return emsDevicesMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.PCS.getCode()); + } + + // 根据设备类别获取父类的设备id + @Override + public List> getParentCategoryDeviceId(String siteId, String deviceCategory) { + DeviceCategory category = DeviceCategory.fromCode(deviceCategory); + if(category == null || category.getParentCategory() == null){ + return null; + } + String parentCategory = category.getParentCategory().getCode(); + List> deviceIdList = emsDevicesMapper.getDeviceInfosBySiteIdAndCategory(siteId, parentCategory); + return deviceIdList; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java new file mode 100644 index 0000000..6efa8ca --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java @@ -0,0 +1,1009 @@ +package com.xzzn.ems.service.impl; + +import com.xzzn.common.enums.CostType; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.vo.AmmeterRevenueStatisListVo; +import com.xzzn.ems.domain.vo.AmmeterStatisListVo; +import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; +import com.xzzn.ems.domain.vo.ClusterStatisListVo; +import com.xzzn.ems.domain.vo.DateSearchRequest; +import com.xzzn.ems.domain.vo.ElectricDataInfoVo; +import com.xzzn.ems.domain.vo.EnergyPriceConfigVo; +import com.xzzn.ems.domain.vo.PCSCurveResponse; +import com.xzzn.ems.domain.vo.PcsStatisListVo; +import com.xzzn.ems.domain.vo.PowerStatisListVo; +import com.xzzn.ems.domain.vo.SiteMonitorDataVo; +import com.xzzn.ems.domain.vo.StackCurveResponse; +import com.xzzn.ems.domain.vo.StackStatisListVo; +import com.xzzn.ems.domain.vo.StatisAmmeterDateRequest; +import com.xzzn.ems.domain.vo.StatisClusterDateRequest; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryDataDayMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.service.IEmsStatsReportService; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +/** + * 统计报表数据Service业务层处理 + * + * @author xzzn + * @date 2025-06-29 + */ +@Service +public class EmsStatsReportServiceImpl implements IEmsStatsReportService +{ + private static final Logger log = LoggerFactory.getLogger(EmsStatsReportServiceImpl.class); + + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsBatteryDataDayMapper emsBatteryDataDayMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; + + // 电量指标 + @Override + public ElectricDataInfoVo getElectricDataResult(DateSearchRequest requestVo) { + ElectricDataInfoVo electricDataInfoVo = new ElectricDataInfoVo(); + + // 默认时间处理 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + + // 总充总放 + String nowData = DateUtils.getDate(); + BigDecimal totalDischarge = BigDecimal.ZERO; + BigDecimal totalCharge = BigDecimal.ZERO; + Map totalMap = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,requestVo.getSiteId()); + if (!CollectionUtils.isEmpty(totalMap)) { + totalDischarge = totalMap.get("totalDischargedCap"); + totalCharge = totalMap.get("totalChargedCap"); + } + BigDecimal efficiency = new BigDecimal(0); + if ( totalCharge.compareTo(BigDecimal.ZERO)>0){ + efficiency = totalDischarge.divide(totalCharge, 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + electricDataInfoVo.setTotalDisChargedCap(totalDischarge); + electricDataInfoVo.setTotalChargedCap(totalCharge); + electricDataInfoVo.setEfficiency(efficiency); + + String siteId = requestVo.getSiteId(); + String deviceId = requestVo.getDeviceId(); + // 日期筛选 + List dataList = new ArrayList(); + // 开始日期和结束日期同一天,展示 0-24 小时数据 + if (DateUtils.isSameDay(startDate, endDate)){ + electricDataInfoVo.setUnit("时"); +// if ("021_DDS_01".equals(siteId)) { + deviceId = "METE"; + dataList = emsAmmeterDataMapper.getChargeDataByHour(siteId,deviceId,startDate); +// } else if ("021_FXX_01".equals(siteId)) { +// endDate = DateUtils.addDays(endDate, 1); +// dataList = emsPcsDataMapper.getPcsDataByHour(requestVo.getSiteId(), startDate, endDate); +// } + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + electricDataInfoVo.setUnit("日"); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 + dataList = emsDailyChargeDataMapper.getTotalChargeDataByDay(siteId,startDate,endDate); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + electricDataInfoVo.setUnit("月"); + // 开始日期-结束日期大于 1 个月,按月展示数据 + dataList = emsDailyChargeDataMapper.getTotalChargeDataByMonth(siteId,startDate, endDate); + } + // 获取昨天昨晚一条数据,计算第一个小时的差值 + //setFirstDataDiff(dataList,siteId,deviceId); + // 计算充放电效率 + if (!CollectionUtils.isEmpty(dataList)){ + + for (SiteMonitorDataVo siteMonitorDataVo : dataList) { + // 计算单天的效率 + BigDecimal dailyEfficiency = new BigDecimal(0); + if ( siteMonitorDataVo.getChargedCap() != null && + siteMonitorDataVo.getChargedCap().compareTo(BigDecimal.ZERO)>0){ + dailyEfficiency = siteMonitorDataVo.getDisChargedCap().divide(siteMonitorDataVo.getChargedCap(), 2, RoundingMode.HALF_UP); + dailyEfficiency = dailyEfficiency.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + siteMonitorDataVo.setDailyEfficiency(dailyEfficiency); + } + + electricDataInfoVo.setSevenDayDisChargeStats(dataList); + } + return electricDataInfoVo; + } + + private void setFirstDataDiff(List dataList, String siteId, String deviceId) { + BigDecimal yestTotalDisChargeDate = new BigDecimal(0); + BigDecimal yestTotalChargeDate = new BigDecimal(0); + + String yestDate = DateUtils.getYesterdayDate(); + if (dataList != null && dataList.size()>0){ + SiteMonitorDataVo firstData = dataList.get(0); + if ("021_DDS_01".equals(siteId)){ + EmsAmmeterData yestData = emsAmmeterDataMapper.getYestLatestDate(siteId,deviceId,yestDate); + if (yestData != null) { + yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); + } + } else if ("021_FXX_01".equals(siteId)) { + + } + firstData.setChargedCap(firstData.getTotalChargedCap() == null ? BigDecimal.ZERO + : firstData.getTotalChargedCap().subtract(yestTotalChargeDate)); + firstData.setDisChargedCap(firstData.getTotalDisChargedCap() == null ? BigDecimal.ZERO + : firstData.getTotalDisChargedCap().subtract(yestTotalDisChargeDate)); + } + } + + // pcs曲线数据 + @Override + public List getPCSDataResult(DateSearchRequest requestVo) { + List responseList = new ArrayList<>(); + List dataList = new ArrayList(); + + // 默认时间-7天 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + +// // 开始日期和结束日期同一天,展示 0-24 小时数据 +// if (DateUtils.isSameDay(startDate, endDate)){ +// endDate = DateUtils.addDays(endDate, 1); +// requestVo.setEndDate(endDate); +// dataList = emsPcsDataMapper.getPcsActivePowerByHour(requestVo); +// } + // 开始日期和结束日期同一天,展示5分钟一组数据点 + if (DateUtils.isSameDay(startDate, endDate)){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + dataList = emsPcsDataMapper.getPcsActivePowerByMinutes(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 + dataList = emsPcsDataMapper.getPcsActivePowerByDay(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 个月,按月展示数据 + dataList = emsPcsDataMapper.getPcsActivePowerByMonth(requestVo); + } + + // 数据格式转换 按deviceId分组 + if (dataList != null && dataList.size()>0){ + responseList = dataList.stream() + .collect(Collectors.groupingBy(PcsStatisListVo::getDeviceId)) + // 将Map转换为Set后流转 + .entrySet().stream() + // 映射为PCSCurveResponse对象 + .map(entry -> { + PCSCurveResponse response = new PCSCurveResponse(); + response.setDeviceId(entry.getKey()); + response.setDataList(entry.getValue()); + return response; + }) + // 收集为List + .collect(Collectors.toList()); + } + return responseList; + } + + // 电池堆曲线 + @Override + public List getStackDataResult(DateSearchRequest requestVo) { + List responseList = new ArrayList<>(); + List dataList = new ArrayList(); + // 默认时间-7天 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + +// // 开始日期和结束日期同一天,展示 0-24 小时数据 +// if (DateUtils.isSameDay(startDate, endDate)){ +// endDate = DateUtils.addDays(endDate, 1); +// requestVo.setEndDate(endDate); +// dataList = emsBatteryStackMapper.getStackDataByHour(requestVo); +// } + // 开始日期和结束日期同一天,按5分钟一个数据点展示数据 + if (DateUtils.isSameDay(startDate, endDate)){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + dataList = emsBatteryStackMapper.getStackDataByMinute(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 + dataList = emsBatteryStackMapper.getStackDataByDay(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 个月,按月展示数据 + dataList = emsBatteryStackMapper.getStackDataByMonth(requestVo); + } + + // 数据格式转换 按deviceId分组 + if (dataList != null && dataList.size()>0){ + responseList = dataList.stream() + .collect(Collectors.groupingBy(StackStatisListVo::getDeviceId)) + // 将Map转换为Set后流转 + .entrySet().stream() + // 映射为PCSCurveResponse对象 + .map(entry -> { + StackCurveResponse response = new StackCurveResponse(); + response.setDeviceId(entry.getKey()); + response.setDataList(entry.getValue()); + return response; + }) + // 收集为List + .collect(Collectors.toList()); + } + return responseList; + } + + // 电池温度 + @Override + public List getClusterDataResult(StatisClusterDateRequest requestVo) { + List dataList = new ArrayList(); + // 时间不传默认当天 + if (requestVo.getDateTime() == null) { + String now = DateUtils.getDate(); + requestVo.setDateTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD, now)); + } + + // 根据时间获取每小时最新数据 + dataList = emsBatteryClusterMapper.getClusterDataByHour(requestVo); + return dataList; + } + + @Override + public List> getLoadNameList(String siteId) { + return emsDevicesSettingMapper.getAmmeterNameList(siteId); + } + + // 电表报表 + @Override + public List getAmmeterDataResult(StatisAmmeterDateRequest requestVo){ + List dataList = emsDailyEnergyDataMapper.getDataBySiteId(requestVo.getSiteId(),requestVo.getStartTime(),requestVo.getEndTime()); + if (dataList == null || dataList.size()==0){ + return new ArrayList<>(); + } + + BigDecimal activePower = new BigDecimal(0); + BigDecimal reactivePower = new BigDecimal(0); + /*AmmeterStatisListVo totalVo = new AmmeterStatisListVo(); + totalVo.setDataTime("汇总");*/ + for (AmmeterStatisListVo ammeterStatisListVo : dataList) { + BigDecimal effect = new BigDecimal(0); + activePower = (ammeterStatisListVo.getActivePeakKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getActivePeakKwh()) + .add((ammeterStatisListVo.getActiveHighKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getActiveHighKwh())) + .add((ammeterStatisListVo.getActiveFlatKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getActiveFlatKwh())) + .add((ammeterStatisListVo.getActiveValleyKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getActiveValleyKwh())); + reactivePower = (ammeterStatisListVo.getReActivePeakKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getReActivePeakKwh()) + .add((ammeterStatisListVo.getReActiveHighKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getReActiveHighKwh())) + .add((ammeterStatisListVo.getReActiveFlatKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getReActiveFlatKwh())) + .add((ammeterStatisListVo.getReActiveValleyKwh() == null ? BigDecimal.ZERO : ammeterStatisListVo.getReActiveValleyKwh())); + + ammeterStatisListVo.setActiveTotalKwh(activePower); + ammeterStatisListVo.setReActiveTotalKwh(reactivePower); + if ( activePower != null && reactivePower !=null + && activePower.compareTo(BigDecimal.ZERO) > 0 + && reactivePower.compareTo(BigDecimal.ZERO) > 0){ + effect = reactivePower.divide(activePower, 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + // 每天的效率 + ammeterStatisListVo.setEffect(effect); + + // 处理汇总数据 + //dealWithAmmeterTotalDate(ammeterStatisListVo,totalVo); + } + + // 处理汇总的效率 + /*BigDecimal totalActive = totalVo.getActiveTotalKwh(); + BigDecimal totalReactive = totalVo.getReActiveTotalKwh(); + if ( totalActive != null && totalReactive !=null + && totalActive.compareTo(BigDecimal.ZERO) > 0 + && totalReactive.compareTo(BigDecimal.ZERO) >= 0){ + BigDecimal totalEffect = new BigDecimal(0); + totalEffect = totalReactive.divide(totalActive, 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + totalVo.setEffect(totalEffect); + } + dataList.add(totalVo);*/ + + return dataList; + } + + @Override + public List getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo) { + List resultList = emsDailyEnergyDataMapper.getRevenueDataBySiteId(requestVo.getSiteId(),requestVo.getStartTime(),requestVo.getEndTime()); + if (CollectionUtils.isEmpty(resultList)) { + return Collections.emptyList(); + } + //计算每天总收益和当日实际收益(放电总-充电总) + resultList.forEach(ammeterRevenue -> { + ammeterRevenue.setActiveTotalPrice(ammeterRevenue.getActivePeakPrice().add(ammeterRevenue.getActiveHighPrice()).add(ammeterRevenue.getActiveFlatPrice()).add(ammeterRevenue.getActiveValleyPrice())); + ammeterRevenue.setReActiveTotalPrice(ammeterRevenue.getReActivePeakPrice().add(ammeterRevenue.getReActiveHighPrice()).add(ammeterRevenue.getReActiveFlatPrice()).add(ammeterRevenue.getReActiveValleyPrice())); + ammeterRevenue.setActualRevenue(ammeterRevenue.getReActiveTotalPrice().subtract(ammeterRevenue.getActiveTotalPrice())); + }); + + return resultList; + } + + public static AmmeterRevenueStatisListVo calculateDailyBill(AmmeterStatisListVo ammeter, List priceList) { + AmmeterRevenueStatisListVo ammeterRevenue = new AmmeterRevenueStatisListVo(); + ammeterRevenue.setDataTime(ammeter.getDataTime()); + if (CollectionUtils.isEmpty(priceList)) { + return ammeterRevenue; + } + EnergyPriceConfigVo price = priceList.get(0); + ammeterRevenue.setActivePeakPrice(ammeter.getActivePeakKwh().multiply(price.getPeak())); + ammeterRevenue.setActiveHighPrice(ammeter.getActiveHighKwh().multiply(price.getHigh())); + ammeterRevenue.setActiveFlatPrice(ammeter.getActiveFlatKwh().multiply(price.getFlat())); + ammeterRevenue.setActiveValleyPrice(ammeter.getActiveValleyKwh().multiply(price.getValley())); + ammeterRevenue.setReActivePeakPrice(ammeter.getReActivePeakKwh().multiply(price.getPeak())); + ammeterRevenue.setReActiveHighPrice(ammeter.getReActiveHighKwh().multiply(price.getHigh())); + ammeterRevenue.setReActiveFlatPrice(ammeter.getReActiveFlatKwh().multiply(price.getFlat())); + ammeterRevenue.setReActiveValleyPrice(ammeter.getReActiveValleyKwh().multiply(price.getValley())); + ammeterRevenue.setActiveTotalPrice(ammeterRevenue.getActivePeakPrice().add(ammeterRevenue.getActiveHighPrice()).add(ammeterRevenue.getActiveFlatPrice()).add(ammeterRevenue.getActiveValleyPrice())); + ammeterRevenue.setReActiveTotalPrice(ammeterRevenue.getReActivePeakPrice().add(ammeterRevenue.getReActiveHighPrice()).add(ammeterRevenue.getReActiveFlatPrice()).add(ammeterRevenue.getReActiveValleyPrice())); + return ammeterRevenue; + } + + private static boolean isInTimeRange(String startTimeStr, String endTimeStr, String timePartStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + // 解析时间字符串为LocalTime对象 + LocalTime checkTime = LocalTime.parse(timePartStr, formatter); + // 定义时间范围 + LocalTime startTime = LocalTime.parse(startTimeStr, formatter); + LocalTime endTime = LocalTime.parse(endTimeStr, formatter); + // 判断时间是否在指定范围内 + return checkTime.compareTo(startTime) >= 0 + && checkTime.compareTo(endTime) < 0; + } + + private static void calculateByCostType(AmmeterStatisListVo ammeter, EnergyPriceConfigVo priceConfig, AmmeterRevenueStatisListVo ammeterRevenue) { + switch (CostType.getEnumByCode(priceConfig.getCostType())) { + case PEAK: + ammeterRevenue.setActivePeakPrice(ammeterRevenue.getActivePeakPrice().add(ammeter.getActiveTotalKwh().multiply(priceConfig.getPeak()))); + ammeterRevenue.setReActivePeakPrice(ammeterRevenue.getReActivePeakPrice().add(ammeter.getReActiveTotalKwh().multiply(priceConfig.getPeak()))); + break; + case HIGH: + ammeterRevenue.setActiveHighPrice(ammeterRevenue.getActiveHighPrice().add(ammeter.getActiveTotalKwh().multiply(priceConfig.getHigh()))); + ammeterRevenue.setReActiveHighPrice(ammeterRevenue.getReActiveHighPrice().add(ammeter.getReActiveTotalKwh().multiply(priceConfig.getHigh()))); + break; + case FLAT: + ammeterRevenue.setActiveFlatPrice(ammeterRevenue.getActiveFlatPrice().add(ammeter.getActiveTotalKwh().multiply(priceConfig.getFlat()))); + ammeterRevenue.setReActiveFlatPrice(ammeterRevenue.getReActiveFlatPrice().add(ammeter.getReActiveTotalKwh().multiply(priceConfig.getFlat()))); + break; + case VALLEY: + ammeterRevenue.setActiveValleyPrice(ammeterRevenue.getActiveValleyPrice().add(ammeter.getActiveTotalKwh().multiply(priceConfig.getValley()))); + ammeterRevenue.setReActiveValleyPrice(ammeterRevenue.getReActiveValleyPrice().add(ammeter.getReActiveTotalKwh().multiply(priceConfig.getValley()))); + break; + default: + break; + } + } + + private static List generateTargetDates(String startDateStr, String endDateStr) { + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 解析日期字符串 + LocalDate startDate = LocalDate.parse(startDateStr, formatter); + LocalDate endDate = LocalDate.parse(endDateStr, formatter); + + List targetDates = new ArrayList<>(); + targetDates.add(startDate); // 添加起始日期 + while (startDate.isBefore(endDate)) { + startDate = startDate.plusDays(1); // 递增1天 + targetDates.add(startDate); // 添加递增后的日期 + } + return targetDates; + } + + private void dealWithAmmeterTotalDate(AmmeterStatisListVo ammeterStatisListVo, AmmeterStatisListVo totalVo) { + // 有功 + totalVo.setActiveTotalKwh(totalVo.getActiveTotalKwh().add(ammeterStatisListVo.getActiveTotalKwh())); + totalVo.setActivePeakKwh(totalVo.getActivePeakKwh().add(ammeterStatisListVo.getActivePeakKwh())); + totalVo.setActiveHighKwh(totalVo.getActiveHighKwh().add(ammeterStatisListVo.getActiveHighKwh())); + totalVo.setActiveFlatKwh(totalVo.getActiveFlatKwh().add(ammeterStatisListVo.getActiveFlatKwh())); + totalVo.setActiveValleyKwh(totalVo.getActiveValleyKwh().add(ammeterStatisListVo.getActiveValleyKwh())); + // 无功 + totalVo.setReActiveTotalKwh(totalVo.getReActiveTotalKwh().add(ammeterStatisListVo.getReActiveTotalKwh())); + totalVo.setReActivePeakKwh(totalVo.getReActivePeakKwh().add(ammeterStatisListVo.getReActivePeakKwh())); + totalVo.setReActiveHighKwh(totalVo.getReActiveHighKwh().add(ammeterStatisListVo.getReActiveHighKwh())); + totalVo.setReActiveFlatKwh(totalVo.getReActiveFlatKwh().add(ammeterStatisListVo.getReActiveFlatKwh())); + totalVo.setReActiveValleyKwh(totalVo.getReActiveValleyKwh().add(ammeterStatisListVo.getReActiveValleyKwh())); + } + + // 功率曲线 + @Override + public List getPowerDataList(DateSearchRequest requestVo) { + List dataList = new ArrayList<>(); + + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + if (startDate == null || endDate == null) { + // 默认按分钟展示-前一个小时数据 + LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1).truncatedTo(ChronoUnit.MINUTES); + startDate = DateUtils.toDate(oneHourAgo); + requestVo.setStartDate(startDate); + requestVo.setEndDate(DateUtils.getNowDate()); +// dataList = emsAmmeterDataMapper.getPowerDataByMinutes(requestVo); +// // 生成目标时间点列表(每分钟一个) +// List targetMinutes = new ArrayList<>(60); +// LocalDateTime current = oneHourAgo; +// +// for (int i = 0; i < 60; i++) { +// targetMinutes.add(current); // 添加当前分钟 +// current = current.plusMinutes(1); // 递增1分钟 +// } +// +// // 填充数据 +// if (dataList != null && dataList.size() >= 0){ +// dataList = fillEveryMinutesData(dataList,targetMinutes); +// } + } + // 开始日期和结束日期同一天,展示 0-24 小时数据 + else if (DateUtils.isSameDay(startDate, endDate)){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); +// dataList = emsAmmeterDataMapper.getPowerDataByHour(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 +// dataList = emsAmmeterDataMapper.getPowerDataByDay(requestVo); + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 个月,按月展示数据 +// dataList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo); + } + // 都按照5分钟一个数据点展示数据 + dataList = emsAmmeterDataMapper.getPowerDataByMinute(requestVo); + + // 负荷功率 + dealDataPower(requestVo.getSiteId(),dataList); + return dataList.stream().sorted(Comparator.comparing(PowerStatisListVo::getStatisDate)).collect(Collectors.toList()); + } + + private List fillEveryMinutesData(List dataList, List targetMinutes) { + + List powerStatisListVoList = new ArrayList<>(); + if (targetMinutes == null || targetMinutes.isEmpty()) { + return dataList; + } + + // 数组转化成Map便于后续获取数据 + Map dataMap = dataList.stream() + .map(data -> new PowerStatisListVo( + data.getStatisDate(), + data.getGridPower(), + data.getStoragePower(), + data.getPvPower() + )).collect(Collectors.toMap( + PowerStatisListVo::getStatisDate, + data -> data, + (existing, replacement) -> replacement + )); + + PowerStatisListVo lastData = null; + // 遍历时间数组 + for (LocalDateTime targetMinute : targetMinutes) { + String tarteDate = DateUtils.convertToString(targetMinute); + PowerStatisListVo currentData = dataMap.get(tarteDate); + if (currentData == null && lastData != null) { + BigDecimal pvPower = lastData.getPvPower()==null?new BigDecimal(0) :lastData.getGridPower(); + BigDecimal storagePower = lastData.getStoragePower()==null?new BigDecimal(0) :lastData.getGridPower(); + BigDecimal gridPower = lastData.getGridPower()==null?new BigDecimal(0) :lastData.getGridPower(); + currentData = new PowerStatisListVo(tarteDate.toString(),gridPower,storagePower,pvPower); + } else if (currentData == null && lastData == null){ + // 开头无数据,所有字段设为null + currentData = new PowerStatisListVo(tarteDate.toString(), new BigDecimal(0), new BigDecimal(0), new BigDecimal(0)); + } + lastData = currentData; + powerStatisListVoList.add(currentData); + } + return powerStatisListVoList; + } + + private void dealDataPower(String siteId, List dataList) { + if (dataList == null || dataList.size() == 0){ + return; + } + + for (PowerStatisListVo powerStatisListVo : dataList) { + BigDecimal gridPower = powerStatisListVo.getGridPower() == null ? BigDecimal.ZERO : powerStatisListVo.getGridPower(); + BigDecimal storagePower = powerStatisListVo.getStoragePower() == null ? BigDecimal.ZERO : powerStatisListVo.getStoragePower(); + BigDecimal pvPower = powerStatisListVo.getPvPower() == null ? BigDecimal.ZERO : powerStatisListVo.getPvPower(); + BigDecimal loadPower = new BigDecimal(0); + + // 负荷功率=电网功率+光伏功率-储能功率 + loadPower = gridPower.add(pvPower).subtract(storagePower); + powerStatisListVo.setLoadPower(loadPower); +// // 电动所:负荷功率=电网功率+光伏功率-储能功率 +// if (SiteEnum.DDS.getCode().equals(siteId)){ +// loadPower = gridPower.add(pvPower).subtract(storagePower); +// powerStatisListVo.setLoadPower(loadPower); +// } else if (SiteEnum.FX.getCode().equals(siteId)){ +// // 奉贤:负荷功率=电网功率-储能功率; +// loadPower = gridPower.subtract(storagePower); +// powerStatisListVo.setLoadPower(loadPower); +// } + } + } + + // 统计入参时间处理 + public void dealRequestTime(DateSearchRequest requestVo){ + + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + if (startDate == null && endDate == null) { + // 如果没有传时间,默认从今天往前7天 + LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); + startDate = DateUtils.toDate(sevenDaysAgo); + endDate = new Date(); + requestVo.setStartDate(startDate); + requestVo.setEndDate(endDate); + } + } + + /** + * 获取单个单体电池数据-默认7天 + * @param requestVo + * @return + */ + @Override + public List getSingleBatteryData(DateSearchRequest requestVo) { + // 默认时间-7天 + dealRequestTime(requestVo); + return emsBatteryDataDayMapper.getBatteryDayData(requestVo); + } + + @Override + public void exportAmmeterData(HttpServletResponse response, StatisAmmeterDateRequest requestVo) { + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("电表报表"); + sheet.setDefaultColumnWidth(10); + sheet.setDefaultRowHeightInPoints(25); + + // 设置第一行 + Row row1 = sheet.createRow(0); + Cell cell1 = row1.createCell(0); + cell1.setCellValue("汇总"); + Cell cell2 = row1.createCell(1); + cell2.setCellValue("充电量"); + Cell cell3 = row1.createCell(6); + cell3.setCellValue("放电量"); + Cell cell4 = row1.createCell(11); + cell4.setCellValue("效率"); + + // 合并充电量列 + CellRangeAddress mergeRegion1 = new CellRangeAddress(0, 0, 1, 5); + sheet.addMergedRegion(mergeRegion1); + + // 合并放电量列 + CellRangeAddress mergeRegion2 = new CellRangeAddress(0, 0, 6, 10); + sheet.addMergedRegion(mergeRegion2); + + // 设置第二行 + Row row2 = sheet.createRow(1); + Cell cell5 = row2.createCell(0); + cell5.setCellValue("日期"); + Cell cell6 = row2.createCell(1); + cell6.setCellValue("尖"); + Cell cell7 = row2.createCell(2); + cell7.setCellValue("峰"); + Cell cell8 = row2.createCell(3); + cell8.setCellValue("平"); + Cell cell9 = row2.createCell(4); + cell9.setCellValue("谷"); + Cell cell10 = row2.createCell(5); + cell10.setCellValue("总"); + Cell cell11 = row2.createCell(6); + cell11.setCellValue("尖"); + Cell cell12 = row2.createCell(7); + cell12.setCellValue("峰"); + Cell cell13 = row2.createCell(8); + cell13.setCellValue("平"); + Cell cell14 = row2.createCell(9); + cell14.setCellValue("谷"); + Cell cell15 = row2.createCell(10); + cell15.setCellValue("总"); + Cell cell16 = row2.createCell(11); + cell16.setCellValue(""); + + // 设置背景颜色 + CellStyle headerStyle = workbook.createCellStyle(); + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + headerStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 应用样式到第一行和第二行 + Iterator row1CellIterator = row1.cellIterator(); + while (row1CellIterator.hasNext()) { + int i = row1CellIterator.next().getColumnIndex(); + row1.getCell(i).setCellStyle(headerStyle); + } + Iterator row2CellIterator = row2.cellIterator(); + while (row2CellIterator.hasNext()) { + int i = row2CellIterator.next().getColumnIndex(); + row2.getCell(i).setCellStyle(headerStyle); + } + + // 设置数据行颜色 + CellStyle row1Style = workbook.createCellStyle(); + row1Style.setAlignment(HorizontalAlignment.CENTER); + row1Style.setVerticalAlignment(VerticalAlignment.CENTER); + row1Style.setBorderTop(BorderStyle.THIN); + row1Style.setBorderBottom(BorderStyle.THIN); + row1Style.setBorderLeft(BorderStyle.THIN); + row1Style.setBorderRight(BorderStyle.THIN); + row1Style.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + row1Style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle row2Style = workbook.createCellStyle(); + row2Style.setAlignment(HorizontalAlignment.CENTER); + row2Style.setVerticalAlignment(VerticalAlignment.CENTER); + row2Style.setBorderTop(BorderStyle.THIN); + row2Style.setBorderBottom(BorderStyle.THIN); + row2Style.setBorderLeft(BorderStyle.THIN); + row2Style.setBorderRight(BorderStyle.THIN); + row2Style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + row2Style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + int rowIndex = 2; + // 查询电量报表数据,添加数据行 + List ammeterDataList = getAmmeterDataResult(requestVo); + for (int i = rowIndex; i < ammeterDataList.size() + rowIndex; i++) { + AmmeterStatisListVo ammeterStatisVo = ammeterDataList.get(i - rowIndex); + Row dataRow = sheet.createRow(i); + Cell dataCell1 = dataRow.createCell(0); + dataCell1.setCellValue(ammeterStatisVo.getDataTime()); + Cell dataCell2 = dataRow.createCell(1); + dataCell2.setCellValue(ammeterStatisVo.getActivePeakKwh().doubleValue()); + Cell dataCell3 = dataRow.createCell(2); + dataCell3.setCellValue(ammeterStatisVo.getActiveHighKwh().doubleValue()); + Cell dataCell4 = dataRow.createCell(3); + dataCell4.setCellValue(ammeterStatisVo.getActiveFlatKwh().doubleValue()); + Cell dataCell5 = dataRow.createCell(4); + dataCell5.setCellValue(ammeterStatisVo.getActiveValleyKwh().doubleValue()); + Cell dataCell6 = dataRow.createCell(5); + dataCell6.setCellValue(ammeterStatisVo.getActiveTotalKwh().doubleValue()); + Cell dataCell7 = dataRow.createCell(6); + dataCell7.setCellValue(ammeterStatisVo.getReActivePeakKwh().doubleValue()); + Cell dataCell8 = dataRow.createCell(7); + dataCell8.setCellValue(ammeterStatisVo.getReActiveHighKwh().doubleValue()); + Cell dataCell9 = dataRow.createCell(8); + dataCell9.setCellValue(ammeterStatisVo.getReActiveFlatKwh().doubleValue()); + Cell dataCell10 = dataRow.createCell(9); + dataCell10.setCellValue(ammeterStatisVo.getReActiveValleyKwh().doubleValue()); + Cell dataCell11 = dataRow.createCell(10); + dataCell11.setCellValue(ammeterStatisVo.getReActiveTotalKwh().doubleValue()); + Cell dataCell12 = dataRow.createCell(11); + dataCell12.setCellValue(ammeterStatisVo.getEffect().doubleValue()); + + // 根据行号设置背景色 + if (i % 2 == 0) { + for (int k = 0; k < dataRow.getLastCellNum(); k++) { + dataRow.getCell(k).setCellStyle(row1Style); + } + } else { + for (int k = 0; k < dataRow.getLastCellNum(); k++) { + dataRow.getCell(k).setCellStyle(row2Style); + } + } + } + + try + { + String fileName = "电表报表" + "_" + UUID.randomUUID() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); + workbook.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出电表报表异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(workbook); + } + } + + @Override + public void exportAmmeterRevenueData(HttpServletResponse response, StatisAmmeterDateRequest requestVo) { + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("收益报表"); + sheet.setDefaultColumnWidth(10); + sheet.setDefaultRowHeightInPoints(25); + + // 设置第一行 + Row row1 = sheet.createRow(0); + Cell cell1 = row1.createCell(0); + cell1.setCellValue("汇总"); + Cell cell2 = row1.createCell(1); + cell2.setCellValue("充电价格"); + Cell cell3 = row1.createCell(6); + cell3.setCellValue("放电价格"); + Cell cell4 = row1.createCell(11); + cell4.setCellValue(""); + + // 合并充电量列 + CellRangeAddress mergeRegion1 = new CellRangeAddress(0, 0, 1, 5); + sheet.addMergedRegion(mergeRegion1); + + // 合并放电量列 + CellRangeAddress mergeRegion2 = new CellRangeAddress(0, 0, 6, 10); + sheet.addMergedRegion(mergeRegion2); + + // 设置第二行 + Row row2 = sheet.createRow(1); + Cell cell5 = row2.createCell(0); + cell5.setCellValue("日期"); + Cell cell6 = row2.createCell(1); + cell6.setCellValue("尖"); + Cell cell7 = row2.createCell(2); + cell7.setCellValue("峰"); + Cell cell8 = row2.createCell(3); + cell8.setCellValue("平"); + Cell cell9 = row2.createCell(4); + cell9.setCellValue("谷"); + Cell cell10 = row2.createCell(5); + cell10.setCellValue("总"); + Cell cell11 = row2.createCell(6); + cell11.setCellValue("尖"); + Cell cell12 = row2.createCell(7); + cell12.setCellValue("峰"); + Cell cell13 = row2.createCell(8); + cell13.setCellValue("平"); + Cell cell14 = row2.createCell(9); + cell14.setCellValue("谷"); + Cell cell15 = row2.createCell(10); + cell15.setCellValue("总"); + Cell cell16 = row2.createCell(11); + cell16.setCellValue("实际收益"); + + // 设置背景颜色 + CellStyle headerStyle = workbook.createCellStyle(); + Font headerFont = workbook.createFont(); + headerFont.setBold(true); + headerStyle.setFont(headerFont); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headerStyle.setBorderTop(BorderStyle.THIN); + headerStyle.setBorderBottom(BorderStyle.THIN); + headerStyle.setBorderLeft(BorderStyle.THIN); + headerStyle.setBorderRight(BorderStyle.THIN); + headerStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex()); + headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 应用样式到第一行和第二行 + Iterator row1CellIterator = row1.cellIterator(); + while (row1CellIterator.hasNext()) { + int i = row1CellIterator.next().getColumnIndex(); + row1.getCell(i).setCellStyle(headerStyle); + } + Iterator row2CellIterator = row2.cellIterator(); + while (row2CellIterator.hasNext()) { + int i = row2CellIterator.next().getColumnIndex(); + row2.getCell(i).setCellStyle(headerStyle); + } + + // 设置数据行颜色 + CellStyle row1Style = workbook.createCellStyle(); + row1Style.setAlignment(HorizontalAlignment.CENTER); + row1Style.setVerticalAlignment(VerticalAlignment.CENTER); + row1Style.setBorderTop(BorderStyle.THIN); + row1Style.setBorderBottom(BorderStyle.THIN); + row1Style.setBorderLeft(BorderStyle.THIN); + row1Style.setBorderRight(BorderStyle.THIN); + row1Style.setFillForegroundColor(IndexedColors.WHITE.getIndex()); + row1Style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + CellStyle row2Style = workbook.createCellStyle(); + row2Style.setAlignment(HorizontalAlignment.CENTER); + row2Style.setVerticalAlignment(VerticalAlignment.CENTER); + row2Style.setBorderTop(BorderStyle.THIN); + row2Style.setBorderBottom(BorderStyle.THIN); + row2Style.setBorderLeft(BorderStyle.THIN); + row2Style.setBorderRight(BorderStyle.THIN); + row2Style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + row2Style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 查询电量报表数据,添加数据行 + BigDecimal activeTotalPrice = BigDecimal.ZERO; + BigDecimal activePeakPrice = BigDecimal.ZERO; + BigDecimal activeHighPrice = BigDecimal.ZERO; + BigDecimal activeFlatPrice = BigDecimal.ZERO; + BigDecimal activeValleyPrice = BigDecimal.ZERO; + BigDecimal reActiveTotalPrice = BigDecimal.ZERO; + BigDecimal reActivePeakPrice = BigDecimal.ZERO; + BigDecimal reActiveHighPrice = BigDecimal.ZERO; + BigDecimal reActiveFlatPrice = BigDecimal.ZERO; + BigDecimal reActiveValleyPrice = BigDecimal.ZERO; + BigDecimal actualRevenue = BigDecimal.ZERO; + List ammeterRevenueDataList = getAmmeterRevenueDataResult(requestVo); + int rowIndex = 2; + int lastRowIndex = ammeterRevenueDataList.size() + rowIndex; + for (int i = rowIndex; i < lastRowIndex; i++) { + AmmeterRevenueStatisListVo ammeterRevenueStatisVo = ammeterRevenueDataList.get(i - rowIndex); + Row dataRow = sheet.createRow(i); + Cell dataCell1 = dataRow.createCell(0); + dataCell1.setCellValue(ammeterRevenueStatisVo.getDataTime()); + Cell dataCell2 = dataRow.createCell(1); + dataCell2.setCellValue(ammeterRevenueStatisVo.getActivePeakPrice().doubleValue()); + Cell dataCell3 = dataRow.createCell(2); + dataCell3.setCellValue(ammeterRevenueStatisVo.getActiveHighPrice().doubleValue()); + Cell dataCell4 = dataRow.createCell(3); + dataCell4.setCellValue(ammeterRevenueStatisVo.getActiveFlatPrice().doubleValue()); + Cell dataCell5 = dataRow.createCell(4); + dataCell5.setCellValue(ammeterRevenueStatisVo.getActiveValleyPrice().doubleValue()); + Cell dataCell6 = dataRow.createCell(5); + dataCell6.setCellValue(ammeterRevenueStatisVo.getActiveTotalPrice().doubleValue()); + Cell dataCell7 = dataRow.createCell(6); + dataCell7.setCellValue(ammeterRevenueStatisVo.getReActivePeakPrice().doubleValue()); + Cell dataCell8 = dataRow.createCell(7); + dataCell8.setCellValue(ammeterRevenueStatisVo.getReActiveHighPrice().doubleValue()); + Cell dataCell9 = dataRow.createCell(8); + dataCell9.setCellValue(ammeterRevenueStatisVo.getReActiveFlatPrice().doubleValue()); + Cell dataCell10 = dataRow.createCell(9); + dataCell10.setCellValue(ammeterRevenueStatisVo.getReActiveValleyPrice().doubleValue()); + Cell dataCell11 = dataRow.createCell(10); + dataCell11.setCellValue(ammeterRevenueStatisVo.getReActiveValleyPrice().doubleValue()); + Cell dataCell12 = dataRow.createCell(11); + dataCell12.setCellValue(ammeterRevenueStatisVo.getActualRevenue().doubleValue()); + + // 根据行号设置背景色 + if (i % 2 == 0) { + for (int k = 0; k < dataRow.getLastCellNum(); k++) { + dataRow.getCell(k).setCellStyle(row1Style); + } + } else { + for (int k = 0; k < dataRow.getLastCellNum(); k++) { + dataRow.getCell(k).setCellStyle(row2Style); + } + } + + // 最后一行合计 + activePeakPrice = activePeakPrice.add(ammeterRevenueStatisVo.getActivePeakPrice()); + activeHighPrice = activeHighPrice.add(ammeterRevenueStatisVo.getActiveHighPrice()); + activeFlatPrice = activeFlatPrice.add(ammeterRevenueStatisVo.getActiveFlatPrice()); + activeValleyPrice = activeValleyPrice.add(ammeterRevenueStatisVo.getActiveValleyPrice()); + activeTotalPrice = activeTotalPrice.add(ammeterRevenueStatisVo.getActiveTotalPrice()); + reActivePeakPrice = reActivePeakPrice.add(ammeterRevenueStatisVo.getReActivePeakPrice()); + reActiveHighPrice = reActiveHighPrice.add(ammeterRevenueStatisVo.getReActiveHighPrice()); + reActiveFlatPrice = reActiveFlatPrice.add(ammeterRevenueStatisVo.getReActiveFlatPrice()); + reActiveValleyPrice = reActiveValleyPrice.add(ammeterRevenueStatisVo.getReActiveValleyPrice()); + reActiveTotalPrice = reActiveTotalPrice.add(ammeterRevenueStatisVo.getReActiveTotalPrice()); + actualRevenue = actualRevenue.add(ammeterRevenueStatisVo.getActualRevenue()); + } + + if (!CollectionUtils.isEmpty(ammeterRevenueDataList)) { + // 设置第后一行 + Row lastRow = sheet.createRow(lastRowIndex); + Cell lastRowCell1 = lastRow.createCell(0); + lastRowCell1.setCellValue("合计"); + Cell lastRowCell2 = lastRow.createCell(1); + lastRowCell2.setCellValue(activePeakPrice.doubleValue()); + Cell lastRowCell3 = lastRow.createCell(2); + lastRowCell3.setCellValue(activeHighPrice.doubleValue()); + Cell lastRowCell4 = lastRow.createCell(3); + lastRowCell4.setCellValue(activeFlatPrice.doubleValue()); + Cell lastRowCell5 = lastRow.createCell(4); + lastRowCell5.setCellValue(activeValleyPrice.doubleValue()); + Cell lastRowCell6 = lastRow.createCell(5); + lastRowCell6.setCellValue(activeTotalPrice.doubleValue()); + Cell lastRowCell7 = lastRow.createCell(6); + lastRowCell7.setCellValue(reActivePeakPrice.doubleValue()); + Cell lastRowCell8 = lastRow.createCell(7); + lastRowCell8.setCellValue(reActiveHighPrice.doubleValue()); + Cell lastRowCell9 = lastRow.createCell(8); + lastRowCell9.setCellValue(reActiveFlatPrice.doubleValue()); + Cell lastRowCell10 = lastRow.createCell(9); + lastRowCell10.setCellValue(reActiveValleyPrice.doubleValue()); + Cell lastRowCell11 = lastRow.createCell(10); + lastRowCell11.setCellValue(reActiveTotalPrice.doubleValue()); + Cell lastRowCell12 = lastRow.createCell(11); + lastRowCell12.setCellValue(actualRevenue.doubleValue()); + Iterator lastRowCellIterator = lastRow.cellIterator(); + while (lastRowCellIterator.hasNext()) { + int i = lastRowCellIterator.next().getColumnIndex(); + lastRow.getCell(i).setCellStyle(headerStyle); + } + } + + try + { + String fileName = "收益报表" + "_" + UUID.randomUUID() + ".xlsx"; + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); + workbook.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出收益报表异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(workbook); + } + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyCurveServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyCurveServiceImpl.java new file mode 100644 index 0000000..c7e2d43 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyCurveServiceImpl.java @@ -0,0 +1,143 @@ +package com.xzzn.ems.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.vo.StrategyCurveVo; +import com.xzzn.ems.domain.vo.StrategyPowerDataVo; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsStrategyCurveMapper; +import com.xzzn.ems.domain.EmsStrategyCurve; +import com.xzzn.ems.service.IEmsStrategyCurveService; + +/** + * 策曲线Service业务层处理 + * + * @author xzzn + * @date 2025-07-11 + */ +@Service +public class EmsStrategyCurveServiceImpl implements IEmsStrategyCurveService +{ + @Autowired + private EmsStrategyCurveMapper emsStrategyCurveMapper; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + + /** + * 查询策曲线 + * + * @param id 策曲线主键 + * @return 策曲线 + */ + @Override + public EmsStrategyCurve selectEmsStrategyCurveById(Long id) + { + return emsStrategyCurveMapper.selectEmsStrategyCurveById(id); + } + + /** + * 查询策曲线列表 + * + * @param emsStrategyCurve 策曲线 + * @return 策曲线 + */ + @Override + public List selectEmsStrategyCurveList(EmsStrategyCurve emsStrategyCurve) + { + return emsStrategyCurveMapper.selectEmsStrategyCurveList(emsStrategyCurve); + } + + /** + * 新增策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + @Override + public int insertEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve) + { + emsStrategyCurve.setCreateTime(DateUtils.getNowDate()); + return emsStrategyCurveMapper.insertEmsStrategyCurve(emsStrategyCurve); + } + + /** + * 修改策曲线 + * + * @param emsStrategyCurve 策曲线 + * @return 结果 + */ + @Override + public int updateEmsStrategyCurve(EmsStrategyCurve emsStrategyCurve) + { + emsStrategyCurve.setUpdateTime(DateUtils.getNowDate()); + return emsStrategyCurveMapper.updateEmsStrategyCurve(emsStrategyCurve); + } + + /** + * 批量删除策曲线 + * + * @param ids 需要删除的策曲线主键 + * @return 结果 + */ + @Override + public int deleteEmsStrategyCurveByIds(Long[] ids) + { + return emsStrategyCurveMapper.deleteEmsStrategyCurveByIds(ids); + } + + /** + * 删除策曲线信息 + * + * @param id 策曲线主键 + * @return 结果 + */ + @Override + public int deleteEmsStrategyCurveById(Long id) + { + return emsStrategyCurveMapper.deleteEmsStrategyCurveById(id); + } + + @Override + public List getStrategyCurveList(EmsStrategyTemp tempConfig) { + List dataList = new ArrayList(); + String siteId = tempConfig.getSiteId(); + Long strategyId = tempConfig.getStrategyId(); + // 获取该策略的所有模板配置 + List> tempList = emsStrategyTempMapper.getTempNameList(strategyId, siteId); + + if (tempList != null && !tempList.isEmpty()) { + for (Map map : tempList) { + String tempName = map.get("templateName"); + String tempId = map.get("templateId"); + + if (StringUtils.isNotEmpty(tempId)) { + List taskList = emsStrategyCurveMapper.getTemplateCurve(tempId); + + for (int i = 0; i < taskList.size(); i++) { + StrategyCurveVo vo = new StrategyCurveVo(); + vo.setTemplateName(tempName); + vo.setTemplateId(tempId); + vo.setStrategyId(taskList.get(i).getStrategyId()); + vo.setSiteId(taskList.get(i).getSiteId()); + vo.setMonth(taskList.get(i).getMonth()); + // 时间功率 + String powerJson = taskList.get(i).getPowerData(); + List powerList = JSON.parseArray(powerJson, StrategyPowerDataVo.class); + vo.setPowerList(powerList); + + dataList.add(vo); + } + } + } + } + return dataList; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java new file mode 100644 index 0000000..5900c46 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java @@ -0,0 +1,148 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.enums.StrategyStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.vo.StrategyRunningVo; +import com.xzzn.ems.mapper.EmsStrategyRunningMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsStrategyMapper; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.service.IEmsStrategyService; + +/** + * 策略Service业务层处理 + * + * @author xzzn + * @date 2025-07-10 + */ +@Service +public class EmsStrategyServiceImpl implements IEmsStrategyService +{ + @Autowired + private EmsStrategyMapper emsStrategyMapper; + @Autowired + private EmsStrategyRunningMapper emsStrategyRunningMapper; + + @Override + public List selectEmsStrategyRunningList(String siteId) { + return emsStrategyRunningMapper.getRunningList(siteId); + } + + @Override + public int stopRunningStrategy(Long id) { + return emsStrategyRunningMapper.stopEmsStrategyRunning(id); + } + + @Override + public List getMainStrategyList() { + return emsStrategyMapper.getStrategyListByType(1L); + } + + @Override + public List getAuxStrategyList() { + return emsStrategyMapper.getStrategyListByType(2L); + } + + @Override + public int configStrategy(EmsStrategyRunning emsStrategyRunning) { + // 校验是否已存在已运行的相同策略 + EmsStrategyRunning existStrategy = emsStrategyRunningMapper.selectEmsStrategyRunning(emsStrategyRunning); + if (existStrategy != null) { + return -1; + } + // 传策略组id-更新 + if (emsStrategyRunning.getId() != null){ + emsStrategyRunning.setUpdateTime(DateUtils.getNowDate()); + return emsStrategyRunningMapper.updateEmsStrategyRunning(emsStrategyRunning); + } + // 否则新增 + emsStrategyRunning.setStatus("1"); + emsStrategyRunning.setCreateTime(DateUtils.getNowDate()); + return emsStrategyRunningMapper.insertEmsStrategyRunning(emsStrategyRunning); + } + + @Override + public void dealStrategyRunningData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + String siteId = ""; + EmsStrategyRunning emsStrategyRunning = new EmsStrategyRunning(); + switch (operateType) { + case "INSERT": + StrategyRunningVo insertVo = JSON.parseObject(content, StrategyRunningVo.class); + BeanUtils.copyProperties(insertVo, emsStrategyRunning); + // 先校验策略是否存在,不存在则插入 + dealStrategyData(emsStrategyRunning, insertVo); + // 新增策略运行数据 + emsStrategyRunningMapper.insertEmsStrategyRunning(emsStrategyRunning); + break; + case "STOP": + EmsStrategyRunning vo = JSON.parseObject(content, EmsStrategyRunning.class); + siteId = vo.getSiteId(); + // 停止站点正在运行的策略即可 + EmsStrategyRunning runningStrategy = emsStrategyRunningMapper.getRunningStrategy(siteId); + emsStrategyRunningMapper.stopEmsStrategyRunning(runningStrategy.getId()); + break; + case "UPDATE": + StrategyRunningVo updateVo = JSON.parseObject(content, StrategyRunningVo.class); + siteId = updateVo.getSiteId(); + // 获取该站点是否有正在运行的策略,无则新增,有则更新 + EmsStrategyRunning existStrategy = emsStrategyRunningMapper.getRunningStrategy(siteId); + if (existStrategy == null) { + BeanUtils.copyProperties(updateVo, emsStrategyRunning); + // 先校验策略是否存在,不存在则插入 + dealStrategyData(emsStrategyRunning, updateVo); + emsStrategyRunningMapper.insertEmsStrategyRunning(emsStrategyRunning); + } else { + // 校验更新的主副策略是否存在,不存在则插入,存在则获取id + dealStrategyData(existStrategy, updateVo); + emsStrategyRunning.setCreateTime(DateUtils.getNowDate()); + emsStrategyRunningMapper.updateEmsStrategyRunning(existStrategy); + } + break; + default: + // 未知操作类型-不同步 + break; + } + } + + private void dealStrategyData(EmsStrategyRunning emsStrategyRunning, StrategyRunningVo insertVo) { + // 主策略 + String mainStrategyName = insertVo.getMainStrategyName(); + EmsStrategy mainStrategy = emsStrategyMapper.getStrategyByName(mainStrategyName); + if (mainStrategy != null) { + emsStrategyRunning.setMainStrategyId(mainStrategy.getId()); + } else { + mainStrategy = createStrategyEntity(mainStrategyName, 1L); + emsStrategyMapper.insertEmsStrategy(mainStrategy); + emsStrategyRunning.setMainStrategyId(mainStrategy.getId()); + } + // 副策略 + String auxStrategyName = insertVo.getAuxStrategyName(); + EmsStrategy auxStrategy = emsStrategyMapper.getStrategyByName(auxStrategyName); + if (auxStrategy != null) { + emsStrategyRunning.setAuxiliaryStrategyId(auxStrategy.getId()); + } else { + auxStrategy = createStrategyEntity(mainStrategyName, 2L); + emsStrategyMapper.insertEmsStrategy(auxStrategy); + emsStrategyRunning.setAuxiliaryStrategyId(auxStrategy.getId()); + } + } + + private EmsStrategy createStrategyEntity(String strategyName, Long type) { + EmsStrategy strategy = new EmsStrategy(); + strategy.setStrategyType(type); + strategy.setStrategyName(strategyName); + strategy.setStatus(StrategyStatus.RUNNING.getCode()); + strategy.setCreateTime(DateUtils.getNowDate()); + return strategy; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTempServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTempServiceImpl.java new file mode 100644 index 0000000..640cc91 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTempServiceImpl.java @@ -0,0 +1,215 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.enums.StrategyStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.common.utils.bean.BeanUtils; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.EmsStrategyTempTimeConfig; +import com.xzzn.ems.domain.vo.StrategyTempConfigRequest; +import com.xzzn.ems.domain.vo.SyncStrategyTempVo; +import com.xzzn.ems.mapper.EmsStrategyCurveMapper; +import com.xzzn.ems.mapper.EmsStrategyMapper; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import com.xzzn.ems.mapper.EmsStrategyTimeConfigMapper; +import com.xzzn.ems.service.IEmsStrategyTempService; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * 模板Service业务层处理 + * + * @author xzzn + * @date 2025-07-11 + */ +@Service +public class EmsStrategyTempServiceImpl implements IEmsStrategyTempService +{ + private static final String PREFIX= "Temp"; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + @Autowired + private EmsStrategyTimeConfigMapper emsStrategyTimeConfigMapper; + @Autowired + private EmsStrategyCurveMapper emsStrategyCurveMapper; + @Autowired + private EmsStrategyMapper emsStrategyMapper; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + /** + * 查询模板列表 + * + * @param templateId 模板 + * @return 模板 + */ + @Override + public List selectEmsStrategyTempList(String templateId) + { + return emsStrategyTempMapper.selectStrategyTempByTempId(templateId); + } + + /** + * 新增模板和时间配置 + * @param requestVo + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean addNewTempAndTimeConfig(StrategyTempConfigRequest requestVo) { + // 随机生产模板id格式:Temp+时间戳 + String templateId = requestVo.getTemplateId(); + if (StringUtils.isEmpty(templateId)) { + templateId = PREFIX + DateUtils.dateTimeNow(); + } + + EmsStrategyTemp publicTemp = new EmsStrategyTemp(); + BeanUtils.copyProperties(requestVo, publicTemp); + publicTemp.setTemplateId(templateId); + publicTemp.setCreateTime(DateUtils.getNowDate()); + + List timeList = requestVo.getTimeConfigList(); + if (timeList != null && !timeList.isEmpty()) { + for (EmsStrategyTempTimeConfig timeConfig : timeList) { + EmsStrategyTemp temp = new EmsStrategyTemp(); + BeanUtils.copyProperties(publicTemp, temp); + // 时间设置 + temp.setStartTime(timeConfig.getStartTime()); + temp.setEndTime(timeConfig.getEndTime()); + temp.setChargeDischargePower(timeConfig.getChargeDischargePower()); + temp.setChargeStatus(timeConfig.getChargeStatus()); + emsStrategyTempMapper.insertEmsStrategyTemp(temp); + } + } else {// 无时间配置只配置模板基本信息 + emsStrategyTempMapper.insertEmsStrategyTemp(publicTemp); + } + return true; + } + + /** + * 修改模板 + * + * @param requestVo 模板 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateEmsStrategyTemp(StrategyTempConfigRequest requestVo) + { + String templateId = requestVo.getTemplateId(); + // 无发匹配原数据 + // 全删 + emsStrategyTempMapper.deleteTempByTempId(templateId); + + // 根据模版id 删除推送的曲线图数据 + emsStrategyCurveMapper.physicalDeleteByTemplateId(templateId); + // 设置该模版的时间配置为待下发 + emsStrategyTimeConfigMapper.updateTimeConfigWaitingPost(templateId); + // 重新新增 + addNewTempAndTimeConfig(requestVo); + + return true; + } + + @Override + public List> getTempNameList(Long strategyId, String siteId) { + return emsStrategyTempMapper.getTempNameList(strategyId, siteId); + } + + + @Override + public int deleteStrategyTempById(String templateId) { + // 先更新配置该模板的月份数据 + emsStrategyTimeConfigMapper.cleanTemplateId(templateId); + // 根据模版id 删除推送的曲线图数据 + emsStrategyCurveMapper.physicalDeleteByTemplateId(templateId); + + return emsStrategyTempMapper.deleteTempByTempId(templateId); + } + + @Override + public void dealStrategyTempData(String content, String operateType) throws JsonProcessingException { + if (StringUtils.isEmpty(content)) { + return; + } + String siteId = ""; + EmsStrategyTemp temp = new EmsStrategyTemp(); + switch (operateType) { + case "INSERT": + SyncStrategyTempVo syncVo = JSON.parseObject(content, SyncStrategyTempVo.class); + //转换开始和结束时间 + convertStringToDate(content, syncVo); + BeanUtils.copyProperties(syncVo, temp); + // 先校验策略是否存在,不存在则插入 + dealStrategyData(temp, syncVo); + // 新增策略运行数据 + emsStrategyTempMapper.insertEmsStrategyTemp(temp); + break; + case "DELETE": + JsonNode jsonNode = objectMapper.readTree(content); + String tempId = jsonNode.get("templateId").asText(); + // 删除模版 + deleteStrategyTempById(tempId); + break; + default: + // 未知操作类型-不同步 + break; + } + } + + private void convertStringToDate(String content, SyncStrategyTempVo syncVo) throws JsonProcessingException { + JsonNode rootNode = objectMapper.readTree(content); + String startTime = rootNode.path("startTime").asText(); + String endTime = rootNode.path("endTime").asText(); + if (startTime != null && !"null".equals(startTime)) { + syncVo.setStartTime(parseTimeStringToDate(startTime)); + } + if (endTime != null && !"null".equals(endTime)) { + syncVo.setEndTime(parseTimeStringToDate(endTime)); + } + } + + private Date parseTimeStringToDate(String timeStr) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + LocalTime time = LocalTime.parse(timeStr, formatter); + LocalDateTime dateTime = LocalDateTime.of(LocalDate.now(), time); + return Date.from(dateTime.atZone(ZoneId.of("Asia/Shanghai")).toInstant()); + } + + private void dealStrategyData(EmsStrategyTemp temp, SyncStrategyTempVo syncVo) { + // 主策略 + String mainStrategyName = syncVo.getStrategyName(); + EmsStrategy strategy = emsStrategyMapper.getStrategyByName(mainStrategyName); + if (strategy != null) { + temp.setStrategyId(strategy.getId()); + } else { + strategy = createStrategyEntity(mainStrategyName, syncVo.getStrategyType()); + emsStrategyMapper.insertEmsStrategy(strategy); + temp.setStrategyId(strategy.getId()); + } + } + + private EmsStrategy createStrategyEntity(String strategyName, Long type) { + EmsStrategy strategy = new EmsStrategy(); + strategy.setStrategyType(type); + strategy.setStrategyName(strategyName); + strategy.setStatus(StrategyStatus.RUNNING.getCode()); + strategy.setCreateTime(DateUtils.getNowDate()); + return strategy; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTimeConfigServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTimeConfigServiceImpl.java new file mode 100644 index 0000000..bd612d8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyTimeConfigServiceImpl.java @@ -0,0 +1,206 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.enums.StrategyStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.common.utils.bean.BeanUtils; +import com.xzzn.ems.domain.EmsStrategy; +import com.xzzn.ems.domain.vo.StrategyTimeConfigVo; +import com.xzzn.ems.domain.vo.SyncStrategyTimeConfigVo; +import com.xzzn.ems.mapper.EmsStrategyCurveMapper; +import com.xzzn.ems.mapper.EmsStrategyMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.EmsStrategyTimeConfigMapper; +import com.xzzn.ems.domain.EmsStrategyTimeConfig; +import com.xzzn.ems.service.IEmsStrategyTimeConfigService; + +/** + * 时间配置Service业务层处理 + * + * @author xzzn + * @date 2025-07-11 + */ +@Service +public class EmsStrategyTimeConfigServiceImpl implements IEmsStrategyTimeConfigService +{ + @Autowired + private EmsStrategyTimeConfigMapper emsStrategyTimeConfigMapper; + @Autowired + private EmsStrategyCurveMapper emsStrategyCurveMapper; + @Autowired + private EmsStrategyMapper emsStrategyMapper; + + /** + * 查询时间配置 + * + * @param id 时间配置主键 + * @return 时间配置 + */ + @Override + public EmsStrategyTimeConfig selectEmsStrategyTimeConfigById(Long id) + { + return emsStrategyTimeConfigMapper.selectEmsStrategyTimeConfigById(id); + } + + /** + * 查询时间配置列表 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 时间配置 + */ + @Override + public List selectEmsStrategyTimeConfigList(EmsStrategyTimeConfig emsStrategyTimeConfig) + { + return emsStrategyTimeConfigMapper.selectEmsStrategyTimeConfigList(emsStrategyTimeConfig); + } + + /** + * 新增时间配置 + * + * @param timeConfigList 时间配置 + * @return 结果 + */ + @Override + public boolean insertEmsStrategyTimeConfig(List timeConfigList) + { + if (timeConfigList != null) { + for (EmsStrategyTimeConfig strategyTimeConfig : timeConfigList) { + Long id = strategyTimeConfig.getId(); + Long strategyId = strategyTimeConfig.getStrategyId(); + String siteId = strategyTimeConfig.getSiteId(); + strategyTimeConfig.setIsPost(1);//默认未下发 + // 新增 + if (id == null) { + strategyTimeConfig.setCreateTime(DateUtils.getNowDate()); + emsStrategyTimeConfigMapper.insertEmsStrategyTimeConfig(strategyTimeConfig); + } else {//更新 + strategyTimeConfig.setUpdateTime(DateUtils.getNowDate()); + emsStrategyTimeConfigMapper.updateEmsStrategyTimeConfig(strategyTimeConfig); + } + // 处理曲线图:物理删除该策略的曲线图 + if (StringUtils.isNotEmpty(siteId) && strategyId != null) { + emsStrategyCurveMapper.physicalDeleteCurve(strategyId,siteId); + } + } + } else { + return false; + } + return true; + } + + /** + * 修改时间配置 + * + * @param emsStrategyTimeConfig 时间配置 + * @return 结果 + */ + @Override + public int updateEmsStrategyTimeConfig(EmsStrategyTimeConfig emsStrategyTimeConfig) + { + emsStrategyTimeConfig.setUpdateTime(DateUtils.getNowDate()); + return emsStrategyTimeConfigMapper.updateEmsStrategyTimeConfig(emsStrategyTimeConfig); + } + + /** + * 批量删除时间配置 + * + * @param ids 需要删除的时间配置主键 + * @return 结果 + */ + @Override + public int deleteEmsStrategyTimeConfigByIds(Long[] ids) + { + return emsStrategyTimeConfigMapper.deleteEmsStrategyTimeConfigByIds(ids); + } + + /** + * 删除时间配置信息 + * + * @param id 时间配置主键 + * @return 结果 + */ + @Override + public int deleteEmsStrategyTimeConfigById(Long id) + { + return emsStrategyTimeConfigMapper.deleteEmsStrategyTimeConfigById(id); + } + + /** + * 获取策略时间配置显示数据 + * @param emsStrategyTimeConfig 时间配置 + * @return + */ + public List getStrategyTimeList(EmsStrategyTimeConfig emsStrategyTimeConfig) + { + return emsStrategyTimeConfigMapper.getStrategyTimeList(emsStrategyTimeConfig); + } + + @Override + public void dealStrategyTimeData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } + String siteId = ""; + EmsStrategyTimeConfig timeConfig = new EmsStrategyTimeConfig(); + SyncStrategyTimeConfigVo syncVo = JSON.parseObject(content, SyncStrategyTimeConfigVo.class); + BeanUtils.copyProperties(syncVo, timeConfig); + // 先校验策略是否存在,不存在则插入 + dealStrategyData(timeConfig, syncVo); + switch (operateType) { + case "INSERT": + // 新增策略运行数据 + emsStrategyTimeConfigMapper.insertEmsStrategyTimeConfig(timeConfig); + break; + case "UPDATE": + // 根据站点 + strategyId + 月份判断是否存在数据存在则更新否则插入 + if (checkExistConfig(timeConfig)) { + emsStrategyTimeConfigMapper.updateEmsStrategyTimeConfig(timeConfig); + } else { + timeConfig.setCreateTime(DateUtils.getNowDate()); + emsStrategyTimeConfigMapper.insertEmsStrategyTimeConfig(timeConfig); + } + break; + default: + // 未知操作类型-不同步 + break; + } + } + + private boolean checkExistConfig(EmsStrategyTimeConfig timeConfig) { + boolean result = true; + String siteId = timeConfig.getSiteId(); + Long strategyId = timeConfig.getStrategyId(); + Long month = timeConfig.getMonth(); + EmsStrategyTimeConfig emsStrategyTimeConfig = emsStrategyTimeConfigMapper.getExistTimeConfig(siteId,strategyId,month); + if (emsStrategyTimeConfig == null) { + result = false; + } + return result; + } + + private void dealStrategyData(EmsStrategyTimeConfig temp, SyncStrategyTimeConfigVo syncVo) { + // 主策略 + String mainStrategyName = syncVo.getStrategyName(); + EmsStrategy strategy = emsStrategyMapper.getStrategyByName(mainStrategyName); + if (strategy != null) { + temp.setStrategyId(strategy.getId()); + } else { + strategy = createStrategyEntity(mainStrategyName, syncVo.getStrategyType()); + emsStrategyMapper.insertEmsStrategy(strategy); + temp.setStrategyId(strategy.getId()); + } + } + + private EmsStrategy createStrategyEntity(String strategyName, Long type) { + EmsStrategy strategy = new EmsStrategy(); + strategy.setStrategyType(type); + strategy.setStrategyName(strategyName); + strategy.setStatus(StrategyStatus.RUNNING.getCode()); + strategy.setCreateTime(DateUtils.getNowDate()); + return strategy; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsTicketServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsTicketServiceImpl.java index 83c2442..e8843af 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsTicketServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsTicketServiceImpl.java @@ -1,9 +1,17 @@ package com.xzzn.ems.service.impl; import java.util.List; +import java.util.Random; + +import com.xzzn.common.enums.AlarmStatus; import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAlarmRecords; import com.xzzn.ems.domain.EmsTicket; +import com.xzzn.ems.domain.vo.TicketListVo; +import com.xzzn.ems.mapper.EmsAlarmRecordsMapper; import com.xzzn.ems.mapper.EmsTicketMapper; +import com.xzzn.ems.service.IEmsAlarmRecordsService; import com.xzzn.ems.service.IEmsTicketService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,17 +28,21 @@ public class EmsTicketServiceImpl implements IEmsTicketService { @Autowired private EmsTicketMapper emsTicketMapper; + @Autowired + private EmsAlarmRecordsMapper emsAlarmRecordsMapper; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; /** - * 查询工单主 + * 查询工单主-工单详情 * * @param id 工单主主键 * @return 工单主 */ @Override - public EmsTicket selectEmsTicketById(String id) + public TicketListVo selectEmsTicketById(String id) { - return emsTicketMapper.selectEmsTicketById(id); + return emsTicketMapper.getTicketDetailInfo(id); } /** @@ -54,6 +66,12 @@ public class EmsTicketServiceImpl implements IEmsTicketService @Override public int insertEmsTicket(EmsTicket emsTicket) { + // 工单号随机生产 + String ticketNo = ""; + String nowDate = DateUtils.dateTime(); + ticketNo = "T" + nowDate + String.format("%06d", new Random().nextInt(1000000)); + emsTicket.setTicketNo(ticketNo); + emsTicket.setStatus(1L);//默认待处理 emsTicket.setCreateTime(DateUtils.getNowDate()); return emsTicketMapper.insertEmsTicket(emsTicket); } @@ -67,6 +85,21 @@ public class EmsTicketServiceImpl implements IEmsTicketService @Override public int updateEmsTicket(EmsTicket emsTicket) { + String status = emsTicket.getStatus() == null ? "" : emsTicket.getStatus().toString(); + String ticketNo = emsTicket.getTicketNo(); + // 判断工单状态为:3-已完成 + if (!StringUtils.isEmpty(status) && "3".equals(status) && !StringUtils.isEmpty(ticketNo)) { + // 处理告警数据状态-已处理 + EmsAlarmRecords emsAlarmRecords = emsAlarmRecordsMapper.getAlarmByTicketNo(ticketNo); + if (emsAlarmRecords != null) { + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + emsAlarmRecords.setAlarmEndTime(DateUtils.getNowDate()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + // 更新告警redis + iEmsAlarmRecordsService.updateRedisAlarmRecords(emsAlarmRecords.getSiteId(),emsAlarmRecords.getDeviceId()); + } + } emsTicket.setUpdateTime(DateUtils.getNowDate()); return emsTicketMapper.updateEmsTicket(emsTicket); } @@ -94,4 +127,26 @@ public class EmsTicketServiceImpl implements IEmsTicketService { return emsTicketMapper.deleteEmsTicketById(id); } + + /** + * 删除工单主信息-物理删除 + * + * @param id 工单主主键 + * @return 结果 + */ + @Override + public int dropEmsTicketById(String id) + { + return emsTicketMapper.dropEmsTicketById(id); + } + + /** + * 根据工单状态数组获取-工单列表 + * @param statusList + * @return + */ + @Override + public List getAllTicketList(Long[] statusList) { + return emsTicketMapper.getAllTicketList(statusList); + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXAlarmDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXAlarmDataProcessServiceImpl.java new file mode 100644 index 0000000..fc20b79 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXAlarmDataProcessServiceImpl.java @@ -0,0 +1,634 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.*; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.MapUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.*; +import com.xzzn.ems.mapper.EmsClusterAlarmDataMapper; +import com.xzzn.ems.mapper.EmsCoolingAlarmDataMapper; +import com.xzzn.ems.mapper.EmsPcsAlarmDataMapper; +import com.xzzn.ems.mapper.EmsStackAlarmDataMapper; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IFXXAlarmDataProcessService; +import com.xzzn.ems.utils.AbstractBatteryDataProcessor; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class FXXAlarmDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXAlarmDataProcessService { + private static final Log log = LogFactory.getLog(FXXAlarmDataProcessServiceImpl.class); + private static final String SITE_ID = "021_FXX_01"; + + @Autowired + private RedisCache redisCache; + + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + @Autowired + private EmsCoolingAlarmDataMapper emsCoolingAlarmDataMapper; + @Autowired + private EmsStackAlarmDataMapper emsStackAlarmDataMapper; + @Autowired + private EmsClusterAlarmDataMapper emsClusterAlarmDataMapper; + @Autowired + private EmsPcsAlarmDataMapper emsPcsAlarmDataMapper; + + // 构造方法(调用父类构造) + public FXXAlarmDataProcessServiceImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public void handleFxAlarmData(String message) { + JSONArray arraylist = JSONArray.parseArray(message); + + // 获取redis缓存-告警信息 + Map alarmMatchInfo= redisCache.getCacheObject(RedisKeyConstants.ALARM_MATCH_INFO); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.get("Device").toString(); + String jsonData = obj.get("Data").toString(); + Long timestamp = Long.valueOf(obj.get("timestamp").toString()); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + String deviceCategory = ""; + if (deviceId.contains("ZSLQ")) { + coolingDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("BMSD")) { + deviceCategory = DeviceCategory.STACK.getCode(); + stackDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("BMSC")) { + deviceCategory = DeviceCategory.CLUSTER.getCode(); + clusterDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("PCS")) { + deviceCategory = DeviceCategory.PCS.getCode(); + pcsDataProcess(deviceId, jsonData, dataUpdateTime); + } + if (StringUtils.isEmpty(deviceCategory)) { + // 处理告警信息 + alarmDataProcess(deviceId, jsonData, alarmMatchInfo, deviceCategory); + } + } + } + + private void pcsDataProcess(String deviceId, String jsonData, Date dataUpdateTime) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + EmsPcsAlarmData pcsAlarmData = new EmsPcsAlarmData(); + // 更新时间 + pcsAlarmData.setDataTimestamp(dataUpdateTime); + + // 告警字段 + pcsAlarmData.setYljzyc(MapUtils.getInteger(obj, "YLJZYC")); + pcsAlarmData.setZlkgSmyc(MapUtils.getInteger(obj, "ZLKGSMYC")); + pcsAlarmData.setJlkgSmyc(MapUtils.getInteger(obj, "JLKGSMYC")); + pcsAlarmData.setZlfjsmyc(MapUtils.getInteger(obj, "ZLFJSMYC")); + pcsAlarmData.setJlfjsmyc(MapUtils.getInteger(obj, "JLFJSMYC")); + pcsAlarmData.setGjz2(MapUtils.getInteger(obj, "GJZ2")); + pcsAlarmData.setGzz2(MapUtils.getInteger(obj, "GZZ2")); + pcsAlarmData.setSrqgwgj(MapUtils.getInteger(obj, "SRQGWGJ")); + pcsAlarmData.setDgfjyc(MapUtils.getInteger(obj, "DGFJYC")); + pcsAlarmData.setBmsgj(MapUtils.getInteger(obj, "BMSGJ")); + pcsAlarmData.setBmsdj(MapUtils.getInteger(obj, "BMSDJ")); + pcsAlarmData.setBmsjf(MapUtils.getInteger(obj, "BMSJF")); + pcsAlarmData.setBmsjc(MapUtils.getInteger(obj, "BMSJC")); + pcsAlarmData.setBmsgjdyc(MapUtils.getInteger(obj, "BMSGJDYC")); + pcsAlarmData.setBmstxyc(MapUtils.getInteger(obj, "BMSTXYC")); + pcsAlarmData.setBmsxtgz(MapUtils.getInteger(obj, "BMSXTGZ")); + pcsAlarmData.setZldhmktxyc(MapUtils.getInteger(obj, "ZLDHMKTXYC")); + pcsAlarmData.setGzgJ(MapUtils.getInteger(obj, "GZGJ")); + pcsAlarmData.setDcdybfhcdtj(MapUtils.getInteger(obj, "DCDYBFHCDTJ")); + pcsAlarmData.setDcfj(MapUtils.getInteger(obj, "DCFJ")); + pcsAlarmData.setWbfjyc(MapUtils.getInteger(obj, "WBFJYC")); + pcsAlarmData.setDcdygj(MapUtils.getInteger(obj, "DCDYGJ")); + pcsAlarmData.setDczzqy(MapUtils.getInteger(obj, "DCZZQY")); + pcsAlarmData.setZlbxsyc(MapUtils.getInteger(obj, "ZLBXSYC")); + pcsAlarmData.setNbfjyc(MapUtils.getInteger(obj, "NBFJYC")); + pcsAlarmData.setDlbh(MapUtils.getInteger(obj, "DLBH")); + pcsAlarmData.setGzbh(MapUtils.getInteger(obj, "GZBH")); + pcsAlarmData.setScdybfhlwtj(MapUtils.getInteger(obj, "SCDYBFHLWTJ")); + pcsAlarmData.setScdyyc(MapUtils.getInteger(obj, "SCDYYC")); + pcsAlarmData.setZlgl(MapUtils.getInteger(obj, "ZLGL")); + pcsAlarmData.setDcqzqy(MapUtils.getInteger(obj, "DCQZQY")); + pcsAlarmData.setDcgy(MapUtils.getInteger(obj, "DCGY")); + pcsAlarmData.setGlmkgwgJ(MapUtils.getInteger(obj, "GLMKGWGJ")); + pcsAlarmData.setDwgqpdjgj(MapUtils.getInteger(obj, "DWGQPDJGJ")); + pcsAlarmData.setKkhrqyc(MapUtils.getInteger(obj, "KKHRQYC")); + pcsAlarmData.setBmsjt(MapUtils.getInteger(obj, "BMSJT")); + pcsAlarmData.setBwjdvc(MapUtils.getInteger(obj, "BWJDYC")); + pcsAlarmData.setJljdvc(MapUtils.getInteger(obj, "JLJDYC")); + pcsAlarmData.setFjjdvc(MapUtils.getInteger(obj, "FJJDYC")); + pcsAlarmData.setZjjdvc(MapUtils.getInteger(obj, "ZJJDYC")); + pcsAlarmData.setDgwdkgwc(MapUtils.getInteger(obj, "DGWDKGYC")); + pcsAlarmData.setFybyqwdkgwc(MapUtils.getInteger(obj, "FYBYQWDKGYC")); + pcsAlarmData.setWbwdkgwc(MapUtils.getInteger(obj, "WBWDKGYC")); + pcsAlarmData.setSrqwdkgwc(MapUtils.getInteger(obj, "SRQWDKGYC")); + pcsAlarmData.setZlfjyc(MapUtils.getInteger(obj, "ZLFJYC")); + pcsAlarmData.setGdycyyx(MapUtils.getInteger(obj, "GDYCYYX")); + pcsAlarmData.setDdycyyx(MapUtils.getInteger(obj, "DDYCYYX")); + pcsAlarmData.setDwdybphgj(MapUtils.getInteger(obj, "DWDYBPHGJ")); + pcsAlarmData.setXtcsbpp(MapUtils.getInteger(obj, "XTCSBPP")); + pcsAlarmData.setZlblmsszcw(MapUtils.getInteger(obj, "ZLBLMSSZCW")); + pcsAlarmData.setGjz(MapUtils.getInteger(obj, "GJZ")); + pcsAlarmData.setGzz(MapUtils.getInteger(obj, "GZZ")); + pcsAlarmData.setYctxyc(MapUtils.getInteger(obj, "YCTXYC")); + pcsAlarmData.setHmi485txyc(MapUtils.getInteger(obj, "HMI485TXYC")); + pcsAlarmData.setJxszcw(MapUtils.getInteger(obj, "JXSZCW")); + pcsAlarmData.setHmictxyc(MapUtils.getInteger(obj, "HMICTXYC")); + pcsAlarmData.setBjtxyc(MapUtils.getInteger(obj, "BJTXYC")); + pcsAlarmData.setYwgj(MapUtils.getInteger(obj, "YWGJ")); + pcsAlarmData.setZlzjcqyc(MapUtils.getInteger(obj, "ZLZJCQYC")); + pcsAlarmData.setLxgl(MapUtils.getInteger(obj, "LXGL")); + pcsAlarmData.setZldhyc(MapUtils.getInteger(obj, "ZLDHYC")); + pcsAlarmData.setTbctxvc(MapUtils.getInteger(obj, "TBCTXYC")); + pcsAlarmData.setBjtxxyc(MapUtils.getInteger(obj, "BJTXXYC")); + pcsAlarmData.setXxgxctxvc(MapUtils.getInteger(obj, "XXGXCTXYC")); + pcsAlarmData.setIdct(MapUtils.getInteger(obj, "IDCT")); + pcsAlarmData.setQdyc(MapUtils.getInteger(obj, "QDYC")); + pcsAlarmData.setNbyjgl(MapUtils.getInteger(obj, "NBYJGL")); + pcsAlarmData.setZndbtxyc(MapUtils.getInteger(obj, "ZNDBTXYC")); + pcsAlarmData.setZlflqyc(MapUtils.getInteger(obj, "ZLFLQYC")); + pcsAlarmData.setSxyc(MapUtils.getInteger(obj, "SXYC")); + pcsAlarmData.setMjgj(MapUtils.getInteger(obj, "MJGJ")); + pcsAlarmData.setLpjzyc(MapUtils.getInteger(obj, "LPJZYC")); + pcsAlarmData.setMxdlgl(MapUtils.getInteger(obj, "MXDLGL")); + pcsAlarmData.setMxdbyfhkjtj(MapUtils.getInteger(obj, "MXDYBFHKJTJ")); + pcsAlarmData.setWbjt(MapUtils.getInteger(obj, "WBJT")); + pcsAlarmData.setNbjt(MapUtils.getInteger(obj, "NBJT")); + pcsAlarmData.setJlflqyc(MapUtils.getInteger(obj, "JLFLQYC")); + pcsAlarmData.setRjhjyc(MapUtils.getInteger(obj, "RJHJYC")); + pcsAlarmData.setJlrqdyc(MapUtils.getInteger(obj, "JLRQDYC")); + pcsAlarmData.setJngw(MapUtils.getInteger(obj, "JNGW")); + pcsAlarmData.setNbyc(MapUtils.getInteger(obj, "NBYC")); + pcsAlarmData.setWdkgwc(MapUtils.getInteger(obj, "WDKGYC")); + pcsAlarmData.setJlkgwc(MapUtils.getInteger(obj, "JLKGYC")); + pcsAlarmData.setJlfjyc(MapUtils.getInteger(obj, "JLFJYC")); + pcsAlarmData.setZlkgwc(MapUtils.getInteger(obj, "ZLKGYC")); + pcsAlarmData.setZlrqdyc(MapUtils.getInteger(obj, "ZLRQDYC")); + pcsAlarmData.setNbrjgl(MapUtils.getInteger(obj, "NBRJGL")); + pcsAlarmData.setDwxxyc(MapUtils.getInteger(obj, "DWXXYC")); + pcsAlarmData.setGlmkgw(MapUtils.getInteger(obj, "GLMKGW")); + pcsAlarmData.setDwqpyc(MapUtils.getInteger(obj, "DWQPYC")); + pcsAlarmData.setDwgpyc(MapUtils.getInteger(obj, "DWGPYC")); + pcsAlarmData.setDwqyyc(MapUtils.getInteger(obj, "DWQYYC")); + pcsAlarmData.setDwgyyc(MapUtils.getInteger(obj, "DWGYYC")); + pcsAlarmData.setZlgv(MapUtils.getInteger(obj, "ZLGY")); + pcsAlarmData.setJlllyc(MapUtils.getInteger(obj, "JLLDLYC")); + pcsAlarmData.setJyzkyc(MapUtils.getInteger(obj, "JYZKYC")); + pcsAlarmData.setGzbz(MapUtils.getInteger(obj, "GZBZ")); + pcsAlarmData.setCreateBy("system"); + pcsAlarmData.setCreateTime(DateUtils.getNowDate()); + pcsAlarmData.setUpdateBy("system"); + pcsAlarmData.setUpdateTime(DateUtils.getNowDate()); + pcsAlarmData.setSiteId(SITE_ID); + pcsAlarmData.setDeviceId(deviceId); + emsPcsAlarmDataMapper.insertEmsPcsAlarmData(pcsAlarmData); + } + + private void stackDataProcess(String deviceId, String jsonData, Date dataUpdateTime) { + // bmsd + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + EmsStackAlarmData stackAlarmData = new EmsStackAlarmData(); + // 更新时间 + stackAlarmData.setDataTimestamp(dataUpdateTime); + + // 告警字段 + stackAlarmData.setKttxsl(MapUtils.getInteger(obj, "KTTXSL")); + stackAlarmData.setDidodi12(MapUtils.getInteger(obj, "DIDODI12")); + stackAlarmData.setDidodi11(MapUtils.getInteger(obj, "DIDODI11")); + stackAlarmData.setDidodi10(MapUtils.getInteger(obj, "DIDODI10")); + stackAlarmData.setDidodi9(MapUtils.getInteger(obj, "DIDODI9")); + stackAlarmData.setDidodi8(MapUtils.getInteger(obj, "DIDODI8")); + stackAlarmData.setDidodi7(MapUtils.getInteger(obj, "DIDODI7")); + stackAlarmData.setDidodi6(MapUtils.getInteger(obj, "DIDODI6")); + stackAlarmData.setDidodi5(MapUtils.getInteger(obj, "DIDODI5")); + stackAlarmData.setDidodi4(MapUtils.getInteger(obj, "DIDODI4")); + stackAlarmData.setDidodi3(MapUtils.getInteger(obj, "DIDODI3")); + stackAlarmData.setDidodi2(MapUtils.getInteger(obj, "DIDODI2")); + stackAlarmData.setDidodi1(MapUtils.getInteger(obj, "DIDODI1")); + stackAlarmData.setDidodi0(MapUtils.getInteger(obj, "DIDODI0")); + stackAlarmData.setWdcjsl(MapUtils.getInteger(obj, "WDCJSL")); + stackAlarmData.setDycjsl(MapUtils.getInteger(obj, "DYCJSL")); + stackAlarmData.setDnmkdyqyyzgjhz(MapUtils.getInteger(obj, "DNMKDYQYYZGJHZ")); + stackAlarmData.setDnmkdyqyzdgjhz(MapUtils.getInteger(obj, "DNMKDYQYZDGJHZ")); + stackAlarmData.setDnmkdyqyqwgjhz(MapUtils.getInteger(obj, "DNMKDYQYQWGJHZ")); + stackAlarmData.setDnmkdygyyzgjhz(MapUtils.getInteger(obj, "DNMKDYGYYZGJHZ")); + stackAlarmData.setDnmkdygyzdgjhz(MapUtils.getInteger(obj, "DNMKDYGYZDGJHZ")); + stackAlarmData.setDnmkdygyqwgjhz(MapUtils.getInteger(obj, "DNMKDYGYQWGJHZ")); + stackAlarmData.setDngdzgwzzdgjhz(MapUtils.getInteger(obj, "DNGDZGWZZDGJHZ")); + stackAlarmData.setDngdzgwzdgjhz(MapUtils.getInteger(obj, "DNGDZGWZDGJHZ")); + stackAlarmData.setDngdzgwqwgjhz(MapUtils.getInteger(obj, "DNGDZGWQWGJHZ")); + stackAlarmData.setYl8(MapUtils.getInteger(obj, "YL8")); + stackAlarmData.setYl7(MapUtils.getInteger(obj, "YL7")); + stackAlarmData.setYl6(MapUtils.getInteger(obj, "YL6")); + stackAlarmData.setYl5(MapUtils.getInteger(obj, "YL5")); + stackAlarmData.setYl4(MapUtils.getInteger(obj, "YL4")); + stackAlarmData.setYl3(MapUtils.getInteger(obj, "YL3")); + stackAlarmData.setYl2(MapUtils.getInteger(obj, "YL2")); + stackAlarmData.setYl1(MapUtils.getInteger(obj, "YL1")); + stackAlarmData.setSrin3(MapUtils.getInteger(obj, "SRIN3")); + stackAlarmData.setSrin2(MapUtils.getInteger(obj, "SRIN2")); + stackAlarmData.setSrin1(MapUtils.getInteger(obj, "SRIN1")); + stackAlarmData.setSrin0(MapUtils.getInteger(obj, "SRIN0")); + stackAlarmData.setBmsxtgzhz(MapUtils.getInteger(obj, "BMSXTGZHZ")); + stackAlarmData.setBmsxtgjhz(MapUtils.getInteger(obj, "BMSXTGJHZ")); + stackAlarmData.setFdjz(MapUtils.getInteger(obj, "FDJZ")); + stackAlarmData.setCdjz(MapUtils.getInteger(obj, "CDJZ")); + stackAlarmData.setDnjcqbhyc(MapUtils.getInteger(obj, "DNJCQBHYC")); + stackAlarmData.setDnjcqdkyc(MapUtils.getInteger(obj, "DNJCQDKYC")); + stackAlarmData.setDngzdyyc(MapUtils.getInteger(obj, "DNGZDYYC")); + stackAlarmData.setDngckslgjhz(MapUtils.getInteger(obj, "DNGCKSLGJHZ")); + stackAlarmData.setDngzkslhz(MapUtils.getInteger(obj, "DNGZKSLHZ")); + stackAlarmData.setDtsohgyzgjhz(MapUtils.getInteger(obj, "DTSOHGYZGJHZ")); + stackAlarmData.setDtsohgzdgjhz(MapUtils.getInteger(obj, "DTSOHGZDGJHZ")); + stackAlarmData.setDtsohgqwgjhz(MapUtils.getInteger(obj, "DTSOHGQWGJHZ")); + stackAlarmData.setDtsohdyzgjhz(MapUtils.getInteger(obj, "DTSOHDYZGJHZ")); + stackAlarmData.setDtsohdzdgjhz(MapUtils.getInteger(obj, "DTSOHDZDGJHZ")); + stackAlarmData.setDtsohdqwgjhz(MapUtils.getInteger(obj, "DTSOHDQWGJHZ")); + stackAlarmData.setDtsocgyzgjhz(MapUtils.getInteger(obj, "DTSOCGYZGJHZ")); + stackAlarmData.setDtsocgzdgjhz(MapUtils.getInteger(obj, "DTSOCGZDGJHZ")); + stackAlarmData.setDtsocgqwgjhz(MapUtils.getInteger(obj, "DTSOCGQWGJHZ")); + stackAlarmData.setDtsocdyzgjhz(MapUtils.getInteger(obj, "DTSOCDYZGJHZ")); + stackAlarmData.setDtsocdzdgjhz(MapUtils.getInteger(obj, "DTSOCDZDGJHZ")); + stackAlarmData.setDtsocdqwgjhz(MapUtils.getInteger(obj, "DTSOCDQWGJHZ")); + stackAlarmData.setDngdtwcyzgjhz(MapUtils.getInteger(obj, "DNGDTWCYZGJHZ")); + stackAlarmData.setDngdtwczdgjhz(MapUtils.getInteger(obj, "DNGDTWCZDGJHZ")); + stackAlarmData.setDngdtwcqwgjhz(MapUtils.getInteger(obj, "DNGDTWCQWGJHZ")); + stackAlarmData.setDngdtgwyzgjhz(MapUtils.getInteger(obj, "DNGDTGWYZGJHZ")); + stackAlarmData.setDngdtgwzdgjhz(MapUtils.getInteger(obj, "DNGDTGWZDGJHZ")); + stackAlarmData.setDngdtgwqwgjhz(MapUtils.getInteger(obj, "DNGDTGWQWGJHZ")); + stackAlarmData.setDngdtqwyzgjhz(MapUtils.getInteger(obj, "DNGDTQWYZGJHZ")); + stackAlarmData.setDngdtqwzdgjhz(MapUtils.getInteger(obj, "DNGDTQWZDGJHZ")); + stackAlarmData.setDngdtqwqwgjhz(MapUtils.getInteger(obj, "DNGDTQWQWGJHZ")); + stackAlarmData.setDngdtycyzgjhz(MapUtils.getInteger(obj, "DNGDTYCYZGJHZ")); + stackAlarmData.setDngdtyczdgjhz(MapUtils.getInteger(obj, "DNGDTYCZDGJHZ")); + stackAlarmData.setDngdtycqwgjhz(MapUtils.getInteger(obj, "DNGDTYCQWGJHZ")); + stackAlarmData.setDngdtqyyzgjhz(MapUtils.getInteger(obj, "DNGDTQYYZGJHZ")); + stackAlarmData.setDngdtqyzdgjhz(MapUtils.getInteger(obj, "DNGDTQYZDGJHZ")); + stackAlarmData.setDngdtqyqwgjhz(MapUtils.getInteger(obj, "DNGDTQYQWGJHZ")); + stackAlarmData.setDngdtgyyzgjhz(MapUtils.getInteger(obj, "DNGDTGYYZGJHZ")); + stackAlarmData.setDngdtgyzdgjhz(MapUtils.getInteger(obj, "DNGDTGYZDGJHZ")); + stackAlarmData.setDngdtgyqwgjhz(MapUtils.getInteger(obj, "DNGDTGYQWGJHZ")); + stackAlarmData.setDngzmkgwdzzdgjhz(MapUtils.getInteger(obj, "DNGZMKGWDZZDGJHZ")); + stackAlarmData.setDngzmkgwdzdgjhz(MapUtils.getInteger(obj, "DNGZMKGWDZDGJHZ")); + stackAlarmData.setDngzmkgwdqdgjhz(MapUtils.getInteger(obj, "DNGZMKGWDQDGJHZ")); + stackAlarmData.setDngzmkqwdzzdgjhz(MapUtils.getInteger(obj, "DNGZMKQWDZZDGJHZ")); + stackAlarmData.setDngzmkqwdzdgjhz(MapUtils.getInteger(obj, "DNGZMKQWDZDGJHZ")); + stackAlarmData.setDngzmkqwdqdgjhz(MapUtils.getInteger(obj, "DNGZMKQWDQDGJHZ")); + stackAlarmData.setDngzjydzdzzdgjhz(MapUtils.getInteger(obj, "DNGZJYDZDZZDGJHZ")); + stackAlarmData.setDngzjydzdzdgjhz(MapUtils.getInteger(obj, "DNGZJYDZDZDGJHZ")); + stackAlarmData.setDngzjydzdqdgjhz(MapUtils.getInteger(obj, "DNGZJYDZDQDGJHZ")); + stackAlarmData.setDngzdglzzdgjhz(MapUtils.getInteger(obj, "DNGZDGLZZDGJHZ")); + stackAlarmData.setDngzdglzdgjhz(MapUtils.getInteger(obj, "DNGZDGLZDGJHZ")); + stackAlarmData.setDngzdglqdgjhz(MapUtils.getInteger(obj, "DNGZDGLQDGJHZ")); + stackAlarmData.setDngzddygyzzdgjhz(MapUtils.getInteger(obj, "DNGZDDYGYZZDGJHZ")); + stackAlarmData.setDngzddygyzdgjhz(MapUtils.getInteger(obj, "DNGZDDYGYZDGJHZ")); + stackAlarmData.setDngzddygyqdgjhz(MapUtils.getInteger(obj, "DNGZDDYGYQDGJHZ")); + stackAlarmData.setDngzddyqyzzdgjhz(MapUtils.getInteger(obj, "DNGZDDYQYZZDGJHZ")); + stackAlarmData.setDngzddyqyzdgjhz(MapUtils.getInteger(obj, "DNGZDDYQYZDGJHZ")); + stackAlarmData.setDngzddyqyqdgjhz(MapUtils.getInteger(obj, "DNGZDDYQYQDGJHZ")); + stackAlarmData.setJfzt(MapUtils.getInteger(obj, "JFZT")); + stackAlarmData.setJczt(MapUtils.getInteger(obj, "JCZT")); + stackAlarmData.setBmsgzzt(MapUtils.getInteger(obj, "BMSGZZT")); + + stackAlarmData.setCreateBy("system"); + stackAlarmData.setCreateTime(DateUtils.getNowDate()); + stackAlarmData.setUpdateBy("system"); + stackAlarmData.setUpdateTime(DateUtils.getNowDate()); + stackAlarmData.setSiteId(SITE_ID); + stackAlarmData.setDeviceId(deviceId); + emsStackAlarmDataMapper.insertEmsStackAlarmData(stackAlarmData); + } + + private void clusterDataProcess(String deviceId, String jsonData, Date dataUpdateTime) { + // bmsc + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + EmsClusterAlarmData clusterAlarmData = new EmsClusterAlarmData(); + // 更新时间 + clusterAlarmData.setDataTimestamp(dataUpdateTime); + + // 告警字段 + clusterAlarmData.setC1wdcjgz(MapUtils.getInteger(obj, "C1WDCJGZ")); + clusterAlarmData.setC1dycjgz(MapUtils.getInteger(obj, "C1DYCJGZ")); + clusterAlarmData.setC1mkdygdzzdgj(MapUtils.getInteger(obj, "C1MKDYGDZZDGJ")); + clusterAlarmData.setC1mkdygdzdgj(MapUtils.getInteger(obj, "C1MKDYGDZDGJ")); + clusterAlarmData.setC1mkdygdqdgj(MapUtils.getInteger(obj, "C1MKDYGDQDGJ")); + clusterAlarmData.setC1mkdyggzzdgj(MapUtils.getInteger(obj, "C1MKDYGGZZDGJ")); + clusterAlarmData.setC1mkdyggzdgj(MapUtils.getInteger(obj, "C1MKDYGGZDGJ")); + clusterAlarmData.setC1mkdyggqdgj(MapUtils.getInteger(obj, "C1MKDYGGQDGJ")); + clusterAlarmData.setC1dzwdggzzdgj(MapUtils.getInteger(obj, "C1DZWDGGZZDGJ")); + clusterAlarmData.setC1dzwdggzdgj(MapUtils.getInteger(obj, "C1DZWDGGZDGJ")); + clusterAlarmData.setC1dzwdggqdgj(MapUtils.getInteger(obj, "C1DZWDGGQDGJ")); + clusterAlarmData.setC1ck40txsl(MapUtils.getInteger(obj, "C1CK40TXSL")); + clusterAlarmData.setC1ck39txsl(MapUtils.getInteger(obj, "C1CK39TXSL")); + clusterAlarmData.setC1ck38txsl(MapUtils.getInteger(obj, "C1CK38TXSL")); + clusterAlarmData.setC1ck37txsl(MapUtils.getInteger(obj, "C1CK37TXSL")); + clusterAlarmData.setC1ck36txsl(MapUtils.getInteger(obj, "C1CK36TXSL")); + clusterAlarmData.setC1ck35txsl(MapUtils.getInteger(obj, "C1CK35TXSL")); + clusterAlarmData.setC1ck34txsl(MapUtils.getInteger(obj, "C1CK34TXSL")); + clusterAlarmData.setC1ck33txsl(MapUtils.getInteger(obj, "C1CK33TXSL")); + clusterAlarmData.setC1ck32txsl(MapUtils.getInteger(obj, "C1CK32TXSL")); + clusterAlarmData.setC1ck31txsl(MapUtils.getInteger(obj, "C1CK31TXSL")); + clusterAlarmData.setC1ck30txsl(MapUtils.getInteger(obj, "C1CK30TXSL")); + clusterAlarmData.setC1ck29txsl(MapUtils.getInteger(obj, "C1CK29TXSL")); + clusterAlarmData.setC1ck28txsl(MapUtils.getInteger(obj, "C1CK28TXSL")); + clusterAlarmData.setC1ck27txsl(MapUtils.getInteger(obj, "C1CK27TXSL")); + clusterAlarmData.setC1ck26txsl(MapUtils.getInteger(obj, "C1CK26TXSL")); + clusterAlarmData.setC1ck25txsl(MapUtils.getInteger(obj, "C1CK25TXSL")); + clusterAlarmData.setC1ck24txsl(MapUtils.getInteger(obj, "C1CK24TXSL")); + clusterAlarmData.setC1ck23txsl(MapUtils.getInteger(obj, "C1CK23TXSL")); + clusterAlarmData.setC1ck22txsl(MapUtils.getInteger(obj, "C1CK22TXSL")); + clusterAlarmData.setC1ck21txsl(MapUtils.getInteger(obj, "C1CK21TXSL")); + clusterAlarmData.setC1ck20txsl(MapUtils.getInteger(obj, "C1CK20TXSL")); + clusterAlarmData.setC1ck19txsl(MapUtils.getInteger(obj, "C1CK19TXSL")); + clusterAlarmData.setC1ck18txsl(MapUtils.getInteger(obj, "C1CK18TXSL")); + clusterAlarmData.setC1ck17txsl(MapUtils.getInteger(obj, "C1CK17TXSL")); + clusterAlarmData.setC1ck16txsl(MapUtils.getInteger(obj, "C1CK16TXSL")); + clusterAlarmData.setC1ck15txsl(MapUtils.getInteger(obj, "C1CK15TXSL")); + clusterAlarmData.setC1ck14txsl(MapUtils.getInteger(obj, "C1CK14TXSL")); + clusterAlarmData.setC1ck13txsl(MapUtils.getInteger(obj, "C1CK13TXSL")); + clusterAlarmData.setC1ck12txsl(MapUtils.getInteger(obj, "C1CK12TXSL")); + clusterAlarmData.setC1ck11txsl(MapUtils.getInteger(obj, "C1CK11TXSL")); + clusterAlarmData.setC1ck10txsl(MapUtils.getInteger(obj, "C1CK10TXSL")); + clusterAlarmData.setC1ck9txsl(MapUtils.getInteger(obj, "C1CK9TXSL")); + clusterAlarmData.setC1ck8txsl(MapUtils.getInteger(obj, "C1CK8TXSL")); + clusterAlarmData.setC1ck7txsl(MapUtils.getInteger(obj, "C1CK7TXSL")); + clusterAlarmData.setC1ck6txsl(MapUtils.getInteger(obj, "C1CK6TXSL")); + clusterAlarmData.setC1ck5txsl(MapUtils.getInteger(obj, "C1CK5TXSL")); + clusterAlarmData.setC1ck4txsl(MapUtils.getInteger(obj, "C1CK4TXSL")); + clusterAlarmData.setC1ck3txsl(MapUtils.getInteger(obj, "C1CK3TXSL")); + clusterAlarmData.setC1ck2txsl(MapUtils.getInteger(obj, "C1CK2TXSL")); + clusterAlarmData.setC1ck1txsl(MapUtils.getInteger(obj, "C1CK1TXSL")); + clusterAlarmData.setC1dtwczzdgj(MapUtils.getInteger(obj, "C1DTWCZZDGJ")); + clusterAlarmData.setC1dtwczdgj(MapUtils.getInteger(obj, "C1DTWCZDGJ")); + clusterAlarmData.setC1dtwcqdgj(MapUtils.getInteger(obj, "C1DTWCQDGJ")); + clusterAlarmData.setC1dtyczzdgj(MapUtils.getInteger(obj, "C1DTYCZZDGJ")); + clusterAlarmData.setC1dtyczdgj(MapUtils.getInteger(obj, "C1DTYCZDGJ")); + clusterAlarmData.setC1dtycqdgj(MapUtils.getInteger(obj, "C1DTYCQDGJ")); + clusterAlarmData.setC1sohdzzdgj(MapUtils.getInteger(obj, "C1SOHDZZDGJ")); + clusterAlarmData.setC1sohdzdgj(MapUtils.getInteger(obj, "C1SOHDZDGJ")); + clusterAlarmData.setC1sohdqdgj(MapUtils.getInteger(obj, "C1SOHDQDGJ")); + clusterAlarmData.setC1socgzzdgj(MapUtils.getInteger(obj, "C1SOCGZZDGJ")); + clusterAlarmData.setC1socgzdgj(MapUtils.getInteger(obj, "C1SOCGZDGJ")); + clusterAlarmData.setC1socdzzdgj(MapUtils.getInteger(obj, "C1SOCDZZDGJ")); + clusterAlarmData.setC1socdzdgj(MapUtils.getInteger(obj, "C1SOCDZDGJ")); + clusterAlarmData.setC1socdqdgj(MapUtils.getInteger(obj, "C1SOCDQDGJ")); + clusterAlarmData.setC1dtgwzzdgj(MapUtils.getInteger(obj, "C1DTGWZZDGJ")); + clusterAlarmData.setC1dtgwzdgj(MapUtils.getInteger(obj, "C1DTGWZDGJ")); + clusterAlarmData.setC1dtgwqdgj(MapUtils.getInteger(obj, "C1DTGWQDGJ")); + clusterAlarmData.setC1dtqwzzdgj(MapUtils.getInteger(obj, "C1DTQWZZDGJ")); + clusterAlarmData.setC1dtqwzdgj(MapUtils.getInteger(obj, "C1DTQWZDGJ")); + clusterAlarmData.setC1dtqwqdgj(MapUtils.getInteger(obj, "C1DTQWQDGJ")); + clusterAlarmData.setC1dtgyzzdgj(MapUtils.getInteger(obj, "C1DTGYZZDGJ")); + clusterAlarmData.setC1dtgyzdgj(MapUtils.getInteger(obj, "C1DTGYZDGJ")); + clusterAlarmData.setC1dtgyqdgj(MapUtils.getInteger(obj, "C1DTGYQDGJ")); + clusterAlarmData.setC1dtqyzzdgj(MapUtils.getInteger(obj, "C1DTQYZZDGJ")); + clusterAlarmData.setC1dtqyzdgj(MapUtils.getInteger(obj, "C1DTQYZDGJ")); + clusterAlarmData.setC1dtqyqdgj(MapUtils.getInteger(obj, "C1DTQYQDGJ")); + clusterAlarmData.setC1ddlzzdgj(MapUtils.getInteger(obj, "C1DDLZZDGJ")); + clusterAlarmData.setC1ddlzdgj(MapUtils.getInteger(obj, "C1DDLZDGJ")); + clusterAlarmData.setC1ddlqdgj(MapUtils.getInteger(obj, "C1DDLQDGJ")); + clusterAlarmData.setC1ddygyzzdgj(MapUtils.getInteger(obj, "C1DDYGYZZDGJ")); + clusterAlarmData.setC1ddygyzdgj(MapUtils.getInteger(obj, "C1DDYGYZDGJ")); + clusterAlarmData.setC1ddygyqdgj(MapUtils.getInteger(obj, "C1DDYGYQDGJ")); + clusterAlarmData.setC1ddyqyzzdgj(MapUtils.getInteger(obj, "C1DDYQYZZDGJ")); + clusterAlarmData.setC1ddyqyzdgj(MapUtils.getInteger(obj, "C1DDYQYZDGJ")); + clusterAlarmData.setC1ddyqyqdgj(MapUtils.getInteger(obj, "C1DDYQYQDGJ")); + clusterAlarmData.setC1zktxsl(MapUtils.getInteger(obj, "C1ZKTXSL")); + clusterAlarmData.setC1socgqdgj(MapUtils.getInteger(obj, "C1SOCGQDGJ")); + + clusterAlarmData.setCreateBy("system"); + clusterAlarmData.setCreateTime(DateUtils.getNowDate()); + clusterAlarmData.setUpdateBy("system"); + clusterAlarmData.setUpdateTime(DateUtils.getNowDate()); + clusterAlarmData.setSiteId(SITE_ID); + clusterAlarmData.setDeviceId(deviceId); + emsClusterAlarmDataMapper.insertEmsClusterAlarmData(clusterAlarmData); + } + + private void coolingDataProcess(String deviceId, String jsonData, Date dataUpdateTime) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + EmsCoolingAlarmData coolingAlarmData = new EmsCoolingAlarmData(); + // 更新时间 + coolingAlarmData.setDataTimestamp(dataUpdateTime); + + // 告警字段 + // 从Map中获取值并转为Integer,适配tinyint字段 + coolingAlarmData.setLsjyx(MapUtils.getInteger(obj, "LSJYX")); + coolingAlarmData.setPqdcfyx(MapUtils.getInteger(obj, "PQDCFYX")); + coolingAlarmData.setDjrq2yx(MapUtils.getInteger(obj, "DJRQ2YX")); + coolingAlarmData.setDjrq1yx(MapUtils.getInteger(obj, "DJRQ1YX")); + coolingAlarmData.setBqbyx(MapUtils.getInteger(obj, "BQBYX")); + coolingAlarmData.setBsbyx(MapUtils.getInteger(obj, "BSBYX")); + coolingAlarmData.setZxhbyx(MapUtils.getInteger(obj, "ZXHBYX")); // 此处不再报错 + coolingAlarmData.setSltzgz(MapUtils.getInteger(obj, "SLTZGZ")); + coolingAlarmData.setSlzhyj(MapUtils.getInteger(obj, "SLZHYJ")); + coolingAlarmData.setSlxtyctzxh(MapUtils.getInteger(obj, "SLXTYCTZXH")); + coolingAlarmData.setSlxtycqdxh(MapUtils.getInteger(obj, "SLXTYCQDXH")); + coolingAlarmData.setSlxtyckz(MapUtils.getInteger(obj, "SLXTYCKZ")); + coolingAlarmData.setSlxtbdkz(MapUtils.getInteger(obj, "SLXTBDKZ")); + coolingAlarmData.setSlxtzdms(MapUtils.getInteger(obj, "SLXTZDMS")); + coolingAlarmData.setSlxtsdms(MapUtils.getInteger(obj, "SLXTSDMS")); + coolingAlarmData.setHsylcdyj(MapUtils.getInteger(obj, "HSYLCDYJ")); + coolingAlarmData.setHsyldyj(MapUtils.getInteger(obj, "HSYLDYJ")); + coolingAlarmData.setGsylcgyj(MapUtils.getInteger(obj, "GSYLCGYJ")); + coolingAlarmData.setGsylgyj(MapUtils.getInteger(obj, "GSYLGYJ")); + coolingAlarmData.setGsylcdyj(MapUtils.getInteger(obj, "GSYLCDYJ")); + coolingAlarmData.setGsyldyj(MapUtils.getInteger(obj, "GSYLDYJ")); + coolingAlarmData.setHcgywg(MapUtils.getInteger(obj, "HCGYWG")); + coolingAlarmData.setHcgywcdtz(MapUtils.getInteger(obj, "HCGYWCDTZ")); + coolingAlarmData.setHcgywd(MapUtils.getInteger(obj, "HCGYWD")); + coolingAlarmData.setHcgylg(MapUtils.getInteger(obj, "HCGYLG")); + coolingAlarmData.setHcgyld(MapUtils.getInteger(obj, "HCGYLD")); + coolingAlarmData.setLysylgyj(MapUtils.getInteger(obj, "LYSYLGYJ")); + coolingAlarmData.setLysyldyj(MapUtils.getInteger(obj, "LYSYLDYJ")); + coolingAlarmData.setHswdcgyj(MapUtils.getInteger(obj, "HSWDCGYJ")); + coolingAlarmData.setHswdgyj(MapUtils.getInteger(obj, "HSWDGYJ")); + coolingAlarmData.setGswdcgtz(MapUtils.getInteger(obj, "GSWDCGTZ")); + coolingAlarmData.setGswdgyj(MapUtils.getInteger(obj, "GSWDGYJ")); + coolingAlarmData.setGswddyj(MapUtils.getInteger(obj, "GSWDDYJ")); + coolingAlarmData.setDdf2gz(MapUtils.getInteger(obj, "DDF2GZ")); + coolingAlarmData.setDdf1gz(MapUtils.getInteger(obj, "DDF1GZ")); + coolingAlarmData.setLyswdbsqyJ(MapUtils.getInteger(obj, "LYSWDBSQYJ")); + coolingAlarmData.setHsylbsqyJ(MapUtils.getInteger(obj, "HSYLBSQYJ")); + coolingAlarmData.setGsylbsqyJ(MapUtils.getInteger(obj, "GSYLBSQYJ")); + coolingAlarmData.setHswdbsqyJ(MapUtils.getInteger(obj, "HSWDBSQYJ")); + coolingAlarmData.setGswdbsqgztz(MapUtils.getInteger(obj, "GSWDBSQGZTZ")); + coolingAlarmData.setLsjgz(MapUtils.getInteger(obj, "LSJGZ")); + coolingAlarmData.setDjrq2gz(MapUtils.getInteger(obj, "DJRQ2GZ")); + coolingAlarmData.setDjrq1gz(MapUtils.getInteger(obj, "DJRQ1GZ")); + coolingAlarmData.setBqbgz(MapUtils.getInteger(obj, "BQBGZ")); + coolingAlarmData.setBsbgz(MapUtils.getInteger(obj, "BSBGZ")); + coolingAlarmData.setXhbgz(MapUtils.getInteger(obj, "XHBGZ")); + coolingAlarmData.setZdygz(MapUtils.getInteger(obj, "ZDYGZ")); + + coolingAlarmData.setCreateBy("system"); + coolingAlarmData.setCreateTime(DateUtils.getNowDate()); + coolingAlarmData.setUpdateBy("system"); + coolingAlarmData.setUpdateTime(DateUtils.getNowDate()); + coolingAlarmData.setSiteId(SITE_ID); + coolingAlarmData.setDeviceId(deviceId); + emsCoolingAlarmDataMapper.insertEmsCoolingAlarmData(coolingAlarmData); + } + + @Override + public void processBatch(List batchData) { + super.processBatch(batchData); + } + + private void alarmDataProcess(String deviceId, String jsonData, + Map alarmInfoData, String category) { + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + String redisKey = RedisKeyConstants.LATEST_ALARM_RECORD + "_" + SITE_ID +"_" + deviceId; + // 获取redis里面的当前有效告警遍历添加到已存在告警key里面 + Map currentAlarm = redisCache.getCacheMap(redisKey); + final Set currentAlarmKeys = new HashSet<>(); + if (currentAlarm != null && !currentAlarm.isEmpty()) { + currentAlarm.keySet().stream() + .filter(Objects::nonNull) + .map(Object::toString) + .forEach(currentAlarmKeys::add); + } + + // 结合同步数据,筛选簇需要更新的告警信息 + List needUpdateKeys = obj.entrySet().stream() + .filter(entry -> { + Object valueObj = entry.getValue(); + if (valueObj == null) { + return false; + } + int value = Integer.parseInt(valueObj.toString()); + return value == 0 && currentAlarmKeys.contains(entry.getKey()); + }) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 批量查询数据库-需要更新的数据 + Map needUpdateMap = new HashMap<>(); + if (!needUpdateKeys.isEmpty()) { + List records = iEmsAlarmRecordsService.getAllUnfinishedRecords(needUpdateKeys,SITE_ID, deviceId); + // 转为Map便于快速获取 + needUpdateMap = records.stream() + .collect(Collectors.toMap( + EmsAlarmRecords::getAlarmPoint, + record -> record + )); + } + + + List saveOrUpdateList = new ArrayList<>(); + List newAddRecordList = new ArrayList<>(); + List toRemoveFromRedis = new ArrayList<>(); + + // 遍历数据map + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + Integer value = (Integer) entry.getValue(); + Boolean isCurrentAlarm = currentAlarmKeys.contains(key); + + // 值为 1且不在当前告警里面 - 新增告警 + if (value == 1 && !isCurrentAlarm) { + String matchRedisKey = category + "_" + key; + Object cacheObj = alarmInfoData.get(matchRedisKey); + if (cacheObj == null) { + // 处理空数据逻辑 + return; + } + EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class); + EmsAlarmRecords emsAlarmRecord = convertAlarmRecord(deviceId,matchInfo); + saveOrUpdateList.add(emsAlarmRecord); + newAddRecordList.add(emsAlarmRecord); + } else if (value == 0 && isCurrentAlarm) {// 值为 0且在当前告警里面 - 更新告警已处理 + EmsAlarmRecords existingAlarm = needUpdateMap.get(key); + if (existingAlarm != null) { + existingAlarm.setStatus(AlarmStatus.DONE.getCode()); + existingAlarm.setUpdateTime(new Date()); + existingAlarm.setAlarmEndTime(new Date()); + saveOrUpdateList.add(existingAlarm); + toRemoveFromRedis.add(key); + } + } + } + + // 批量处理插入和更新操作 + if (saveOrUpdateList != null && saveOrUpdateList.size() > 0) { + iEmsAlarmRecordsService.batchProcessAlarmRecords(saveOrUpdateList); + } + // 已处理的从redis里面删除 + if (!toRemoveFromRedis.isEmpty()) { + redisCache.deleteAllCacheMapValue(RedisKeyConstants.LATEST_ALARM_RECORD + SITE_ID,toRemoveFromRedis.toArray()); + } + // 批量添加新增的告警到Redis + Map newAlarms = newAddRecordList.stream() + .filter(a -> !AlarmStatus.DONE.getCode().equals(a.getStatus())) + .collect(Collectors.toMap(EmsAlarmRecords::getAlarmPoint, a -> a)); + if (!newAlarms.isEmpty()) { + // 本次新增的放入redis + redisCache.setAllCacheMapValue(redisKey, newAlarms); + } + } + + private EmsAlarmRecords convertAlarmRecord(String deviceId, EmsAlarmMatchData matchInfo) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + emsAlarmRecords.setSiteId(SITE_ID); + emsAlarmRecords.setDeviceId(deviceId); + emsAlarmRecords.setDeviceType(DeviceType.TCP.toString()); + emsAlarmRecords.setAlarmLevel(AlarmLevelStatus.GENERAL.getCode()); + emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode()); + emsAlarmRecords.setAlarmStartTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateBy("system"); + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + emsAlarmRecords.setUpdateBy("system"); + + if (matchInfo != null) { + emsAlarmRecords.setAlarmPoint(matchInfo.getPoint()); + emsAlarmRecords.setAlarmContent(matchInfo.getAlarmDescription()); + } + return emsAlarmRecords; + } + + // 空数据不处理 + private boolean checkJsonDataEmpty(String jsonData) { + boolean flag = false; + try { + if (StringUtils.isEmpty(jsonData)) { + flag = true; + } + JsonNode jsonNode = objectMapper.readTree(jsonData); + // 判断是否为空对象({}) + if (jsonNode.isObject() && jsonNode.isEmpty()) { + flag = true ; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return flag; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java new file mode 100644 index 0000000..e95ac48 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java @@ -0,0 +1,1122 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.BranchStatus; +import com.xzzn.common.enums.ChargeStatus; +import com.xzzn.common.enums.CommunicationStatus; +import com.xzzn.common.enums.ControlModeStatus; +import com.xzzn.common.enums.DeviceRunningStatus; +import com.xzzn.common.enums.GridStatus; +import com.xzzn.common.enums.SwitchStatus; +import com.xzzn.common.enums.WorkStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsBatteryCluster; +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryDataDailyLatest; +import com.xzzn.ems.domain.EmsBatteryDataMinutes; +import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.domain.EmsCoolingData; +import com.xzzn.ems.domain.EmsDailyChargeData; +import com.xzzn.ems.domain.EmsDailyEnergyData; +import com.xzzn.ems.domain.EmsDevicesSetting; +import com.xzzn.ems.domain.EmsDhData; +import com.xzzn.ems.domain.EmsPcsBranchData; +import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsCoolingDataMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsDhDataMapper; +import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper; +import com.xzzn.ems.mapper.EmsPcsBranchDataMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; +import com.xzzn.ems.service.IFXXDataProcessService; +import com.xzzn.ems.utils.AbstractBatteryDataProcessor; +import com.xzzn.ems.utils.DevicePointMatchDataProcessor; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService { + private static final Log log = LogFactory.getLog(FXXDataProcessServiceImpl.class); + private static final String SITE_ID = "021_FXX_01"; + + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + + @Autowired + private RedisCache redisCache; + + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsBatteryDailyLatestServiceImpl emsBatteryDailyLatestServiceImpl; + @Autowired + private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsDhDataMapper emsDhDataMapper; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + @Autowired + private EmsCoolingDataMapper emsCoolingDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; + @Autowired + private IEmsEnergyPriceConfigService emsEnergyPriceConfigService; + @Autowired + private IEmsEnergyPriceConfigService iEmsEnergyPriceConfigService; + @Autowired + private DevicePointMatchDataProcessor devicePointMatchDataProcessor; + + // 构造方法(调用父类构造) + public FXXDataProcessServiceImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public void handleFxData(String message) { + JSONArray arraylist = JSONArray.parseArray(message); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.get("Device").toString(); + String jsonData = obj.get("Data").toString(); + Long timestamp = Long.valueOf(obj.get("timestamp").toString()); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + boolean isEmpty = checkJsonDataEmpty(jsonData); + if (isEmpty) { + // 添加设备告警 + iEmsAlarmRecordsService.addEmptyDataAlarmRecord(SITE_ID,deviceId); + return; + } + + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + SITE_ID + "_" + deviceId, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA + SITE_ID + "_" + deviceId, obj, 1, TimeUnit.MINUTES); + + if (deviceId.contains("BMSD")) { + batteryStackDataProcess(deviceId, jsonData); + + } else if (deviceId.contains("BMSC")) { + batteryClusterDataProcess(deviceId, jsonData); + batteryDataProcess(deviceId, jsonData,dataUpdateTime); + + } else if (deviceId.contains("PCS")) { + pcsDataProcess(deviceId, jsonData,dataUpdateTime); + pcsBranchDataProcess(deviceId, jsonData); + dealFXXDailyChargeDate(deviceId, jsonData); + } else if (deviceId.contains("LOAD")) { + loadDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("METE")) { + meteDataProcess(deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("donghuan")) { + dhDataProcess(deviceId, jsonData); + } else if (deviceId.contains("ZSLQ")) { + coolingDataProcess(deviceId, jsonData); + } + } + } + + private void coolingDataProcess(String deviceId, String jsonData) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + EmsCoolingData coolingData = new EmsCoolingData(); + + coolingData.setGsTemp(StringUtils.getBigDecimal(obj.get("GSWD"))); + coolingData.setHsTemp(StringUtils.getBigDecimal(obj.get("HSWD"))); + coolingData.setGsPressure(StringUtils.getBigDecimal(obj.get("GSYL"))); + coolingData.setHsPressure(StringUtils.getBigDecimal(obj.get("HSYL"))); + coolingData.setLysTemp(StringUtils.getBigDecimal(obj.get("LYSWD"))); + coolingData.setVb01Kd(StringUtils.getBigDecimal(obj.get("VB1KD"))); + coolingData.setVb02Kd(StringUtils.getBigDecimal(obj.get("VB2KD"))); + + coolingData.setCreateBy("system"); + coolingData.setCreateTime(DateUtils.getNowDate()); + coolingData.setUpdateBy("system"); + coolingData.setUpdateTime(DateUtils.getNowDate()); + coolingData.setSiteId(SITE_ID); + coolingData.setDeviceId(deviceId); + + emsCoolingDataMapper.insertEmsCoolingData(coolingData); + + redisCache.setCacheObject(RedisKeyConstants.COOLING + SITE_ID + "_" +deviceId, coolingData); + + } + + private void dhDataProcess(String deviceId, String dataJson) { + //动环 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //DH + EmsDhData dhData = new EmsDhData(); + dhData.setHumidity(StringUtils.getBigDecimal(obj.get("SD3"))); + dhData.setTemperature(StringUtils.getBigDecimal(obj.get("WD3"))); + + dhData.setCreateBy("system"); + dhData.setCreateTime(DateUtils.getNowDate()); + dhData.setUpdateBy("system"); + dhData.setUpdateTime(DateUtils.getNowDate()); + dhData.setSiteId(SITE_ID); + dhData.setDeviceId(deviceId); + emsDhDataMapper.insertEmsDhData(dhData); + + redisCache.setCacheObject(RedisKeyConstants.DH + SITE_ID + "_" +deviceId, dhData); + + } + + private void batteryStackDataProcess(String deviceId, String dataJson) { + + //电池堆 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //BMS 电池簇 + EmsBatteryStack dataStack = new EmsBatteryStack(); + + // 其他非 BigDecimal 字段 + dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + + // 电池堆状态数据设置 + dataStack.setOperationStatus(StringUtils.getString(obj.get("DCZT"))); + dataStack.setStackVoltage(StringUtils.getBigDecimal(obj.get("DCDDY"))); + dataStack.setStackCurrent(StringUtils.getBigDecimal(obj.get("DCDDL"))); + dataStack.setStackSoc(StringUtils.getBigDecimal(obj.get("DCDSOC"))); + dataStack.setStackSoh(StringUtils.getBigDecimal(obj.get("DCDSOH"))); + + // 电压极值信息 + dataStack.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDCDY"))); + dataStack.setMaxVoltageGroupId(StringUtils.getLong(obj.get("ZGDCDYZH"))); + dataStack.setMaxVoltageCellId(StringUtils.getLong(obj.get("ZGDCDYZHDH"))); + dataStack.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDCDY"))); + dataStack.setMinVoltageGroupId(StringUtils.getLong(obj.get("ZDDCDYZH"))); + dataStack.setMinVoltageCellId(StringUtils.getLong(obj.get("ZDDCDYZHDH"))); + + // 温度极值信息 + dataStack.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDCWD"))); + dataStack.setMaxTempGroupId(StringUtils.getLong(obj.get("ZGDCWDZH"))); + dataStack.setMaxTempCellId(StringUtils.getLong(obj.get("ZGDCWDZHDH"))); + dataStack.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDCWD"))); + dataStack.setMinTempGroupId(StringUtils.getLong(obj.get("ZDDCWDZH"))); + dataStack.setMinTempCellId(StringUtils.getLong(obj.get("ZDDCWDZHDH"))); + + // 电量统计信息 + dataStack.setTotalChargeCapacity(StringUtils.getBigDecimal(obj.get("DLJCDDL"))); + dataStack.setTotalDischargeCapacity(StringUtils.getBigDecimal(obj.get("DLCFDDL"))); + dataStack.setSessionChargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJCDDL"))); + dataStack.setSessionDischargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJFDDL"))); + dataStack.setAvailableChargeCapacity(StringUtils.getBigDecimal(obj.get("DKCDL"))); + dataStack.setAvailableDischargeCapacity(StringUtils.getBigDecimal(obj.get("DKFDL"))); + + // 时间信息 + dataStack.setRemainingDischargeTime(StringUtils.getLong(obj.get("KYFDSJ"))); + dataStack.setRemainingChargeTime(StringUtils.getLong(obj.get("KYCDSJ"))); + + // 功率/电流限制 + dataStack.setMaxDischargePower(StringUtils.getBigDecimal(obj.get("YXZDFDGL"))); + dataStack.setMaxChargePower(StringUtils.getBigDecimal(obj.get("YXZDCDGL"))); + dataStack.setMaxDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDFDDL"))); + dataStack.setMaxChargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDCDDL"))); + + // 当日统计 + dataStack.setDailyDischargeCycles(StringUtils.getLong(obj.get("DTFDCS"))); + dataStack.setDailyChargeCycles(StringUtils.getLong(obj.get("DTCDCS"))); + dataStack.setDailyDischargeCapacity(StringUtils.getBigDecimal(obj.get("DTFDDL"))); + dataStack.setDailyChargeCapacity(StringUtils.getBigDecimal(obj.get("DTCDDL"))); + + // 系统状态 + dataStack.setOperatingTemp(StringUtils.getBigDecimal(obj.get("YXWD"))); + dataStack.setBmsStatus(StringUtils.getString(obj.get("BMSDDQZT"))); + dataStack.setBmsChargeStatus(StringUtils.getString(obj.get("BMSCFDZT"))); + dataStack.setStackInsulationResistance(StringUtils.getBigDecimal(obj.get("DCDJYDZ"))); + + + dataStack.setCreateBy("system"); + dataStack.setCreateTime(DateUtils.getNowDate()); + dataStack.setUpdateBy("system"); + dataStack.setUpdateTime(DateUtils.getNowDate()); + dataStack.setSiteId(SITE_ID); + dataStack.setDeviceId(deviceId); + + emsBatteryStackMapper.insertEmsBatteryStack(dataStack); + + redisCache.setCacheObject(RedisKeyConstants.STACK + SITE_ID + "_" +deviceId, dataStack); + + } + + private void saveDeviceData(List pointMatchList, Map obj, Object entity) { + Map pointMatchMap = pointMatchList.stream().collect(Collectors.toMap(data -> StringUtils.toCamelCase(data.getMatchField()), EmsPointMatch::getDataPoint)); + Field[] fields = entity.getClass().getDeclaredFields(); + for (Field field : fields) { + if (pointMatchMap.containsKey(field.getName())) { + field.setAccessible(true); + try { + Object matchValue = obj.get(pointMatchMap.get(field.getName())); + Class fieldType = field.getType(); + if (String.class.equals(fieldType)) { + matchValue = StringUtils.getString(matchValue); + } else if (Long.class.equals(fieldType)) { + matchValue = StringUtils.getLong(matchValue); + } else if (BigDecimal.class.equals(fieldType)) { + matchValue = StringUtils.getBigDecimal(matchValue); + } + field.set(entity, matchValue); + } catch (IllegalAccessException e) { + log.warn("batteryStackDataProcess 设置字段值时出错", e); + } + } + } + } + + private void saveDevicePointMatchData(List pointMatchList, String deviceId, + DeviceMatchTable pointMatchType, String dataDevice){ + if (CollectionUtils.isNotEmpty(pointMatchList)) { + return; + } + devicePointMatchDataProcessor.saveDevicePointMatch(SITE_ID, deviceId, pointMatchType, dataDevice); + } + + private void batteryClusterDataProcess(String deviceId, String dataJson) { + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + EmsDevicesSetting joken = new EmsDevicesSetting(); + joken.setDeviceId(deviceId); + List up = emsDevicesSettingMapper.selectEmsDevicesSettingList(joken); + String stackDeviceId = ""; + if (up != null && up.size() >0) { + stackDeviceId = up.get(0).getParentId(); + if (stackDeviceId == null || stackDeviceId.isEmpty()) { + stackDeviceId = "1"; + } + } + //BMS 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + // 设置所有 BigDecimal 类型字段为 ZERO + data.setChargeableCapacity(StringUtils.getBigDecimal(obj.get("KCDL"))); + data.setClusterVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); + data.setClusterCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); + data.setTotalChargedCapacity(StringUtils.getBigDecimal(obj.get("LJCDDL"))); + data.setDischargeableCapacity(StringUtils.getBigDecimal(obj.get("KFDL"))); + data.setTotalDischargedCapacity(StringUtils.getBigDecimal(obj.get("LJFDDL"))); + data.setSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + data.setAverageTemperature(StringUtils.getBigDecimal(obj.get("MKWD"))); + data.setInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + data.setCurrentSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + data.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("YXCDZDGL"))); + data.setMaxAllowedDischargePower(StringUtils.getBigDecimal(obj.get("YXFDZDGL"))); + data.setMaxAllowedChargeVoltage(StringUtils.getBigDecimal(obj.get("YXCDZDDY"))); + data.setMaxAllowedDischargeVoltage(StringUtils.getBigDecimal(obj.get("YXFDZDDY"))); + data.setMaxAllowedChargeCurrent(StringUtils.getBigDecimal(obj.get("YXCDZDDL"))); + data.setMaxAllowedDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXFDZDDL"))); + data.setBatteryPackVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); + data.setBatteryPackCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); + data.setBatteryPackTemp(StringUtils.getBigDecimal(obj.get("MKWD"))); + data.setBatteryPackSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + data.setBatteryPackSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + data.setBatteryPackInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + data.setAvgCellVoltage(StringUtils.getBigDecimal(obj.get("PJDTDY"))); + data.setAvgCellTemp(StringUtils.getBigDecimal(obj.get("PJDTWD"))); + data.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDTDY"))); + data.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDTDY"))); + data.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDTWD"))); + data.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDTWD"))); + data.setMaxCellSoc(StringUtils.getBigDecimal(obj.get("ZGDTSOC"))); + data.setMinCellSoc(StringUtils.getBigDecimal(obj.get("ZDDTSOC"))); + data.setMaxCellSoh(StringUtils.getBigDecimal(obj.get("ZGDTSOH"))); + data.setMinCellSoh(StringUtils.getBigDecimal(obj.get("ZDDTSOH"))); + data.setTotalChargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJCDDL"))); + data.setTotalDischargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJFDDL"))); + + // 其他非 BigDecimal 字段 + data.setMaxCellVoltageId(StringUtils.getString(obj.get("ZGDTDYDYD"))); + data.setMinCellVoltageId(StringUtils.getString(obj.get("ZDDTDYDYD"))); + data.setMaxCellTempId(StringUtils.getString(obj.get("ZGDTWDDYD"))); + data.setMinCellTempId(StringUtils.getString(obj.get("ZDDTWDDYD"))); + data.setMaxCellSocId(StringUtils.getString(obj.get("ZGDTSOCDYD"))); + data.setMinCellSocId(StringUtils.getString(obj.get("ZDDTSOCDYD"))); + data.setMaxCellSohId(StringUtils.getString(obj.get("ZGDTSOHDYD"))); + data.setMinCellSohId(StringUtils.getString(obj.get("ZDDTSOHDYD"))); + + data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(SITE_ID); + data.setDeviceId(deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + SITE_ID + "_" +deviceId, data); + + } + + private void batteryDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { + EmsDevicesSetting joken = new EmsDevicesSetting(); + joken.setDeviceId(deviceId); + List up = emsDevicesSettingMapper.selectEmsDevicesSettingList(joken); + String stackDeviceId = ""; + if (up != null && up.size() >0) { + stackDeviceId = up.get(0).getParentId(); + if (stackDeviceId == null || stackDeviceId.isEmpty()) { + stackDeviceId = "1"; + } + } + //单体电池 + Map> records = processData(JSON.parseObject(dataJson, new TypeReference>() {})); + List list = new ArrayList<>(); + List dailyList = new ArrayList<>(); + List minutesList = new ArrayList<>(); + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + //单体电池 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsBatteryData batteryData = new EmsBatteryData(); + batteryData.setDeviceId(recordId); + batteryData.setBatteryCellId(recordId); + + batteryData.setSoc(StringUtils.getBigDecimal(fields.get("DTSOC"))); + batteryData.setSoh(StringUtils.getBigDecimal(fields.get("DTSOH"))); + batteryData.setTemperature(StringUtils.getBigDecimal(fields.get("DTWD"))); + batteryData.setVoltage(StringUtils.getBigDecimal(fields.get("DTDY"))); + + batteryData.setBatteryCluster(deviceId); + batteryData.setBatteryPack(stackDeviceId); + + // 时间戳 + batteryData.setDataTimestamp(dataUpdateTime); + // 系统管理字段 + batteryData.setCreateBy("system"); + batteryData.setCreateTime(DateUtils.getNowDate()); + batteryData.setUpdateBy("system"); + batteryData.setUpdateTime(DateUtils.getNowDate()); + // ID字段 + batteryData.setSiteId(SITE_ID); + batteryData.setClusterDeviceId(deviceId); + list.add(batteryData); + + // 每日最新数据 + EmsBatteryDataDailyLatest daily = new EmsBatteryDataDailyLatest(); + BeanUtils.copyProperties(batteryData, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyList.add(daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = new EmsBatteryDataMinutes(); + BeanUtils.copyProperties(batteryData, minutes); + minutesList.add(minutes); + } + if (list.size() > 0) { + emsBatteryDataMapper.insertEmsBatteryDataList(list); + + redisCache.deleteList(RedisKeyConstants.BATTERY + SITE_ID + "_" + deviceId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + SITE_ID + "_" + deviceId, list); + + } + + // 批量处理每日最新数据 + if (dailyList != null && dailyList.size() > 0) { + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + // 实时插入每分钟数据 + if (minutesList != null && minutesList.size() > 0) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (list.size() > 0) { + super.processBatch(list); + } + } + + private void pcsDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //pcs + EmsPcsData pcsData = new EmsPcsData(); + + // 功率与能量类字段 + pcsData.setTotalActivePower(StringUtils.getBigDecimal(obj.get("YGGL"))); + pcsData.setDailyAcChargeEnergy(StringUtils.getBigDecimal(obj.get("RCDL"))); + pcsData.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("XTWGGL"))); + pcsData.setDailyAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("RFDL"))); + pcsData.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); + pcsData.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("GLYS"))); + pcsData.setDcPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); + pcsData.setTotalAcChargeEnergy(StringUtils.getBigDecimal(obj.get("ZCDL"))); + pcsData.setTotalAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("ZFDL"))); + pcsData.setAcChargeActivePower(StringUtils.getBigDecimal(obj.get("JLCCDYGGL"))); + pcsData.setAcCapacitiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCRXWGGL"))); + pcsData.setAcDischargeActivePower(StringUtils.getBigDecimal(obj.get("JLCFDYGGL"))); + pcsData.setAcInductiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCGXWGGL"))); + pcsData.setMaxCapacitivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDRXWGNL"))); + pcsData.setMaxInductivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDGXWGNL"))); + pcsData.setMaxChargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKCGL"))); + pcsData.setMaxDischargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKFGL"))); + + + // 温度与环境参数 +// pcsData.setPcsModuleTemperature(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); +// pcsData.setPcsEnvironmentTemperature(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); +// pcsData.setAcFrequency(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); + + // 状态指示类 + pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); + pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); + String acSwitchStatus = StringUtils.getString(obj.get("JLKGZT")); + pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String dcSwitchStatus = StringUtils.getString(obj.get("ZLKGZT")); + pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String controlMode = StringUtils.getString(obj.get("YCTT")); + pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); + + // 电流参数 + pcsData.setSysUCurrent(StringUtils.getBigDecimal(obj.get("XTSCUXDL"))); + pcsData.setSysVCurrent(StringUtils.getBigDecimal(obj.get("XTSCVXDL"))); + pcsData.setSysWCurrent(StringUtils.getBigDecimal(obj.get("XTSCWXDL"))); + + // 直流参数 +// pcsData.setDcVoltage(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); +// pcsData.setDcCurrent(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); + + // 三相温度 + pcsData.setuTemperature(StringUtils.getBigDecimal(obj.get("DY1UXIGBTWD"))); + pcsData.setvTemperature(StringUtils.getBigDecimal(obj.get("DY1VXIGBTWD"))); + pcsData.setwTemperature(StringUtils.getBigDecimal(obj.get("DY1WXIGBTWD"))); + + // 时间与状态类字段 + pcsData.setDataUpdateTime(dataUpdateTime); + pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); + pcsData.setGridStatus(GridStatus.GRID.getCode()); + pcsData.setDeviceStatus(DeviceRunningStatus.ONLINE.getCode()); + pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); + + // 系统管理字段 + pcsData.setCreateBy("system"); + pcsData.setCreateTime(DateUtils.getNowDate()); + pcsData.setUpdateBy("system"); + pcsData.setUpdateTime(DateUtils.getNowDate()); + pcsData.setSiteId(SITE_ID); + pcsData.setDeviceId(deviceId); + pcsData.setDateMonth(DateUtils.getNowMonthLong()); + pcsData.setDateDay(DateUtils.getNowDayLong()); + + emsPcsDataMapper.insertEmsPcsData(pcsData); + redisCache.setCacheObject(RedisKeyConstants.PCS + SITE_ID + "_" +deviceId, pcsData); + + } + + private void pcsBranchDataProcess(String deviceId, String dataJson) { + + Map> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference>() {})); + List list = new ArrayList<>(); + + //PCS支路 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsPcsBranchData data = new EmsPcsBranchData(); + data.setDeviceId(deviceId); + data.setSiteId(SITE_ID); + data.setGridStatus(GridStatus.GRID.getCode()); + data.setDcPower(StringUtils.getBigDecimal(fields.get("ZLGL"))); + data.setDcVoltage(StringUtils.getBigDecimal(fields.get("ZLDY"))); + data.setDcCurrent(StringUtils.getBigDecimal(fields.get("ZLDL"))); + data.setGridUVoltage(StringUtils.getBigDecimal(fields.get("DWUXDY"))); + data.setGridVVoltage(StringUtils.getBigDecimal(fields.get("DWVXDY"))); + data.setGridWVoltage(StringUtils.getBigDecimal(fields.get("DWWXDY"))); + data.setOutputUCurrent(StringUtils.getBigDecimal(fields.get("SCUXDL"))); + data.setOutputVCurrent(StringUtils.getBigDecimal(fields.get("SCVXDL"))); + data.setOutputWCurrent(StringUtils.getBigDecimal(fields.get("SCWXDL"))); + data.setApparentPower(StringUtils.getBigDecimal(fields.get("SZGL"))); + data.setActivePower(StringUtils.getBigDecimal(fields.get("YGGL"))); + data.setReactivePower(StringUtils.getBigDecimal(fields.get("WGGL"))); + data.setPowerFactor(StringUtils.getBigDecimal(fields.get("GLYS"))); + data.setFrequency(StringUtils.getBigDecimal(fields.get("PL"))); + data.setInternalTemp(StringUtils.getBigDecimal(fields.get("DY1WD"))); + data.setuIgbtTemp(StringUtils.getBigDecimal(fields.get("UXIGBTWD"))); + data.setvIgbtTemp(StringUtils.getBigDecimal(fields.get("VXIGBTWD"))); + data.setwIgbtTemp(StringUtils.getBigDecimal(fields.get("WXIGBTWD"))); + data.setAvailablePower(StringUtils.getBigDecimal(fields.get("KYGL"))); + data.setTotalLoadRatio(StringUtils.getBigDecimal(fields.get("ZFZB"))); + data.setAcLeakageCurrent(StringUtils.getBigDecimal(fields.get("JLLDL"))); + data.setInsulationResistance(StringUtils.getBigDecimal(fields.get("JYZK"))); + data.setBranchId(recordId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + list.add(data); + } + if (list.size() > 0 ) { + emsPcsBranchDataMapper.insertPcsBranchDataList(list); + + redisCache.setCacheObject(RedisKeyConstants.BRANCH + SITE_ID + "_" +deviceId, list); + + } + + } + + private void loadDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + EmsAmmeterData dataLoad = new EmsAmmeterData(); + // 更新时间 + dataLoad.setDataUpdateTime(dataUpdateTime); + + // 电能设置-组合有功 + dataLoad.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN"))); + dataLoad.setCurrentCombActivePeak(StringUtils.getBigDecimal(obj.get("DQZHYGJDN"))); + dataLoad.setCurrentCombActiveHigh(StringUtils.getBigDecimal(obj.get("DQZHYGFDN"))); + dataLoad.setCurrentCombActiveFlat(StringUtils.getBigDecimal(obj.get("DQZHYGPDN"))); + dataLoad.setCurrentCombActiveValley(StringUtils.getBigDecimal(obj.get("DQZHYGGDN"))); + // 电能设置-正向有功 + dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQZXYGZDN"))); + dataLoad.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQZXYGJDN"))); + dataLoad.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQZXYGFDN"))); + dataLoad.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQZXYGPDN"))); + dataLoad.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQZXYGGDN"))); + // 电能设置-反向有功 + dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQFXYGZDN"))); + dataLoad.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQFXYGJDN"))); + dataLoad.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQFXYGFDN"))); + dataLoad.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQFXYGPDN"))); + dataLoad.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQFXYGGDN"))); + // 电能设置-组合无功 + dataLoad.setCurrentCombReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZHWGZDN"))); + dataLoad.setCurrentCombReactivePeak(StringUtils.getBigDecimal(obj.get("DQZHWGJDN"))); + dataLoad.setCurrentCombReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZHWGFDN"))); + dataLoad.setCurrentCombReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZHWGPDN"))); + dataLoad.setCurrentCombReactiveValley(StringUtils.getBigDecimal(obj.get("DQZHWGGDN"))); + // 电能设置-正向无功 + dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZXWGZDN"))); + dataLoad.setCurrentForwardReactivePeak(StringUtils.getBigDecimal(obj.get("DQZXWGJDN"))); + dataLoad.setCurrentForwardReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZXWGFDN"))); + dataLoad.setCurrentForwardReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZXWGPDN"))); + dataLoad.setCurrentForwardReactiveValley(StringUtils.getBigDecimal(obj.get("DQZXWGGDN"))); + // 电能设置-反向无功 + dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("DQFXWGZDN"))); + dataLoad.setCurrentReverseReactivePeak(StringUtils.getBigDecimal(obj.get("DQFXWGJDN"))); + dataLoad.setCurrentReverseReactiveHigh(StringUtils.getBigDecimal(obj.get("DQFXWGFDN"))); + dataLoad.setCurrentReverseReactiveFlat(StringUtils.getBigDecimal(obj.get("DQFXWGPDN"))); + dataLoad.setCurrentReverseReactiveValley(StringUtils.getBigDecimal(obj.get("DQFXWGGDN"))); + + // 电压+电流 + dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + + dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("CBXDY"))); + dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("ACXDY"))); + + // 频率 + dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("PL"))); + + // 功率 有功+总+无功+无总+视在 + dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + dataLoad.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); + dataLoad.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); + dataLoad.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); + dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + + // 功率因数 + dataLoad.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); + dataLoad.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); + dataLoad.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); + dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + + // 需量 + dataLoad.setForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("ZXYGZDXL"))); + dataLoad.setReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("FXYGZDXL"))); + dataLoad.setDailyForwardMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXYGZDXL"))); + + dataLoad.setCreateBy("system"); + dataLoad.setCreateTime(DateUtils.getNowDate()); + dataLoad.setUpdateBy("system"); + dataLoad.setUpdateTime(DateUtils.getNowDate()); + dataLoad.setSiteId(SITE_ID); + dataLoad.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); + + } + + private void dealFXXDailyChargeDate(String deviceId, String dataJson) { + log.info("start dealFXXDailyChargeDate"); + //日充放电数据 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 初始化当日数据 + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(SITE_ID); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(StringUtils.getBigDecimal(obj.get("ZCDL"))); + emsDailyChargeData.setTotalDischargeData(StringUtils.getBigDecimal(obj.get("ZFDL"))); + emsDailyChargeData.setChargeData(StringUtils.getBigDecimal(obj.get("RCDL"))); + emsDailyChargeData.setDischargeData(StringUtils.getBigDecimal(obj.get("RFDL"))); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + log.info("end dealFXXDailyChargeDate"); + } + + private void meteDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 获取上次数据,便于后面计算差值均无则默认0 + EmsAmmeterData lastAmmeterData = getLastAmmeterData(deviceId); + + EmsAmmeterData dataLoad = new EmsAmmeterData(); + // 更新时间 + dataLoad.setDataUpdateTime(dataUpdateTime); + // 电压+电流 + dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + + dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY"))); + dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY"))); + + // 频率 + dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); + + // 功率 + dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + + dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + + // 二次相关数据 + dataLoad.setSecondaryAbLineVoltage(StringUtils.getBigDecimal(obj.get("ECABXDY"))); + dataLoad.setSecondaryAPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECAXDL"))); + dataLoad.setSecondaryAPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECAXDY"))); + dataLoad.setSecondaryAPowerFactor(StringUtils.getBigDecimal(obj.get("ECAXGLYS"))); + dataLoad.setSecondaryAApparentPower(StringUtils.getBigDecimal(obj.get("ECAXSZGL"))); + dataLoad.setSecondaryAReactivePower(StringUtils.getBigDecimal(obj.get("ECAXWGGL"))); + dataLoad.setSecondaryAActivePower(StringUtils.getBigDecimal(obj.get("ECAXYGGL"))); + dataLoad.setSecondaryBcLineVoltage(StringUtils.getBigDecimal(obj.get("ECBCXDY"))); + dataLoad.setSecondaryBPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECBXDL"))); + dataLoad.setSecondaryBPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECBXDY"))); + dataLoad.setSecondaryBPowerFactor(StringUtils.getBigDecimal(obj.get("ECBXGLYS"))); + dataLoad.setSecondaryBApparentPower(StringUtils.getBigDecimal(obj.get("ECBXSZGL"))); + dataLoad.setSecondaryBReactivePower(StringUtils.getBigDecimal(obj.get("ECBXWGGL"))); + dataLoad.setSecondaryBActivePower(StringUtils.getBigDecimal(obj.get("ECBXYGGL"))); + dataLoad.setSecondaryCaLineVoltage(StringUtils.getBigDecimal(obj.get("ECCAXDY"))); + dataLoad.setSecondaryCPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECCXDL"))); + dataLoad.setSecondaryCPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECCXDY"))); + dataLoad.setSecondaryCPowerFactor(StringUtils.getBigDecimal(obj.get("ECCXGLYS"))); + dataLoad.setSecondaryCApparentPower(StringUtils.getBigDecimal(obj.get("ECCXSZGL"))); + dataLoad.setSecondaryCReactivePower(StringUtils.getBigDecimal(obj.get("ECCXWGGL"))); + dataLoad.setSecondaryCActivePower(StringUtils.getBigDecimal(obj.get("ECCXYGGL"))); + dataLoad.setSecondaryGridFrequency(StringUtils.getBigDecimal(obj.get("ECDWPL"))); + dataLoad.setSecondaryReverseReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXWGDN"))); + dataLoad.setSecondaryNegativeActiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXYGDN"))); + dataLoad.setSecondaryTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ECZGLYS"))); + dataLoad.setSecondaryTotalApparentPower(StringUtils.getBigDecimal(obj.get("ECZSZFL"))); + dataLoad.setSecondaryTotalReactivePower(StringUtils.getBigDecimal(obj.get("ECZWGGL"))); + dataLoad.setSecondaryPositiveReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXWGDN"))); + dataLoad.setSecondaryPositiveActiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXYGDN"))); + dataLoad.setSecondaryTotalActivePower(StringUtils.getBigDecimal(obj.get("ECZYGGL"))); + + // 需量 + dataLoad.setReverseReactiveEnergyEqMinus(StringUtils.getBigDecimal(obj.get("FXWGDN"))); + dataLoad.setReverseActiveEnergyEpMinus(StringUtils.getBigDecimal(obj.get("FXYGDN"))); + dataLoad.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); + dataLoad.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); + + // 正反向有功无功电能 + dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); + dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("FXYGDN"))); + dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); + dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("FXWGDN"))); + + dataLoad.setCreateBy("system"); + dataLoad.setCreateTime(DateUtils.getNowDate()); + dataLoad.setUpdateBy("system"); + dataLoad.setUpdateTime(DateUtils.getNowDate()); + dataLoad.setSiteId(SITE_ID); + dataLoad.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); + + // 处理电表每日充放电数据 + dealAmmeterDailyDate(obj, dataUpdateTime, lastAmmeterData); + } + + private EmsAmmeterData getLastAmmeterData(String deviceId) { + // 先从redis取,取不到查数据 + EmsAmmeterData lastData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId); + if (lastData == null) { + lastData = emsAmmeterDataMapper.getLastData(SITE_ID,deviceId); + if (lastData == null) { + lastData = new EmsAmmeterData(); + lastData.setSiteId(SITE_ID); + lastData.setDeviceId(deviceId); + lastData.setCurrentForwardActiveTotal(BigDecimal.ZERO); + lastData.setCurrentReverseActiveTotal(BigDecimal.ZERO); + } + } + return lastData; + } + + private void dealAmmeterDailyDate(Map obj, Date dataUpdateTime, EmsAmmeterData lastData) { + // 先获取当月电价配置,redis没有这查数据库,都没有则返回 + String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + SITE_ID + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(priceKey); + if (priceVo == null) { + priceVo = emsEnergyPriceConfigService.getCurrentMonthPrice(SITE_ID); + redisCache.setCacheObject(priceKey, priceVo, 31, TimeUnit.DAYS); + if (priceVo == null) { + return; + } + } + List timeRanges = priceVo.getRange(); + if (timeRanges == null) { + return; + } + + // 根据时间范围判断数据类型(尖峰平谷),无法确定数据类型则不处理 + String costType = ""; + String startTime = ""; + for (EnergyPriceTimeRange timeRange : timeRanges) { + startTime = timeRange.getStartTime(); + if (isInPriceTimeRange(startTime, timeRange.getEndTime(), dataUpdateTime)) { + costType = timeRange.getCostType(); + break; + } + } + if (StringUtils.isEmpty(costType)) { + return; + } + + //初始化电表每日差值对象 + EmsDailyEnergyData energyData = initEnergyData(); + + // 根据 costType,计算本次与上次数据差值,累加到对应的数据类型里面 + setDiffByCostType(costType,energyData,lastData,obj,priceVo); + + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, + Map obj, EnergyPriceVo priceVo) { + BigDecimal currentChargeData = StringUtils.getBigDecimal(obj.get("ZXYGDN")); + BigDecimal currentDischargeData = StringUtils.getBigDecimal(obj.get("FXYGDN")); + currentChargeData = currentChargeData != null ? currentChargeData : BigDecimal.ZERO; + currentDischargeData = currentDischargeData != null ? currentDischargeData : BigDecimal.ZERO; + + // 获取上次实时总收益+当日实时总收益,初始化电价 + Map revenueMap = getRealTimeData(SITE_ID); + BigDecimal totalRevenue = revenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : revenueMap.get("totalRevenue"); + BigDecimal dayRevenue = revenueMap.get("dayRevenue") == null ? BigDecimal.ZERO : revenueMap.get("dayRevenue"); + BigDecimal price = BigDecimal.ZERO; + // 计算时段差值,按照数据类型累加 + // 计算当日累加收益,尖峰平谷收益在当日原基础累加,(放电量-充电量)*电价 + BigDecimal chargeDiffData = currentChargeData.subtract( + lastData.getCurrentForwardActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentForwardActiveTotal()); + BigDecimal disChargeDiffData = currentDischargeData.subtract( + lastData.getCurrentReverseActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentReverseActiveTotal() + ); + switch (costType) { + case "peak": + // 增加电量 + BigDecimal peakCharge = energyData.getPeakChargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakChargeDiff(); + energyData.setPeakChargeDiff(peakCharge.add(chargeDiffData)); + BigDecimal peakDischarge = energyData.getPeakDischargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakDischargeDiff(); + energyData.setPeakDischargeDiff(peakDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + break; + case "high": + // 增加电量 + BigDecimal highCharge = energyData.getHighChargeDiff() == null ? BigDecimal.ZERO : energyData.getHighChargeDiff(); + energyData.setHighChargeDiff(highCharge.add(chargeDiffData)); + BigDecimal highDischarge = energyData.getHighDischargeDiff() == null ? BigDecimal.ZERO : energyData.getHighDischargeDiff(); + energyData.setHighDischargeDiff(highDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + break; + case "flat": + // 增加电量 + BigDecimal flatCharge = energyData.getFlatChargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatChargeDiff(); + energyData.setFlatChargeDiff(flatCharge.add(chargeDiffData)); + BigDecimal flatDischarge = energyData.getFlatDischargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatDischargeDiff(); + energyData.setFlatDischargeDiff(flatDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + break; + case "valley": + // 增加电量 + BigDecimal valleyCharge = energyData.getValleyChargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyChargeDiff(); + energyData.setValleyChargeDiff(valleyCharge.add(chargeDiffData)); + BigDecimal valleyDischarge = energyData.getValleyDischargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyDischargeDiff(); + energyData.setValleyDischargeDiff(valleyDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + break; + default: + return; + } + + // 计算本次累加收益 + BigDecimal addRevenue = disChargeDiffData.subtract(chargeDiffData).multiply(price); + dayRevenue = dayRevenue.add(addRevenue); + energyData.setDayRevenue(dayRevenue); + // 总收益 = 上次实时总收益+今日实时增加的收益 + totalRevenue = totalRevenue.add(addRevenue); + energyData.setTotalRevenue(totalRevenue); + + // 存redis便于下次取用 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + SITE_ID + "_" + today; + Map realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", totalRevenue); + realTimeRevenue.put("dayRevenue",dayRevenue); + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + + private Map getRealTimeData(String siteId) { + // fx取实时总收益和当天实时收益 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId + "_" + today; + Map realTimeRevenue = redisCache.getCacheObject(redisKey); + if (realTimeRevenue == null) { + // 查数据库 + realTimeRevenue = iEmsEnergyPriceConfigService.getDayRevenueMap(SITE_ID); + if (realTimeRevenue == null) { + realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", BigDecimal.ZERO); + realTimeRevenue.put("dayRevenue", BigDecimal.ZERO); + } + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + return realTimeRevenue; + } + + private boolean isInPriceTimeRange(String startTime, String endTime, Date dataUpdateTime) { + if (startTime == null || endTime == null || dataUpdateTime == null) { + return false; + } + LocalDateTime time = DateUtils.toLocalDateTime(dataUpdateTime); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + String dataTimeStr = time.format(formatter); + // 比较时间范围 + return dataTimeStr.compareTo(startTime) >= 0 + && dataTimeStr.compareTo(endTime) < 0; + } + + private EmsDailyEnergyData initEnergyData() { + // 先获取数据库当天数据,存在则更新时间,不存在则初始化 + EmsDailyEnergyData energyData = emsDailyEnergyDataMapper.getDataByDate(SITE_ID,DateUtils.getDate()); + if (energyData == null) { + energyData = new EmsDailyEnergyData(); + energyData.setSiteId(SITE_ID); + energyData.setDataDate(DateUtils.getNowDate()); + energyData.setCreateBy("system"); + energyData.setCreateTime(DateUtils.getNowDate()); + } + energyData.setUpdateBy("system"); + energyData.setCalcTime(DateUtils.getNowDate()); + return energyData; + } + + // 数据分组处理 + private static Map> processData(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 提取记录ID(最后3位) + String recordId = key.substring(key.length() - 3); + try { + Long.parseLong(recordId); + } catch (Exception e) { + continue; + } + + // 提取字段类型(前缀) + String fieldType = key.substring(0, key.length() - 3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + return records; + } + + private static Map> processDataPrefix(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 确保键长度足够 + if (key.length() < 3) { + continue; + } + + // 提取记录ID(前3位) + String recordId = key.substring(0, 3); + if (!recordId.startsWith("DY")) { + continue; + } + + // 提取字段类型(剩余部分) + String fieldType = key.substring(3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + return records; + } + + @Override + public void processBatch(List batchData) { + super.processBatch(batchData); + } + + // 空数据不处理 + private boolean checkJsonDataEmpty(String jsonData) { + boolean flag = false; + try { + if (StringUtils.isEmpty(jsonData)) { + flag = true; + } + JsonNode jsonNode = objectMapper.readTree(jsonData); + // 判断是否为空对象({}) + if (jsonNode.isObject() && jsonNode.isEmpty()) { + flag = true ; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return flag; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java new file mode 100644 index 0000000..5df0d62 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java @@ -0,0 +1,762 @@ +package com.xzzn.ems.service.impl; + +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointDataList; +import com.xzzn.ems.domain.vo.GeneralQueryDataVo; +import com.xzzn.ems.domain.vo.GeneralQueryResponse; +import com.xzzn.ems.domain.vo.PointNameRequest; +import com.xzzn.ems.domain.vo.SiteBatteryListVo; +import com.xzzn.ems.mapper.EmsBatteryDataMonthMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsPointMatchMapper; +import com.xzzn.ems.service.IGeneralQueryService; + +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +/** + * 综合查询 服务层实现 + * + */ +@Service +public class GeneralQueryServiceImpl implements IGeneralQueryService +{ + private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:00"); + + @Autowired + private EmsPointMatchMapper emsPointMatchMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsBatteryDataMonthMapper emsBatteryDataMonthMapper; + + @Override + public List getPointNameList(PointNameRequest request) { + List siteIds = request.getSiteIds(); + if (siteIds == null || siteIds.isEmpty()) { + return Collections.emptyList(); + } + + String deviceCategory = request.getDeviceCategory(); + if (deviceCategory == null) { + return Collections.emptyList(); + } + + return emsPointMatchMapper.getPointNameList(siteIds,deviceCategory,request.getPointName()); + } + + @Override + public Map> getAllBatteryIdsBySites(String[] siteIds) { + Map> resultMap = new HashMap<>(); + if (siteIds == null || siteIds.length == 0) { + return resultMap; + } + List siteBatteryListVos = emsBatteryDataMonthMapper.getAllBatteryIdsBySites(siteIds); + resultMap = convertToMap(siteBatteryListVos); + return resultMap; + } + + public static Map> convertToMap(List siteDeviceList) { + Map> resultMap = new HashMap<>(); + + for (SiteBatteryListVo item : siteDeviceList) { + String siteId = item.getSiteId (); + String deviceId = item.getDeviceId (); + if (!resultMap.containsKey (siteId)) { + resultMap.put (siteId, new ArrayList<>()); + } + resultMap.get (siteId).add (deviceId); + } + + return resultMap; + } + + @Override + public List getPointValueList(PointNameRequest request){ + List result = new ArrayList<>(); + List querySiteIds = new ArrayList<>(); + + List siteIds = request.getSiteIds(); + String deviceId = request.getDeviceId(); + String deviceCategory = request.getDeviceCategory(); + // 处理点位名称 + String pointName = request.getPointName(); + // 根据入参获取点位对应的表和字段 + List matchInfo = emsPointMatchMapper.getMatchInfo(siteIds,deviceId,deviceCategory,pointName); + if (CollectionUtils.isEmpty(matchInfo) && DeviceCategory.AMMETER.getCode().equals(deviceCategory)) { + pointName = processPointName(pointName); + matchInfo = emsPointMatchMapper.getMatchInfo(siteIds,deviceId,deviceCategory,pointName); + } + if (CollectionUtils.isEmpty(matchInfo)) { + return result; + } else { + for (EmsPointMatch emsPointMatch : matchInfo) { + querySiteIds.add(emsPointMatch.getSiteId()); + } + } + + // 单体电池特殊校验 + Map> siteDeviceMap = request.getSiteDeviceMap(); + if (DeviceCategory.BATTERY.getCode().equals(deviceCategory) && (siteDeviceMap == null || siteDeviceMap.size() == 0)) { + return result; + } + + // 处理时间范围,如果未传根据数据单位设默认值 + dealDataTime(request); + + try { + // 不同的site_id根据设备类型和字段,默认取第一个匹配到的表和表字段只会有一个, + EmsPointMatch pointMatch = matchInfo.get(0); + String finalPointName = pointName; + Optional emsPointMatch = matchInfo.stream() + .filter(item -> finalPointName.equals(item.getPointName()) || finalPointName.equals(item.getDataPointName())) + .findFirst(); + if (emsPointMatch.isPresent()) { + pointMatch = emsPointMatch.get(); + } + String tableName = pointMatch.getMatchTable(); + String tableField = pointMatch.getMatchField(); + Long dataType = pointMatch.getDataType(); + if (DeviceCategory.BATTERY.getCode().equals(deviceCategory)) { + // 单体电池数据特殊处理 + result = generalQueryBatteryData(querySiteIds,tableName,tableField,request,deviceCategory,dataType); + } else { + // 其他设备数据 + result = generalQueryCommonData(querySiteIds,tableName,tableField,request,deviceCategory,dataType); + } + } catch (ParseException e) { + throw new RuntimeException(e); + } + return result; + } + + private String processPointName(String pointName) { + // 特殊处理 + if ("正向有功电能".equals(pointName)) { + pointName = "当前正向总有功电能"; + } + if ("反向有功电能".equals(pointName)) { + pointName = "当前反向总有功电能"; + } + if ("正向无功电能".equals(pointName)) { + pointName = "当前正向总无功电能"; + } + if ("反向无功电能".equals(pointName)) { + pointName = "当前反向总无功电能"; + } + if ("有功功率".equals(pointName)) { + pointName = "功率"; + } + if ("无功功率".equals(pointName)) { + pointName = "总无功功率"; + } + return pointName; + } + + private List generalQueryCommonData(List querySiteIds, String tableName, + String tableField, PointNameRequest request, + String deviceCategory, Long dataType) throws ParseException { + List result = new ArrayList<>(); + List dataVoList = new ArrayList<>(); + + int dataUnit = request.getDataUnit(); + String deviceId = request.getDeviceId(); + Date startDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,request.getStartDate()); + Date endDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,request.getEndDate()); + if (dataUnit == 1) { // 分钟:yyyy-MM-dd HH:mm:ss + startDate = DateUtils.adjustToStartOfMinutes(request.getStartDate()); + dataVoList = emsPointMatchMapper.getCommonPointDataByMinutes(querySiteIds,tableName,tableField,startDate,endDate,deviceId); + if (dataVoList != null && dataVoList.size() > 0) { + dataVoList = dealWithMinutesData(querySiteIds,dataVoList,deviceCategory, + request.getStartDate(),request.getEndDate()); + } + } else if (dataUnit == 2) { // 小时:yyyy-MM-dd HH:mm:ss + dataVoList = emsPointMatchMapper.getCommonPointDataByHours(querySiteIds,tableName,tableField,startDate,endDate,deviceId); + } else if (dataUnit == 3) { // 天:yyyy-MM-dd 00:00:00 + endDate = DateUtils.adjustToEndOfDay(request.getEndDate()); + dataVoList = emsPointMatchMapper.getCommonPointDataForBoxPlot(querySiteIds,tableName,tableField,startDate,endDate,deviceId); + } + + if (dataUnit == 3) { + // 箱线图数据特殊处理 + result = dealCommonWithBoxPlotData(dataVoList, dataType); + } else { + // 曲线图数据特殊处理 + // 数据转换+计算曲线数据最大最小平均和差值 + result = convertCommonToResultList(dataVoList, dataType); + } + + return result; + } + + private List generalQueryBatteryData(List querySiteIds, String tableName, + String tableField, PointNameRequest request, + String deviceCategory, Long dataType) throws ParseException { + List result = new ArrayList<>(); + List dataVoList = new ArrayList<>(); + + int dataUnit = request.getDataUnit(); + String clusterDeviceId = request.getDeviceId(); + Date startDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,request.getStartDate()); + Date endDate = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,request.getEndDate()); + Map> siteDeviceMap = request.getSiteDeviceMap(); + if (dataUnit == 1) { // 分钟 + startDate = DateUtils.adjustToStartOfMinutes(request.getStartDate()); + dataVoList = emsPointMatchMapper.getBatteryPointDataByMinutes(querySiteIds,tableName,tableField,startDate,endDate,siteDeviceMap,clusterDeviceId); + if (dataVoList != null && dataVoList.size() > 0) { + dataVoList = dealWithBatteryMinutesData(querySiteIds,dataVoList,deviceCategory, + request.getStartDate(),request.getEndDate(),siteDeviceMap); + } + } else if (dataUnit == 2) { // 小时 + startDate = DateUtils.adjustToStartOfHour(request.getStartDate()); + tableName = "ems_battery_data_hour"; + dataVoList = emsPointMatchMapper.getBatteryPointDataByHours(querySiteIds,tableName,tableField,startDate,endDate,siteDeviceMap,clusterDeviceId); + } else if (dataUnit == 3) { // 天 + endDate = DateUtils.adjustToEndOfDay(request.getEndDate()); + tableName = "ems_battery_data_day"; + dataVoList = emsPointMatchMapper.getBatteryPointDataForBoxPlot(querySiteIds,tableName,tableField,startDate,endDate,siteDeviceMap,clusterDeviceId); + } + // 数据转换 + if (dataUnit == 3) { + // 箱线图数据特殊处理 + result = dealBatteryWithBoxPlotData(dataVoList, dataType); + } else { + // 曲线图数据特殊处理 + // 数据转换+计算曲线数据最大最小平均和差值 + result = convertBatteryToResultList(dataVoList, dataType); + } + return result; + } + + private List dealCommonWithBoxPlotData(List dataVoList, Long dataType) { + // 数据转换: 先按siteId分组,再按deviceId分组 + return dataVoList.stream() + // 第一层分组:按siteId分组,得到 + .collect(Collectors.groupingBy(GeneralQueryDataVo::getSiteId)) + .entrySet().stream() + .map(siteEntry -> { + String siteId = siteEntry.getKey(); + List siteAllData = siteEntry.getValue(); + + // 第二层分组:在当前站点下,按deviceId分组,得到 + List deviceList = siteAllData.stream() + .collect(Collectors.groupingBy(GeneralQueryDataVo::getDeviceId)) + .entrySet().stream() + .map(deviceEntry -> { + String deviceId = deviceEntry.getKey(); + List deviceDataList = deviceEntry.getValue(); + + // 第三层分组:在当前设备下,按时间分组,得到 <时间, 该时间段数据> + List dataList = deviceDataList.stream().sorted(Comparator.comparing(GeneralQueryDataVo::getValueDate)) + .collect(Collectors.groupingBy( + GeneralQueryDataVo::getValueDate, + TreeMap::new, + Collectors.toList())) + .entrySet().stream().map(timeEntry -> { + String valueDate = timeEntry.getKey(); + // 计算当前设备数据的统计值(最小值,第一四分位数,中位数,第三四分位数, 最大值) + List values = timeEntry.getValue().stream().map(data -> new BigDecimal(String.valueOf(data.getPointValue()))).collect(Collectors.toList()); + BoxPlotData data = calculateBoxPlotData(values); + return new GeneralQueryDataVo(siteId, deviceId, valueDate, null, data.min, data.q1, data.median, data.q3, data.max); + }).collect(Collectors.toList()); + + return new DevicePointDataList(deviceId, null, dataList); + }) + .collect(Collectors.toList()); + + return new GeneralQueryResponse(siteId, deviceList, dataType, 2L); + }) + .collect(Collectors.toList()); + } + + private List dealBatteryWithBoxPlotData(List dataVoList, Long dataType) { + // 先按siteId分组 + return dataVoList.stream() + .collect(Collectors.groupingBy(GeneralQueryDataVo::getSiteId)) + .entrySet().stream() + .map(siteEntry -> { + String siteId = siteEntry.getKey(); + List siteData = siteEntry.getValue(); + + // 2. 按(deviceId + parentDeviceId)组合分组,生成deviceList + List deviceList = siteData.stream() + // 分组键:deviceId + parentDeviceId(确保唯一设备) + .collect(Collectors.groupingBy(data -> + data.getDeviceId() + "_" + data.getParentDeviceId() + )) + .entrySet().stream() + .map(deviceEntry -> { + // 解析分组键,获取deviceId和parentDeviceId + String[] keyParts = deviceEntry.getKey().split("_"); + String deviceId = keyParts[0]; + String parentDeviceId = keyParts[1]; + + // 3. 第三层分组:在当前设备下,按时间分组,得到 <时间, 该时间段数据> + List deviceDataList = deviceEntry.getValue().stream() + .collect(Collectors.groupingBy( + GeneralQueryDataVo::getValueDate, + TreeMap::new, + Collectors.toList())) + .entrySet().stream().map(timeEntry -> { + String valueDate = timeEntry.getKey(); + + // 计算当前设备数据的统计值(最小值,第一四分位数,中位数,第三四分位数, 最大值) + List values = timeEntry.getValue().stream().map(data -> new BigDecimal(String.valueOf(data.getPointValue()))).collect(Collectors.toList()); + BoxPlotData data = calculateBoxPlotData(values); + return new GeneralQueryDataVo(siteId, deviceId, valueDate, parentDeviceId, data.min, data.q1, data.median, data.q3, data.max); + }).collect(Collectors.toList()); + + // 4. 构建DeviceItem + return new DevicePointDataList(deviceId, parentDeviceId, deviceDataList); + })// 关键排序步骤:先按deviceId升序,再按parentDeviceId升序 + .sorted( + Comparator.comparing(DevicePointDataList::getDeviceId) // 第一排序键:deviceId + .thenComparing(DevicePointDataList::getParentDeviceId) // 第二排序键:parentDeviceId + ) + .collect(Collectors.toList()); + + // 5. 构建SiteData + return new GeneralQueryResponse(siteId, deviceList, dataType, 2L); + }) + .collect(Collectors.toList()); + } + + private List convertBatteryToResultList(List dataVoList, Long dataType) { + // 先按siteId分组 + return dataVoList.stream() + .collect(Collectors.groupingBy(GeneralQueryDataVo::getSiteId)) + .entrySet().stream() + .map(siteEntry -> { + String siteId = siteEntry.getKey(); + List siteData = siteEntry.getValue(); + + // 2. 按(deviceId + parentDeviceId)组合分组,生成deviceList + List deviceList = siteData.stream() + // 分组键:deviceId + parentDeviceId(确保唯一设备) + .collect(Collectors.groupingBy(data -> + data.getDeviceId() + "_" + data.getParentDeviceId() + )) + .entrySet().stream() + .map(deviceEntry -> { + // 解析分组键,获取deviceId和parentDeviceId + String[] keyParts = deviceEntry.getKey().split("_"); + String deviceId = keyParts[0]; + String parentDeviceId = keyParts[1]; + + // 3. 转换为PointValue列表 + List pointValueList = deviceEntry.getValue().stream() + .map(data -> { + GeneralQueryDataVo pv = new GeneralQueryDataVo(); + pv.setSiteId(siteId); + pv.setDeviceId(deviceId); + pv.setValueDate(data.getValueDate()); + pv.setPointValue(data.getPointValue()); + pv.setParentDeviceId(parentDeviceId); + return pv; + }) + .collect(Collectors.toList()); + + // 4. 计算最大最小平均值 + Stats stats = clacStats(pointValueList); + + // 4. 构建DeviceItem + return new DevicePointDataList(deviceId, pointValueList,parentDeviceId, + stats.max, stats.min,stats.avg,stats.diff,stats.maxDate,stats.minDate); + })// 关键排序步骤:先按deviceId升序,再按parentDeviceId升序 + .sorted( + Comparator.comparing(DevicePointDataList::getDeviceId) // 第一排序键:deviceId + .thenComparing(DevicePointDataList::getParentDeviceId) // 第二排序键:parentDeviceId + ) + .collect(Collectors.toList()); + + // 5. 构建SiteData + return new GeneralQueryResponse(siteId, deviceList, dataType, 1L); + }) + .collect(Collectors.toList()); + } + + private List convertCommonToResultList(List dataVoList, Long dataType) { + // 数据转换: 先按siteId分组,再按deviceId分组 + return dataVoList.stream() + // 第一层分组:按siteId分组,得到 + .collect(Collectors.groupingBy(GeneralQueryDataVo::getSiteId)) + .entrySet().stream() + .map(siteEntry -> { + String siteId = siteEntry.getKey(); + List siteAllData = siteEntry.getValue(); + + // 第二层分组:在当前站点下,按deviceId分组,得到 + List deviceList = siteAllData.stream() + .collect(Collectors.groupingBy(GeneralQueryDataVo::getDeviceId)) + .entrySet().stream() + .map(deviceEntry -> { + String deviceId = deviceEntry.getKey(); + List deviceDataList = deviceEntry.getValue(); + + // 计算当前设备数据的统计值(最大,最小,平均,差值) + Stats stats = clacStats(deviceDataList); + + return new DevicePointDataList(deviceId, deviceDataList,null, + stats.max, stats.min,stats.avg,stats.diff,stats.maxDate,stats.minDate); + }) + .collect(Collectors.toList()); + + return new GeneralQueryResponse(siteId, deviceList, dataType, 1L); + }) + .collect(Collectors.toList()); + + } + + private Stats clacStats(List deviceDataList) { + // 转换并过滤数据,封装数值和对应的时间 + List validPairs = deviceDataList.stream() + .map(vo -> { + BigDecimal value = convertToBigDecimal(vo.getPointValue()); + return value != null ? + new ValueTimePair(value, vo.getValueDate()) : + null; + }) + .filter(pair -> pair != null) // 过滤无效数据 + .collect(Collectors.toList()); + + if (validPairs.isEmpty()) { + return new Stats(null, null, null, null, null, null); + } + // 计算最大最小值 + Optional maxPair = validPairs.stream().max((p1, p2) -> p1.value.compareTo(p2.value)); + Optional minPair = validPairs.stream().min((p1, p2) -> p1.value.compareTo(p2.value)); + // 计算平均值,四舍五入保留4为小数 + BigDecimal sum = validPairs.stream() .map(pair -> pair.value).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal avgValue = sum.divide(BigDecimal.valueOf(validPairs.size()), 4, BigDecimal.ROUND_HALF_UP); + // 增量数据,计算差值 + BigDecimal diff = maxPair.get().value.subtract(minPair.get().value); + + return new Stats(maxPair.get().value,minPair.get().value,avgValue,diff,maxPair.get().time,minPair.get().time); + } + + private BigDecimal convertToBigDecimal(Object pointValue) { + if (pointValue == null) { + return null; + } + // 根据实际存储的数值类型,依次判断并转换 + if (pointValue instanceof BigDecimal) { + return (BigDecimal) pointValue; + } else if (pointValue instanceof Integer) { + return new BigDecimal ((Integer) pointValue); + } else if (pointValue instanceof Long) { + return new BigDecimal ((Long) pointValue); + } else if (pointValue instanceof Double) { + return BigDecimal.valueOf ((Double) pointValue); // 避免 Double 精度丢失 + } else if (pointValue instanceof Float) { + return BigDecimal.valueOf ((Float) pointValue); + } else { + // 非数值类型(如 String),可根据业务需求处理(此处返回 null) + return null; + } + } + + private void dealDataTime(PointNameRequest request) { + String startDate = request.getStartDate(); + String endDate = request.getEndDate(); + int dataUnit = request.getDataUnit(); + if (startDate == null || endDate == null) { + // 前端未传递时,根据dataunit设置默认时间范围 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime start; + LocalDateTime end; + switch (dataUnit) { + case 1: // 按分钟 - 前一小时 + end = now; + start = now.minusHours(1); + break; + case 2: // 按小时 - 当天 + end = now.with(LocalTime.MAX); + start = now.with(LocalTime.MIN); + break; + case 3: // 按天 - 当月 + end = now.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX); + start = now.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); + break; + default: + throw new IllegalArgumentException("无效的dataunit值: " + dataUnit); + } + // 格式化为字符串(与前端传递的格式一致) + startDate = DateUtils.convertToString(start); + endDate = DateUtils.convertToString(end); + } + request.setStartDate(startDate); + request.setEndDate(endDate); + } + + private List dealWithMinutesData(List querySiteIds, List dataVoList, + String deviceCategory, String startDate, String endDate) throws ParseException { + List fullData = new ArrayList<>(); + Map dataMap = new HashMap<>(); + List deviceIds = new ArrayList<>(); + for (GeneralQueryDataVo data : dataVoList) { + String key = data.getSiteId() + "_" + data.getDeviceId() + "_" + data.getValueDate(); + dataMap.put(key, data); + + if (!deviceIds.contains(data.getDeviceId())) { + deviceIds.add(data.getDeviceId()); + } + } + // 生成分钟序列 + Set minuteSeries = generateMinuteSeries(startDate, endDate); + // 遍历每个站点,查看设备 + for (String siteId : querySiteIds) { + // 处理该站点下的所有设备 + for (String deviceId : deviceIds) { + Object lastValue = null; + + for (String minute : minuteSeries) { + String dataKey = siteId + "_" + deviceId + "_" + minute; + GeneralQueryDataVo data = dataMap.get(dataKey); + + // 空值填充逻辑 + if (data == null) { + data = new GeneralQueryDataVo(); + data.setValueDate(minute); + data.setSiteId(siteId); + data.setDeviceId(deviceId); + data.setPointValue(lastValue==null? BigDecimal.ZERO : lastValue); // 用上一分钟值填充 + } else { + lastValue = data.getPointValue(); // 更新最新值 + } + + fullData.add(data); + } + } + } + + fullData.sort(Comparator.comparing(GeneralQueryDataVo::getValueDate) + .thenComparing(GeneralQueryDataVo::getSiteId) + .thenComparing(GeneralQueryDataVo::getDeviceId)); + + return fullData; + } + + private List dealWithBatteryMinutesData(List querySiteIds, List dataVoList, + String deviceCategory, String startDate, String endDate, + Map> siteDeviceMap) throws ParseException { + List fullData = new ArrayList<>(); + Map dataMap = new HashMap<>(); + List clusterIds = new ArrayList<>(); + for (GeneralQueryDataVo data : dataVoList) { + String key = data.getParentDeviceId() + "_" + data.getDeviceId() + "_" + data.getValueDate(); + dataMap.put(key, data); + + if (!clusterIds.contains(data.getParentDeviceId())) { + clusterIds.add(data.getParentDeviceId()); + } + } + // 生成分钟序列 + Set minuteSeries = generateMinuteSeries(startDate, endDate); + + Map lastValueMap = new HashMap<>(); + String siteId = querySiteIds.get(0); + // 单站-先处理站点下的簇id + for (String clusterId : clusterIds) { + List deviceIds = siteDeviceMap.get(siteId); + if (deviceIds.isEmpty()) { + continue; + } + for (String deviceId : deviceIds) { + String deviceKey = clusterId + "_" + deviceId; + + for (String minute : minuteSeries) { + Object lastValue = lastValueMap.get(deviceKey); + String dataKey = clusterId + "_" + deviceId + "_" + minute; + GeneralQueryDataVo data = dataMap.get(dataKey); + + // 空值填充逻辑 + if (data == null) { + data = new GeneralQueryDataVo(); + data.setValueDate(minute); + data.setSiteId(siteId); + data.setDeviceId(deviceId); + data.setParentDeviceId(clusterId); + data.setPointValue(lastValue == null ? 0 : lastValue); // 上一分钟数据不存在默认0 + } else { + lastValueMap.put(deviceKey,data.getPointValue());// 更新最新值 + } + + fullData.add(data); + } + } + + } + + fullData.sort(Comparator.comparing(GeneralQueryDataVo::getValueDate) + .thenComparing(GeneralQueryDataVo::getSiteId) + .thenComparing(GeneralQueryDataVo::getDeviceId)); + + return fullData; + } + + /** + * 根据前端传递的startDate和endDate生成所有分钟点的序列 + * @param startDate 起始时间(格式:yyyy-MM-dd HH:mm:00) + * @param endDate 结束时间(格式:yyyy-MM-dd HH:mm:00) + * @return 包含所有分钟点的有序集合 + * @throws ParseException 时间格式解析失败时抛出 + */ + private Set generateMinuteSeries(String startDate, String endDate) throws ParseException { + Set minutes = new TreeSet<>(); // TreeSet保证时间有序 + + // 解析起止时间 + //startDate = DateUtils.adjustToNextMinute(startDate); + Date startTime = TIME_FORMAT.parse(startDate.substring(0, 16) + ":00"); + Date endTime = TIME_FORMAT.parse(endDate.substring(0, 16) + ":00"); + + // 验证时间有效性 + if (startTime.after(endTime)) { + throw new IllegalArgumentException("起始时间不能晚于结束时间"); + } + + // 初始化日历对象,从起始时间开始 + Calendar cal = Calendar.getInstance(); + cal.setTime(startTime); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + // 循环生成从startDate到endDate的所有分钟点 + while (!cal.getTime().after(endTime)) { + // 添加当前分钟(格式:yyyy-MM-dd HH:mm:00) + minutes.add(TIME_FORMAT.format(cal.getTime())); + // 递增1分钟 + cal.add(Calendar.MINUTE, 1); + } + + return minutes; + } + + public BoxPlotData calculateBoxPlotData(List values) { + if (values == null || values.isEmpty()) { + return null; + } + + // 排序 + Collections.sort(values); + + // 计算五个统计量 + BigDecimal min = values.get(0); + BigDecimal max = values.get(values.size() - 1); + BigDecimal median = calculateMedian(values); + BigDecimal q1 = calculateQuartile(values, new BigDecimal("0.25")); + BigDecimal q3 = calculateQuartile(values, new BigDecimal("0.75")); + + return new BoxPlotData(min, q1, median, q3, max); + } + + private BigDecimal calculateMedian(List values) { + int size = values.size(); + if (size % 2 == 0) { + return (values.get(size/2 - 1).add(values.get(size/2))).divide(new BigDecimal(2)); + } else { + return values.get(size/2); + } + } + + private BigDecimal calculateQuartile(List values, BigDecimal quartile) { + int size = values.size(); + BigDecimal pos = new BigDecimal(size - 1).multiply(quartile); + int lowerIndex = (int) Math.floor(pos.doubleValue()); + int upperIndex = (int) Math.ceil(pos.doubleValue()); + + if (lowerIndex == upperIndex) { + return values.get(lowerIndex); + } + + BigDecimal lowerValue = values.get(lowerIndex); + BigDecimal upperValue = values.get(upperIndex); +// return lowerValue + (upperValue - lowerValue) * (pos - lowerIndex); + return lowerValue.add(upperValue.subtract(lowerValue)).multiply((pos.subtract(new BigDecimal(lowerIndex)))); + } + + /** + * 内部辅助类:存储统计结果 + */ + private static class Stats { + private final BigDecimal max; + private final String maxDate; + private final BigDecimal min; + private final String minDate; + private final BigDecimal avg; + private final BigDecimal diff; + + public Stats(BigDecimal max, BigDecimal min, BigDecimal avg, BigDecimal diff, + String maxDate, String minDate) { + this.max = max; + this.maxDate = maxDate; + this.min = min; + this.minDate = minDate; + this.avg = avg; + this.diff = diff; + } + } + + /** + * 辅助类:关联数值和对应的时间 + */ + private static class ValueTimePair { + final BigDecimal value; + final String time; + + ValueTimePair(BigDecimal value, String time) { + this.value = value; + this.time = time; + } + } + + /** + * 内部辅助类:存储箱线图统计结果 + */ + private static class BoxPlotData { + /** 最小值(Minimum) */ + private final BigDecimal min; + + /** 第一四分位数(Q1) */ + private final BigDecimal q1; + + /** 中位数(Median/Q2) */ + private final BigDecimal median; + + /** 第三四分位数(Q3) */ + private final BigDecimal q3; + + /** 最大值(Maximum) */ + private final BigDecimal max; + + public BoxPlotData(BigDecimal min, BigDecimal q1, BigDecimal median, BigDecimal q3, BigDecimal max) { + this.min = min; + this.q1 = q1; + this.median = median; + this.q3 = q3; + this.max = max; + } + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/HomePageServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/HomePageServiceImpl.java index b563b98..948b85f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/HomePageServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/HomePageServiceImpl.java @@ -4,16 +4,17 @@ import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsSiteSetting; import com.xzzn.ems.domain.vo.*; -import com.xzzn.ems.mapper.EmsAlarmRecordsMapper; -import com.xzzn.ems.mapper.EmsPcsDataMapper; -import com.xzzn.ems.mapper.EmsSiteSettingMapper; +import com.xzzn.ems.mapper.*; import com.xzzn.ems.service.IEmsSiteService; import com.xzzn.ems.service.IHomePageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; import java.util.*; +import java.util.stream.Collectors; /** * 首页看板+站点地图 服务层实现 @@ -22,99 +23,88 @@ import java.util.*; @Service public class HomePageServiceImpl implements IHomePageService { + private static final int LIMIT_TIME = 6; @Autowired private IEmsSiteService emsSiteService; @Autowired - private EmsPcsDataMapper emsPcsDataMapper; - @Autowired private EmsSiteSettingMapper emsSiteMapper; @Autowired private EmsAlarmRecordsMapper alarmRecordsMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; @Override public SiteTotalInfoVo getSiteTotalInfo() { SiteTotalInfoVo siteTotalInfoVo = new SiteTotalInfoVo(); siteTotalInfoVo = emsSiteService.getSiteTotalInfo(); // 获取总充+总放 - Map pcsMap = new HashMap<>(); - pcsMap = emsPcsDataMapper.getPcsTotalChargeData(); - siteTotalInfoVo.setTotalChargedCap(pcsMap.get("totalChargedCap")); - siteTotalInfoVo.setTotalDischargedCap(pcsMap.get("totalDischargedCap")); + String nowData = DateUtils.getDate(); + Map data = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,null); + if(data != null){ + siteTotalInfoVo.setTotalChargedCap(data.get("totalChargedCap")); + siteTotalInfoVo.setTotalDischargedCap(data.get("totalDischargedCap")); + } return siteTotalInfoVo; } // 单站点基本信息 @Override - public SingleSiteBaseInfo getSingleSiteBaseInfo(Long siteId) { + public SingleSiteBaseInfo getSingleSiteBaseInfo(String siteId) { SingleSiteBaseInfo singleSiteBaseInfo = new SingleSiteBaseInfo(); - if (siteId != null) { + if (!StringUtils.isEmpty(siteId)) { // 站点基本信息 - EmsSiteSetting emsSite = emsSiteMapper.selectEmsSiteSettingById(siteId); + EmsSiteSetting emsSite = emsSiteMapper.selectEmsSiteSettingBySiteId(siteId); if (emsSite != null) { // 装机功率+装机容量 singleSiteBaseInfo.setSiteName(emsSite.getSiteName()); - singleSiteBaseInfo.setInstalledCap(emsSite.getInstallCapacity()); - singleSiteBaseInfo.setInstalledPower(emsSite.getInstallPower()); + singleSiteBaseInfo.setInstallCapacity(emsSite.getInstallCapacity()); + singleSiteBaseInfo.setInstallPower(emsSite.getInstallPower()); String[] siteLocation = new String[2]; siteLocation[0] = emsSite.getLongitude() == null ? "" : emsSite.getLongitude().toString(); siteLocation[1] = emsSite.getLatitude() == null ? "" : emsSite.getLatitude().toString(); singleSiteBaseInfo.setSiteLocation(siteLocation);//站点位置 singleSiteBaseInfo.setSiteAddress(emsSite.getSiteAddress()); - singleSiteBaseInfo.setRunningTime(DateUtils.parseDateToStr("yyyy-MM-dd",emsSite.getRunningTime()));//投运时间 - // 七天放电数据统计 - List siteMonitorDataVoList = emsPcsDataMapper.getPcsDataBySiteId(siteId); + singleSiteBaseInfo.setRunningTime(emsSite.getRunningTime() == null ? null : + DateUtils.parseDateToStr("yyyy-MM-dd",emsSite.getRunningTime()));//投运时间 + // 获取单站点的总充+总放 + String nowData = DateUtils.getDate(); + Map data = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,siteId); + if (data != null) { + singleSiteBaseInfo.setTotalChargedCap(data.get("totalChargedCap")); + singleSiteBaseInfo.setTotalDisChargedCap(data.get("totalDischargedCap")); + } + // 七天放电数据统计 默认从今天往前7天 + LocalDate sevenDaysAgo = LocalDate.now().minusDays(LIMIT_TIME); + Date startDate = DateUtils.toDate(sevenDaysAgo); + Date endDate = new Date(); + List siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate); singleSiteBaseInfo.setSevenDayDisChargeStats(siteMonitorDataVoList); // 充放电基本数据处理 - dealSitePCSDate(singleSiteBaseInfo,siteMonitorDataVoList); + dealSiteChargeDate(singleSiteBaseInfo,siteMonitorDataVoList); } } return singleSiteBaseInfo; } - private void dealSitePCSDate(SingleSiteBaseInfo singleSiteBaseInfo, List siteMonitorDataVoList) { + private void dealSiteChargeDate(SingleSiteBaseInfo singleSiteBaseInfo, List siteMonitorDataVoList) { if (siteMonitorDataVoList != null && !siteMonitorDataVoList.isEmpty()) { - BigDecimal dayChargeCap = new BigDecimal(0); - BigDecimal dayDisChargeCap = new BigDecimal(0); - BigDecimal totalChargeCap = new BigDecimal(0); - BigDecimal totalDisChargeCap = new BigDecimal(0); for (SiteMonitorDataVo sitePcsData : siteMonitorDataVoList) { - // 总充电量 - totalChargeCap = totalChargeCap.add(sitePcsData.getChargedCap()); - // 总放电量 - totalDisChargeCap = totalDisChargeCap.add(sitePcsData.getDisChargedCap()); // 获取当天的充电量+放电量 - String pcsDate = sitePcsData.getAmmeterDate(); - boolean isToday= checkIsToday(pcsDate); + String dayDate = sitePcsData.getAmmeterDate(); + boolean isToday= DateUtils.checkIsToday(dayDate); if(isToday){ - dayChargeCap = dayChargeCap.add(sitePcsData.getChargedCap()); - dayDisChargeCap = dayDisChargeCap.add(sitePcsData.getDisChargedCap()); + singleSiteBaseInfo.setDayChargedCap(sitePcsData.getChargedCap()); + singleSiteBaseInfo.setDayDisChargedCap(sitePcsData.getDisChargedCap()); } } - singleSiteBaseInfo.setDayChargedCap(dayChargeCap); - singleSiteBaseInfo.setDayDisChargedCap(dayDisChargeCap); - singleSiteBaseInfo.setTotalChargedCap(totalChargeCap); - singleSiteBaseInfo.setTotalDisChargedCap(totalDisChargeCap); } } - private boolean checkIsToday(String pcsDate) { - boolean flag = false; - Calendar calendar = Calendar.getInstance(); - int todayMonth = calendar.get(Calendar.MONTH) + 1; - int todayDay = calendar.get(Calendar.DAY_OF_MONTH); - if (StringUtils.isNotEmpty(pcsDate)){ - String[] pcsDateArray = pcsDate.split("/"); - if (todayMonth == Integer.parseInt(pcsDateArray[0]) && - todayDay == Integer.parseInt(pcsDateArray[1])) { - flag = true; - } - } - return flag; - } - /** * 首页看板-数据概览 */ @@ -122,20 +112,177 @@ public class HomePageServiceImpl implements IHomePageService public HomePageDataViewVo getHomePageDataList() { HomePageDataViewVo homePageDataViewVo = new HomePageDataViewVo(); // 电量指标 - List electricDataList = new ArrayList(); - electricDataList = emsPcsDataMapper.getElectDataList(); + //List electricDataList = emsPcsDataMapper.getElectDataList(); + List electricDataList = getElectricDataList2(); homePageDataViewVo.setElecDataList(electricDataList); // 系统效率 + List systemEfficiencyLists = new ArrayList<>(); + if (electricDataList != null && !electricDataList.isEmpty()) { + for (ElectricIndexList electricIndexList : electricDataList) { + SystemEfficiencyList systemEfficiency = new SystemEfficiencyList(); + systemEfficiency.setDateMonth(electricIndexList.getDateMonth()); + + BigDecimal dailyEfficiency = new BigDecimal(0); + BigDecimal chargeEnergy = electricIndexList.getChargeEnergy(); + BigDecimal disChargeEnergy = electricIndexList.getDisChargeEnergy(); + if (chargeEnergy != null && disChargeEnergy != null + && chargeEnergy.compareTo(BigDecimal.ZERO) > 0 + && disChargeEnergy.compareTo(BigDecimal.ZERO) >= 0) { + dailyEfficiency = electricIndexList.getDisChargeEnergy().divide(electricIndexList.getChargeEnergy(), 2, RoundingMode.HALF_UP); + dailyEfficiency = dailyEfficiency.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + systemEfficiency.setSystemEfficiency(dailyEfficiency); + systemEfficiencyLists.add(systemEfficiency); + } + } + homePageDataViewVo.setSysEfficList(systemEfficiencyLists); // 告警趋势 - List alarmTrendList = new ArrayList(); - alarmTrendList = alarmRecordsMapper.getAlarmTrendList(); + List alarmTrendList = alarmRecordsMapper.getAlarmTrendList(); homePageDataViewVo.setAlarmDataList(alarmTrendList); // 设备告警占比 - List deviceAlarmPropList = new ArrayList(); - deviceAlarmPropList = alarmRecordsMapper.getDeviceAlarmPropList(); + List deviceAlarmPropList = alarmRecordsMapper.getDeviceAlarmPropList(); homePageDataViewVo.setDeviceAlarmList(deviceAlarmPropList); // 告警等级分布 + List alarmLevelList = alarmRecordsMapper.getAlarmGradeList(); + if (alarmLevelList != null && !alarmLevelList.isEmpty()) { + BigDecimal total = new BigDecimal(alarmLevelList.size()); + for (AlarmGradeList alarmGradeList : alarmLevelList) { + if (alarmGradeList.getDataNum() != 0 + && total.compareTo(BigDecimal.ZERO) > 0) { + BigDecimal percent = new BigDecimal(alarmGradeList.getDataNum()).divide(total, 2, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + alarmGradeList.setPercent(percent); + } + } + } + homePageDataViewVo.setAlarmLevelList(alarmLevelList); return homePageDataViewVo; } + private List getElectricDataList2() { + List electricDataList = new ArrayList<>(); + electricDataList = emsDailyChargeDataMapper.getAllSiteChargeDataByMonth(); + return electricDataList; + } + + private List getElectricDataList() { + List electricDataList = new ArrayList<>(); + // 获取每个月最早和最晚的时间 + List timeRanges = emsAmmeterDataMapper.getMonthlyTimeRanges(); + if (timeRanges.isEmpty()) { + return Collections.emptyList(); + } + // 遍历收集所有需要查询的时间点(最早+最晚) + List timePointQueries = new ArrayList<>(); + for (MonthlyTimeRange range : timeRanges) { + timePointQueries.add(new TimePointQuery(range.getSiteId(),range.getFirstDataTime())); + timePointQueries.add(new TimePointQuery(range.getSiteId(),range.getLastDataTime())); + } + // 批量获取所有时间点对应的数据值转化为map + List timePointValues = emsAmmeterDataMapper.batchGetTimePointValues(timePointQueries); + Map valueMap = timePointValues.stream() + .collect(Collectors.toMap( + v -> v.getSiteId() + "_" + v.getDataUpdateTime().toString(), + v -> v + )); + // 缓存每个站点的上月最晚电量 key=siteId, value=上月最晚时间对应数据 + Map lastMonthMap = new HashMap<>(); + + // 组装结果-key=统计月,value=统计月的数据 + Map elecDataMap = new HashMap<>(); + for (MonthlyTimeRange timeRange : timeRanges) { + String dataMonth = timeRange.getMonth(); + String siteId = timeRange.getSiteId(); + + BigDecimal totalChargeData = new BigDecimal(0); + BigDecimal totalDisChargeData = new BigDecimal(0); + // 获取本月最晚数据 + TimePointValue monthLastValue = valueMap.get(siteId +"_"+timeRange.getLastDataTime()); + BigDecimal lastChargeValue = new BigDecimal(0); + BigDecimal lastDisChargeValue = new BigDecimal(0); + if (monthLastValue != null) { + lastChargeValue = monthLastValue.getTotalChargeData() == null ? BigDecimal.ZERO : monthLastValue.getTotalChargeData(); + lastDisChargeValue = monthLastValue.getTotalDischargeData() == null ? BigDecimal.ZERO : monthLastValue.getTotalDischargeData(); + + }// 看是否有缓存上个月最晚电量,没有则是首月 + if (!lastMonthMap.containsKey(siteId)) { + // 首月充放电 = 本月最晚数据 - 本月最早数据 + TimePointValue monthFirstValue = valueMap.get(siteId +"_"+timeRange.getFirstDataTime()); + BigDecimal firstChargeValue = new BigDecimal(0); + BigDecimal firstDisChargeValue = new BigDecimal(0); + if (monthLastValue != null) { + firstChargeValue = monthFirstValue.getTotalChargeData() == null ? BigDecimal.ZERO : monthFirstValue.getTotalChargeData(); + firstDisChargeValue = monthFirstValue.getTotalDischargeData() == null ? BigDecimal.ZERO : monthFirstValue.getTotalDischargeData(); + } + totalChargeData = lastChargeValue.subtract(firstChargeValue); + totalDisChargeData = lastDisChargeValue.subtract(firstDisChargeValue); + } else {// 非本月充放电 = 本月最晚数据 - 上月最晚数据 + TimePointValue lastValue = lastMonthMap.get(siteId); + if (lastValue == null) {// 缓存找不到上月数据,则取本月最早数据 + lastValue = valueMap.get(siteId +"_"+timeRange.getFirstDataTime()); + } + BigDecimal lastMonthChargeValue = new BigDecimal(0); + BigDecimal lastMonthDisChargeValue = new BigDecimal(0); + if (lastValue != null) { + lastMonthChargeValue = lastValue.getTotalChargeData() == null ? BigDecimal.ZERO : lastValue.getTotalChargeData(); + lastMonthDisChargeValue = lastValue.getTotalDischargeData() == null ? BigDecimal.ZERO : lastValue.getTotalDischargeData(); + }totalChargeData = lastChargeValue.subtract(lastMonthChargeValue); + totalDisChargeData = lastDisChargeValue.subtract(lastMonthDisChargeValue); + } + // 缓存最晚数据 + lastMonthMap.put(siteId,monthLastValue); + + ElectricIndexList electricIndexList = new ElectricIndexList(); + // 判断map里面是否已经有排序月份 + if (elecDataMap.containsKey(dataMonth)) { + electricIndexList = elecDataMap.get(dataMonth); + totalChargeData = totalChargeData.add(electricIndexList.getChargeEnergy()); + totalDisChargeData = totalDisChargeData.add(electricIndexList.getDisChargeEnergy()); + } + electricIndexList.setDateMonth(dataMonth); + electricIndexList.setChargeEnergy(totalChargeData); + electricIndexList.setDisChargeEnergy(totalDisChargeData); + elecDataMap.put(dataMonth,electricIndexList); + } + // 按月份升序排序后返回 + electricDataList = elecDataMap.values().stream() + .sorted(Comparator.comparing(ElectricIndexList::getDateMonth)) + .collect(Collectors.toList()); + return electricDataList; + } + // 从timeRangeList中获取指定站点+月份的时间范围 + private MonthlyTimeRange getSiteRangeByMonth(List rangeList, String siteId, String month) { + return rangeList.stream() + .filter(r -> siteId.equals(r.getSiteId()) && month.equals(r.getMonth())) + .findFirst() .orElse(null); + } + + + @Override + public List getSevenChargeData(DateSearchRequest requestVo) { + String siteId = requestVo.getSiteId(); + + // 默认时间-7天 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + // 七天放电数据统计 + List siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate); + return siteMonitorDataVoList; + } + + // 统计入参时间处理 + public void dealRequestTime(DateSearchRequest requestVo){ + + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + if (startDate == null && endDate == null) { + // 如果没有传时间,默认从今天往前7天 + LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); + startDate = DateUtils.toDate(sevenDaysAgo); + endDate = new Date(); + requestVo.setStartDate(startDate); + requestVo.setEndDate(endDate); + } + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/MqttSyncLogServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/MqttSyncLogServiceImpl.java new file mode 100644 index 0000000..42401b0 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/MqttSyncLogServiceImpl.java @@ -0,0 +1,280 @@ +package com.xzzn.ems.service.impl; + +import java.util.List; + +import com.alibaba.fastjson2.JSON; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsSiteSetting; +import com.xzzn.ems.mapper.EmsSiteSettingMapper; +import com.xzzn.ems.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xzzn.ems.mapper.MqttSyncLogMapper; +import com.xzzn.ems.domain.MqttSyncLog; + +/** + * MQTT云上本地同步日志Service业务层处理 + * + * @author xzzn + * @date 2025-11-12 + */ +@Service +public class MqttSyncLogServiceImpl implements IMqttSyncLogService +{ + @Autowired + private MqttSyncLogMapper mqttSyncLogMapper; + @Autowired + private IEmsFaultProtectionPlanService emsFaultProtectionPlanService; + @Autowired + private IEmsStrategyService emsStrategyService; + @Autowired + private IEmsAlarmRecordsService emsAlarmRecordsService; + @Autowired + private EmsSiteSettingMapper emsSiteSettingMapper; + @Autowired + private IEmsFaultIssueLogService emsFaultIssueLogService; + @Autowired + private IEmsDeviceChangeLogService emsDeviceChangeLogService; + @Autowired + private IEmsStrategyTempService emsStrategyTempService; + @Autowired + private IEmsStrategyTimeConfigService emsStrategyTimeConfigService; + + /** + * 查询MQTT云上本地同步日志 + * + * @param id MQTT云上本地同步日志主键 + * @return MQTT云上本地同步日志 + */ + @Override + public MqttSyncLog selectMqttSyncLogById(Long id) + { + return mqttSyncLogMapper.selectMqttSyncLogById(id); + } + + /** + * 查询MQTT云上本地同步日志列表 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return MQTT云上本地同步日志 + */ + @Override + public List selectMqttSyncLogList(MqttSyncLog mqttSyncLog) + { + return mqttSyncLogMapper.selectMqttSyncLogList(mqttSyncLog); + } + + /** + * 新增MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + @Override + public int insertMqttSyncLog(MqttSyncLog mqttSyncLog) + { + mqttSyncLog.setCreateTime(DateUtils.getNowDate()); + return mqttSyncLogMapper.insertMqttSyncLog(mqttSyncLog); + } + + /** + * 修改MQTT云上本地同步日志 + * + * @param mqttSyncLog MQTT云上本地同步日志 + * @return 结果 + */ + @Override + public int updateMqttSyncLog(MqttSyncLog mqttSyncLog) + { + return mqttSyncLogMapper.updateMqttSyncLog(mqttSyncLog); + } + + /** + * 批量删除MQTT云上本地同步日志 + * + * @param ids 需要删除的MQTT云上本地同步日志主键 + * @return 结果 + */ + @Override + public int deleteMqttSyncLogByIds(Long[] ids) + { + return mqttSyncLogMapper.deleteMqttSyncLogByIds(ids); + } + + /** + * 删除MQTT云上本地同步日志信息 + * + * @param id MQTT云上本地同步日志主键 + * @return 结果 + */ + @Override + public int deleteMqttSyncLogById(Long id) + { + return mqttSyncLogMapper.deleteMqttSyncLogById(id); + } + + // 校验同步目标是否该站点 + private boolean checkIsSite(String target) { + if (StringUtils.isEmpty(target)) { + return false; + } + EmsSiteSetting emsSiteSetting = emsSiteSettingMapper.selectEmsSiteSettingBySiteId(target); + if (emsSiteSetting == null) { + return false; + } + return true; + } + + /** + * 处理云上运行策略数据 + * 云上-本地:校验是否该站点 + * @param payload + */ + @Override + public void handleMqttStrategyData(String payload) { + MqttSyncLog syncLog = JSON.parseObject(payload, MqttSyncLog.class); + if (syncLog != null) { + // 校验是否该站点数据 + if (!checkIsSite(syncLog.getTarget())) { + return; + } + // 校验是否存在 + String syncId = syncLog.getSyncId(); + MqttSyncLog existLog = mqttSyncLogMapper.selectMqttSyncLogBySyncId(syncId); + if (existLog == null) { + try { + // 根据不同操作更新 + String operateType = syncLog.getOperateType(); + if (!StringUtils.isEmpty(operateType)) { + // 不同表操作 + String tableName = syncLog.getTableName(); + switch (tableName) { + case "ems_strategy_running": + emsStrategyService.dealStrategyRunningData(syncLog.getContent(), operateType); + break; + case "ems_strategy_temp": + emsStrategyTempService.dealStrategyTempData(syncLog.getContent(), operateType); + break; + case "ems_strategy_time_config": + emsStrategyTimeConfigService.dealStrategyTimeData(syncLog.getContent(), operateType); + break; + default: + break; + } + } + } catch (Exception e) { + syncLog.setStatus("FAIL"); + syncLog.setErrorMsg(e.getMessage()); + } + // 保存日志 + insertMqttSyncLog(syncLog); + } + } + } + + /** + * 处理云上同步的告警保护信息 + * 云上-本地:校验是否该站点 + * @param payload + */ + @Override + public void handleMqttPlanData(String payload) { + MqttSyncLog planLog = JSON.parseObject(payload, MqttSyncLog.class); + if (planLog != null) { + // 校验是否该站点数据 + if (!checkIsSite(planLog.getTarget())) { + return; + } + + // 校验是否存在 + String syncId = planLog.getSyncId(); + MqttSyncLog existLog = mqttSyncLogMapper.selectMqttSyncLogBySyncId(syncId); + if (existLog == null) { + // 处理数据 + String operateType = planLog.getOperateType(); + if (!StringUtils.isEmpty(operateType)) { + emsFaultProtectionPlanService.dealSyncData(planLog.getContent(), operateType); + } + + // 保存日志 + insertMqttSyncLog(planLog); + } + } + + } + + /** + * 处理设备保护策略触发的告警信息 + * 本地-云上 + * @param payload + */ + @Override + public void handleFaultAlarmData(String payload) { + MqttSyncLog syncLog = JSON.parseObject(payload, MqttSyncLog.class); + if (syncLog != null) { + // 校验是否存在 + String syncId = syncLog.getSyncId(); + MqttSyncLog existLog = mqttSyncLogMapper.selectMqttSyncLogBySyncId(syncId); + if (existLog == null) { + // 根据不同操作更新 + String operateType = syncLog.getOperateType(); + if (!StringUtils.isEmpty(operateType)) { + emsAlarmRecordsService.dealSyncData(syncLog.getContent(),operateType); + } + + // 保存日志 + insertMqttSyncLog(syncLog); + } + } + } + + /** + * 处理保护策略告警信息 + * 本地-云上 + * @param payload + */ + @Override + public void handleFaultPlanIssueData(String payload) { + MqttSyncLog syncLog = JSON.parseObject(payload, MqttSyncLog.class); + if (syncLog != null) { + // 校验是否存在 + String syncId = syncLog.getSyncId(); + MqttSyncLog existLog = mqttSyncLogMapper.selectMqttSyncLogBySyncId(syncId); + if (existLog == null) { + // 根据不同操作更新 + String operateType = syncLog.getOperateType(); + if (!StringUtils.isEmpty(operateType)) { + emsFaultIssueLogService.dealSyncData(syncLog.getContent(),operateType); + } + + // 保存日志 + insertMqttSyncLog(syncLog); + } + } + } + /** + * 处理设备运行状态变更日志 + * 本地-云上 + * @param payload + */ + @Override + public void handleDeviceChangeLogData(String payload) { + MqttSyncLog syncLog = JSON.parseObject(payload, MqttSyncLog.class); + if (syncLog == null) { + // 校验是否存在 + String syncId = syncLog.getSyncId(); + MqttSyncLog existLog = mqttSyncLogMapper.selectMqttSyncLogBySyncId(syncId); + if (existLog == null) { + // 根据不同操作更新 + String operateType = syncLog.getOperateType(); + if (!StringUtils.isEmpty(operateType)) { + emsDeviceChangeLogService.dealSyncData(syncLog.getContent(),operateType); + } + + // 保存日志 + insertMqttSyncLog(syncLog); + } + } + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java index 922c81e..937bea0 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java @@ -1,261 +1,1142 @@ package com.xzzn.ems.service.impl; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.AmmeterCategory; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsBatteryCluster; import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryStack; import com.xzzn.ems.domain.EmsCoolingData; +import com.xzzn.ems.domain.EmsDhData; +import com.xzzn.ems.domain.EmsEmsData; +import com.xzzn.ems.domain.EmsPcsBranchData; +import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.EmsStrategyTemp; +import com.xzzn.ems.domain.EmsXfData; import com.xzzn.ems.domain.vo.*; -import com.xzzn.ems.mapper.*; +import com.xzzn.ems.mapper.EmsAlarmRecordsMapper; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.mapper.EmsPointMatchMapper; +import com.xzzn.ems.mapper.EmsStrategyRunningMapper; +import com.xzzn.ems.mapper.EmsStrategyTempMapper; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; import com.xzzn.ems.service.ISingleSiteService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; +import com.xzzn.ems.utils.DevicePointMatchDataProcessor; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + /** * 单点监控 服务层实现 */ @Service public class SingleSiteServiceImpl implements ISingleSiteService { + private static final Logger log = LoggerFactory.getLogger(SingleSiteServiceImpl.class); + private static final String CLUSTER_DATA_TEP = "温度"; private static final String CLUSTER_DATA_VOLTAGE = "电压"; private static final String CLUSTER_DATA_SOC = "SOC"; + // 初始化List,存储指定的电表deviceId + List ammeterDeviceIds = Arrays.asList( + "LOAD", "METE", "METEGF" + ); @Autowired private EmsPcsDataMapper emsPcsDataMapper; @Autowired private EmsAlarmRecordsMapper emsAlarmRecordsMapper; @Autowired - private EmsBatteryDataMapper emsBatteryDataMapper; - @Autowired private EmsBatteryStackMapper emsBatteryStackMapper; @Autowired private EmsBatteryClusterMapper emsBatteryClusterMapper; @Autowired - private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + private EmsAmmeterDataMapper emsAmmeterDataMapper; @Autowired - private EmsCoolingDataMapper emsCoolingDataMapper; + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsPointMatchMapper emsPointMatchMapper; + + @Autowired + private RedisCache redisCache; + @Autowired + private EmsStrategyRunningMapper emsStrategyRunningMapper; + @Autowired + private EmsStrategyTempMapper emsStrategyTempMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; + @Autowired + private IEmsEnergyPriceConfigService iEmsEnergyPriceConfigService; + @Autowired + private DevicePointMatchDataProcessor devicePointMatchDataProcessor; @Override - public SiteMonitorHomeVo getSiteMonitorDataVo(Long siteId) { + public SiteMonitorHomeVo getSiteMonitorDataVo(String siteId) { SiteMonitorHomeVo siteMonitorHomeVo = new SiteMonitorHomeVo(); - if (siteId != null) { + if (!StringUtils.isEmpty(siteId)) { + // 获取单站点的总充+总放+电网实时功率 + String nowData = DateUtils.getDate(); + Map dataMap = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,siteId); + if (dataMap != null) { + siteMonitorHomeVo.setTotalChargedCap(dataMap.get("totalChargedCap")); + siteMonitorHomeVo.setTotalDischargedCap(dataMap.get("totalDischargedCap")); + //siteMonitorHomeVo.setGridNrtPower(dataMap.get("gridNrtPower")); + } + + // 总收入+当日实时收入 + Map dayRevenueMap = iEmsEnergyPriceConfigService.getDayRevenueMap(siteId); + siteMonitorHomeVo.setTotalRevenue( + dayRevenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : dayRevenueMap.get("totalRevenue")); + siteMonitorHomeVo.setDayRevenue( + dayRevenueMap.get("dayRevenue") == null ? BigDecimal.ZERO :dayRevenueMap.get("dayRevenue")); + siteMonitorHomeVo.setYesterdayRevenue( + dayRevenueMap.get("yesterdayRevenue") == null ? BigDecimal.ZERO :dayRevenueMap.get("yesterdayRevenue")); + // 实时告警数据 名称+状态+告警内容 List siteMonitorHomeAlarmVo = emsAlarmRecordsMapper.getAlarmRecordsBySiteId(siteId); siteMonitorHomeVo.setSiteMonitorHomeAlarmVo(siteMonitorHomeAlarmVo); + + // 策略运行-主策略模板数据 + List runningVo = emsStrategyRunningMapper.getRunningList(siteId); + if (runningVo != null && runningVo.size() > 0) { + StrategyTempInfo siteTempInfo = new StrategyTempInfo(); + siteTempInfo.setMainStrategyName(runningVo.get(0).getMainStrategyName()); + Long mainStrategyId = runningVo.get(0).getMainStrategyId(); + List tempList = emsStrategyTempMapper.getTempListBySiteIdAndStrategyId(siteId, mainStrategyId); + siteTempInfo.setSiteMonitorDataVo(tempList); + siteMonitorHomeVo.setStrategyTempInfo(siteTempInfo); + } + // 能量数据 - List siteMonitorDataVoList = emsPcsDataMapper.getPcsDataBySiteId(siteId); + LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); + Date startDate = DateUtils.toDate(sevenDaysAgo); + Date endDate = new Date(); + List siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate); if (!CollectionUtils.isEmpty(siteMonitorDataVoList)) { - BigDecimal dayChargeCap = new BigDecimal(0); - BigDecimal dayDisChargeCap = new BigDecimal(0); - BigDecimal totalChargeCap = new BigDecimal(0); - BigDecimal totalDisChargeCap = new BigDecimal(0); for (SiteMonitorDataVo sitePcsData : siteMonitorDataVoList) { - // 总充电量 - totalChargeCap = totalChargeCap.add(sitePcsData.getChargedCap()); - // 总放电量 - totalDisChargeCap = totalDisChargeCap.add(sitePcsData.getDisChargedCap()); // 获取当天的充电量+放电量 String pcsDate = sitePcsData.getAmmeterDate(); - boolean isToday= checkIsToday(pcsDate); + boolean isToday= DateUtils.checkIsToday(pcsDate); if(isToday){ - dayChargeCap = dayChargeCap.add(sitePcsData.getChargedCap()); - dayDisChargeCap = dayDisChargeCap.add(sitePcsData.getDisChargedCap()); + siteMonitorHomeVo.setDayChargedCap(sitePcsData.getChargedCap()); + siteMonitorHomeVo.setDayDisChargedCap(sitePcsData.getDisChargedCap()); } + // 获取昨日充电量+放电量 + if (DateUtils.getYesterdayDayString().equals(pcsDate)) { + siteMonitorHomeVo.setYesterdayChargedCap(sitePcsData.getChargedCap()); + siteMonitorHomeVo.setYesterdayDisChargedCap(sitePcsData.getDisChargedCap()); + } + } - siteMonitorHomeVo.setDayChargedCap(dayChargeCap); - siteMonitorHomeVo.setDayDisChargedCap(dayDisChargeCap); - siteMonitorHomeVo.setTotalChargedCap(totalChargeCap); - siteMonitorHomeVo.setTotalDischargedCap(totalDisChargeCap); // 储能可用电量 BigDecimal energyStorageAvailElec = siteMonitorHomeVo.getTotalDischargedCap().subtract(siteMonitorHomeVo.getTotalChargedCap()); siteMonitorHomeVo.setEnergyStorageAvailElec(energyStorageAvailElec); } + siteMonitorHomeVo.setSiteMonitorDataVo(siteMonitorDataVoList); - // 电网实时功率 - siteMonitorHomeVo.setGridNrtPower(emsPcsDataMapper.getGridNrtPower(siteId)); } return siteMonitorHomeVo; } - private boolean checkIsToday(String pcsDate) { - boolean flag = false; - Calendar calendar = Calendar.getInstance(); - int todayMonth = calendar.get(Calendar.MONTH) + 1; - int todayDay = calendar.get(Calendar.DAY_OF_MONTH); - if (StringUtils.isNotEmpty(pcsDate)){ - String[] pcsDateArray = pcsDate.split("/"); - if (todayMonth == Integer.parseInt(pcsDateArray[0]) && - todayDay == Integer.parseInt(pcsDateArray[1])) { - flag = true; - } - } - return flag; - } - // 获取单站监控实时运行头部数据 @Override - public SiteMonitorRuningHeadInfoVo getSiteRunningHeadInfo(Long siteId) { - SiteMonitorRuningHeadInfoVo siteMonitorRunningHeadInfoVo = new SiteMonitorRuningHeadInfoVo(); + public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId) { + SiteMonitorRunningHeadInfoVo siteMonitorRunningHeadInfoVo = new SiteMonitorRunningHeadInfoVo(); - if (siteId != null) { - // 实时有功功率/实时无功功率/今日充电量/今日放电量 - siteMonitorRunningHeadInfoVo = emsPcsDataMapper.getSiteRunningHeadInfo(siteId); - // 电池簇SOC - // 电池堆SOH - EmsBatteryData emsBatteryData = emsBatteryDataMapper.getBatteryDataBySiteId(siteId); - if (emsBatteryData != null) { - siteMonitorRunningHeadInfoVo.setSoc(emsBatteryData.getSoc()); - siteMonitorRunningHeadInfoVo.setSoh(emsBatteryData.getSoh()); + if (!StringUtils.isEmpty(siteId)) { + // 实时有功功率/实时无功功率 + SiteMonitorRunningHeadInfoVo tempVo = emsPcsDataMapper.getSiteRunningHeadInfo(siteId); + if (tempVo != null) { + siteMonitorRunningHeadInfoVo.setTotalActivePower(tempVo.getTotalActivePower()); + siteMonitorRunningHeadInfoVo.setTotalReactivePower(tempVo.getTotalReactivePower()); + } + + // 今日充放电 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startOfDay = now.with(LocalTime.MIN); + Date startDate = DateUtils.toDate(startOfDay); + Date endDate = new Date(); + List siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate); + if (siteMonitorDataVoList != null && siteMonitorDataVoList.size() > 0) { + siteMonitorRunningHeadInfoVo.setDayChargedCap(siteMonitorDataVoList.get(0).getChargedCap()); + siteMonitorRunningHeadInfoVo.setDayDisChargedCap(siteMonitorDataVoList.get(0).getDisChargedCap()); + } + // 电池堆SOC + 电池堆SOH + EmsBatteryStack emsBatteryStack = emsBatteryStackMapper.getSiteSumStackInfo(siteId); + if (emsBatteryStack != null) { + siteMonitorRunningHeadInfoVo.setSoc(emsBatteryStack.getStackSoc()); + siteMonitorRunningHeadInfoVo.setSoh(emsBatteryStack.getStackSoh()); } } return siteMonitorRunningHeadInfoVo; } - // 获取单站监控实时运行曲线图数据 + // 获取单站监控实时运行-PCS有功无功功率 @Override - public SiteMonitorRuningInfoVo getRunningGraph(Long siteId) { + public SiteMonitorRuningInfoVo getRunningGraphStorage(RunningGraphRequest request) { SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); - if (siteId != null) { - //储能功率list - //pcs平均温度list - //电池平均soclist - //电池平均温度list + if (Objects.isNull(request) || StringUtils.isEmpty(request.getSiteId())) { + return siteMonitorRuningInfoVo; } +// // 时间暂定今日+昨日 +// Date today = DateUtils.getNowDate(); +// Date yesterday = DateUtils.addDays(today, -1); + Date startDate = request.getStartDate(); + Date endDate = request.getEndDate(); + + //pcs有功无功 + List pcsPowerList = new ArrayList<>(); + List energyStoragePowList = emsPcsDataMapper.getStoragePowerList(request.getSiteId(), startDate, endDate); + + // List -> 按pcs的deviceId分组转成List + if (!CollectionUtils.isEmpty(energyStoragePowList)) { + Map> dataMap = energyStoragePowList.stream() + .collect(Collectors.groupingBy( + EnergyStoragePowVo::getDeviceId, + Collectors.toList())); + + pcsPowerList = dataMap.entrySet().stream() + .map(entry -> { + PcsPowerList pcdData = new PcsPowerList(); + pcdData.setDeviceId(entry.getKey()); + pcdData.setEnergyStoragePowList(entry.getValue()); + return pcdData; + }).collect(Collectors.toList()); + +// // 生成时间列表(每5分钟一个) +// List targetMinutes = new ArrayList<>(12); +// LocalDateTime startLocalDate = DateUtils.toLocalDateTime(startDate).truncatedTo(ChronoUnit.DAYS); +// LocalDateTime endLocalDate = DateUtils.toLocalDateTime(endDate).with(LocalDateTime.now().toLocalTime()); +// while (startLocalDate.isBefore(endLocalDate)) { +// targetMinutes.add(startLocalDate); +// startLocalDate = startLocalDate.plusMinutes(5); // 递增5分钟 +// } +// // 根据时间列表填充数据 +// pcsPowerList = fullFillData(pcsPowerList, targetMinutes); + } + + siteMonitorRuningInfoVo.setPcsPowerList(pcsPowerList); + + return siteMonitorRuningInfoVo; + } + + private List fullFillData(List pcsPowerList, List targetMinutes) { + List resultList = new ArrayList<>(); + + for (PcsPowerList pcsPower : pcsPowerList) { + Map dataMap = new HashMap<>(); + PcsPowerList pcsResultPower = new PcsPowerList(); + String deviceId = pcsPower.getDeviceId(); + List powerList = pcsPower.getEnergyStoragePowList(); + + if (CollectionUtils.isEmpty(powerList)) { + continue; + } + // 将数据转Map便于后续根据时间获取 + dataMap = powerList.stream().collect( + Collectors.toMap( + data -> data.getGroupTime(), + data -> data, + (existing, replacement) -> replacement + )); + + // 按时间列表遍历 + List resultPowerList = new ArrayList<>(); + EnergyStoragePowVo lastData = null; + for(LocalDateTime targetMinute : targetMinutes) { + String currentDate = DateUtils.convertToString(targetMinute); + EnergyStoragePowVo currentData = dataMap.get(currentDate); + if (currentData == null && lastData != null) { + BigDecimal pcsTotalActPower = lastData.getPcsTotalActPower(); + BigDecimal pcsTotalReactivePower = lastData.getPcsTotalReactivePower(); + currentData = new EnergyStoragePowVo(); + currentData.setPcsTotalActPower(pcsTotalActPower); + currentData.setPcsTotalReactivePower(pcsTotalReactivePower); + currentData.setDeviceId(deviceId); + } else if (currentData == null && lastData == null){ + // 开头无数据,所有字段设为null + currentData = new EnergyStoragePowVo(); + currentData.setDeviceId(deviceId); + } + lastData = currentData; +// currentData.setCreateDate(currentDate.substring(11)); + currentData.setCreateDate(currentData.getCreateDate()); + resultPowerList.add(currentData); + } + pcsResultPower.setDeviceId(deviceId); + pcsResultPower.setEnergyStoragePowList(resultPowerList); + resultList.add(pcsResultPower); + } + + return resultList; + } + + // 获取单站监控实时运行-pcs最高温度 + @Override + public SiteMonitorRuningInfoVo getRunningGraphPcsMaxTemp(RunningGraphRequest request) { + SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); + List pcsMaxTempList = new ArrayList<>(); +// // 时间暂定今日+昨日 +// Date today = new Date(); +// Date yesterday = DateUtils.addDays(today, -1); + String siteId = request.getSiteId(); + Date startDate = request.getStartDate(); + Date endDate = request.getEndDate(); + //PCS最高温度list + List pcsMaxTempVos = emsPcsDataMapper.getPcsMaxTemp(siteId, startDate, endDate); +// if (SiteEnum.FX.getCode().equals(siteId)) { +// pcsMaxTempVos = emsPcsDataMapper.getFXMaxTemp(siteId, startDate, endDate); +// } else if (SiteEnum.DDS.getCode().equals(siteId)) { +// pcsMaxTempVos = emsPcsDataMapper.getDDSMaxTemp(siteId, startDate, endDate); +// } + + // List -> 按pcs的deviceId分组转成List + if (!CollectionUtils.isEmpty(pcsMaxTempVos)) { + Map> dataMap = pcsMaxTempVos.stream() + .collect(Collectors.groupingBy( + PcsMaxTempVo::getDeviceId, + Collectors.toList())); + + pcsMaxTempList = dataMap.entrySet().stream() + .map(entry -> { + PcsMaxTempList pcdData = new PcsMaxTempList(); + pcdData.setDeviceId(entry.getKey()); + pcdData.setMaxTempVoList(entry.getValue()); + return pcdData; + }).collect(Collectors.toList()); + +// // 生成时间列表(每小时一个) +// List targetHours = new ArrayList<>(60); +// LocalDateTime startDate = DateUtils.toLocalDateTime(yesterday).truncatedTo(ChronoUnit.DAYS); +// LocalDateTime endDate = DateUtils.toLocalDateTime(today); +// while (startDate.isBefore(endDate)) { +// targetHours.add(startDate); +// startDate = startDate.plusHours(1); // 递增1小时 +// } +// // 根据时间列表填充数据 +// pcsMaxTempList = fullFillMaxTempData(pcsMaxTempList,targetHours); + } + + siteMonitorRuningInfoVo.setPcsMaxTempList(pcsMaxTempList); + return siteMonitorRuningInfoVo; + } + private List fullFillMaxTempData(List pcsMaxTempList, List targetHours) { + List resultList = new ArrayList<>(); + + for (PcsMaxTempList pcsMaxTemp : pcsMaxTempList) { + PcsMaxTempList pcsTemp = new PcsMaxTempList(); + List resultVos = new ArrayList<>(); + Map dataMap = new HashMap<>(); + + String deviceId = pcsMaxTemp.getDeviceId(); + List pcsMaxTempVos = pcsMaxTemp.getMaxTempVoList(); + if (CollectionUtils.isEmpty(pcsMaxTempVos)) { + continue; + } + + // 将数据转Map便于后续根据时间获取 + dataMap = pcsMaxTempVos.stream().collect( + Collectors.toMap( + data -> data.getCreateDate(), + data -> data, + (existing, replacement) -> replacement + )); + + PcsMaxTempVo lastData = null; + List resultTempList = new ArrayList<>(); + // 遍历时间填充数据 + for (LocalDateTime targetHour : targetHours) { + String currentDate = DateUtils.convertToString(targetHour); + PcsMaxTempVo currentData = dataMap.get(currentDate); + if (currentData == null && lastData != null) { + BigDecimal temp = lastData.getTemp(); + currentData = new PcsMaxTempVo(); + currentData.setTemp(temp); + currentData.setDeviceId(deviceId); + } else if (currentData == null && lastData == null){ + // 开头无数据,所有字段设为null + currentData = new PcsMaxTempVo(); + currentData.setDeviceId(deviceId); + } + lastData = currentData; + currentData.setCreateDate(currentDate.substring(11)); + resultTempList.add(currentData); + + } + pcsTemp.setDeviceId(deviceId); + pcsTemp.setMaxTempVoList(resultTempList); + resultList.add(pcsTemp); + } + return resultList; + } + + // 获取单站监控实时运行-平均soc + @Override + public SiteMonitorRuningInfoVo getRunningGraphBatterySoc(RunningGraphRequest request) { + SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); + if (!StringUtils.isEmpty(request.getSiteId())) { +// // 时间暂定今日+昨日 +// Date today = new Date(); +// Date yesterday = DateUtils.addDays(today, -1); + //电池平均soclist + List batteryAveSOCList = emsBatteryStackMapper.getAveSocList(request.getSiteId(), request.getStartDate(), request.getEndDate()); + siteMonitorRuningInfoVo.setBatteryAveSOCList(batteryAveSOCList); + } + return siteMonitorRuningInfoVo; + } + // 获取单站监控实时运行-电池平均温度 + @Override + public SiteMonitorRuningInfoVo getRunningGraphBatteryTemp(RunningGraphRequest request) { + SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); + if (Objects.isNull(request) || StringUtils.isEmpty(request.getSiteId())) { + return siteMonitorRuningInfoVo; + } + String siteId = request.getSiteId(); + Date startDate = request.getStartDate(); + Date endDate = request.getEndDate(); + //电池平均温度list,优先从电池堆取,电池堆没有的话再从电池簇取 + List batteryAveTempList = new ArrayList<>(); + batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, startDate, endDate); + // 电池堆暂无数据,从电池簇取 + if (CollectionUtils.isEmpty(batteryAveTempList)) { + batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, startDate, endDate); + } +// if (SiteEnum.FX.getCode().equals(siteId)) { +// batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, startDate, endDate); +// } else if (SiteEnum.DDS.getCode().equals(siteId)) { +// batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, startDate, endDate); +// } + siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList); +// if (!StringUtils.isEmpty(siteId)) { +// // 时间暂定今日+昨日 +// Date today = new Date(); +// Date yesterday = DateUtils.addDays(today, -1); +// //电池平均温度list +// List batteryAveTempList = new ArrayList<>(); +// if (SiteEnum.FX.getCode().equals(siteId)) { +// batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, yesterday, today); +// } else if (SiteEnum.DDS.getCode().equals(siteId)) { +// batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, yesterday, today); +// } +// siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList); +// } return siteMonitorRuningInfoVo; } // 根据site_id获取pcs详细数据+支路数据 @Override - public List getPcsDetailInfo(Long siteId) { + public List getPcsDetailInfo(String siteId) { List pcsDetailInfoVoList = new ArrayList<>(); - if (siteId != null) { - // 获取pcs最新数据 - pcsDetailInfoVoList = emsPcsDataMapper.getPcsDetailInfoBySiteId(siteId); - if (!CollectionUtils.isEmpty(pcsDetailInfoVoList)) { - for (PcsDetailInfoVo pcsDetailInfoVo : pcsDetailInfoVoList) { - Long deviceId = pcsDetailInfoVo.getDeviceId(); - // 获取支路最新数据 - if (deviceId != null) { - List pcsBranchInfoList = emsPcsBranchDataMapper.getPcsBranchInfoList(siteId, deviceId); - pcsDetailInfoVo.setPcsBranchInfoList(pcsBranchInfoList); - } + if (!StringUtils.isEmpty(siteId)) { + // 获取该设备下所有pcs的id + List> pcsIds = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.PCS.getCode()); + + for (Map pcsDevice : pcsIds) { + PcsDetailInfoVo pcsDetailInfoVo = new PcsDetailInfoVo(); + pcsDetailInfoVo.setDeviceName(pcsDevice.get("deviceName").toString()); + pcsDetailInfoVo.setCommunicationStatus(pcsDevice.get("communicationStatus") == null ? + "" :pcsDevice.get("communicationStatus").toString()); + // 从redis取pcs单个详细数据 + String pcsId = pcsDevice.get("id").toString(); + EmsPcsData pcsData = redisCache.getCacheObject(RedisKeyConstants.PCS +siteId+"_"+pcsId); + if (pcsData != null) { + BeanUtils.copyProperties(pcsData, pcsDetailInfoVo); } + // 支路信息数据 + List pcsBranchInfoList = new ArrayList<>(); + processBranchDataInfo(siteId,pcsId,pcsBranchInfoList); + pcsDetailInfoVo.setPcsBranchInfoList(pcsBranchInfoList); + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId,pcsId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, pcsId, DeviceCategory.PCS.getCode()); + pcsDetailInfoVo.setAlarmNum(alarmNum); + pcsDetailInfoVo.setDeviceStatus(pcsDevice.get("deviceStatus") == null ? "" : pcsDevice.get("deviceStatus").toString()); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.PCS.getCode(), pcsDetailInfoVo); + + pcsDetailInfoVoList.add(pcsDetailInfoVo); } } return pcsDetailInfoVoList; } + private void processBranchDataInfo(String siteId, String pcsId, List pcsBranchInfoList) { + if (!StringUtils.isEmpty(pcsId)) { + List pcsBranchData = redisCache.getCacheObject(RedisKeyConstants.BRANCH +siteId+"_"+pcsId); + if (pcsBranchData != null) { + for(EmsPcsBranchData emsPcsBranchData : pcsBranchData) { + PcsBranchInfo pcsBranchInfo = new PcsBranchInfo(); + BeanUtils.copyProperties(emsPcsBranchData, pcsBranchInfo); + pcsBranchInfoList.add(pcsBranchInfo); + } + } + } + } + // 获取BMS总览数据 @Override - public List getBMSOverView(Long siteId) { + public List getBMSOverView(String siteId) { List bmsOverViewVoList = new ArrayList<>(); - if (siteId != null) { - // 获取电池堆list - bmsOverViewVoList = emsBatteryStackMapper.selectEmsBatteryStackBySiteId(siteId); - if (!CollectionUtils.isEmpty(bmsOverViewVoList)) { - for (BMSOverViewVo bmsOverViewVo : bmsOverViewVoList) { - // 获取单体电池数据-待确认 - Long stackDeviceId = bmsOverViewVo.getDeviceId(); - if (stackDeviceId != null) { - List batteryDataList = new ArrayList<>(); - batteryDataList = emsBatteryClusterMapper.getBmsBatteryData(siteId,stackDeviceId); - bmsOverViewVo.setBatteryDataList(batteryDataList); - } + // 获取所有电池堆 + if (!StringUtils.isEmpty(siteId)) { + List> stackIds = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.STACK.getCode()); + for (Map stackDevice : stackIds) { + BMSOverViewVo bmsOverViewVo = new BMSOverViewVo(); + bmsOverViewVo.setDeviceName(stackDevice.get("deviceName").toString()); + // 从redis取堆单个详细数据 + String stackId = stackDevice.get("id").toString(); + EmsBatteryStack stackData = redisCache.getCacheObject(RedisKeyConstants.STACK +siteId+"_"+stackId); + if (stackData != null) { + BeanUtils.copyProperties(stackData, bmsOverViewVo); } + // 下面簇列表数据 + List batteryDataLists = new ArrayList<>(); + if (!StringUtils.isEmpty(stackId)) { + batteryDataLists = getBMSClusterListInfo(siteId,stackId,null); + bmsOverViewVo.setBatteryDataList(batteryDataLists); + } + + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, stackId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, stackId, DeviceCategory.STACK.getCode()); + bmsOverViewVo.setAlarmNum(alarmNum); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.STACK.getCode(), bmsOverViewVo); + + bmsOverViewVoList.add(bmsOverViewVo); } } return bmsOverViewVoList; } + private List getBMSClusterListInfo(String siteId, String stackId, String clusterDeviceId) { + List batteryDataList = new ArrayList(); + + List> clusterIds = new ArrayList<>(); + if (StringUtils.isEmpty(clusterDeviceId)) { + clusterIds = emsDevicesSettingMapper.getClusterIdsByFuzzyQuery(siteId, DeviceCategory.CLUSTER.getCode(),stackId); + } else { + Map map = new HashMap<>(); + map.put("id", clusterDeviceId); + clusterIds.add(map); + } + + for (Map clusterDevice : clusterIds) { + BMSBatteryDataList bmsBatteryDataList= new BMSBatteryDataList(); + // 从redis取单个簇的详细数据 + String clusterId = clusterDevice.get("id").toString(); + bmsBatteryDataList.setClusterId(clusterId); + EmsBatteryCluster clusterData = redisCache.getCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + clusterId); + if (clusterData != null) { + BeanUtils.copyProperties(clusterData, bmsBatteryDataList); + } + batteryDataList.add(bmsBatteryDataList); + } + + return batteryDataList; + } + // 获取BMS电池簇数据 @Override - public List getBMSBatteryCluster(Long siteId) { + public List getBMSBatteryCluster(String siteId) { List bmsBatteryClusterVoList = new ArrayList<>(); - if (siteId != null) { - bmsBatteryClusterVoList = emsBatteryClusterMapper.getBMSBatteryCluster(siteId); - if (!CollectionUtils.isEmpty(bmsBatteryClusterVoList)) { - for (BMSBatteryClusterVo bmsBatteryClusterVo : bmsBatteryClusterVoList) { - - Long clusterDeviceId = bmsBatteryClusterVo.getDeviceId(); + if (!StringUtils.isEmpty(siteId)) { + // 获取所有设备下的电池簇id + List> clusterIds = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.CLUSTER.getCode()); + for (Map clusterDevice : clusterIds) { + BMSBatteryClusterVo bmsBatteryClusterVo = new BMSBatteryClusterVo(); + bmsBatteryClusterVo.setDeviceName(clusterDevice.get("deviceName").toString()); + bmsBatteryClusterVo.setParentDeviceName(clusterDevice.get("parentDeviceName") == null ? null : clusterDevice.get("parentDeviceName").toString()); + // 从redis取单个簇详细数据 + String clusterId = clusterDevice.get("id").toString(); + EmsBatteryCluster clusterData = redisCache.getCacheObject(RedisKeyConstants.CLUSTER +siteId+"_"+clusterId); + String parentDeviceId = ""; + if (clusterData != null) { + BeanUtils.copyProperties(clusterData, bmsBatteryClusterVo); + // 处理单体电池数据-平均/最大/最小 List clusterDataList = new ArrayList<>(); - if (clusterDeviceId != null) { - // 获取单体电池数据-平均/最大/最小 - BatteryClusterDataDetailVo batteryClusterDataDetailVo = emsBatteryDataMapper.getBatteryDataByClusterId(siteId,clusterDeviceId); - // 处理数据 - if (batteryClusterDataDetailVo != null) { - BMSBatteryClusterDataList voltageData = new BMSBatteryClusterDataList(); - BMSBatteryClusterDataList tempData = new BMSBatteryClusterDataList(); - BMSBatteryClusterDataList socData = new BMSBatteryClusterDataList(); - // 设值 - voltageData.setDataName(CLUSTER_DATA_VOLTAGE); - voltageData.setAvgData(batteryClusterDataDetailVo.getAvgVoltage()); - voltageData.setMaxData(batteryClusterDataDetailVo.getMaxVoltage()); - voltageData.setMinData(batteryClusterDataDetailVo.getMinVoltage()); - tempData.setDataName(CLUSTER_DATA_TEP); - tempData.setAvgData(batteryClusterDataDetailVo.getAvgTemp()); - tempData.setMaxData(batteryClusterDataDetailVo.getMaxTemp()); - tempData.setMinData(batteryClusterDataDetailVo.getMinTemp()); - socData.setDataName(CLUSTER_DATA_SOC); - socData.setAvgData(batteryClusterDataDetailVo.getAvgSoc()); - socData.setMaxData(batteryClusterDataDetailVo.getMaxSoc()); - socData.setMinData(batteryClusterDataDetailVo.getMinSoc()); - - // 设置对应单体id - List> dataIdMapList = emsBatteryDataMapper.getDataIdsMap(batteryClusterDataDetailVo); - Map resultIdMap = new HashMap<>(); - if (!CollectionUtils.isEmpty(dataIdMapList)) { - resultIdMap = dataIdMapList.stream() - .filter(map -> map.containsKey("type") && map.containsKey("device_id")) // 过滤无效数据 - .filter(map -> map.get("type") instanceof String && map.get("device_id") instanceof Number) // 确保类型正确 - .collect(Collectors.toMap( - map -> (String) map.get("type"), // 键:type 字段 - map -> ((Number) map.get("device_id")).longValue(), // 值:device_id 转为 int - (existing, replacement) -> existing // 处理键冲突的策略 - )); - - // 电压 - voltageData.setMaxDataID(resultIdMap.get("maxVoltageId")); - voltageData.setMaxDataID(resultIdMap.get("maxVoltageId")); - // 温度 - tempData.setMaxDataID(resultIdMap.get("maxTempId")); - tempData.setMinDataID(resultIdMap.get("minTempId")); - // soc - socData.setMaxDataID(resultIdMap.get("maxSocId")); - socData.setMinDataID(resultIdMap.get("minSocId")); - } - clusterDataList.add(voltageData); - clusterDataList.add(tempData); - clusterDataList.add(socData); - } - bmsBatteryClusterVo.setBatteryDataList(clusterDataList); - } + dealWithBatteryClusterData(clusterData,clusterDataList); + bmsBatteryClusterVo.setBatteryDataList(clusterDataList); } + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, clusterId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, clusterId, DeviceCategory.CLUSTER.getCode()); + bmsBatteryClusterVo.setAlarmNum(alarmNum); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.CLUSTER.getCode(), bmsBatteryClusterVo); + + bmsBatteryClusterVoList.add(bmsBatteryClusterVo); } } return bmsBatteryClusterVoList; } + private void dealWithBatteryClusterData(EmsBatteryCluster clusterData, List clusterDataList) { + BMSBatteryClusterDataList voltageData = new BMSBatteryClusterDataList(); + BMSBatteryClusterDataList tempData = new BMSBatteryClusterDataList(); + BMSBatteryClusterDataList socData = new BMSBatteryClusterDataList(); + + // 设值 + voltageData.setDataName(CLUSTER_DATA_VOLTAGE); + voltageData.setAvgData(clusterData.getAvgCellVoltage()); + voltageData.setMaxData(clusterData.getMaxCellVoltage()); + voltageData.setMaxDataID(clusterData.getMaxCellVoltageId() == null ? null : clusterData.getMaxCellVoltageId().toString()); + voltageData.setMinData(clusterData.getMinCellVoltage()); + voltageData.setMinDataID(clusterData.getMinCellVoltageId() == null ? null : clusterData.getMinCellVoltageId().toString()); + tempData.setDataName(CLUSTER_DATA_TEP); + tempData.setAvgData(clusterData.getAvgCellTemp()); + tempData.setMaxData(clusterData.getMaxCellTemp()); + tempData.setMaxDataID(clusterData.getMaxCellTempId() == null ? null : clusterData.getMaxCellTempId().toString()); + tempData.setMinData(clusterData.getMinCellTemp()); + tempData.setMinDataID(clusterData.getMinCellTempId() == null ? null : clusterData.getMinCellTempId().toString()); + socData.setDataName(CLUSTER_DATA_SOC); + socData.setAvgData(clusterData.getCurrentSoc()); + socData.setMaxData(clusterData.getMaxCellSoc()); + socData.setMaxDataID(clusterData.getMaxCellSocId() == null ? null : clusterData.getMaxCellSocId().toString()); + socData.setMinData(clusterData.getMinCellSoc()); + socData.setMinDataID(clusterData.getMinCellSocId() == null ? null : clusterData.getMinCellSocId().toString()); + + clusterDataList.add(voltageData); + clusterDataList.add(tempData); + clusterDataList.add(socData); + } + // 获取液冷设备参数 @Override - public List getCoolingDataList(Long siteId) { - List emsCoolingDataList = new ArrayList<>(); - if (siteId != null) { - emsCoolingDataList = emsCoolingDataMapper.getCoolingDataList(siteId); + public List getCoolingDataList(String siteId) { + List emsCoolingDataList = new ArrayList<>(); + + List> deviceIds = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.COOLING.getCode()); + for (Map deviceId : deviceIds) { + CoolingDataViewVo dataViewVo = new CoolingDataViewVo(); + dataViewVo.setDeviceName(deviceId.get("deviceName").toString()); + // 从redis取堆单个详细数据 + String coolingId = deviceId.get("id").toString(); + EmsCoolingData coolingData = redisCache.getCacheObject(RedisKeyConstants.COOLING + siteId + "_" + coolingId); + if (coolingData != null) { + BeanUtils.copyProperties(coolingData, dataViewVo); + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, coolingId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, coolingId, DeviceCategory.COOLING.getCode()); + dataViewVo.setAlarmNum(alarmNum); + } + + emsCoolingDataList.add(dataViewVo); } return emsCoolingDataList; } + + /** + * 根据电池堆获取单体电池数据 + * @param clusterDeviceId + * @return + */ + @Override + public List getClusterDataInfoList(String clusterDeviceId,String siteId, + String stackDeviceId, String batteryId) { + List batteryDataStatsListVo = new ArrayList<>(); + List> clusterIds = new ArrayList<>(); + if (StringUtils.isEmpty(clusterDeviceId)) { + clusterIds = emsDevicesSettingMapper.getClusterIdsByFuzzyQuery(siteId, DeviceCategory.CLUSTER.getCode(),stackDeviceId); + } else { + Map map = new HashMap<>(); + map.put("id", clusterDeviceId); + clusterIds.add(map); + } + for (Map clusterDevice : clusterIds) { + // 从redis取单个簇详细数据 + String clusterId = clusterDevice.get("id").toString(); + List batteryDataList = redisCache.getCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); + if (batteryDataList != null) { + for (EmsBatteryData batteryData : batteryDataList) { + // 判断是否需要筛选:batteryId不为空时才进行匹配 + if (batteryId == null || batteryId.trim().isEmpty()) { + // 空值情况:直接添加所有数据 + BatteryDataStatsListVo batteryDataStatsVo = new BatteryDataStatsListVo(); + BeanUtils.copyProperties(batteryData, batteryDataStatsVo); + batteryDataStatsListVo.add(batteryDataStatsVo); + } else { + // 有值情况:只添加匹配的数据 + if (batteryId.equals(batteryData.getDeviceId())) { + BatteryDataStatsListVo batteryDataStatsVo = new BatteryDataStatsListVo(); + BeanUtils.copyProperties(batteryData, batteryDataStatsVo); + batteryDataStatsListVo.add(batteryDataStatsVo); + // 找到匹配项后可提前退出当前簇的循环 + break; + } + } + } + } + } + //TODO 临时删除排序 + // 排序 +// List sortedList = batteryDataStatsListVo.stream() +// .sorted((u1, u2) -> Integer.parseInt(u1.getClusterDeviceId()) - Integer.parseInt(u2.getClusterDeviceId())) +// .collect(Collectors.toList()); + return batteryDataStatsListVo; + } + + // 获取单站的最大最小温度和电压单体数据id + @Override + public List getClusterBatteryList(String siteId, String stackDeviceId, String clusterDeviceId) { + return getBMSClusterListInfo(siteId, stackDeviceId,clusterDeviceId); + } + + /** + * 电表数据信息 + * @param siteId + * @return + */ + @Override + public List getAmmeterDataList(String siteId) { + List ammeterResponse = new ArrayList<>(); + + if (StringUtils.isEmpty(siteId)) { + return ammeterResponse; + } + + // 先获取电表设备 + List> ammeterIdList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.AMMETER.getCode()); + if (ammeterIdList == null || ammeterIdList.isEmpty()) { + return ammeterResponse; + } + for (Map ammeterDevice : ammeterIdList) { + String ammeterId = ammeterDevice.get("id").toString(); + // 从redis取总表详细数据 + EmsAmmeterData ammeterData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + siteId + "_" +ammeterId); + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, ammeterId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, ammeterId, DeviceCategory.AMMETER.getCode()); + + AmmeterDataVo ammeterDataVo = new AmmeterDataVo(); + ammeterDataVo.setDeviceName(ammeterDevice.get("deviceName").toString()); + ammeterDataVo.setDeviceId(ammeterDevice.get("id").toString()); + ammeterDataVo.setEmsCommunicationStatus(ammeterDevice.get("communicationStatus") == null? "" : + ammeterDevice.get("communicationStatus").toString()); + ammeterDataVo.setAlarmNum(alarmNum); + // 设置表数据 + dealAmmeterData(ammeterData,ammeterDataVo); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.AMMETER.getCode(), ammeterDataVo); + + ammeterResponse.add(ammeterDataVo); + } + return ammeterResponse; + } + + private void dealAmmeterData(EmsAmmeterData ammeterData, AmmeterDataVo ammeterDataVo) { + if (ammeterData != null) { + ammeterDataVo.setActivePower(ammeterData.getTotalActivePower() == null ? ammeterData.getPower() : ammeterData.getTotalActivePower()); + ammeterDataVo.setReactivePower(ammeterData.getTotalReactivePower()); + ammeterDataVo.setForwardActive(ammeterData.getCurrentForwardActiveTotal()); + ammeterDataVo.setForwardReactive(ammeterData.getCurrentForwardReactiveTotal()); + ammeterDataVo.setReverseActive(ammeterData.getCurrentReverseActiveTotal()); + ammeterDataVo.setReverseReactive(ammeterData.getCurrentReverseReactiveTotal()); + ammeterDataVo.setActiveEnergy(ammeterData.getPositiveActiveEnergyEpPlus()); + ammeterDataVo.setReactiveEnergy(ammeterData.getPositiveReactiveEnergyEqPlus()); + ammeterDataVo.setDataUpdateTime(ammeterData.getDataUpdateTime()); + } + } + + private void dealAmmeterLoadData(EmsAmmeterData ammeterData, AmmeterDataVo ammeterDataVo) { + if (ammeterData != null) { + // 数据更新时间 + ammeterDataVo.setDataUpdateTime(ammeterData.getDataUpdateTime()); + + List loadDataDetailInfos = new ArrayList<>(); + // 拼接数据 + // 当前正向有功 + LoadDataDetailInfo ammeterDataDetailInfo1 = new LoadDataDetailInfo(); + ammeterDataDetailInfo1.setCategory(AmmeterCategory.CURRENT_FORWARD_ACTIVE.getInfo()); + ammeterDataDetailInfo1.setTotalKwh(ammeterData.getCurrentForwardActiveTotal()); + ammeterDataDetailInfo1.setPeakKwh(ammeterData.getCurrentForwardActivePeak()); + ammeterDataDetailInfo1.setHighKwh(ammeterData.getCurrentForwardActiveHigh()); + ammeterDataDetailInfo1.setFlatKwh(ammeterData.getCurrentForwardActiveFlat()); + ammeterDataDetailInfo1.setValleyKwh(ammeterData.getCurrentForwardActiveValley()); + loadDataDetailInfos.add(ammeterDataDetailInfo1); + // 当前正向无功 + LoadDataDetailInfo ammeterDataDetailInfo2 = new LoadDataDetailInfo(); + ammeterDataDetailInfo2.setCategory(AmmeterCategory.CURRENT_FORWARD_REACTIVE.getInfo()); + ammeterDataDetailInfo2.setTotalKwh(ammeterData.getCurrentForwardReactiveTotal()); + ammeterDataDetailInfo2.setPeakKwh(ammeterData.getCurrentForwardReactivePeak()); + ammeterDataDetailInfo2.setHighKwh(ammeterData.getCurrentForwardReactiveHigh()); + ammeterDataDetailInfo2.setFlatKwh(ammeterData.getCurrentForwardReactiveFlat()); + ammeterDataDetailInfo2.setValleyKwh(ammeterData.getCurrentForwardReactiveValley()); + loadDataDetailInfos.add(ammeterDataDetailInfo2); + // 当前反向有功 + LoadDataDetailInfo ammeterDataDetailInfo3 = new LoadDataDetailInfo(); + ammeterDataDetailInfo3.setCategory(AmmeterCategory.CURRENT_REVERSE_ACTIVE.getInfo()); + ammeterDataDetailInfo3.setTotalKwh(ammeterData.getCurrentReverseActiveTotal()); + ammeterDataDetailInfo3.setPeakKwh(ammeterData.getCurrentReverseActivePeak()); + ammeterDataDetailInfo3.setHighKwh(ammeterData.getCurrentReverseActiveHigh()); + ammeterDataDetailInfo3.setFlatKwh(ammeterData.getCurrentReverseActiveFlat()); + ammeterDataDetailInfo3.setValleyKwh(ammeterData.getCurrentReverseActiveValley()); + loadDataDetailInfos.add(ammeterDataDetailInfo3); + // 当前反向无功 + LoadDataDetailInfo ammeterDataDetailInfo4 = new LoadDataDetailInfo(); + ammeterDataDetailInfo4.setCategory(AmmeterCategory.CURRENT_REVERSE_REACTIVE.getInfo()); + ammeterDataDetailInfo4.setTotalKwh(ammeterData.getCurrentReverseReactiveTotal()); + ammeterDataDetailInfo4.setPeakKwh(ammeterData.getCurrentReverseReactivePeak()); + ammeterDataDetailInfo4.setHighKwh(ammeterData.getCurrentReverseReactiveHigh()); + ammeterDataDetailInfo4.setFlatKwh(ammeterData.getCurrentReverseReactiveFlat()); + ammeterDataDetailInfo4.setValleyKwh(ammeterData.getCurrentReverseReactiveValley()); + loadDataDetailInfos.add(ammeterDataDetailInfo4); + + ammeterDataVo.setLoadDataDetailInfo(loadDataDetailInfos); + } + + } + + /** + * 获取动环设备参数 + * @param siteId + * @return + */ + @Override + public List getDhDataList(String siteId) { + List emsDhDataList = new ArrayList<>(); + + List> dhDeviceList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.DH.getCode()); + for (Map dhDevice : dhDeviceList) { + DhDataVo dhDataVo = new DhDataVo(); + dhDataVo.setDeviceName(dhDevice.get("deviceName").toString()); + // 从redis取堆单个详细数据 + String dhDeviceId = dhDevice.get("id").toString(); + EmsDhData dhData = redisCache.getCacheObject(RedisKeyConstants.DH + siteId + "_" + dhDeviceId); + if (dhData != null) { + BeanUtils.copyProperties(dhData, dhDataVo); + } + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, dhDeviceId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, dhDeviceId, DeviceCategory.DH.getCode()); + dhDataVo.setAlarmNum(alarmNum); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.DH.getCode(), dhDataVo); + + emsDhDataList.add(dhDataVo); + } + return emsDhDataList; + } + + /** + * 获取消防设备参数 + * @param siteId + * @return + */ + @Override + public List getXfDataList(String siteId) { + List emsXfDataList = new ArrayList<>(); + + List> xfDeviceList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.XF.getCode()); + for (Map xfDevice : xfDeviceList) { + XfDataVo xfDataVo = new XfDataVo(); + xfDataVo.setDeviceName(xfDevice.get("deviceName").toString()); + // 从redis取堆单个详细数据 + String xfDeviceId = xfDevice.get("id").toString(); + EmsXfData xfData = redisCache.getCacheObject(RedisKeyConstants.XF + siteId + "_" + xfDeviceId); + log.info("查询消防数据xfDataVo:{}", xfDataVo); + if (xfData != null) { + BeanUtils.copyProperties(xfData, xfDataVo); + xfDataVo.setDataUpdateTime(xfData.getDataTimestamp()); + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, xfDeviceId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, xfDeviceId, DeviceCategory.XF.getCode()); + xfDataVo.setAlarmNum(alarmNum); + } + xfDataVo.setEmsCommunicationStatus(xfDevice.get("communicationStatus") == null ? "" : xfDevice.get("communicationStatus").toString()); + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.XF.getCode(), xfDataVo); + + emsXfDataList.add(xfDataVo); + } + return emsXfDataList; + } + + @Override + public List getEmsDataList(String siteId) { + List emsDataList = new ArrayList<>(); + + List> xfDeviceList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.EMS.getCode()); + + for (Map emsDevice : xfDeviceList) { + EmsDataVo emsDataVo = new EmsDataVo(); + emsDataVo.setDeviceName(emsDevice.get("deviceName").toString()); + // 从redis取堆单个详细数据 + String emsDeviceId = emsDevice.get("id").toString(); + EmsEmsData emsData = redisCache.getCacheObject(RedisKeyConstants.EMS + siteId + "_" + emsDeviceId); + if (emsData != null) { + BeanUtils.copyProperties(emsData, emsDataVo); + // 报警个数 + int alarmNum = emsAlarmRecordsMapper.getDeviceAlarmNum(siteId, emsDeviceId); +// // 告警设备点位个数 +// int alarmNum = emsPointMatchMapper.getDevicePointAlarmNum(siteId, emsDeviceId, DeviceCategory.EMS.getCode()); + emsDataVo.setAlarmNum(alarmNum); + } + + // 处理枚举匹配字段 + devicePointMatchDataProcessor.convertFieldValueToEnumMatch(siteId, DeviceCategory.EMS.getCode(), emsDataVo); + + emsDataList.add(emsDataVo); + } + return emsDataList; + } + + /** + * 单站监控-首页-获取重点数据 + * @param requestVo + * @return + */ + @Override + public List getPointData(DateSearchRequest requestVo) { + List responseList = new ArrayList<>(); + List powerList = new ArrayList<>();//功率数据 + List stackList = new ArrayList<>();//电池堆数据 +// List> fxAvgTempList = new ArrayList<>(); + List> avgTempList = new ArrayList<>(); + + // 默认时间-7天 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + List timeList = new ArrayList<>(); + +// // 开始日期和结束日期同一天,展示 0-24 小时数据 +// if (DateUtils.isSameDay(startDate, endDate)){ +// endDate = DateUtils.addDays(endDate, 1); +// requestVo.setEndDate(endDate); +// powerList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);//功率数据 +// stackList = emsBatteryStackMapper.getStackPointByHour(requestVo);//电池堆数据 +// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ +// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo); +// } +// avgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo);//电池簇数据 +// } + // 开始日期和结束日期同一天,展示每5分钟一个点数据 + if (DateUtils.isSameDay(startDate, endDate)){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + powerList = emsAmmeterDataMapper.getPowerDataByMinute(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByMinute(requestVo);//电池堆数据 + avgTempList = emsBatteryClusterMapper.getAvgTempByMinute(requestVo);//电池簇数据 + } + else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 + powerList = emsAmmeterDataMapper.getPowerDataByDay(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByDay(requestVo);//电池堆数据 +// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ +// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo); +// } + avgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);//电池簇数据 + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 个月,按月展示数据 + powerList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByMonth(requestVo);//电池堆数据 +// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ +// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo); +// } + avgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);//电池簇数据 + } + +// // 如果奉贤数据:电池平均温度单独取值。将其塞入stackList里面 +// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ +// processFXXTempData(stackList,fxAvgTempList); +// } + // 优先从电池堆取,电池堆没有的话再从电池簇取 + processTempData(stackList, avgTempList); + + // 数据转换为Map + Map powerMap = powerList.stream() + .collect(Collectors.toMap(PowerStatisListVo::getStatisDate, stat -> stat)); + Map stackMap = stackList.stream() + .collect(Collectors.toMap(StackPointVo::getStatisDate, stat -> stat)); + // 收集所有日期 + Set allDates = new HashSet<>(); + allDates.addAll(powerMap.keySet()); + allDates.addAll(stackMap.keySet()); + + // 按日期合并数据 + responseList = allDates.stream() + .map(date -> { + PowerStatisListVo powerStat = powerMap.get(date); + StackPointVo stackStat = stackMap.get(date); + + // null时取0 + BigDecimal pvPower = powerStat != null ? powerStat.getPvPower() : BigDecimal.ZERO; + BigDecimal storagePower = powerStat != null ? powerStat.getStoragePower() : BigDecimal.ZERO; + BigDecimal gridPower = powerStat != null ? powerStat.getGridPower() : BigDecimal.ZERO; + BigDecimal avgSoh = stackStat != null ? (stackStat.getAvgSoh() == null ? BigDecimal.ZERO : stackStat.getAvgSoh().setScale(2,RoundingMode.HALF_UP)) : BigDecimal.ZERO; + BigDecimal avgSoc = stackStat != null ? (stackStat.getAvgSoc() == null ? BigDecimal.ZERO : stackStat.getAvgSoc().setScale(2,RoundingMode.HALF_UP)) : BigDecimal.ZERO; + BigDecimal avgTemp = stackStat != null ? (stackStat.getAvgTemp() == null ? BigDecimal.ZERO : stackStat.getAvgTemp().setScale(2,RoundingMode.HALF_UP)) : BigDecimal.ZERO; + + // 假设完整构造参数(补充原代码中缺失的部分) + return new PointDataResponse(date, pvPower, storagePower, BigDecimal.ZERO, gridPower, avgSoh, avgSoc, avgTemp); + }) + // 按日期排序 + .sorted(Comparator.comparing(PointDataResponse::getStatisDate)) + .collect(Collectors.toList()); + + // 负荷功率 + dealDataPower(requestVo.getSiteId(),responseList); + + return responseList; + } + + private void dealDataPower(String siteId, List dataList) { + if (dataList == null || dataList.size() == 0){ + return; + } + + for (PointDataResponse pointDataResponse : dataList) { + BigDecimal gridPower = pointDataResponse.getGridPower() == null ? BigDecimal.ZERO : pointDataResponse.getGridPower(); + BigDecimal storagePower = pointDataResponse.getStoragePower() == null ? BigDecimal.ZERO : pointDataResponse.getStoragePower(); + BigDecimal pvPower = pointDataResponse.getPvPower() == null ? BigDecimal.ZERO : pointDataResponse.getPvPower(); + BigDecimal loadPower = new BigDecimal(0); + +// // 电动所:负荷功率=电网功率+光伏功率-储能功率 +// // 奉贤:负荷功率=电网功率-储能功率; +// if (SiteEnum.DDS.getCode().equals(siteId)){ +// loadPower = gridPower.add(pvPower).subtract(storagePower); +// pointDataResponse.setLoadPower(loadPower); +// } else if (SiteEnum.FX.getCode().equals(siteId)){ +// // 奉贤:负荷功率=电网功率-储能功率; +// loadPower = gridPower.subtract(storagePower); +// pointDataResponse.setLoadPower(loadPower); +// } + // 负荷功率=电网功率+光伏功率-储能功率 + loadPower = gridPower.add(pvPower).subtract(storagePower); + pointDataResponse.setLoadPower(loadPower); + } + } + + private void processTempData(List stackList, List> avgTempList) { + if (stackList == null || avgTempList == null) { + return; + } + + + Map avgTempMap = avgTempList.stream() + .filter(subMap -> subMap != null && !subMap.isEmpty()) + .filter(subMap -> subMap.containsKey("statisDate") && subMap.containsKey("avgTemp")) + .collect(Collectors.toMap( + subMap -> String.valueOf(subMap.get("statisDate")), + subMap -> (BigDecimal)subMap.get("avgTemp"), + (existingValue, newValue) -> newValue, + HashMap::new + )); + + for (StackPointVo stackPointVo : stackList) { + if (stackPointVo.getAvgTemp() != null) { + continue; + } + // 从map中获取temp + BigDecimal mapTemp = (avgTempMap != null) ? avgTempMap.get(stackPointVo.getStatisDate()) : null; + if (mapTemp != null) { + stackPointVo.setAvgTemp(mapTemp); + } + } + + } + + private void processFXXTempData(List stackList, List> fxAvgTempList) { + if (stackList == null || fxAvgTempList == null) { + return; + } + + Map fxAvgTempMap = fxAvgTempList.stream() + .filter(subMap -> subMap != null && !subMap.isEmpty()) + .filter(subMap -> subMap.containsKey("statisDate") && subMap.containsKey("avgTemp")) + .collect(Collectors.toMap( + subMap -> String.valueOf(subMap.get("statisDate")), + subMap -> (BigDecimal)subMap.get("avgTemp"), + (existingValue, newValue) -> newValue, + HashMap::new + )); + + for (StackPointVo stackPointVo : stackList) { + // 从map中获取temp + BigDecimal mapTemp = (fxAvgTempMap != null) ? fxAvgTempMap.get(stackPointVo.getStatisDate()) : null; + if (mapTemp != null) { + stackPointVo.setAvgTemp(mapTemp); + } + } + + } + + // 统计入参时间处理 + public void dealRequestTime(DateSearchRequest requestVo){ + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + if (startDate == null && endDate == null) { + // 如果没有传时间,默认从今天往前7天 + LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); + startDate = DateUtils.toDate(sevenDaysAgo); + endDate = new Date(); + requestVo.setStartDate(startDate); + requestVo.setEndDate(endDate); + } + } + } diff --git a/ems-system/src/main/java/com/xzzn/ems/utils/AbstractBatteryDataProcessor.java b/ems-system/src/main/java/com/xzzn/ems/utils/AbstractBatteryDataProcessor.java new file mode 100644 index 0000000..ba0ec22 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/utils/AbstractBatteryDataProcessor.java @@ -0,0 +1,678 @@ +package com.xzzn.ems.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.EmsBatteryDataDay; +import com.xzzn.ems.domain.EmsBatteryDataHour; +import com.xzzn.ems.domain.EmsBatteryDataMonth; +import com.xzzn.ems.mapper.EmsBatteryDataDayMapper; +import com.xzzn.ems.mapper.EmsBatteryDataHourMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMonthMapper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public abstract class AbstractBatteryDataProcessor { + + private static final Log log = LogFactory.getLog(AbstractBatteryDataProcessor.class); + + protected static final DateTimeFormatter HOUR_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH"); + protected static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + protected static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM"); + // 公共缓存: + protected final Map tempCache = new ConcurrentHashMap<>(); + // 公共锁缓存: + protected final Map lockCache = new ConcurrentHashMap<>(); + protected final ObjectMapper objectMapper; + + @Autowired + private EmsBatteryDataHourMapper emsBatteryDataHourMapper; + @Autowired + private EmsBatteryDataDayMapper emsBatteryDataDayMapper; + @Autowired + private EmsBatteryDataMonthMapper emsBatteryDataMonthMapper; + @Autowired + private RedisCache redisCache; + + // 公共线程池(IO密集型,子类共享) + protected ThreadPoolTaskExecutor ioExecutor; + // 批量缓冲区(线程安全队列,按级别区分) + protected ConcurrentLinkedQueue hourBatchQueue = new ConcurrentLinkedQueue<>(); + protected ConcurrentLinkedQueue dayBatchQueue = new ConcurrentLinkedQueue<>(); + protected ConcurrentLinkedQueue monthBatchQueue = new ConcurrentLinkedQueue<>(); + // 批量提交阈值(满100条触发数据库操作) + protected static final int BATCH_THRESHOLD = 50; + // 死锁重试等待时间基数(毫秒) + private static final int RETRY_BASE_DELAY = 100; + // 随机数生成器,用于重试退避 + private static final Random random = new Random(); + + // 初始化方法(构造时初始化线程池) + public AbstractBatteryDataProcessor(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + ioExecutor = new ThreadPoolTaskExecutor(); + int coreThreads = Runtime.getRuntime().availableProcessors() * 2; + ioExecutor.setCorePoolSize(coreThreads); + ioExecutor.setMaxPoolSize(coreThreads * 2); + ioExecutor.setQueueCapacity(10000); + ioExecutor.setThreadNamePrefix("battery-io-"); + // 线程池饱和策略:使用调用者线程执行,避免任务丢失 + ioExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + ioExecutor.initialize(); + } + + // 模板方法:定义数据处理主流程(子类无需重写) + public void processBatch(List batchData) { + // 1. 数据分片(实现通用分片逻辑) + List> shards = splitIntoShards(batchData, 50); + int totalShards = shards.size(); + + // 2. 并行处理每个分片(使用父类线程池) + for (int i = 0; i < totalShards; i++) { + List shard = shards.get(i); + boolean isLastShard = (i == totalShards - 1); // 判断是否为最后一个分片 + + // 传递分片索引和是否最后一个分片的标记 + ioExecutor.execute(() -> processShard(shard, isLastShard)); + } + } + + /** + * 将大批量数据拆分为多个小分片 + * @param dataList 原始数据列表 + * @param shardSize 每个分片的最大大小(如100条/片) + * @return 分片后的列表(每个元素是一个子列表) + */ + protected List> splitIntoShards(List dataList, int shardSize) { + // 1. 校验参数:避免空列表或无效分片大小 + if (dataList == null || dataList.isEmpty()) { + return new ArrayList<>(); + } + if (shardSize <= 0) { + throw new IllegalArgumentException("分片大小必须大于0"); + } + + // 2. 计算总分片数:向上取整(如150条数据,分片大小100 → 2片) + int totalSize = dataList.size(); + int shardCount = (totalSize + shardSize - 1) / shardSize; + + // 3. 拆分数据为分片(使用IntStream生成分片索引) + return IntStream.range(0, shardCount) + .mapToObj(shardIndex -> { + // 计算当前分片的起始索引和结束索引 + int startIndex = shardIndex * shardSize; + int endIndex = Math.min(startIndex + shardSize, totalSize); + // 截取子列表作为一个分片 + return dataList.subList(startIndex, endIndex); + }) + .collect(Collectors.toList()); + } + + // 处理单个分片(父类定义流程,调用子类实现的具体判断和更新逻辑) + private void processShard(List shard, boolean isLastShard) { + int shardSize = shard.size(); + log.info("分片校验:" + shardSize + ""); + for (int i = 0; i < shardSize; i++) { + EmsBatteryData data = shard.get(i); + if (!isValidData(data)) continue; + + // 判断当前数据是否为最后一个分片的最后一条数据 + boolean isLastData = isLastShard && (i == shardSize - 1); + // shouldUpdate判断是否需要更新 + if (shouldUpdate(data, "hour")) { + addToHourBatch(data, isLastData); // 加入小时级批量队列 + } + if (shouldUpdate(data, "day")) { + addToDayBatch(data, isLastData); // 加入天级批量队列 + } + if (shouldUpdate(data, "month")) { + addToMonthBatch(data, isLastData); + } + } + } + + // 加入小时级批量队列,达到阈值时触发批量更新 + protected void addToHourBatch(EmsBatteryData data, boolean isLastData) { + hourBatchQueue.add(data); + if (hourBatchQueue.size() >= BATCH_THRESHOLD || isLastData) { + List batch = drainQueue(hourBatchQueue); + ioExecutor.execute(() -> batchUpdateHour(batch)); // 异步批量更新 + } + } + + // 加入天级批量队列,达到阈值时触发批量更新 + protected void addToDayBatch(EmsBatteryData data, boolean isLastData) { + dayBatchQueue.add(data); + if (dayBatchQueue.size() >= BATCH_THRESHOLD || isLastData) { + List batch = drainQueue(dayBatchQueue); + ioExecutor.execute(() -> batchUpdateDay(batch)); // 异步批量更新 + } + } + + // 加入月级批量队列,达到阈值时触发批量更新 + protected void addToMonthBatch(EmsBatteryData data, boolean isLastData) { + monthBatchQueue.add(data); + if (monthBatchQueue.size() >= BATCH_THRESHOLD || isLastData) { + List batch = drainQueue(monthBatchQueue); + ioExecutor.execute(() -> batchUpdateMonth(batch)); // 异步批量更新 + } + } + + // 实现父类的抽象方法:批量更新小时级数据 + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void batchUpdateHour(List batch) { + if (batch.isEmpty()) return; + + int maxRetry = 3; // 最多重试3次 + int retryCount = 0; + while (retryCount < maxRetry) { + try { + // 关键优化:按唯一键排序,保证所有线程处理相同记录时顺序一致 + List sortedBatch = batch.stream() + .sorted(Comparator.comparing(data -> generateCacheKey(data, "hour"))) // 用唯一键排序 + .collect(Collectors.toList()); + + // 1. 转换原始数据为小时级统计对象(分组取最高温) + List hourDataList = sortedBatch.stream() + .collect(Collectors.groupingBy( + data -> generateCacheKey(data, "hour"), // 分组键 + Collectors.collectingAndThen( + Collectors.maxBy((d1, d2) -> d1.getTemperature().compareTo(d2.getTemperature())), + maxData -> convertToHourData(maxData.get()) // 取每组最高温转换为HourData + ) + )) + .values() + .stream() + .sorted(Comparator.comparing(this::getHourDataUniqueKey)) + .collect(Collectors.toList()); + + // 2. 批量插入或更新数据库(依赖数据库唯一索引) + emsBatteryDataHourMapper.batchInsertOrUpdate(hourDataList); + + // 3. 同步更新Redis缓存(批量操作) + batchUpdateHourCache(hourDataList); + log.info("小时级批量更新成功,批次大小:" + batch.size() + ",重试次数:" + retryCount); + return; + } catch (Exception e) { + log.error("小时级批量更新失败", e); + // 使用改进的死锁判断方法,直接传入异常对象 + if (isDeadlockException(e) && retryCount < maxRetry - 1) { + retryCount++; + long sleepTime = calculateBackoffTime(retryCount); + log.info("检测到死锁,第" + retryCount + "次重试(当前批次大小:" + batch.size() + ")", e); + try { + // 指数退避策略:100ms, 200ms, 300ms... + Thread.sleep(sleepTime); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); // 保留中断状态 + break; + } + } else { + log.error("小时级批量更新失败(已达最大重试次数)", e); + //retryQueue.addAll(batch); // 加入重试队列 + return; + } + } + } + } + // 辅助方法:获取小时级数据的唯一键(用于排序) + private String getHourDataUniqueKey(EmsBatteryDataHour data) { + return data.getSiteId() + "_" + data.getBatteryPack() + "_" + data.getClusterDeviceId() + + "_" + data.getDeviceId() + "_" + data.getHourTime(); + } + // 批量更新小时级数据缓存-小时级统计数据列表(已按唯一键分组并取最高温) + public void batchUpdateHourCache(List hourDataList) { + if (hourDataList.isEmpty()) return; + + Map tempCacheMap = buildCacheMap(hourDataList, "hour"); + + try { + // 批量设置缓存 + redisCache.multiSetWithExpire(tempCacheMap, 1, TimeUnit.HOURS); + } catch (Exception e) { + log.error("批量更新小时级缓存失败", e); + // 缓存更新失败不影响主流程,但需记录日志便于排查 + } + } + // 转换为小时级数据对象 + private EmsBatteryDataHour convertToHourData(EmsBatteryData data) { + LocalDateTime localDateTime = data.getDataTimestamp().toInstant().atZone(ZoneId.of("Asia/Shanghai")) + .toLocalDateTime(); + LocalDateTime hourStart = localDateTime.truncatedTo(ChronoUnit.HOURS); + + EmsBatteryDataHour hourData = new EmsBatteryDataHour(); + BeanUtils.copyProperties(data, hourData); + hourData.setUpdateTime(new Date()); + hourData.setHourTime(DateUtils.convertToDate(hourStart)); + return hourData; + } + + // 实现父类的抽象方法:批量更新天级数据 + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void batchUpdateDay(List batch) { + if (batch.isEmpty()) return; + + int maxRetry = 3; // 最多重试3次 + int retryCount = 0; + while (retryCount < maxRetry) { + try { + // 关键优化:按唯一键排序,保证所有线程处理相同记录时顺序一致 + List sortedBatch = batch.stream() + .sorted(Comparator.comparing(data -> generateCacheKey(data, "day"))) // 用唯一键排序 + .collect(Collectors.toList()); + + // 1. 转换原始数据为天级统计对象(分组取最高温) + List dayDataList = sortedBatch.stream() + .collect(Collectors.groupingBy( + data -> generateCacheKey(data, "day"), // 分组键 + Collectors.collectingAndThen( + Collectors.maxBy((d1, d2) -> d1.getTemperature().compareTo(d2.getTemperature())), + maxData -> convertToDayData(maxData.get()) // 取每组最高温转换为HourData + ) + )) + .values() + .stream() + .sorted(Comparator.comparing(this::getDayDataUniqueKey)) + .collect(Collectors.toList()); + + // 2. 批量插入或更新数据库(依赖数据库唯一索引) + emsBatteryDataDayMapper.batchInsertOrUpdate(dayDataList); + + // 3. 同步更新Redis缓存(批量操作) + batchUpdateDayCache(dayDataList); + log.info("天级批量更新成功,批次大小:" + batch.size() + ",重试次数:" + retryCount); + return; + } catch (Exception e) { + log.error("天级批量更新失败", e); + // 使用改进的死锁判断方法,直接传入异常对象 + if (isDeadlockException(e) && retryCount < maxRetry - 1) { + retryCount++; + long sleepTime = calculateBackoffTime(retryCount); + log.info("检测到死锁,第" + retryCount + "次重试(当前批次大小:" + batch.size() + ")", e); + try { + // 指数退避策略:100ms, 200ms, 300ms... + Thread.sleep(sleepTime); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); // 保留中断状态 + break; + } + } else { + log.error("天级批量更新失败(已达最大重试次数)", e); + //retryQueue.addAll(batch); // 加入重试队列 + return; + } + } + } + } + // 辅助方法:获取天级数据的唯一键(用于排序) + private String getDayDataUniqueKey(EmsBatteryDataDay data) { + return data.getSiteId() + "_" + data.getBatteryPack() + "_" + data.getClusterDeviceId() + + "_" + data.getDeviceId() + "_" + data.getDayTime(); + } + // 批量更新天级数据缓存-天级统计数据列表(已按唯一键分组并取最高温) + public void batchUpdateDayCache(List dayDataList) { + if (dayDataList.isEmpty()) return; + + Map tempCacheMap = buildCacheMap(dayDataList, "hour"); + + try { + // 批量设置缓存 + redisCache.multiSetWithExpire(tempCacheMap, 24, TimeUnit.HOURS); + } catch (Exception e) { + log.error("批量更新小时级缓存失败", e); + // 缓存更新失败不影响主流程,但需记录日志便于排查 + } + } + // 转换为天级数据对象 + private EmsBatteryDataDay convertToDayData(EmsBatteryData data) { + LocalDateTime localDateTime = data.getDataTimestamp().toInstant().atZone(ZoneId.of("Asia/Shanghai")) + .toLocalDateTime(); + LocalDateTime dayStart = localDateTime.truncatedTo(ChronoUnit.DAYS); + + EmsBatteryDataDay dayData = new EmsBatteryDataDay(); + BeanUtils.copyProperties(data, dayData); + dayData.setUpdateTime(new Date()); + dayData.setDayTime(DateUtils.convertToDate(dayStart)); + return dayData; + } + + // 实现父类的抽象方法:批量更新月级数据 + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void batchUpdateMonth(List batch) { + if (batch.isEmpty()) return; + + int maxRetry = 3; // 最多重试3次 + int retryCount = 0; + while (retryCount < maxRetry) { + try { + // 关键优化:按唯一键排序,保证所有线程处理相同记录时顺序一致 + List sortedBatch = batch.stream() + .sorted(Comparator.comparing(data -> generateCacheKey(data, "month"))) // 用唯一键排序 + .collect(Collectors.toList()); + + // 1. 转换原始数据为小时级统计对象(分组取最高温) + List monthDataList = sortedBatch.stream() + .collect(Collectors.groupingBy( + data -> generateCacheKey(data, "month"), // 分组键 + Collectors.collectingAndThen( + Collectors.maxBy((d1, d2) -> d1.getTemperature().compareTo(d2.getTemperature())), + maxData -> convertToMonthData(maxData.get()) // 取每组最高温转换为HourData + ) + )) + .values() + .stream() + .sorted(Comparator.comparing(this::getMonthDataUniqueKey)) + .collect(Collectors.toList()); + + // 2. 批量插入或更新数据库(依赖数据库唯一索引) + emsBatteryDataMonthMapper.batchInsertOrUpdate(monthDataList); + + // 3. 同步更新Redis缓存(批量操作) + batchUpdateMonthCache(monthDataList); + log.info("月级批量更新成功,批次大小:" + batch.size() + ",重试次数:" + retryCount); + return; + } catch (Exception e) { + log.error("月级批量更新失败", e); + // 使用改进的死锁判断方法,直接传入异常对象 + if (isDeadlockException(e) && retryCount < maxRetry - 1) { + retryCount++; + long sleepTime = calculateBackoffTime(retryCount); + log.info("检测到死锁,第" + retryCount + "次重试(当前批次大小:" + batch.size() + ")", e); + try { + // 指数退避策略:100ms, 200ms, 300ms... + Thread.sleep(sleepTime); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); // 保留中断状态 + break; + } + } else { + log.error("月级批量更新失败(已达最大重试次数)", e); + //retryQueue.addAll(batch); // 加入重试队列 + return; + } + } + } + } + // 辅助方法:获取月级数据的唯一键(用于排序) + private String getMonthDataUniqueKey(EmsBatteryDataMonth data) { + return data.getSiteId() + "_" + data.getBatteryPack() + "_" + data.getClusterDeviceId() + + "_" + data.getDeviceId() + "_" + data.getMonthTime(); + } + // 转换为月级数据对象 + private EmsBatteryDataMonth convertToMonthData(EmsBatteryData data) { + LocalDateTime localDateTime = data.getDataTimestamp().toInstant().atZone(ZoneId.of("Asia/Shanghai")) + .toLocalDateTime(); + LocalDateTime monthStart = localDateTime.withDayOfMonth(1).withHour(0).withMinute(0) + .withSecond(0).withNano(0); + + EmsBatteryDataMonth monthData = new EmsBatteryDataMonth(); + BeanUtils.copyProperties(data, monthData); + monthData.setUpdateTime(new Date()); + monthData.setMonthTime(DateUtils.convertToDate(monthStart)); + return monthData; + } + // 批量更新月级数据缓存-月级统计数据列表(已按唯一键分组并取最高温) + public void batchUpdateMonthCache(List monthDataList) { + if (monthDataList.isEmpty()) return; + + Map tempCacheMap = buildCacheMap(monthDataList, "hour"); + + try { + // 批量设置缓存 + redisCache.multiSetWithExpire(tempCacheMap, 24*30, TimeUnit.HOURS); + } catch (Exception e) { + log.error("批量更新月级缓存失败", e); + // 缓存更新失败不影响主流程,但需记录日志便于排查 + } + } + + + /** + * 校验数据有效性(公共逻辑:检查核心字段) + */ + protected boolean isValidData(EmsBatteryData data) { + return data.getDeviceId() != null + && data.getTemperature() != null + && data.getDataTimestamp() != null; + } + + /** + * 判断是否需要更新(公共缓存逻辑) + */ + protected boolean shouldUpdate(EmsBatteryData data, String granularity) { + String cacheKey = generateCacheKey(data, granularity); + if (cacheKey == null) return true; + + BigDecimal newTemp = data.getTemperature(); + CacheValue localCache = tempCache.get(cacheKey); + if (localCache != null) { + return newTemp.compareTo(localCache.maxTemp) > 0; + } + + // 本地缓存未命中:查Redis + try { + String redisValue = redisCache.getCacheObject(cacheKey); + if (redisValue != null) { + // Redis有值:转换为BigDecimal比较 + BigDecimal redisMaxTemp = new BigDecimal(redisValue); + // 同时更新本地缓存(减少下次查询Redis的开销) + tempCache.put(cacheKey, new CacheValue(redisMaxTemp, LocalDateTime.now())); + return newTemp.compareTo(redisMaxTemp) > 0; + } + } catch (Exception e) { + log.error("查询Redis缓存失败(key: " + cacheKey + ")", e); + } + + + // 数据库校验(缓存都未命中或新温度更高时) + BigDecimal dbMaxTemp = queryDbMaxTemp(data, granularity); + if (dbMaxTemp != null && newTemp.compareTo(dbMaxTemp) <= 0) { + // 数据库已有更高温度,更新缓存后返回 + CacheValue dbCache = new CacheValue(dbMaxTemp, LocalDateTime.now()); + tempCache.put(cacheKey, dbCache); + redisCache.setCacheObject(cacheKey, dbMaxTemp.toString()); // 同步到Redis + return false; + } + + return true; + } + + /** + * 查询数据库中该设备在指定时间粒度下的最大温度 + */ + private BigDecimal queryDbMaxTemp(EmsBatteryData data, String granularity) { + try { + LocalDateTime dataTime = data.getDataTimestamp().toInstant() + .atZone(ZoneId.of("Asia/Shanghai")).toLocalDateTime(); + + String siteId = data.getSiteId(); + String batteryPack = data.getBatteryPack(); + String clusterId = data.getClusterDeviceId(); + String deviceId = data.getDeviceId(); + + // 根据粒度查询对应的数据表 + switch (granularity) { + case "hour": + LocalDateTime hourStart = dataTime.truncatedTo(ChronoUnit.HOURS); + // 调用Mapper查询该小时的最大温度(需确保Mapper方法存在) + EmsBatteryDataHour hourMax = emsBatteryDataHourMapper.findHourMaxTemp( + siteId, batteryPack, clusterId, deviceId, hourStart + ); + return hourMax != null ? hourMax.getTemperature() : null; + + case "day": + LocalDateTime dayStart = dataTime.truncatedTo(ChronoUnit.DAYS); + EmsBatteryDataDay dayMax = emsBatteryDataDayMapper.findDayMaxTemp( + siteId, batteryPack, clusterId, deviceId, dayStart + ); + return dayMax != null ? dayMax.getTemperature() : null; + + case "month": + // 设为当月1号 与其他表统一格式 + LocalDateTime monthStart = dataTime.withDayOfMonth(1).withHour(0).withMinute(0) + .withSecond(0).withNano(0); + EmsBatteryDataMonth monthMax = emsBatteryDataMonthMapper.findMonthMaxTemp( + siteId, batteryPack, clusterId, deviceId, monthStart + ); + return monthMax != null ? monthMax.getTemperature() : null; + + default: + log.error("不支持的查询粒度:" + granularity); + return null; + } + } catch (Exception e) { + log.error("查询数据库最大温度失败", e); + return null; // 数据库查询失败时,暂不阻止更新(避免业务中断) + } + } + + // 生成缓存键(不同级别格式不同) + private String generateCacheKey(EmsBatteryData data, String granularity) { + String siteId = data.getSiteId(); + String stackId = data.getBatteryPack(); + String clusterId = data.getClusterDeviceId(); + String batteryId = data.getDeviceId(); + try { + LocalDateTime localDateTime = data.getDataTimestamp().toInstant().atZone(ZoneId.of("Asia/Shanghai")) + .toLocalDateTime(); + String timeStr; + // 根据级别格式化时间(小时/天/月) + switch (granularity) { + case "hour": + timeStr = localDateTime.format(HOUR_FORMATTER); + break; + case "day": + timeStr = localDateTime.format(DAY_FORMATTER); + break; + case "month": + timeStr = localDateTime.format(MONTH_FORMATTER); + break; + default: + log.info("不支持的级别:" + granularity); + return null; + } + // 缓存键格式 + return siteId + "_" + stackId + "_" + clusterId + "_" + batteryId + "_" +timeStr; + } catch (Exception e) { + log.error("生成缓存键失败", e); + return null; + } + } + + // 工具方法:从队列中取出所有元素 + protected List drainQueue(ConcurrentLinkedQueue queue) { + List result = new ArrayList<>(); + T element; + while ((element = queue.poll()) != null) { + result.add(element); + } + return result; + } + + /** + * 获取电池+粒度的专属锁(公共锁逻辑) + */ + protected ReentrantLock getLock(String siteId, String stackId, String clusterId, + String batteryId, String granularity) { + String lockKey = siteId + "_" + stackId + "_" + clusterId + "_" + batteryId + "_" + granularity; + return lockCache.computeIfAbsent(lockKey, k -> new ReentrantLock()); + } + + // 计算退避时间:指数退避 + 随机抖动,避免重试风暴 + private long calculateBackoffTime(int retryCount) { + // 100ms * 2^retry + 随机0-100ms + return (long)(RETRY_BASE_DELAY * Math.pow(2, retryCount)) + random.nextInt(100); + } + + // 判断是否为死锁异常 + private boolean isDeadlockException(Throwable e) { + // 遍历所有异常链(包括cause的cause...) + while (e != null) { + // 检查异常消息是否包含死锁关键字 + if (e.getMessage() != null && e.getMessage().contains("Deadlock found when trying to get lock")) { + return true; + } + // 深入下一层异常 + e = e.getCause(); + } + return false; + } + + /** + * 公共缓存实体(所有站点通用) + */ + protected static class CacheValue { + BigDecimal maxTemp; + LocalDateTime lastUpdateTime; + + public CacheValue(BigDecimal maxTemp, LocalDateTime lastUpdateTime) { + this.maxTemp = maxTemp; + this.lastUpdateTime = lastUpdateTime; + } + } + + // 通用构建缓存键值对的方法(根据不同数据类型适配) + private Map buildCacheMap(List dataList, String granularity) { + Map cacheMap = new HashMap<>(dataList.size()); + for (T data : dataList) { + EmsBatteryData cacheData = new EmsBatteryData(); + BeanUtils.copyProperties(data, cacheData); + String cacheKey = generateCacheKey(cacheData, granularity); + + // 根据数据类型获取温度值(实际项目中可通过接口或反射统一处理) + String temperature; + if (data instanceof EmsBatteryDataHour) { + temperature = ((EmsBatteryDataHour) data).getTemperature().toString(); + } else if (data instanceof EmsBatteryDataDay) { + temperature = ((EmsBatteryDataDay) data).getTemperature().toString(); + } else if (data instanceof EmsBatteryDataMonth) { + temperature = ((EmsBatteryDataMonth) data).getTemperature().toString(); + } else { + throw new IllegalArgumentException("不支持的数据类型"); + } + cacheMap.put(cacheKey, temperature); + } + return cacheMap; + } + + // 新增定时任务,每1分钟强制刷新一次队列(防止数据长期积压) + @Scheduled(fixedRate = 60000) // 1分钟 = 60000毫秒 + protected void scheduledFlushBatch() { + if (!hourBatchQueue.isEmpty()) { + List remaining = drainQueue(hourBatchQueue); + ioExecutor.execute(() -> batchUpdateHour(remaining)); + log.info("定时任务触发,处理小时级剩余数据,数量: " + remaining.size()); + } + if (!dayBatchQueue.isEmpty()) { + List remaining = drainQueue(dayBatchQueue); + ioExecutor.execute(() -> batchUpdateDay(remaining)); + log.info("定时任务触发,处理天级剩余数据,数量: " + remaining.size()); + } + if (!monthBatchQueue.isEmpty()) { + List remaining = drainQueue(monthBatchQueue); + ioExecutor.execute(() -> batchUpdateMonth(remaining)); + log.info("定时任务触发,处理月级剩余数据,数量: " + remaining.size()); + } + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java new file mode 100644 index 0000000..a34ff2c --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java @@ -0,0 +1,273 @@ +package com.xzzn.ems.utils; + + +import com.xzzn.common.annotation.Excel; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.PointType; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsPointEnumMatch; +import com.xzzn.ems.domain.EmsPointMatch; +import com.xzzn.ems.domain.vo.DevicePointMatchInfo; +import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsPointEnumMatchMapper; +import com.xzzn.ems.mapper.EmsPointMatchMapper; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DevicePointMatchDataProcessor { + + private static final Logger log = LoggerFactory.getLogger(DevicePointMatchDataProcessor.class); + + private DevicePointMatchInfo devicePointMatchInfo; + + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsPointMatchMapper emsPointMatchMapper; + @Autowired + private EmsPointEnumMatchMapper emsPointEnumMatchMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 初始化加载设备匹配点位配置数据 + */ +// @PostConstruct +// public void init() +// { +// try { +// ClassPathResource classPathResource = new ClassPathResource("biz/configData/DevicePointMatch.json"); +// String configJson = DataUtils.getJSONFromFile(classPathResource.getInputStream()); +// devicePointMatchInfo = JSONObject.parseObject(configJson, DevicePointMatchInfo.class); +// log.info("初始化设备匹配点位配置数据成功。"+ JSON.toJSONString(devicePointMatchInfo)); +// } catch (Exception ex) { +// log.error("OcrMedicalStdHandler 设置mapping数据异常。", ex); +// } +// } + + /** + * 获取字段注解信息 + */ + public static String getFieldAnnotation(Class clazz, String filedName) + { + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) { + if (StringUtils.equals(filedName, field.getName()) && field.isAnnotationPresent(Excel.class)) + { + Excel column = field.getAnnotation(Excel.class); + return column.name(); + } + } + return null; + } + + public List getDeviceDefaultPointMatch(String siteId, String deviceCategory) { + List pointMatchList = redisCache.getCacheList(getPointMacthCacheKey(siteId, null, deviceCategory)); + if (CollectionUtils.isEmpty(pointMatchList)) { + pointMatchList = emsPointMatchMapper.getDevicePointMatchList(siteId, null, deviceCategory); + } + return pointMatchList; + } + + public List getDevicePointMatch(String siteId, String deviceId, String deviceCategory) { + return getDevicePointMatch(siteId, deviceId, deviceCategory, false); + } + + public List getDeviceAlarmPointMatch(String siteId, String deviceId, String deviceCategory) { + return getDevicePointMatch(siteId, deviceId, deviceCategory, true); + } + + private List getDevicePointMatch(String siteId, String deviceId, String deviceCategory, boolean isAlarm) { +// List pointMatchList = new ArrayList<>(); +// EmsDevicesSetting devicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); +// if (devicesSetting == null) { +// log.info("未找到设备配置信息,siteId: " + siteId + ", deviceId: "+ deviceId); +// return pointMatchList; +// } + List pointMatchList = redisCache.getCacheList(getPointMacthCacheKey(siteId, deviceId, deviceCategory)); + if (CollectionUtils.isEmpty(pointMatchList)) { + pointMatchList = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceId, deviceCategory); + } + if (CollectionUtils.isNotEmpty(pointMatchList)) { + Map> map = pointMatchList.stream().collect(Collectors.groupingBy(EmsPointMatch::getIsAlarm)); + if (isAlarm) { + pointMatchList = map.get(PointType.YES.getCode()); + } else { + pointMatchList = map.get(PointType.NO.getCode()); + } + } + + return pointMatchList; + } + + public List getPointEnumMatchList(String siteId, String deviceCategory) { + List pointEnumMatchList = redisCache.getCacheList(getPointEnumMacthCacheKey(siteId, deviceCategory)); + + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + pointEnumMatchList = emsPointEnumMatchMapper.selectList(siteId, deviceCategory, null); + } + + return pointEnumMatchList; + } + + public Map> getPointEnumMatchMap(String siteId, String deviceCategory) { + List pointEnumMatchList = getPointEnumMatchList(siteId, deviceCategory); + if (CollectionUtils.isEmpty(pointEnumMatchList)) { + return new HashMap<>(); + } + return pointEnumMatchList.stream() + .collect(Collectors.groupingBy(data -> StringUtils.toCamelCase(data.getMatchField()))); + } + + public void saveDevicePointMatch(String siteId, String deviceId, DeviceMatchTable pointMatchType, String dataDevice) { +// EmsDevicesSetting devicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); +// if (devicesSetting == null) { +// return; +// } +// String deviceCategory = devicesSetting.getDeviceCategory(); + String deviceCategory = pointMatchType.getCode(); + Map devicePintointMtachInfo = this.getDevicePointMtachInfo(pointMatchType, dataDevice); + if (devicePintointMtachInfo.isEmpty()) { + return; + } + + try { + devicePintointMtachInfo.forEach((key, value) -> { + // 查询点位是否存在 + EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceId, deviceCategory, value); + if (!Objects.isNull(dbPoint)) { + return; + } + EmsPointMatch pointMatch = new EmsPointMatch(); + pointMatch.setSiteId(siteId); + pointMatch.setDeviceCategory(deviceCategory); + pointMatch.setMatchTable(DeviceMatchTable.getMatchTableByCode(deviceCategory)); + pointMatch.setMatchField(StringUtils.toUnderScoreCase(key)); + pointMatch.setDataPoint(value); + pointMatch.setPointName(getFieldAnnotation(DeviceMatchTable.getClassByTable(pointMatch.getMatchTable()), StringUtils.toCamelCase(pointMatch.getMatchField()))); + pointMatch.setDataDevice(dataDevice); +// pointMatch.setDataPointName(""); +// pointMatch.setDataUnit(""); + pointMatch.setCreateBy("system"); + pointMatch.setUpdateBy("system"); + emsPointMatchMapper.insertEmsPointMatch(pointMatch); + }); + } catch (Exception e) { + log.info("保存设备点位匹配信息异常,siteId: " + siteId + ", deviceId: "+ deviceId + "异常信息:" + e.getMessage()); + } + } + + private Map getDevicePointMtachInfo(DeviceMatchTable pointMatchType, String dataDevice) { + switch (pointMatchType) { + case PCS: + return devicePointMatchInfo.getPcs(); + case BRANCH: + return devicePointMatchInfo.getBranch(); + case STACK: + return devicePointMatchInfo.getStack(); + case CLUSTER: + return devicePointMatchInfo.getCluster(); + case BATTERY: + return devicePointMatchInfo.getBattery(); + case AMMETER: + if (dataDevice.equals("LOAD")) { + return devicePointMatchInfo.getAmmeterLoad(); + } else { + return devicePointMatchInfo.getAmmeterMete(); + } + case COOLING: + return devicePointMatchInfo.getCooling(); + case DH: + return devicePointMatchInfo.getDh(); + case XF: + return devicePointMatchInfo.getXf(); + case BATTERY_GROUP: + return devicePointMatchInfo.getBatteryGroup(); + default: + return new HashMap<>(); + } + } + + /** + * 设置点位缓存key + * @param siteId + * @param deviceCategory + * @return 点位缓存key + */ + public static String getPointMacthCacheKey(String siteId, String deviceId, String deviceCategory) + { + if (StringUtils.isEmpty(deviceId)) { + return RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId; + } else { + return RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId + "_" + deviceId; + } + } + + /** + * 设置点位枚举缓存key + * @param siteId + * @param deviceCategory + * @return 点位枚举缓存key + */ + public static String getPointEnumMacthCacheKey(String siteId, String deviceCategory) + { + return RedisKeyConstants.POINT_ENUM_MATCH + deviceCategory + "_" + siteId; + } + + /** + * 转换字段值为配置枚举值 + */ + public void convertFieldValueToEnumMatch(String siteId, String deviceCategory, Object entity) { + + Map> pointEnumMatchMap = this.getPointEnumMatchMap(siteId, deviceCategory); + Field[] fields = entity.getClass().getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + if (pointEnumMatchMap.containsKey(fieldName)) { + // 处理匹配的字段名,并设置值 + field.setAccessible(true); // 允许访问私有字段 + try { + // 从原始数据中获取匹配值 + Object matchValue = field.get(entity); + List pointEnumMatchList = pointEnumMatchMap.get(fieldName); + if (CollectionUtils.isNotEmpty(pointEnumMatchList) && matchValue != null) { + String finalMatchValue = String.valueOf(matchValue).replace(".0", ""); + Optional enumMatch = pointEnumMatchList.stream() + .filter(data -> data.getDataEnumCode().equals(finalMatchValue)).findFirst(); + if (enumMatch.isPresent()) { + matchValue = enumMatch.get().getEnumCode(); + } + } + if (matchValue == null) { + continue; + } + + // 设置字段值 + field.set(entity, matchValue); + } catch (IllegalAccessException e) { + log.warn("convertFieldValueToEnumMatch 设置字段值时出错", e); + } + } + } + } + +} diff --git a/ems-system/src/main/resources/biz/configData/DevicePointMatch.json b/ems-system/src/main/resources/biz/configData/DevicePointMatch.json new file mode 100644 index 0000000..1ea40f8 --- /dev/null +++ b/ems-system/src/main/resources/biz/configData/DevicePointMatch.json @@ -0,0 +1,311 @@ +{ + "pcs": { + "totalActivePower": "YGGL", + "dailyAcChargeEnergy": "RCDL", + "totalReactivePower": "XTWGGL", + "dailyAcDischargeEnergy": "RFDL", + "totalApparentPower": "XTSZGL", + "totalPowerFactor": "GLYS", + "dcPower": "XTSZGL", + "totalAcChargeEnergy": "ZCDL", + "totalAcDischargeEnergy": "ZFDL", + "acChargeActivePower": "JLCCDYGGL", + "acCapacitiveReactivePower": "JLCRXWGGL", + "acDischargeActivePower": "JLCFDYGGL", + "acInductiveReactivePower": "JLCGXWGGL", + "maxCapacitivePowerCapacity": "ZDRXWGNL", + "maxInductivePowerCapacity": "ZDGXWGNL", + "maxChargePowerCapacity": "ZDKCGL", + "maxDischargePowerCapacity": "ZDKFGL", + + "sysUCurrent": "XTSCUXDL", + "sysVCurrent": "XTSCVXDL", + "sysWCurrent": "XTSCWXDL", + + "uTemperature": "DY1UXIGBTWD", + "vTemperature": "DY1VXIGBTWD", + "wTemperature": "DY1WXIGBTWD" + + }, + "branch": { + "dcPower": "ZLGL", + "dcVoltage": "ZLDY", + "dcCurrent": "ZLDL", + "gridUVoltage": "DWUXDY", + "gridVVoltage": "DWVXDY", + "gridWVoltage": "DWWXDY", + "outputUCurrent": "SCUXDL", + "outputVCurrent": "SCVXDL", + "outputWCurrent": "SCWXDL", + "apparentPower": "SZGL", + "activePower": "YGGL", + "reactivePower": "WGGL", + "powerFactor": "GLYS", + "frequency": "PL", + "internalTemp": "DY1WD", + "uIgbtTemp": "UXIGBTWD", + "vIgbtTemp": "VXIGBTWD", + "wIgbtTemp": "WXIGBTWD", + "availablePower": "KYGL", + "totalLoadRatio": "ZFZB", + "acLeakageCurrent": "JLLDL", + "insulationResistance": "JYZK" + + }, + "stack": { + "operationStatus": "DCZT", + "stackVoltage": "DCDDY", + "stackCurrent": "DCDDL", + "stackSoc": "DCDSOC", + "stackSoh": "DCDSOH", + + "maxCellVoltage": "ZGDCDY", + "maxVoltageGroupId": "ZGDCDYZH", + "maxVoltageCellId": "ZGDCDYZHDH", + "minCellVoltage": "ZDDCDY", + "minVoltageGroupId": "ZDDCDYZH", + "minVoltageCellId": "ZDDCDYZHDH", + + "maxCellTemp": "ZGDCWD", + "maxTempGroupId": "ZGDCWDZH", + "maxTempCellId": "ZGDCWDZHDH", + "minCellTemp": "ZDDCWD", + "minTempGroupId": "ZDDCWDZH", + "minTempCellId": "ZDDCWDZHDH", + + "totalChargeCapacity": "DLJCDDL", + "totalDischargeCapacity": "DLCFDDL", + "sessionChargeCapacity": "DDCLJCDDL", + "sessionDischargeCapacity": "DDCLJFDDL", + "availableChargeCapacity": "DKCDL", + "availableDischargeCapacity": "DKFDL", + + "remainingDischargeTime": "KYFDSJ", + "remainingChargeTime": "KYCDSJ", + + "maxDischargePower": "YXZDFDGL", + "maxChargePower": "YXZDCDGL", + "maxDischargeCurrent": "YXZDFDDL", + "maxChargeCurrent": "YXZDCDDL", + + "dailyDischargeCycles": "DTFDCS", + "dailyChargeCycles": "DTCDCS", + "dailyDischargeCapacity": "DTFDDL", + "dailyChargeCapacity": "DTCDDL", + + "operatingTemp": "YXWD", + "bmsStatus": "BMSDDQZT", + "bmsChargeStatus": "BMSCFDZT", + "stackInsulationResistance": "DCDJYDZ" + }, + "cluster": { + "chargeableCapacity": "KCDL", + "clusterVoltage": "ZDY", + "clusterCurrent": "ZDL", + "totalChargedCapacity": "LJCDDL", + "dischargeableCapacity": "KFDL", + "totalDischargedCapacity": "LJFDDL", + "soh": "ZSOH", + "averageTemperature": "MKWD", + "insulationResistance": "ZJYDZ", + "currentSoc": "ZSOC", + "maxAllowedChargePower": "YXCDZDGL", + "maxAllowedDischargePower": "YXFDZDGL", + "maxAllowedChargeVoltage": "YXCDZDDY", + "maxAllowedDischargeVoltage": "YXFDZDDY", + "maxAllowedChargeCurrent": "YXCDZDDL", + "maxAllowedDischargeCurrent": "YXFDZDDL", + "batteryPackVoltage": "ZDY", + "batteryPackCurrent": "ZDL", + "batteryPackTemp": "MKWD", + "batteryPackSoc": "ZSOC", + "batteryPackSoh": "ZSOH", + "batteryPackInsulationResistance": "ZJYDZ", + "avgCellVoltage": "PJDTDY", + "avgCellTemp": "PJDTWD", + "maxCellVoltage": "ZGDTDY", + "minCellVoltage": "ZDDTDY", + "maxCellTemp": "ZGDTWD", + "minCellTemp": "ZDDTWD", + "maxCellSoc": "ZGDTSOC", + "minCellSoc": "ZDDTSOC", + "maxCellSoh": "ZGDTSOH", + "minCellSoh": "ZDDTSOH", + "totalChargeEnergy": "DCLJCDDL", + "totalDischargeEnergy": "DCLJFDDL", + + "maxCellVoltageId": "ZGDTDYDYD", + "minCellVoltageId": "ZDDTDYDYD", + "maxCellTempId": "ZGDTWDDYD", + "minCellTempId": "ZDDTWDDYD", + "maxCellSocId": "ZGDTSOCDYD", + "minCellSocId": "ZDDTSOCDYD", + "maxCellSohId": "ZGDTSOHDYD", + "minCellSohId": "ZDDTSOHDYD" + + }, + "battery": { + "soc": "DTSOC", + "soh": "DTSOH", + "temperature": "DTWD", + "voltage": "DTDY" + + }, + "ammeterLoad": { + "currentCombActiveTotal": "DQZHYGZDN", + "currentCombActivePeak": "DQZHYGJDN", + "currentCombActiveHigh": "DQZHYGFDN", + "currentCombActiveFlat": "DQZHYGPDN", + "currentCombActiveValley": "DQZHYGGDN", + + "currentForwardActiveTotal": "DQZXYGZDN", + "currentForwardActivePeak": "DQZXYGJDN", + "currentForwardActiveHigh": "DQZXYGFDN", + "currentForwardActiveFlat": "DQZXYGPDN", + "currentForwardActiveValley": "DQZXYGGDN", + + "currentReverseActiveTotal": "DQFXYGZDN", + "currentReverseActivePeak": "DQFXYGJDN", + "currentReverseActiveHigh": "DQFXYGFDN", + "currentReverseActiveFlat": "DQFXYGPDN", + "currentReverseActiveValley": "DQFXYGGDN", + + "currentCombReactiveTotal": "DQZHWGZDN", + "currentCombReactivePeak": "DQZHWGJDN", + "currentCombReactiveHigh": "DQZHWGFDN", + "currentCombReactiveFlat": "DQZHWGPDN", + "currentCombReactiveValley": "DQZHWGGDN", + + "currentForwardReactiveTotal": "DQZXWGZDN", + "currentForwardReactivePeak": "DQZXWGJDN", + "currentForwardReactiveHigh": "DQZXWGFDN", + "currentForwardReactiveFlat": "DQZXWGPDN", + "currentForwardReactiveValley": "DQZXWGGDN", + + "currentReverseReactiveTotal": "DQFXWGZDN", + "currentReverseReactivePeak": "DQFXWGJDN", + "currentReverseReactiveHigh": "DQFXWGFDN", + "currentReverseReactiveFlat": "DQFXWGPDN", + "currentReverseReactiveValley": "DQFXWGGDN", + + "phaseAVoltage": "AXDY", + "phaseBVoltage": "BXDY", + "phaseCVoltage": "CXDY", + "phaseACurrent": "AXDL", + "phaseBCurrent": "BXDL", + "phaseCCurrent": "CXDL", + + "abLineVoltage": "ABXDY", + "cbLineVoltage": "CBXDY", + "acLineVoltage": "ACXDY", + + "frequency": "PL", + + "phaseAActivePower": "AXYGGL", + "phaseBActivePower": "BXYGGL", + "phaseCActivePower": "CXYGGL", + "totalActivePower": "ZYGGL", + "phaseAReactivePower": "AXWGGL", + "phaseBReactivePower": "BXWGGL", + "phaseCReactivePower": "CXWGGL", + "totalReactivePower": "ZWGGL", + "phaseAApparentPower": "AXSZGL", + "phaseBApparentPower": "BXSZGL", + "phaseCApparentPower": "CXSZGL", + "totalApparentPower": "ZSZGL", + + "phaseAPowerFactor": "AXGLYS", + "phaseBPowerFactor": "BXGLYS", + "phaseCPowerFactor": "CXGLYS", + "totalPowerFactor": "ZGLYS", + + "forwardAcMaxDemand": "ZXYGZDXL", + "reverseAcMaxDemand": "FXYGZDXL", + "dailyForwardMaxDemand": "DRZXYGZDXL" + + }, + "ammeterMete": { + "phaseAVoltage": "AXDY", + "phaseBVoltage": "BXDY", + "phaseCVoltage": "CXDY", + "phaseACurrent": "AXDL", + "phaseBCurrent": "BXDL", + "phaseCCurrent": "CXDL", + + "abLineVoltage": "ABXDY", + "cbLineVoltage": "BCXDY", + "acLineVoltage": "CAXDY", + + "frequency": "DWPL", + + "phaseAActivePower": "AXYGGL", + "phaseBActivePower": "BXYGGL", + "phaseCActivePower": "CXYGGL", + "totalActivePower": "ZYGGL", + "phaseAReactivePower": "AXWGGL", + "phaseBReactivePower": "BXWGGL", + "phaseCReactivePower": "CXWGGL", + "totalReactivePower": "ZWGGL", + + "totalApparentPower": "ZSZGL", + "totalPowerFactor": "ZGLYS", + + "secondaryAbLineVoltage": "ECABXDY", + "secondaryAPhaseCurrent": "ECAXDL", + "secondaryAPhaseVoltage": "ECAXDY", + "secondaryAPowerFactor": "ECAXGLYS", + "secondaryAApparentPower": "ECAXSZGL", + "secondaryAReactivePower": "ECAXWGGL", + "secondaryAActivePower": "ECAXYGGL", + "secondaryBcLineVoltage": "ECBCXDY", + "secondaryBPhaseCurrent": "ECBXDL", + "secondaryBPhaseVoltage": "ECBXDY", + "secondaryBPowerFactor": "ECBXGLYS", + "secondaryBApparentPower": "ECBXSZGL", + "secondaryBReactivePower": "ECBXWGGL", + "secondaryBActivePower": "ECBXYGGL", + "secondaryCaLineVoltage": "ECCAXDY", + "secondaryCPhaseCurrent": "ECCXDL", + "secondaryCPhaseVoltage": "ECCXDY", + "secondaryCPowerFactor": "ECCXGLYS", + "secondaryCApparentPower": "ECCXSZGL", + "secondaryCReactivePower": "ECCXWGGL", + "secondaryCActivePower": "ECCXYGGL", + "secondaryGridFrequency": "ECDWPL", + "secondaryReverseReactiveEnergy": "ECFXWGDN", + "secondaryNegativeActiveEnergy": "ECFXYGDN", + "secondaryTotalPowerFactor": "ECZGLYS", + "secondaryTotalApparentPower": "ECZSZFL", + "secondaryTotalReactivePower": "ECZWGGL", + "secondaryPositiveReactiveEnergy": "ECZXWGDN", + "secondaryPositiveActiveEnergy": "ECZXYGDN", + "secondaryTotalActivePower": "ECZYGGL", + + "reverseReactiveEnergyEqMinus": "FXWGDN", + "reverseActiveEnergyEpMinus": "FXYGDN", + "positiveReactiveEnergyEqPlus": "ZXWGDN", + "positiveActiveEnergyEpPlus": "ZXYGDN", + + "currentForwardActiveTotal": "ZXYGDN", + "currentReverseActiveTotal": "FXYGDN", + "currentForwardReactiveTotal": "ZXWGDN", + "currentReverseReactiveTotal": "FXWGDN" + + }, + "dh": { + "humidity": "SD3", + "temperature": "WD3" + + }, + "cooling": { + "gsTemp": "GSWD", + "hsTemp": "HSWD", + "gsPressure": "GSYL", + "hsPressure": "HSYL", + "lysTemp": "LYSWD", + "vb01Kd": "VB1KD", + "vb02Kd": "VB2KD" + + } + +} \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsAlarmMatchDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsAlarmMatchDataMapper.xml new file mode 100644 index 0000000..7f1bd02 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsAlarmMatchDataMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + select id, point, alarm_data, alarm_description, site_id, device_category, create_by, create_time, update_by, update_time, remark from ems_alarm_match_data + + + + + + + + insert into ems_alarm_match_data + + point, + alarm_data, + alarm_description, + site_id, + device_category, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{point}, + #{alarmData}, + #{alarmDescription}, + #{siteId}, + #{deviceCategory}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_alarm_match_data + + point = #{point}, + alarm_data = #{alarmData}, + alarm_description = #{alarmDescription}, + site_id = #{siteId}, + device_category = #{deviceCategory}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_alarm_match_data where id = #{id} + + + + delete from ems_alarm_match_data where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsAlarmRecordsMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsAlarmRecordsMapper.xml index 2c92e25..21972bc 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsAlarmRecordsMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsAlarmRecordsMapper.xml @@ -11,6 +11,7 @@ + @@ -19,11 +20,11 @@ - + - select id, device_type, alarm_level, alarm_content, alarm_start_time, alarm_end_time, status, create_by, create_time, update_by, update_time, remark, site_id, device_id, device_name from ems_alarm_records + select id, device_type, alarm_level, alarm_content, alarm_start_time, alarm_end_time, alarm_point, status, create_by, create_time, update_by, update_time, remark, site_id, device_id, ticket_no from ems_alarm_records @@ -54,6 +56,7 @@ alarm_content, alarm_start_time, alarm_end_time, + alarm_point, status, create_by, create_time, @@ -61,8 +64,8 @@ update_time, remark, site_id, - device_id, - device_name, + device_id, + ticket_no, #{deviceType}, @@ -70,6 +73,7 @@ #{alarmContent}, #{alarmStartTime}, #{alarmEndTime}, + #{alarmPoint}, #{status}, #{createBy}, #{createTime}, @@ -77,8 +81,8 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, - #{deviceName}, + #{deviceId}, + #{ticketNo}, @@ -90,6 +94,7 @@ alarm_content = #{alarmContent}, alarm_start_time = #{alarmStartTime}, alarm_end_time = #{alarmEndTime}, + alarm_point = #{alarmPoint}, status = #{status}, create_by = #{createBy}, create_time = #{createTime}, @@ -97,8 +102,8 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, - device_name = #{deviceName}, + device_id = #{deviceId}, + ticket_no = #{ticketNo}, where id = #{id} @@ -114,11 +119,17 @@ - + select t2.device_name as deviceName, + t.status, + t.alarm_content as alarmContent, + t.ticket_no as ticketNo, + t.id + from ems_alarm_records t INNER JOIN ems_devices_setting t2 on t.site_id = t2.site_id and t.device_id = t2.device_id + where t.site_id = #{siteId} + and t.status != 1 + and t.alarm_level in ('C','D') + order by t.alarm_start_time desc + + + + + + + + + + + + + INSERT into ems_alarm_records ( + id, + device_type, + alarm_level, + alarm_content, + alarm_start_time, + alarm_end_time, + alarm_point, + status, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + ticket_no + ) values + + ( + #{item.id}, + #{item.deviceType}, + #{item.alarmLevel}, + #{item.alarmContent}, + #{item.alarmStartTime}, + #{item.alarmEndTime}, + #{item.alarmPoint}, + #{item.status}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId}, + #{item.ticketNo} + ) + + on duplicate key update + alarm_end_time = values(alarm_end_time), + status = values(status), + device_id = values(device_id) + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml new file mode 100644 index 0000000..b8098e1 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml @@ -0,0 +1,1164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_update_time, current_comb_active_total, current_comb_active_peak, current_comb_active_high, current_comb_active_flat, current_comb_active_valley, current_forward_active_total, current_forward_active_peak, current_forward_active_high, current_forward_active_flat, current_forward_active_valley, current_reverse_active_total, current_reverse_active_peak, current_reverse_active_high, current_reverse_active_flat, current_reverse_active_valley, current_comb_reactive_total, current_comb_reactive_peak, current_comb_reactive_high, current_comb_reactive_flat, current_comb_reactive_valley, current_forward_reactive_total, current_forward_reactive_peak, current_forward_reactive_high, current_forward_reactive_flat, current_forward_reactive_valley, current_reverse_reactive_total, current_reverse_reactive_peak, current_reverse_reactive_high, current_reverse_reactive_flat, current_reverse_reactive_valley, phase_a_voltage, phase_b_voltage, phase_c_voltage, phase_a_current, phase_b_current, phase_c_current, frequency, ab_line_voltage, cb_line_voltage, ac_line_voltage, forward_ac_max_demand, reverse_ac_max_demand, phase_a_active_power, phase_b_active_power, phase_c_active_power, total_active_power, phase_a_reactive_power, phase_b_reactive_power, phase_c_reactive_power, total_reactive_power, phase_a_apparent_power, phase_b_apparent_power, phase_c_apparent_power, total_apparent_power, phase_a_power_factor, phase_b_power_factor, phase_c_power_factor, total_power_factor, daily_forward_max_demand, site_id, device_id, create_by, create_time, update_by, update_time, remark, secondary_ab_line_voltage, secondary_a_phase_current, secondary_a_phase_voltage, secondary_a_power_factor, secondary_a_apparent_power, secondary_a_reactive_power, secondary_a_active_power, secondary_bc_line_voltage, secondary_b_phase_current, secondary_b_phase_voltage, secondary_b_power_factor, secondary_b_apparent_power, secondary_b_reactive_power, secondary_b_active_power, secondary_ca_line_voltage, secondary_c_phase_current, secondary_c_phase_voltage, secondary_c_power_factor, secondary_c_apparent_power, secondary_c_reactive_power, secondary_c_active_power, secondary_grid_frequency, secondary_reverse_reactive_energy, secondary_negative_active_energy, secondary_total_power_factor, secondary_total_apparent_power, secondary_total_reactive_power, secondary_positive_reactive_energy, secondary_positive_active_energy, secondary_total_active_power, reverse_reactive_energy_eq_minus, reverse_active_energy_ep_minus, positive_reactive_energy_eq_plus, positive_active_energy_ep_plus, current_percent, voltage_percent, avg_current, total_forward_active_two, total_peak_forward_active, total_high_forward_active, total_flat_forward_active, total_valley_forward_active, total_reverse_active_two, total_peak_reverse_active, total_high_reverse_active, total_flat_reverse_active, total_valley_reverse_active, disconnect_detection_indication, rated_primary_current_value, switch_input_output_status, alarm_status, current_total_voltage_percent, voltage_content_percent, voltage_ac_percent, current_total_current_percent, current_content_percent, current_ac_percent, current_total_power_percent, power_content_percent, power_ac_percent, data_setting_year_month, data_setting_day_hour, data_setting_minutes_seconds, current_rate, version_number, voltage, current, power, internal_temp, total_forward_active_one, total_reverse_active_one, forward_reactive_max_demand, reverse_reactive_max_demand, a_forward_active_energy, b_forward_active_energy, c_forward_active_energy, dido_status, running_status, zero_seq_current, voltage_unbalance_degree, current_unbalance_degree, daily_reverse_ac_max_demand, daily_forward_reac_max_demand, daily_reverse_reac_max_demand, pre_day_forward_ac_max_demand, pre_day_reverse_ac_max_demand, pre_day_forward_reac_max_demand, pre_day_reverse_reac_max_demand, pre_2d_forward_ac_max_demand, pre_2d_reverse_ac_max_demand, pre_2d_forward_reac_max_demand, pre_2d_reverse_reac_max_demand, current_forward_ac_demand, current_reverse_ac_demand, current_forward_reac_demand, current_reverse_reac_demand from ems_ammeter_data + + + + + + + + insert into ems_ammeter_data + + data_update_time, + current_comb_active_total, + current_comb_active_peak, + current_comb_active_high, + current_comb_active_flat, + current_comb_active_valley, + current_forward_active_total, + current_forward_active_peak, + current_forward_active_high, + current_forward_active_flat, + current_forward_active_valley, + current_reverse_active_total, + current_reverse_active_peak, + current_reverse_active_high, + current_reverse_active_flat, + current_reverse_active_valley, + current_comb_reactive_total, + current_comb_reactive_peak, + current_comb_reactive_high, + current_comb_reactive_flat, + current_comb_reactive_valley, + current_forward_reactive_total, + current_forward_reactive_peak, + current_forward_reactive_high, + current_forward_reactive_flat, + current_forward_reactive_valley, + current_reverse_reactive_total, + current_reverse_reactive_peak, + current_reverse_reactive_high, + current_reverse_reactive_flat, + current_reverse_reactive_valley, + phase_a_voltage, + phase_b_voltage, + phase_c_voltage, + phase_a_current, + phase_b_current, + phase_c_current, + frequency, + ab_line_voltage, + cb_line_voltage, + ac_line_voltage, + forward_ac_max_demand, + reverse_ac_max_demand, + phase_a_active_power, + phase_b_active_power, + phase_c_active_power, + total_active_power, + phase_a_reactive_power, + phase_b_reactive_power, + phase_c_reactive_power, + total_reactive_power, + phase_a_apparent_power, + phase_b_apparent_power, + phase_c_apparent_power, + total_apparent_power, + phase_a_power_factor, + phase_b_power_factor, + phase_c_power_factor, + total_power_factor, + daily_forward_max_demand, + site_id, + device_id, + create_by, + create_time, + update_by, + update_time, + remark, + secondary_ab_line_voltage, + secondary_a_phase_current, + secondary_a_phase_voltage, + secondary_a_power_factor, + secondary_a_apparent_power, + secondary_a_reactive_power, + secondary_a_active_power, + secondary_bc_line_voltage, + secondary_b_phase_current, + secondary_b_phase_voltage, + secondary_b_power_factor, + secondary_b_apparent_power, + secondary_b_reactive_power, + secondary_b_active_power, + secondary_ca_line_voltage, + secondary_c_phase_current, + secondary_c_phase_voltage, + secondary_c_power_factor, + secondary_c_apparent_power, + secondary_c_reactive_power, + secondary_c_active_power, + secondary_grid_frequency, + secondary_reverse_reactive_energy, + secondary_negative_active_energy, + secondary_total_power_factor, + secondary_total_apparent_power, + secondary_total_reactive_power, + secondary_positive_reactive_energy, + secondary_positive_active_energy, + secondary_total_active_power, + reverse_reactive_energy_eq_minus, + reverse_active_energy_ep_minus, + positive_reactive_energy_eq_plus, + positive_active_energy_ep_plus, + current_percent, + voltage_percent, + avg_current, + total_forward_active_two, + total_peak_forward_active, + total_high_forward_active, + total_flat_forward_active, + total_valley_forward_active, + total_reverse_active_two, + total_peak_reverse_active, + total_high_reverse_active, + total_flat_reverse_active, + total_valley_reverse_active, + disconnect_detection_indication, + rated_primary_current_value, + switch_input_output_status, + alarm_status, + current_total_voltage_percent, + voltage_content_percent, + voltage_ac_percent, + current_total_current_percent, + current_content_percent, + current_ac_percent, + current_total_power_percent, + power_content_percent, + power_ac_percent, + data_setting_year_month, + data_setting_day_hour, + data_setting_minutes_seconds, + current_rate, + version_number, + voltage, + current, + power, + internal_temp, + total_forward_active_one, + total_reverse_active_one, + forward_reactive_max_demand, + reverse_reactive_max_demand, + a_forward_active_energy, + b_forward_active_energy, + c_forward_active_energy, + dido_status, + running_status, + zero_seq_current, + voltage_unbalance_degree, + current_unbalance_degree, + daily_reverse_ac_max_demand, + daily_forward_reac_max_demand, + daily_reverse_reac_max_demand, + pre_day_forward_ac_max_demand, + pre_day_reverse_ac_max_demand, + pre_day_forward_reac_max_demand, + pre_day_reverse_reac_max_demand, + pre_2d_forward_ac_max_demand, + pre_2d_reverse_ac_max_demand, + pre_2d_forward_reac_max_demand, + pre_2d_reverse_reac_max_demand, + current_forward_ac_demand, + current_reverse_ac_demand, + current_forward_reac_demand, + current_reverse_reac_demand, + + + #{dataUpdateTime}, + #{currentCombActiveTotal}, + #{currentCombActivePeak}, + #{currentCombActiveHigh}, + #{currentCombActiveFlat}, + #{currentCombActiveValley}, + #{currentForwardActiveTotal}, + #{currentForwardActivePeak}, + #{currentForwardActiveHigh}, + #{currentForwardActiveFlat}, + #{currentForwardActiveValley}, + #{currentReverseActiveTotal}, + #{currentReverseActivePeak}, + #{currentReverseActiveHigh}, + #{currentReverseActiveFlat}, + #{currentReverseActiveValley}, + #{currentCombReactiveTotal}, + #{currentCombReactivePeak}, + #{currentCombReactiveHigh}, + #{currentCombReactiveFlat}, + #{currentCombReactiveValley}, + #{currentForwardReactiveTotal}, + #{currentForwardReactivePeak}, + #{currentForwardReactiveHigh}, + #{currentForwardReactiveFlat}, + #{currentForwardReactiveValley}, + #{currentReverseReactiveTotal}, + #{currentReverseReactivePeak}, + #{currentReverseReactiveHigh}, + #{currentReverseReactiveFlat}, + #{currentReverseReactiveValley}, + #{phaseAVoltage}, + #{phaseBVoltage}, + #{phaseCVoltage}, + #{phaseACurrent}, + #{phaseBCurrent}, + #{phaseCCurrent}, + #{frequency}, + #{abLineVoltage}, + #{cbLineVoltage}, + #{acLineVoltage}, + #{forwardAcMaxDemand}, + #{reverseAcMaxDemand}, + #{phaseAActivePower}, + #{phaseBActivePower}, + #{phaseCActivePower}, + #{totalActivePower}, + #{phaseAReactivePower}, + #{phaseBReactivePower}, + #{phaseCReactivePower}, + #{totalReactivePower}, + #{phaseAApparentPower}, + #{phaseBApparentPower}, + #{phaseCApparentPower}, + #{totalApparentPower}, + #{phaseAPowerFactor}, + #{phaseBPowerFactor}, + #{phaseCPowerFactor}, + #{totalPowerFactor}, + #{dailyForwardMaxDemand}, + #{siteId}, + #{deviceId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{secondaryAbLineVoltage}, + #{secondaryAPhaseCurrent}, + #{secondaryAPhaseVoltage}, + #{secondaryAPowerFactor}, + #{secondaryAApparentPower}, + #{secondaryAReactivePower}, + #{secondaryAActivePower}, + #{secondaryBcLineVoltage}, + #{secondaryBPhaseCurrent}, + #{secondaryBPhaseVoltage}, + #{secondaryBPowerFactor}, + #{secondaryBApparentPower}, + #{secondaryBReactivePower}, + #{secondaryBActivePower}, + #{secondaryCaLineVoltage}, + #{secondaryCPhaseCurrent}, + #{secondaryCPhaseVoltage}, + #{secondaryCPowerFactor}, + #{secondaryCApparentPower}, + #{secondaryCReactivePower}, + #{secondaryCActivePower}, + #{secondaryGridFrequency}, + #{secondaryReverseReactiveEnergy}, + #{secondaryNegativeActiveEnergy}, + #{secondaryTotalPowerFactor}, + #{secondaryTotalApparentPower}, + #{secondaryTotalReactivePower}, + #{secondaryPositiveReactiveEnergy}, + #{secondaryPositiveActiveEnergy}, + #{secondaryTotalActivePower}, + #{reverseReactiveEnergyEqMinus}, + #{reverseActiveEnergyEpMinus}, + #{positiveReactiveEnergyEqPlus}, + #{positiveActiveEnergyEpPlus}, + #{currentPercent}, + #{voltagePercent}, + #{avgCurrent}, + #{totalForwardActiveTwo}, + #{totalPeakForwardActive}, + #{totalHighForwardActive}, + #{totalFlatForwardActive}, + #{totalValleyForwardActive}, + #{totalReverseActiveTwo}, + #{totalPeakReverseActive}, + #{totalHighReverseActive}, + #{totalFlatReverseActive}, + #{totalValleyReverseActive}, + #{disconnectDetectionIndication}, + #{ratedPrimaryCurrentValue}, + #{switchInputOutputStatus}, + #{alarmStatus}, + #{currentTotalVoltagePercent}, + #{voltageContentPercent}, + #{voltageAcPercent}, + #{currentTotalCurrentPercent}, + #{currentContentPercent}, + #{currentAcPercent}, + #{currentTotalPowerPercent}, + #{powerContentPercent}, + #{powerAcPercent}, + #{dataSettingYearMonth}, + #{dataSettingDayHour}, + #{dataSettingMinutesSeconds}, + #{currentRate}, + #{versionNumber}, + #{voltage}, + #{current}, + #{power}, + #{internalTemp}, + #{totalForwardActiveOne}, + #{totalReverseActiveOne}, + #{forwardReactiveMaxDemand}, + #{reverseReactiveMaxDemand}, + #{aForwardActiveEnergy}, + #{bForwardActiveEnergy}, + #{cForwardActiveEnergy}, + #{didoStatus}, + #{runningStatus}, + #{zeroSeqCurrent}, + #{voltageUnbalanceDegree}, + #{currentUnbalanceDegree}, + #{dailyReverseAcMaxDemand}, + #{dailyForwardReacMaxDemand}, + #{dailyReverseReacMaxDemand}, + #{preDayForwardAcMaxDemand}, + #{preDayReverseAcMaxDemand}, + #{preDayForwardReacMaxDemand}, + #{preDayReverseReacMaxDemand}, + #{pre2dForwardAcMaxDemand}, + #{pre2dReverseAcMaxDemand}, + #{pre2dForwardReacMaxDemand}, + #{pre2dReverseReacMaxDemand}, + #{currentForwardAcDemand}, + #{currentReverseAcDemand}, + #{currentForwardReacDemand}, + #{currentReverseReacDemand}, + + + + + update ems_ammeter_data + + data_update_time = #{dataUpdateTime}, + current_comb_active_total = #{currentCombActiveTotal}, + current_comb_active_peak = #{currentCombActivePeak}, + current_comb_active_high = #{currentCombActiveHigh}, + current_comb_active_flat = #{currentCombActiveFlat}, + current_comb_active_valley = #{currentCombActiveValley}, + current_forward_active_total = #{currentForwardActiveTotal}, + current_forward_active_peak = #{currentForwardActivePeak}, + current_forward_active_high = #{currentForwardActiveHigh}, + current_forward_active_flat = #{currentForwardActiveFlat}, + current_forward_active_valley = #{currentForwardActiveValley}, + current_reverse_active_total = #{currentReverseActiveTotal}, + current_reverse_active_peak = #{currentReverseActivePeak}, + current_reverse_active_high = #{currentReverseActiveHigh}, + current_reverse_active_flat = #{currentReverseActiveFlat}, + current_reverse_active_valley = #{currentReverseActiveValley}, + current_comb_reactive_total = #{currentCombReactiveTotal}, + current_comb_reactive_peak = #{currentCombReactivePeak}, + current_comb_reactive_high = #{currentCombReactiveHigh}, + current_comb_reactive_flat = #{currentCombReactiveFlat}, + current_comb_reactive_valley = #{currentCombReactiveValley}, + current_forward_reactive_total = #{currentForwardReactiveTotal}, + current_forward_reactive_peak = #{currentForwardReactivePeak}, + current_forward_reactive_high = #{currentForwardReactiveHigh}, + current_forward_reactive_flat = #{currentForwardReactiveFlat}, + current_forward_reactive_valley = #{currentForwardReactiveValley}, + current_reverse_reactive_total = #{currentReverseReactiveTotal}, + current_reverse_reactive_peak = #{currentReverseReactivePeak}, + current_reverse_reactive_high = #{currentReverseReactiveHigh}, + current_reverse_reactive_flat = #{currentReverseReactiveFlat}, + current_reverse_reactive_valley = #{currentReverseReactiveValley}, + phase_a_voltage = #{phaseAVoltage}, + phase_b_voltage = #{phaseBVoltage}, + phase_c_voltage = #{phaseCVoltage}, + phase_a_current = #{phaseACurrent}, + phase_b_current = #{phaseBCurrent}, + phase_c_current = #{phaseCCurrent}, + frequency = #{frequency}, + ab_line_voltage = #{abLineVoltage}, + cb_line_voltage = #{cbLineVoltage}, + ac_line_voltage = #{acLineVoltage}, + forward_ac_max_demand = #{forwardAcMaxDemand}, + reverse_ac_max_demand = #{reverseAcMaxDemand}, + phase_a_active_power = #{phaseAActivePower}, + phase_b_active_power = #{phaseBActivePower}, + phase_c_active_power = #{phaseCActivePower}, + total_active_power = #{totalActivePower}, + phase_a_reactive_power = #{phaseAReactivePower}, + phase_b_reactive_power = #{phaseBReactivePower}, + phase_c_reactive_power = #{phaseCReactivePower}, + total_reactive_power = #{totalReactivePower}, + phase_a_apparent_power = #{phaseAApparentPower}, + phase_b_apparent_power = #{phaseBApparentPower}, + phase_c_apparent_power = #{phaseCApparentPower}, + total_apparent_power = #{totalApparentPower}, + phase_a_power_factor = #{phaseAPowerFactor}, + phase_b_power_factor = #{phaseBPowerFactor}, + phase_c_power_factor = #{phaseCPowerFactor}, + total_power_factor = #{totalPowerFactor}, + daily_forward_max_demand = #{dailyForwardMaxDemand}, + site_id = #{siteId}, + device_id = #{deviceId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + secondary_ab_line_voltage = #{secondaryAbLineVoltage}, + secondary_a_phase_current = #{secondaryAPhaseCurrent}, + secondary_a_phase_voltage = #{secondaryAPhaseVoltage}, + secondary_a_power_factor = #{secondaryAPowerFactor}, + secondary_a_apparent_power = #{secondaryAApparentPower}, + secondary_a_reactive_power = #{secondaryAReactivePower}, + secondary_a_active_power = #{secondaryAActivePower}, + secondary_bc_line_voltage = #{secondaryBcLineVoltage}, + secondary_b_phase_current = #{secondaryBPhaseCurrent}, + secondary_b_phase_voltage = #{secondaryBPhaseVoltage}, + secondary_b_power_factor = #{secondaryBPowerFactor}, + secondary_b_apparent_power = #{secondaryBApparentPower}, + secondary_b_reactive_power = #{secondaryBReactivePower}, + secondary_b_active_power = #{secondaryBActivePower}, + secondary_ca_line_voltage = #{secondaryCaLineVoltage}, + secondary_c_phase_current = #{secondaryCPhaseCurrent}, + secondary_c_phase_voltage = #{secondaryCPhaseVoltage}, + secondary_c_power_factor = #{secondaryCPowerFactor}, + secondary_c_apparent_power = #{secondaryCApparentPower}, + secondary_c_reactive_power = #{secondaryCReactivePower}, + secondary_c_active_power = #{secondaryCActivePower}, + secondary_grid_frequency = #{secondaryGridFrequency}, + secondary_reverse_reactive_energy = #{secondaryReverseReactiveEnergy}, + secondary_negative_active_energy = #{secondaryNegativeActiveEnergy}, + secondary_total_power_factor = #{secondaryTotalPowerFactor}, + secondary_total_apparent_power = #{secondaryTotalApparentPower}, + secondary_total_reactive_power = #{secondaryTotalReactivePower}, + secondary_positive_reactive_energy = #{secondaryPositiveReactiveEnergy}, + secondary_positive_active_energy = #{secondaryPositiveActiveEnergy}, + secondary_total_active_power = #{secondaryTotalActivePower}, + reverse_reactive_energy_eq_minus = #{reverseReactiveEnergyEqMinus}, + reverse_active_energy_ep_minus = #{reverseActiveEnergyEpMinus}, + positive_reactive_energy_eq_plus = #{positiveReactiveEnergyEqPlus}, + positive_active_energy_ep_plus = #{positiveActiveEnergyEpPlus}, + current_percent = #{currentPercent}, + voltage_percent = #{voltagePercent}, + avg_current = #{avgCurrent}, + total_forward_active_two = #{totalForwardActiveTwo}, + total_peak_forward_active = #{totalPeakForwardActive}, + total_high_forward_active = #{totalHighForwardActive}, + total_flat_forward_active = #{totalFlatForwardActive}, + total_valley_forward_active = #{totalValleyForwardActive}, + total_reverse_active_two = #{totalReverseActiveTwo}, + total_peak_reverse_active = #{totalPeakReverseActive}, + total_high_reverse_active = #{totalHighReverseActive}, + total_flat_reverse_active = #{totalFlatReverseActive}, + total_valley_reverse_active = #{totalValleyReverseActive}, + disconnect_detection_indication = #{disconnectDetectionIndication}, + rated_primary_current_value = #{ratedPrimaryCurrentValue}, + switch_input_output_status = #{switchInputOutputStatus}, + alarm_status = #{alarmStatus}, + current_total_voltage_percent = #{currentTotalVoltagePercent}, + voltage_content_percent = #{voltageContentPercent}, + voltage_ac_percent = #{voltageAcPercent}, + current_total_current_percent = #{currentTotalCurrentPercent}, + current_content_percent = #{currentContentPercent}, + current_ac_percent = #{currentAcPercent}, + current_total_power_percent = #{currentTotalPowerPercent}, + power_content_percent = #{powerContentPercent}, + power_ac_percent = #{powerAcPercent}, + data_setting_year_month = #{dataSettingYearMonth}, + data_setting_day_hour = #{dataSettingDayHour}, + data_setting_minutes_seconds = #{dataSettingMinutesSeconds}, + current_rate = #{currentRate}, + version_number = #{versionNumber}, + voltage = #{voltage}, + current = #{current}, + power = #{power}, + internal_temp = #{internalTemp}, + total_forward_active_one = #{totalForwardActiveOne}, + total_reverse_active_one = #{totalReverseActiveOne}, + forward_reactive_max_demand = #{forwardReactiveMaxDemand}, + reverse_reactive_max_demand = #{reverseReactiveMaxDemand}, + a_forward_active_energy = #{aForwardActiveEnergy}, + b_forward_active_energy = #{bForwardActiveEnergy}, + c_forward_active_energy = #{cForwardActiveEnergy}, + dido_status = #{didoStatus}, + running_status = #{runningStatus}, + zero_seq_current = #{zeroSeqCurrent}, + voltage_unbalance_degree = #{voltageUnbalanceDegree}, + current_unbalance_degree = #{currentUnbalanceDegree}, + daily_reverse_ac_max_demand = #{dailyReverseAcMaxDemand}, + daily_forward_reac_max_demand = #{dailyForwardReacMaxDemand}, + daily_reverse_reac_max_demand = #{dailyReverseReacMaxDemand}, + pre_day_forward_ac_max_demand = #{preDayForwardAcMaxDemand}, + pre_day_reverse_ac_max_demand = #{preDayReverseAcMaxDemand}, + pre_day_forward_reac_max_demand = #{preDayForwardReacMaxDemand}, + pre_day_reverse_reac_max_demand = #{preDayReverseReacMaxDemand}, + pre_2d_forward_ac_max_demand = #{pre2dForwardAcMaxDemand}, + pre_2d_reverse_ac_max_demand = #{pre2dReverseAcMaxDemand}, + pre_2d_forward_reac_max_demand = #{pre2dForwardReacMaxDemand}, + pre_2d_reverse_reac_max_demand = #{pre2dReverseReacMaxDemand}, + current_forward_ac_demand = #{currentForwardAcDemand}, + current_reverse_ac_demand = #{currentReverseAcDemand}, + current_forward_reac_demand = #{currentForwardReacDemand}, + current_reverse_reac_demand = #{currentReverseReacDemand}, + + where id = #{id} + + + + delete from ems_ammeter_data where id = #{id} + + + + delete from ems_ammeter_data where id in + + #{id} + + + + + + + + + + + + + + + + + MAX(CASE WHEN t.device_id = 'METE' THEN t.total_active_power END) AS storagePower, + MAX(CASE WHEN t.device_id = 'LOAD' THEN t.total_active_power END) AS gridPower, + MAX(CASE WHEN t.device_id = 'METEGF' THEN t.total_active_power END) AS pvPower + + + + WHERE p.device_id in ('METE','LOAD','METEGF') + and p.site_id = #{siteId} + + AND p.data_update_time >= #{startDate} + + + AND p.data_update_time < #{endDate} + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryClusterMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryClusterMapper.xml index 8b061cf..7dc50c5 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsBatteryClusterMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryClusterMapper.xml @@ -6,6 +6,7 @@ + @@ -26,15 +27,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select id, work_status, pcs_communication_status, ems_communication_status, cluster_voltage, chargeable_capacity, total_charged_capacity, cluster_current, dischargeable_capacity, total_discharged_capacity, soh, average_temperature, insulation_resistance, current_soc, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_battery_cluster + select id, work_status, pcs_communication_status, ems_communication_status, cluster_voltage, chargeable_capacity, total_charged_capacity, cluster_current, dischargeable_capacity, total_discharged_capacity, soh, average_temperature, insulation_resistance, current_soc, create_by, create_time, update_by, update_time, remark, site_id, device_id, stack_device_id, max_allowed_charge_power, max_allowed_discharge_power, max_allowed_charge_voltage, max_allowed_discharge_voltage, max_allowed_charge_current, max_allowed_discharge_current, battery_pack_voltage, battery_pack_current, battery_pack_temp, battery_pack_soc, battery_pack_soh, battery_pack_insulation_resistance, avg_cell_voltage, avg_cell_temp, max_cell_voltage, max_cell_voltage_id, min_cell_voltage, min_cell_voltage_id, max_cell_temp, max_cell_temp_id, min_cell_temp, min_cell_temp_id, max_cell_soc, max_cell_soc_id, min_cell_soc, min_cell_soc_id, max_cell_soh, max_cell_soh_id, min_cell_soh, min_cell_soh_id, total_charge_energy, total_discharge_energy from ems_battery_cluster @@ -61,6 +129,7 @@ insert into ems_battery_cluster + data_update_time, work_status, pcs_communication_status, ems_communication_status, @@ -80,9 +149,43 @@ update_time, remark, site_id, - device_id, + device_id, + stack_device_id, + max_allowed_charge_power, + max_allowed_discharge_power, + max_allowed_charge_voltage, + max_allowed_discharge_voltage, + max_allowed_charge_current, + max_allowed_discharge_current, + battery_pack_voltage, + battery_pack_current, + battery_pack_temp, + battery_pack_soc, + battery_pack_soh, + battery_pack_insulation_resistance, + avg_cell_voltage, + avg_cell_temp, + max_cell_voltage, + max_cell_voltage_id, + min_cell_voltage, + min_cell_voltage_id, + max_cell_temp, + max_cell_temp_id, + min_cell_temp, + min_cell_temp_id, + max_cell_soc, + max_cell_soc_id, + min_cell_soc, + min_cell_soc_id, + max_cell_soh, + max_cell_soh_id, + min_cell_soh, + min_cell_soh_id, + total_charge_energy, + total_discharge_energy, + #{dataUpdateTime}, #{workStatus}, #{pcsCommunicationStatus}, #{emsCommunicationStatus}, @@ -102,13 +205,47 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, + #{stackDeviceId}, + #{maxAllowedChargePower}, + #{maxAllowedDischargePower}, + #{maxAllowedChargeVoltage}, + #{maxAllowedDischargeVoltage}, + #{maxAllowedChargeCurrent}, + #{maxAllowedDischargeCurrent}, + #{batteryPackVoltage}, + #{batteryPackCurrent}, + #{batteryPackTemp}, + #{batteryPackSoc}, + #{batteryPackSoh}, + #{batteryPackInsulationResistance}, + #{avgCellVoltage}, + #{avgCellTemp}, + #{maxCellVoltage}, + #{maxCellVoltageId}, + #{minCellVoltage}, + #{minCellVoltageId}, + #{maxCellTemp}, + #{maxCellTempId}, + #{minCellTemp}, + #{minCellTempId}, + #{maxCellSoc}, + #{maxCellSocId}, + #{minCellSoc}, + #{minCellSocId}, + #{maxCellSoh}, + #{maxCellSohId}, + #{minCellSoh}, + #{minCellSohId}, + #{totalChargeEnergy}, + #{totalDischargeEnergy}, update ems_battery_cluster + data_update_time = #{dataUpdateTime}, work_status = #{workStatus}, pcs_communication_status = #{pcsCommunicationStatus}, ems_communication_status = #{emsCommunicationStatus}, @@ -128,7 +265,40 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, + stack_device_id = #{stackDeviceId}, + max_allowed_charge_power = #{maxAllowedChargePower}, + max_allowed_discharge_power = #{maxAllowedDischargePower}, + max_allowed_charge_voltage = #{maxAllowedChargeVoltage}, + max_allowed_discharge_voltage = #{maxAllowedDischargeVoltage}, + max_allowed_charge_current = #{maxAllowedChargeCurrent}, + max_allowed_discharge_current = #{maxAllowedDischargeCurrent}, + battery_pack_voltage = #{batteryPackVoltage}, + battery_pack_current = #{batteryPackCurrent}, + battery_pack_temp = #{batteryPackTemp}, + battery_pack_soc = #{batteryPackSoc}, + battery_pack_soh = #{batteryPackSoh}, + battery_pack_insulation_resistance = #{batteryPackInsulationResistance}, + avg_cell_voltage = #{avgCellVoltage}, + avg_cell_temp = #{avgCellTemp}, + max_cell_voltage = #{maxCellVoltage}, + max_cell_voltage_id = #{maxCellVoltageId}, + min_cell_voltage = #{minCellVoltage}, + min_cell_voltage_id = #{minCellVoltageId}, + max_cell_temp = #{maxCellTemp}, + max_cell_temp_id = #{maxCellTempId}, + min_cell_temp = #{minCellTemp}, + min_cell_temp_id = #{minCellTempId}, + max_cell_soc = #{maxCellSoc}, + max_cell_soc_id = #{maxCellSocId}, + min_cell_soc = #{minCellSoc}, + min_cell_soc_id = #{minCellSocId}, + max_cell_soh = #{maxCellSoh}, + max_cell_soh_id = #{maxCellSohId}, + min_cell_soh = #{minCellSoh}, + min_cell_soh_id = #{minCellSohId}, + total_charge_energy = #{totalChargeEnergy}, + total_discharge_energy = #{totalDischargeEnergy}, where id = #{id} @@ -144,17 +314,138 @@ - + SELECT t.cluster_voltage as clusterVoltage,t.cluster_current as clusterCurrent, + t.current_soc as currentSoc,t.site_id as siteId,t.device_id as clusterId, + t.max_cell_voltage as maxVoltage,t.min_cell_voltage as minVoltage, + t.max_cell_temp as maxTemperature,t.min_cell_temp as minTemperature + FROM ems_battery_cluster t + INNER JOIN ( + SELECT p.site_id, p.device_id, MAX(p.update_time) AS max_update_time + FROM ems_battery_cluster p + WHERE p.site_id = #{siteId} and p.stack_device_id = #{stackDeviceId} + GROUP BY p.site_id,p.device_id + ) latest on t.device_id = latest.device_id and t.update_time = latest.max_update_time + where t.site_id = #{siteId} and t.stack_device_id = #{stackDeviceId} + t.max_cell_temp,t.min_cell_temp + + + + + + + + WHERE p.site_id = #{siteId} + + AND p.update_time >= #{startDate} + + + AND p.update_time < #{endDate} + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDailyLatestMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDailyLatestMapper.xml new file mode 100644 index 0000000..e9da985 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDailyLatestMapper.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, date_day, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id from ems_battery_data_daily_latest + + + + + + + + insert into ems_battery_data_daily_latest + + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + date_day, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + + + #{batteryPack}, + #{batteryCluster}, + #{batteryCellId}, + #{voltage}, + #{temperature}, + #{soc}, + #{soh}, + #{dateDay}, + #{dataTimestamp}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + #{clusterDeviceId}, + + + + + update ems_battery_data_daily_latest + + battery_cluster = #{batteryCluster}, + battery_cell_id = #{batteryCellId}, + voltage = #{voltage}, + temperature = #{temperature}, + soc = #{soc}, + soh = #{soh}, + date_day = #{dateDay}, + data_timestamp = #{dataTimestamp}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + + where battery_pack = #{batteryPack} + + + + delete from ems_battery_data_daily_latest where battery_pack = #{batteryPack} + + + + delete from ems_battery_data_daily_latest where battery_pack in + + #{batteryPack} + + + + + INSERT INTO ems_battery_data_daily_latest ( + battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, date_day, + data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id + ) VALUES + + ( + #{item.batteryPack}, + #{item.batteryCluster}, + #{item.batteryCellId}, + #{item.voltage}, + #{item.temperature}, + #{item.soc}, + #{item.soh}, + #{item.dateDay}, + #{item.dataTimestamp}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId}, + #{item.clusterDeviceId} + ) + + ON DUPLICATE KEY UPDATE + voltage = VALUES(voltage), + temperature = VALUES(temperature), + soc = VALUES(soc), + soh = VALUES(soh), + data_timestamp = VALUES(data_timestamp), + update_time = NOW(), + remark = VALUES(remark) + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDayMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDayMapper.xml new file mode 100644 index 0000000..a54c203 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataDayMapper.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id, inter_resistance, current, day_time from ems_battery_data_day + + + + + + + + insert into ems_battery_data_day + + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + current, + day_time, + + + #{batteryPack}, + #{batteryCluster}, + #{batteryCellId}, + #{voltage}, + #{temperature}, + #{soc}, + #{soh}, + #{dataTimestamp}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + #{clusterDeviceId}, + #{interResistance}, + #{current}, + #{dayTime}, + + + + + update ems_battery_data_day + + battery_pack = #{batteryPack}, + battery_cluster = #{batteryCluster}, + battery_cell_id = #{batteryCellId}, + voltage = #{voltage}, + temperature = #{temperature}, + soc = #{soc}, + soh = #{soh}, + data_timestamp = #{dataTimestamp}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + inter_resistance = #{interResistance}, + current = #{current}, + day_time = #{dayTime}, + + where id = #{id} + + + + delete from ems_battery_data_day where id = #{id} + + + + delete from ems_battery_data_day where id in + + #{id} + + + + + + + + INSERT INTO ems_battery_data_day ( + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + current, + day_time + ) VALUES + + ( + #{item.batteryPack}, + #{item.batteryCluster}, + #{item.batteryCellId}, + #{item.voltage}, + #{item.temperature}, + #{item.soc}, + #{item.soh}, + #{item.dataTimestamp}, + #{item.createBy}, + #{item.createTime}, #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId}, + #{item.clusterDeviceId}, + #{item.interResistance}, + #{item.current}, + #{item.dayTime} + ) + + ON DUPLICATE KEY UPDATE + -- 仅当新温度高于现有温度时,才更新温度和相关字段 + update_time = IF(VALUES(temperature) > temperature, NOW(), update_time), + data_timestamp = IF(VALUES(temperature) > temperature, VALUES(data_timestamp), data_timestamp), + voltage = IF(VALUES(temperature) > temperature, VALUES(voltage), voltage), + soc = IF(VALUES(temperature) > temperature, VALUES(soc), soc), + soh = IF(VALUES(temperature) > temperature, VALUES(soh), soh), + inter_resistance = IF(VALUES(temperature) > temperature, VALUES(inter_resistance), inter_resistance), + current = IF(VALUES(temperature) > temperature, VALUES(current), current), + update_by = IF(VALUES(temperature) > temperature, VALUES(update_by), update_by), + temperature = IF(VALUES(temperature) > temperature, VALUES(temperature), temperature) + + + + + diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataHourMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataHourMapper.xml new file mode 100644 index 0000000..2f2f886 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataHourMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id, inter_resistance, hour_time from ems_battery_data_hour + + + + + + + + insert into ems_battery_data_hour + + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + hour_time, + + + #{batteryPack}, + #{batteryCluster}, + #{batteryCellId}, + #{voltage}, + #{temperature}, + #{soc}, + #{soh}, + #{dataTimestamp}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + #{clusterDeviceId}, + #{interResistance}, + #{hourTime}, + + + + + update ems_battery_data_hour + + battery_pack = #{batteryPack}, + battery_cluster = #{batteryCluster}, + battery_cell_id = #{batteryCellId}, + voltage = #{voltage}, + temperature = #{temperature}, + soc = #{soc}, + soh = #{soh}, + data_timestamp = #{dataTimestamp}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + inter_resistance = #{interResistance}, + hour_time = #{hourTime}, + + where id = #{id} + + + + delete from ems_battery_data_hour where id = #{id} + + + + delete from ems_battery_data_hour where id in + + #{id} + + + + + + + + INSERT INTO ems_battery_data_hour ( + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + hour_time + ) VALUES + + ( + #{item.batteryPack}, + #{item.batteryCluster}, + #{item.batteryCellId}, + #{item.voltage}, + #{item.temperature}, + #{item.soc}, + #{item.soh}, + #{item.dataTimestamp}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId}, + #{item.clusterDeviceId}, + #{item.interResistance}, + #{item.hourTime} + ) + + ON DUPLICATE KEY UPDATE + -- 仅当新温度高于现有温度时,才更新温度和相关字段 + update_time = IF(VALUES(temperature) > temperature, NOW(), update_time), + data_timestamp = IF(VALUES(temperature) > temperature, VALUES(data_timestamp), data_timestamp), + voltage = IF(VALUES(temperature) > temperature, VALUES(voltage), voltage), + soc = IF(VALUES(temperature) > temperature, VALUES(soc), soc), + soh = IF(VALUES(temperature) > temperature, VALUES(soh), soh), + inter_resistance = IF(VALUES(temperature) > temperature, VALUES(inter_resistance), inter_resistance), + update_by = IF(VALUES(temperature) > temperature, VALUES(update_by), update_by), + temperature = IF(VALUES(temperature) > temperature, VALUES(temperature), temperature) + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMapper.xml index 456f7a1..8794f26 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMapper.xml @@ -21,10 +21,13 @@ + + + - select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_battery_data + select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id, inter_resistance, current from ems_battery_data @@ -65,7 +71,10 @@ update_time, remark, site_id, - device_id, + device_id, + cluster_device_id, + inter_resistance, + current, #{batteryPack}, @@ -82,7 +91,10 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, + #{clusterDeviceId}, + #{interResistance}, + #{current}, @@ -103,7 +115,10 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + inter_resistance = #{interResistance}, + current = #{current}, where id = #{id} @@ -119,9 +134,94 @@ - - where site_id = #{siteId} - and DATE(data_timestamp) = DATE(NOW()) + WHERE site_id = #{siteId} AND data_timestamp >= CURDATE() + ORDER BY data_timestamp desc limit 1 + + + + + + + + + INSERT INTO ems_battery_data ( + battery_pack, battery_cluster, battery_cell_id, + voltage, temperature, soc, soh, data_timestamp, + create_by, create_time, update_by, update_time, + remark, site_id, device_id, cluster_device_id, inter_resistance, current + ) VALUES + + ( + #{item.batteryPack}, #{item.batteryCluster}, #{item.batteryCellId}, + #{item.voltage}, #{item.temperature}, #{item.soc}, #{item.soh}, #{item.dataTimestamp}, + #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, + #{item.remark}, #{item.siteId}, #{item.deviceId}, #{item.clusterDeviceId},#{item.interResistance},#{item.current} + ) + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMinutesMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMinutesMapper.xml new file mode 100644 index 0000000..070cf44 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMinutesMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id, inter_resistance from ems_battery_data_minutes + + + + + + + + insert into ems_battery_data_minutes + + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + + + #{batteryPack}, + #{batteryCluster}, + #{batteryCellId}, + #{voltage}, + #{temperature}, + #{soc}, + #{soh}, + #{dataTimestamp}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + #{clusterDeviceId}, + #{interResistance}, + + + + + update ems_battery_data_minutes + + battery_pack = #{batteryPack}, + battery_cluster = #{batteryCluster}, + battery_cell_id = #{batteryCellId}, + voltage = #{voltage}, + temperature = #{temperature}, + soc = #{soc}, + soh = #{soh}, + data_timestamp = #{dataTimestamp}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + inter_resistance = #{interResistance}, + + where id = #{id} + + + + delete from ems_battery_data_minutes where date_day = #{dateDay} + + + + delete from ems_battery_data_minutes where date_day in + + #{dateDay} + + + + + INSERT INTO ems_battery_data_minutes ( + battery_pack, battery_cluster, battery_cell_id, + voltage, temperature, soc, soh, data_timestamp, + create_by, create_time, update_by, update_time, + remark, site_id, device_id, cluster_device_id, inter_resistance + ) VALUES + + ( + #{item.batteryPack}, #{item.batteryCluster}, #{item.batteryCellId}, + #{item.voltage}, #{item.temperature}, #{item.soc}, #{item.soh}, #{item.dataTimestamp}, + #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, + #{item.remark}, #{item.siteId}, #{item.deviceId}, #{item.clusterDeviceId},#{item.interResistance} + ) + + + + + delete from ems_battery_data_minutes where data_timestamp < #{oneHourAgoStr} + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMonthMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMonthMapper.xml new file mode 100644 index 0000000..0ef37df --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryDataMonthMapper.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, battery_pack, battery_cluster, battery_cell_id, voltage, temperature, soc, soh, data_timestamp, create_by, create_time, update_by, update_time, remark, site_id, device_id, cluster_device_id, inter_resistance, month_time from ems_battery_data_month + + + + + + + + insert into ems_battery_data_month + + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + month_time, + + + #{batteryPack}, + #{batteryCluster}, + #{batteryCellId}, + #{voltage}, + #{temperature}, + #{soc}, + #{soh}, + #{dataTimestamp}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + #{clusterDeviceId}, + #{interResistance}, + #{monthTime}, + + + + + update ems_battery_data_month + + battery_pack = #{batteryPack}, + battery_cluster = #{batteryCluster}, + battery_cell_id = #{batteryCellId}, + voltage = #{voltage}, + temperature = #{temperature}, + soc = #{soc}, + soh = #{soh}, + data_timestamp = #{dataTimestamp}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + cluster_device_id = #{clusterDeviceId}, + inter_resistance = #{interResistance}, + month_time = #{monthTime}, + + where id = #{id} + + + + delete from ems_battery_data_month where id = #{id} + + + + delete from ems_battery_data_month where id in + + #{id} + + + + + + + + INSERT INTO ems_battery_data_month ( + battery_pack, + battery_cluster, + battery_cell_id, + voltage, + temperature, + soc, + soh, + data_timestamp, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + cluster_device_id, + inter_resistance, + month_time + ) VALUES + + ( + #{item.batteryPack}, + #{item.batteryCluster}, + #{item.batteryCellId}, + #{item.voltage}, + #{item.temperature}, + #{item.soc}, + #{item.soh}, + #{item.dataTimestamp}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId}, + #{item.clusterDeviceId}, + #{item.interResistance}, + #{item.monthTime} + ) + + ON DUPLICATE KEY UPDATE + -- 仅当新温度高于现有温度时,才更新温度和相关字段 + update_time = IF(VALUES(temperature) > temperature, NOW(), update_time), + data_timestamp = IF(VALUES(temperature) > temperature, VALUES(data_timestamp), data_timestamp), + voltage = IF(VALUES(temperature) > temperature, VALUES(voltage), voltage), + soc = IF(VALUES(temperature) > temperature, VALUES(soc), soc), + soh = IF(VALUES(temperature) > temperature, VALUES(soh), soh), + inter_resistance = IF(VALUES(temperature) > temperature, VALUES(inter_resistance), inter_resistance), + update_by = IF(VALUES(temperature) > temperature, VALUES(update_by), update_by), + temperature = IF(VALUES(temperature) > temperature, VALUES(temperature), temperature) + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryGroupMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryGroupMapper.xml new file mode 100644 index 0000000..2a18355 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryGroupMapper.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, status, voltage, current, soc, soh, estimated_backup_duration, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_battery_group + + + + + + + + insert into ems_battery_group + + status, + voltage, + current, + soc, + soh, + estimated_backup_duration, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + + + #{status}, + #{voltage}, + #{current}, + #{soc}, + #{soh}, + #{estimatedBackupDuration}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + + + + + update ems_battery_group + + status = #{status}, + voltage = #{voltage}, + current = #{current}, + soc = #{soc}, + soh = #{soh}, + estimated_backup_duration = #{estimatedBackupDuration}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + + where id = #{id} + + + + delete from ems_battery_group where id = #{id} + + + + delete from ems_battery_group where id in + + #{id} + + + + + INSERT INTO ems_battery_group ( + status, + voltage, + current, + soc, + soh, + estimated_backup_duration, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id + ) VALUES + + + ( + #{item.status}, + #{item.voltage}, + #{item.current}, + #{item.soc}, + #{item.soh}, + #{item.estimatedBackupDuration}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark}, + #{item.siteId}, + #{item.deviceId} + ) + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml index 724d750..3a3b74c 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml @@ -6,50 +6,133 @@ + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select id, work_status, pcs_communication_status, ems_communication_status, total_voltage, chargeable_capacity, total_charged_capacity, total_current, dischargeable_capacity, total_discharged_capacity, soh, average_temperature, insulation_resistance, current_soc, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_battery_stack + select id, work_status, pcs_communication_status, ems_communication_status, operation_status, stack_voltage, stack_current, stack_soc, stack_soh, max_cell_voltage, max_voltage_group_id, max_voltage_cell_id, min_cell_voltage, min_voltage_group_id, min_voltage_cell_id, max_cell_temp, max_temp_group_id, max_temp_cell_id, min_cell_temp, min_temp_group_id, min_temp_cell_id, total_charge_capacity, total_discharge_capacity, session_charge_capacity, session_discharge_capacity, available_charge_capacity, available_discharge_capacity, remaining_discharge_time, remaining_charge_time, max_discharge_power, max_charge_power, max_discharge_current, max_charge_current, daily_discharge_cycles, daily_charge_cycles, daily_discharge_capacity, daily_charge_capacity, operating_temp, bms_status, bms_charge_status, stack_insulation_resistance, site_id, device_id, create_time, create_by, update_time, update_by, battery_number, battery_avg_voltage, battery_different_pressure, avg_temperature, battery_different_temperature, max_internal_resistance, min_internal_resistance, avg_internal_resistance, battery_defferent_resistance, max_resistance_cell_id, min_resistance_cell_id, environment_temperature, environment_humidity, circuit_breaker_status from ems_battery_stack @@ -61,74 +144,197 @@ insert into ems_battery_stack + data_update_time, work_status, pcs_communication_status, ems_communication_status, - total_voltage, - chargeable_capacity, - total_charged_capacity, - total_current, - dischargeable_capacity, - total_discharged_capacity, - soh, - average_temperature, - insulation_resistance, - current_soc, - create_by, + operation_status, + stack_voltage, + stack_current, + stack_soc, + stack_soh, + max_cell_voltage, + max_voltage_group_id, + max_voltage_cell_id, + min_cell_voltage, + min_voltage_group_id, + min_voltage_cell_id, + max_cell_temp, + max_temp_group_id, + max_temp_cell_id, + min_cell_temp, + min_temp_group_id, + min_temp_cell_id, + total_charge_capacity, + total_discharge_capacity, + session_charge_capacity, + session_discharge_capacity, + available_charge_capacity, + available_discharge_capacity, + remaining_discharge_time, + remaining_charge_time, + max_discharge_power, + max_charge_power, + max_discharge_current, + max_charge_current, + daily_discharge_cycles, + daily_charge_cycles, + daily_discharge_capacity, + daily_charge_capacity, + operating_temp, + bms_status, + bms_charge_status, + stack_insulation_resistance, + site_id, + device_id, create_time, - update_by, + create_by, update_time, - remark, - site_id, - device_id, + update_by, + battery_number, + battery_avg_voltage, + battery_different_pressure, + avg_temperature, + battery_different_temperature, + max_internal_resistance, + min_internal_resistance, + avg_internal_resistance, + battery_defferent_resistance, + max_resistance_cell_id, + min_resistance_cell_id, + environment_temperature, + environment_humidity, + circuit_breaker_status, + #{dataUpdateTime}, #{workStatus}, #{pcsCommunicationStatus}, #{emsCommunicationStatus}, - #{totalVoltage}, - #{chargeableCapacity}, - #{totalChargedCapacity}, - #{totalCurrent}, - #{dischargeableCapacity}, - #{totalDischargedCapacity}, - #{soh}, - #{averageTemperature}, - #{insulationResistance}, - #{currentSoc}, - #{createBy}, + #{operationStatus}, + #{stackVoltage}, + #{stackCurrent}, + #{stackSoc}, + #{stackSoh}, + #{maxCellVoltage}, + #{maxVoltageGroupId}, + #{maxVoltageCellId}, + #{minCellVoltage}, + #{minVoltageGroupId}, + #{minVoltageCellId}, + #{maxCellTemp}, + #{maxTempGroupId}, + #{maxTempCellId}, + #{minCellTemp}, + #{minTempGroupId}, + #{minTempCellId}, + #{totalChargeCapacity}, + #{totalDischargeCapacity}, + #{sessionChargeCapacity}, + #{sessionDischargeCapacity}, + #{availableChargeCapacity}, + #{availableDischargeCapacity}, + #{remainingDischargeTime}, + #{remainingChargeTime}, + #{maxDischargePower}, + #{maxChargePower}, + #{maxDischargeCurrent}, + #{maxChargeCurrent}, + #{dailyDischargeCycles}, + #{dailyChargeCycles}, + #{dailyDischargeCapacity}, + #{dailyChargeCapacity}, + #{operatingTemp}, + #{bmsStatus}, + #{bmsChargeStatus}, + #{stackInsulationResistance}, + #{siteId}, + #{deviceId}, #{createTime}, - #{updateBy}, + #{createBy}, #{updateTime}, - #{remark}, - #{siteId}, - #{deviceId}, + #{updateBy}, + #{batteryNumber}, + #{batteryAvgVoltage}, + #{batteryDifferentPressure}, + #{avgTemperature}, + #{batteryDifferentTemperature}, + #{maxInternalResistance}, + #{minInternalResistance}, + #{avgInternalResistance}, + #{batteryDefferentResistance}, + #{maxResistanceCellId}, + #{minResistanceCellId}, + #{environmentTemperature}, + #{environmentHumidity}, + #{circuitBreakerStatus}, update ems_battery_stack + data_update_time = #{dataUpdateTime}, work_status = #{workStatus}, pcs_communication_status = #{pcsCommunicationStatus}, ems_communication_status = #{emsCommunicationStatus}, - total_voltage = #{totalVoltage}, - chargeable_capacity = #{chargeableCapacity}, - total_charged_capacity = #{totalChargedCapacity}, - total_current = #{totalCurrent}, - dischargeable_capacity = #{dischargeableCapacity}, - total_discharged_capacity = #{totalDischargedCapacity}, - soh = #{soh}, - average_temperature = #{averageTemperature}, - insulation_resistance = #{insulationResistance}, - current_soc = #{currentSoc}, - create_by = #{createBy}, + operation_status = #{operationStatus}, + stack_voltage = #{stackVoltage}, + stack_current = #{stackCurrent}, + stack_soc = #{stackSoc}, + stack_soh = #{stackSoh}, + max_cell_voltage = #{maxCellVoltage}, + max_voltage_group_id = #{maxVoltageGroupId}, + max_voltage_cell_id = #{maxVoltageCellId}, + min_cell_voltage = #{minCellVoltage}, + min_voltage_group_id = #{minVoltageGroupId}, + min_voltage_cell_id = #{minVoltageCellId}, + max_cell_temp = #{maxCellTemp}, + max_temp_group_id = #{maxTempGroupId}, + max_temp_cell_id = #{maxTempCellId}, + min_cell_temp = #{minCellTemp}, + min_temp_group_id = #{minTempGroupId}, + min_temp_cell_id = #{minTempCellId}, + total_charge_capacity = #{totalChargeCapacity}, + total_discharge_capacity = #{totalDischargeCapacity}, + session_charge_capacity = #{sessionChargeCapacity}, + session_discharge_capacity = #{sessionDischargeCapacity}, + available_charge_capacity = #{availableChargeCapacity}, + available_discharge_capacity = #{availableDischargeCapacity}, + remaining_discharge_time = #{remainingDischargeTime}, + remaining_charge_time = #{remainingChargeTime}, + max_discharge_power = #{maxDischargePower}, + max_charge_power = #{maxChargePower}, + max_discharge_current = #{maxDischargeCurrent}, + max_charge_current = #{maxChargeCurrent}, + daily_discharge_cycles = #{dailyDischargeCycles}, + daily_charge_cycles = #{dailyChargeCycles}, + daily_discharge_capacity = #{dailyDischargeCapacity}, + daily_charge_capacity = #{dailyChargeCapacity}, + operating_temp = #{operatingTemp}, + bms_status = #{bmsStatus}, + bms_charge_status = #{bmsChargeStatus}, + stack_insulation_resistance = #{stackInsulationResistance}, + site_id = #{siteId}, + device_id = #{deviceId}, create_time = #{createTime}, - update_by = #{updateBy}, + create_by = #{createBy}, update_time = #{updateTime}, - remark = #{remark}, - site_id = #{siteId}, - device_id = #{deviceId}, + update_by = #{updateBy}, + battery_number = #{batteryNumber}, + battery_avg_voltage = #{batteryAvgVoltage}, + battery_different_pressure = #{batteryDifferentPressure}, + avg_temperature = #{avgTemperature}, + battery_different_temperature = #{batteryDifferentTemperature}, + max_internal_resistance = #{maxInternalResistance}, + min_internal_resistance = #{minInternalResistance}, + avg_internal_resistance = #{avgInternalResistance}, + battery_defferent_resistance = #{batteryDefferentResistance}, + max_resistance_cell_id = #{maxResistanceCellId}, + min_resistance_cell_id = #{minResistanceCellId}, + environment_temperature = #{environmentTemperature}, + environment_humidity = #{environmentHumidity}, + circuit_breaker_status = #{circuitBreakerStatus}, where id = #{id} @@ -144,17 +350,228 @@ - + WITH ranked AS ( + SELECT + *, + date_format(create_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(create_time) / 5) * 5 MINUTE AS group_time, + ROW_NUMBER() OVER (PARTITION BY date_format(create_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(create_time) / 5) ORDER BY create_time) as rn + FROM + ems_battery_stack + where site_id = #{siteId} + and create_time >= #{startDate} + and create_time < DATE_ADD(#{endDate}, INTERVAL 1 DAY) + and avg_temperature is not null + ) + SELECT + site_id, + round(avg(avg_temperature)) as batteryTemp, + DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay, + DATE_FORMAT(group_time, '%H:%i:00') as createDate, + group_time as groupTime + FROM + ranked + GROUP BY site_id,groupTime + + + + WHERE p.site_id = #{siteId} + + AND p.update_time >= #{startDate} + + + AND p.update_time < #{endDate} + + + + + + + t.operating_temp AS temp + + + t.stack_voltage as voltage + + + t.stack_current as current + + + t.stack_soc as soc + + + 0 AS temp + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsClusterAlarmDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsClusterAlarmDataMapper.xml new file mode 100644 index 0000000..21dedba --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsClusterAlarmDataMapper.xml @@ -0,0 +1,526 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_timestamp, site_id, device_id, c1zktxsl, c1ddyqyqdgj, c1ddyqyzdgj, c1ddyqyzzdgj, c1ddygyqdgj, c1ddygyzdgj, c1ddygyzzdgj, c1ddlqdgj, c1ddlzdgj, c1ddlzzdgj, c1dtqyqdgj, c1dtqyzdgj, c1dtqyzzdgj, c1dtgyqdgj, c1dtgyzdgj, c1dtgyzzdgj, c1dtqwqdgj, c1dtqwzdgj, c1dtqwzzdgj, c1dtgwqdgj, c1dtgwzdgj, c1dtgwzzdgj, c1socdqdgj, c1socdzdgj, c1socdzzdgj, c1socgqdgj, c1socgzdgj, c1socgzzdgj, c1sohdqdgj, c1sohdzdgj, c1sohdzzdgj, c1dtycqdgj, c1dtyczdgj, c1dtyczzdgj, c1dtwcqdgj, c1dtwczdgj, c1dtwczzdgj, c1ck1txsl, c1ck2txsl, c1ck3txsl, c1ck4txsl, c1ck5txsl, c1ck6txsl, c1ck7txsl, c1ck8txsl, c1ck9txsl, c1ck10txsl, c1ck11txsl, c1ck12txsl, c1ck13txsl, c1ck14txsl, c1ck15txsl, c1ck16txsl, c1ck17txsl, c1ck18txsl, c1ck19txsl, c1ck20txsl, c1ck21txsl, c1ck22txsl, c1ck23txsl, c1ck24txsl, c1ck25txsl, c1ck26txsl, c1ck27txsl, c1ck28txsl, c1ck29txsl, c1ck30txsl, c1ck31txsl, c1ck32txsl, c1ck33txsl, c1ck34txsl, c1ck35txsl, c1ck36txsl, c1ck37txsl, c1ck38txsl, c1ck39txsl, c1ck40txsl, c1dzwdggqdgj, c1dzwdggzdgj, c1dzwdggzzdgj, c1mkdyggqdgj, c1mkdyggzdgj, c1mkdyggzzdgj, c1mkdygdqdgj, c1mkdygdzdgj, c1mkdygdzzdgj, c1dycjgz, c1wdcjgz, create_by, create_time, update_by, update_time, remark from ems_cluster_alarm_data + + + + + + + + insert into ems_cluster_alarm_data + + data_timestamp, + site_id, + device_id, + c1zktxsl, + c1ddyqyqdgj, + c1ddyqyzdgj, + c1ddyqyzzdgj, + c1ddygyqdgj, + c1ddygyzdgj, + c1ddygyzzdgj, + c1ddlqdgj, + c1ddlzdgj, + c1ddlzzdgj, + c1dtqyqdgj, + c1dtqyzdgj, + c1dtqyzzdgj, + c1dtgyqdgj, + c1dtgyzdgj, + c1dtgyzzdgj, + c1dtqwqdgj, + c1dtqwzdgj, + c1dtqwzzdgj, + c1dtgwqdgj, + c1dtgwzdgj, + c1dtgwzzdgj, + c1socdqdgj, + c1socdzdgj, + c1socdzzdgj, + c1socgqdgj, + c1socgzdgj, + c1socgzzdgj, + c1sohdqdgj, + c1sohdzdgj, + c1sohdzzdgj, + c1dtycqdgj, + c1dtyczdgj, + c1dtyczzdgj, + c1dtwcqdgj, + c1dtwczdgj, + c1dtwczzdgj, + c1ck1txsl, + c1ck2txsl, + c1ck3txsl, + c1ck4txsl, + c1ck5txsl, + c1ck6txsl, + c1ck7txsl, + c1ck8txsl, + c1ck9txsl, + c1ck10txsl, + c1ck11txsl, + c1ck12txsl, + c1ck13txsl, + c1ck14txsl, + c1ck15txsl, + c1ck16txsl, + c1ck17txsl, + c1ck18txsl, + c1ck19txsl, + c1ck20txsl, + c1ck21txsl, + c1ck22txsl, + c1ck23txsl, + c1ck24txsl, + c1ck25txsl, + c1ck26txsl, + c1ck27txsl, + c1ck28txsl, + c1ck29txsl, + c1ck30txsl, + c1ck31txsl, + c1ck32txsl, + c1ck33txsl, + c1ck34txsl, + c1ck35txsl, + c1ck36txsl, + c1ck37txsl, + c1ck38txsl, + c1ck39txsl, + c1ck40txsl, + c1dzwdggqdgj, + c1dzwdggzdgj, + c1dzwdggzzdgj, + c1mkdyggqdgj, + c1mkdyggzdgj, + c1mkdyggzzdgj, + c1mkdygdqdgj, + c1mkdygdzdgj, + c1mkdygdzzdgj, + c1dycjgz, + c1wdcjgz, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dataTimestamp}, + #{siteId}, + #{deviceId}, + #{c1zktxsl}, + #{c1ddyqyqdgj}, + #{c1ddyqyzdgj}, + #{c1ddyqyzzdgj}, + #{c1ddygyqdgj}, + #{c1ddygyzdgj}, + #{c1ddygyzzdgj}, + #{c1ddlqdgj}, + #{c1ddlzdgj}, + #{c1ddlzzdgj}, + #{c1dtqyqdgj}, + #{c1dtqyzdgj}, + #{c1dtqyzzdgj}, + #{c1dtgyqdgj}, + #{c1dtgyzdgj}, + #{c1dtgyzzdgj}, + #{c1dtqwqdgj}, + #{c1dtqwzdgj}, + #{c1dtqwzzdgj}, + #{c1dtgwqdgj}, + #{c1dtgwzdgj}, + #{c1dtgwzzdgj}, + #{c1socdqdgj}, + #{c1socdzdgj}, + #{c1socdzzdgj}, + #{c1socgqdgj}, + #{c1socgzdgj}, + #{c1socgzzdgj}, + #{c1sohdqdgj}, + #{c1sohdzdgj}, + #{c1sohdzzdgj}, + #{c1dtycqdgj}, + #{c1dtyczdgj}, + #{c1dtyczzdgj}, + #{c1dtwcqdgj}, + #{c1dtwczdgj}, + #{c1dtwczzdgj}, + #{c1ck1txsl}, + #{c1ck2txsl}, + #{c1ck3txsl}, + #{c1ck4txsl}, + #{c1ck5txsl}, + #{c1ck6txsl}, + #{c1ck7txsl}, + #{c1ck8txsl}, + #{c1ck9txsl}, + #{c1ck10txsl}, + #{c1ck11txsl}, + #{c1ck12txsl}, + #{c1ck13txsl}, + #{c1ck14txsl}, + #{c1ck15txsl}, + #{c1ck16txsl}, + #{c1ck17txsl}, + #{c1ck18txsl}, + #{c1ck19txsl}, + #{c1ck20txsl}, + #{c1ck21txsl}, + #{c1ck22txsl}, + #{c1ck23txsl}, + #{c1ck24txsl}, + #{c1ck25txsl}, + #{c1ck26txsl}, + #{c1ck27txsl}, + #{c1ck28txsl}, + #{c1ck29txsl}, + #{c1ck30txsl}, + #{c1ck31txsl}, + #{c1ck32txsl}, + #{c1ck33txsl}, + #{c1ck34txsl}, + #{c1ck35txsl}, + #{c1ck36txsl}, + #{c1ck37txsl}, + #{c1ck38txsl}, + #{c1ck39txsl}, + #{c1ck40txsl}, + #{c1dzwdggqdgj}, + #{c1dzwdggzdgj}, + #{c1dzwdggzzdgj}, + #{c1mkdyggqdgj}, + #{c1mkdyggzdgj}, + #{c1mkdyggzzdgj}, + #{c1mkdygdqdgj}, + #{c1mkdygdzdgj}, + #{c1mkdygdzzdgj}, + #{c1dycjgz}, + #{c1wdcjgz}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_cluster_alarm_data + + data_timestamp = #{dataTimestamp}, + site_id = #{siteId}, + device_id = #{deviceId}, + c1zktxsl = #{c1zktxsl}, + c1ddyqyqdgj = #{c1ddyqyqdgj}, + c1ddyqyzdgj = #{c1ddyqyzdgj}, + c1ddyqyzzdgj = #{c1ddyqyzzdgj}, + c1ddygyqdgj = #{c1ddygyqdgj}, + c1ddygyzdgj = #{c1ddygyzdgj}, + c1ddygyzzdgj = #{c1ddygyzzdgj}, + c1ddlqdgj = #{c1ddlqdgj}, + c1ddlzdgj = #{c1ddlzdgj}, + c1ddlzzdgj = #{c1ddlzzdgj}, + c1dtqyqdgj = #{c1dtqyqdgj}, + c1dtqyzdgj = #{c1dtqyzdgj}, + c1dtqyzzdgj = #{c1dtqyzzdgj}, + c1dtgyqdgj = #{c1dtgyqdgj}, + c1dtgyzdgj = #{c1dtgyzdgj}, + c1dtgyzzdgj = #{c1dtgyzzdgj}, + c1dtqwqdgj = #{c1dtqwqdgj}, + c1dtqwzdgj = #{c1dtqwzdgj}, + c1dtqwzzdgj = #{c1dtqwzzdgj}, + c1dtgwqdgj = #{c1dtgwqdgj}, + c1dtgwzdgj = #{c1dtgwzdgj}, + c1dtgwzzdgj = #{c1dtgwzzdgj}, + c1socdqdgj = #{c1socdqdgj}, + c1socdzdgj = #{c1socdzdgj}, + c1socdzzdgj = #{c1socdzzdgj}, + c1socgqdgj = #{c1socgqdgj}, + c1socgzdgj = #{c1socgzdgj}, + c1socgzzdgj = #{c1socgzzdgj}, + c1sohdqdgj = #{c1sohdqdgj}, + c1sohdzdgj = #{c1sohdzdgj}, + c1sohdzzdgj = #{c1sohdzzdgj}, + c1dtycqdgj = #{c1dtycqdgj}, + c1dtyczdgj = #{c1dtyczdgj}, + c1dtyczzdgj = #{c1dtyczzdgj}, + c1dtwcqdgj = #{c1dtwcqdgj}, + c1dtwczdgj = #{c1dtwczdgj}, + c1dtwczzdgj = #{c1dtwczzdgj}, + c1ck1txsl = #{c1ck1txsl}, + c1ck2txsl = #{c1ck2txsl}, + c1ck3txsl = #{c1ck3txsl}, + c1ck4txsl = #{c1ck4txsl}, + c1ck5txsl = #{c1ck5txsl}, + c1ck6txsl = #{c1ck6txsl}, + c1ck7txsl = #{c1ck7txsl}, + c1ck8txsl = #{c1ck8txsl}, + c1ck9txsl = #{c1ck9txsl}, + c1ck10txsl = #{c1ck10txsl}, + c1ck11txsl = #{c1ck11txsl}, + c1ck12txsl = #{c1ck12txsl}, + c1ck13txsl = #{c1ck13txsl}, + c1ck14txsl = #{c1ck14txsl}, + c1ck15txsl = #{c1ck15txsl}, + c1ck16txsl = #{c1ck16txsl}, + c1ck17txsl = #{c1ck17txsl}, + c1ck18txsl = #{c1ck18txsl}, + c1ck19txsl = #{c1ck19txsl}, + c1ck20txsl = #{c1ck20txsl}, + c1ck21txsl = #{c1ck21txsl}, + c1ck22txsl = #{c1ck22txsl}, + c1ck23txsl = #{c1ck23txsl}, + c1ck24txsl = #{c1ck24txsl}, + c1ck25txsl = #{c1ck25txsl}, + c1ck26txsl = #{c1ck26txsl}, + c1ck27txsl = #{c1ck27txsl}, + c1ck28txsl = #{c1ck28txsl}, + c1ck29txsl = #{c1ck29txsl}, + c1ck30txsl = #{c1ck30txsl}, + c1ck31txsl = #{c1ck31txsl}, + c1ck32txsl = #{c1ck32txsl}, + c1ck33txsl = #{c1ck33txsl}, + c1ck34txsl = #{c1ck34txsl}, + c1ck35txsl = #{c1ck35txsl}, + c1ck36txsl = #{c1ck36txsl}, + c1ck37txsl = #{c1ck37txsl}, + c1ck38txsl = #{c1ck38txsl}, + c1ck39txsl = #{c1ck39txsl}, + c1ck40txsl = #{c1ck40txsl}, + c1dzwdggqdgj = #{c1dzwdggqdgj}, + c1dzwdggzdgj = #{c1dzwdggzdgj}, + c1dzwdggzzdgj = #{c1dzwdggzzdgj}, + c1mkdyggqdgj = #{c1mkdyggqdgj}, + c1mkdyggzdgj = #{c1mkdyggzdgj}, + c1mkdyggzzdgj = #{c1mkdyggzzdgj}, + c1mkdygdqdgj = #{c1mkdygdqdgj}, + c1mkdygdzdgj = #{c1mkdygdzdgj}, + c1mkdygdzzdgj = #{c1mkdygdzzdgj}, + c1dycjgz = #{c1dycjgz}, + c1wdcjgz = #{c1wdcjgz}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_cluster_alarm_data where id = #{id} + + + + delete from ems_cluster_alarm_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsCoolingAlarmDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsCoolingAlarmDataMapper.xml new file mode 100644 index 0000000..a6db7b3 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsCoolingAlarmDataMapper.xml @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_timestamp, site_id, device_id, lsjyx, pqdcfyx, djrq2yx, djrq1yx, bqbyx, bsbyx, zxhbyx, sltzgz, slzhyj, slxtyctzxh, slxtycqdxh, slxtyckz, slxtbdkz, slxtzdms, slxtsdms, hsylcdyj, hsyldyj, gsylcgyj, gsylgyj, gsylcdyj, gsyldyj, hcgywg, hcgywcdtz, hcgywd, hcgylg, hcgyld, lysylgyj, lysyldyj, hswdcgyj, hswdgyj, gswdcgtz, gswdgyj, gswddyj, ddf2gz, ddf1gz, lyswdbsqyJ, hsylbsqyJ, gsylbsqyJ, hswdbsqyJ, gswdbsqgztz, lsjgz, djrq2gz, djrq1gz, bqbgz, bsbgz, xhbgz, zdygz, create_by, create_time, update_by, update_time, remark from ems_cooling_alarm_data + + + + + + + + insert into ems_cooling_alarm_data + + data_timestamp, + site_id, + device_id, + lsjyx, + pqdcfyx, + djrq2yx, + djrq1yx, + bqbyx, + bsbyx, + zxhbyx, + sltzgz, + slzhyj, + slxtyctzxh, + slxtycqdxh, + slxtyckz, + slxtbdkz, + slxtzdms, + slxtsdms, + hsylcdyj, + hsyldyj, + gsylcgyj, + gsylgyj, + gsylcdyj, + gsyldyj, + hcgywg, + hcgywcdtz, + hcgywd, + hcgylg, + hcgyld, + lysylgyj, + lysyldyj, + hswdcgyj, + hswdgyj, + gswdcgtz, + gswdgyj, + gswddyj, + ddf2gz, + ddf1gz, + lyswdbsqyJ, + hsylbsqyJ, + gsylbsqyJ, + hswdbsqyJ, + gswdbsqgztz, + lsjgz, + djrq2gz, + djrq1gz, + bqbgz, + bsbgz, + xhbgz, + zdygz, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dataTimestamp}, + #{siteId}, + #{deviceId}, + #{lsjyx}, + #{pqdcfyx}, + #{djrq2yx}, + #{djrq1yx}, + #{bqbyx}, + #{bsbyx}, + #{zxhbyx}, + #{sltzgz}, + #{slzhyj}, + #{slxtyctzxh}, + #{slxtycqdxh}, + #{slxtyckz}, + #{slxtbdkz}, + #{slxtzdms}, + #{slxtsdms}, + #{hsylcdyj}, + #{hsyldyj}, + #{gsylcgyj}, + #{gsylgyj}, + #{gsylcdyj}, + #{gsyldyj}, + #{hcgywg}, + #{hcgywcdtz}, + #{hcgywd}, + #{hcgylg}, + #{hcgyld}, + #{lysylgyj}, + #{lysyldyj}, + #{hswdcgyj}, + #{hswdgyj}, + #{gswdcgtz}, + #{gswdgyj}, + #{gswddyj}, + #{ddf2gz}, + #{ddf1gz}, + #{lyswdbsqyJ}, + #{hsylbsqyJ}, + #{gsylbsqyJ}, + #{hswdbsqyJ}, + #{gswdbsqgztz}, + #{lsjgz}, + #{djrq2gz}, + #{djrq1gz}, + #{bqbgz}, + #{bsbgz}, + #{xhbgz}, + #{zdygz}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_cooling_alarm_data + + data_timestamp = #{dataTimestamp}, + site_id = #{siteId}, + device_id = #{deviceId}, + lsjyx = #{lsjyx}, + pqdcfyx = #{pqdcfyx}, + djrq2yx = #{djrq2yx}, + djrq1yx = #{djrq1yx}, + bqbyx = #{bqbyx}, + bsbyx = #{bsbyx}, + zxhbyx = #{zxhbyx}, + sltzgz = #{sltzgz}, + slzhyj = #{slzhyj}, + slxtyctzxh = #{slxtyctzxh}, + slxtycqdxh = #{slxtycqdxh}, + slxtyckz = #{slxtyckz}, + slxtbdkz = #{slxtbdkz}, + slxtzdms = #{slxtzdms}, + slxtsdms = #{slxtsdms}, + hsylcdyj = #{hsylcdyj}, + hsyldyj = #{hsyldyj}, + gsylcgyj = #{gsylcgyj}, + gsylgyj = #{gsylgyj}, + gsylcdyj = #{gsylcdyj}, + gsyldyj = #{gsyldyj}, + hcgywg = #{hcgywg}, + hcgywcdtz = #{hcgywcdtz}, + hcgywd = #{hcgywd}, + hcgylg = #{hcgylg}, + hcgyld = #{hcgyld}, + lysylgyj = #{lysylgyj}, + lysyldyj = #{lysyldyj}, + hswdcgyj = #{hswdcgyj}, + hswdgyj = #{hswdgyj}, + gswdcgtz = #{gswdcgtz}, + gswdgyj = #{gswdgyj}, + gswddyj = #{gswddyj}, + ddf2gz = #{ddf2gz}, + ddf1gz = #{ddf1gz}, + lyswdbsqyJ = #{lyswdbsqyJ}, + hsylbsqyJ = #{hsylbsqyJ}, + gsylbsqyJ = #{gsylbsqyJ}, + hswdbsqyJ = #{hswdbsqyJ}, + gswdbsqgztz = #{gswdbsqgztz}, + lsjgz = #{lsjgz}, + djrq2gz = #{djrq2gz}, + djrq1gz = #{djrq1gz}, + bqbgz = #{bqbgz}, + bsbgz = #{bsbgz}, + xhbgz = #{xhbgz}, + zdygz = #{zdygz}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_cooling_alarm_data where id = #{id} + + + + delete from ems_cooling_alarm_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsCoolingDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsCoolingDataMapper.xml index 89808f1..0ed3595 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsCoolingDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsCoolingDataMapper.xml @@ -6,6 +6,7 @@ + @@ -15,6 +16,13 @@ + + + + + + + @@ -25,12 +33,13 @@ - select id, system_name, work_mode, current_temperature, heating_start_point, cooling_start_point, high_temp_alarm_point, heating_stop_point, cooling_stop_point, low_temp_alarm_point, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_cooling_data + select id, system_name, work_mode, current_temperature, heating_start_point, cooling_start_point, high_temp_alarm_point, heating_stop_point, cooling_stop_point, low_temp_alarm_point, gs_temp, hs_temp, gs_pressure, hs_pressure, lys_temp, vb01_kd, vb02_kd, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_cooling_data @@ -53,6 +69,7 @@ insert into ems_cooling_data + data_update_time, system_name, work_mode, current_temperature, @@ -62,15 +79,23 @@ heating_stop_point, cooling_stop_point, low_temp_alarm_point, + gs_temp, + hs_temp, + gs_pressure, + hs_pressure, + lys_temp, + vb01_kd, + vb02_kd, create_by, create_time, update_by, update_time, remark, site_id, - device_id, + device_id, + #{dataUpdateTime}, #{systemName}, #{workMode}, #{currentTemperature}, @@ -80,19 +105,27 @@ #{heatingStopPoint}, #{coolingStopPoint}, #{lowTempAlarmPoint}, + #{gsTemp}, + #{hsTemp}, + #{gsPressure}, + #{hsPressure}, + #{lysTemp}, + #{vb01Kd}, + #{vb02Kd}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, update ems_cooling_data + data_update_time = #{dataUpdateTime}, system_name = #{systemName}, work_mode = #{workMode}, current_temperature = #{currentTemperature}, @@ -102,13 +135,20 @@ heating_stop_point = #{heatingStopPoint}, cooling_stop_point = #{coolingStopPoint}, low_temp_alarm_point = #{lowTempAlarmPoint}, + gs_temp = #{gsTemp}, + hs_temp = #{hsTemp}, + gs_pressure = #{gsPressure}, + hs_pressure = #{hsPressure}, + lys_temp = #{lysTemp}, + vb01_kd = #{vb01Kd}, + vb02_kd = #{vb02Kd}, create_by = #{createBy}, create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, where id = #{id} @@ -124,13 +164,13 @@ - + SELECT t.* + FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY device_id ORDER BY update_time DESC ) AS rn + FROM ems_cooling_data + WHERE site_id = #{siteId} + ) t + WHERE rn = 1 + ORDER BY system_name \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsDailyChageDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDailyChageDataMapper.xml new file mode 100644 index 0000000..4b1fb36 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsDailyChageDataMapper.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + select id, site_id, device_id, date_time, total_charge_Data, total_discharge_Data, charge_data, discharge_data, create_by, create_time, update_by, update_time, remark from ems_daily_charge_data + + + + + + + + insert into ems_daily_charge_data + + site_id, + device_id, + date_time, + total_charge_Data, + total_discharge_Data, + charge_data, + discharge_data, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{siteId}, + #{deviceId}, + #{dateTime}, + #{totalChargeData}, + #{totalDischargeData}, + #{chargeData}, + #{dischargeData}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_daily_charge_data + + site_id = #{siteId}, + device_id = #{deviceId}, + date_time = #{dateTime}, + total_charge_Data = #{totalChargeData}, + total_discharge_Data = #{totalDischargeData}, + charge_data = #{chargeData}, + discharge_data = #{dischargeData}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_daily_charge_data where id = #{id} + + + + delete from ems_daily_charge_data where id in + + #{id} + + + + + INSERT into ems_daily_charge_data ( + id, + site_id, + device_id, + date_time, + total_charge_Data, + total_discharge_Data, + charge_data, + discharge_data, + create_by, + create_time, + update_by, + update_time, + remark + ) values ( + #{id}, + #{siteId}, + #{deviceId}, + #{dateTime}, + #{totalChargeData}, + #{totalDischargeData}, + #{chargeData}, + #{dischargeData}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark} + ) + on duplicate key update + total_charge_Data = #{totalChargeData}, + total_discharge_Data = #{totalDischargeData}, + charge_data = #{chargeData}, + discharge_data = #{dischargeData}, + update_time = NOW() + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml new file mode 100644 index 0000000..3b34ab5 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, site_id, data_date, total_revenue, day_revenue, peak_charge_diff, peak_discharge_diff, high_charge_diff, high_discharge_diff, flat_charge_diff, flat_discharge_diff, valley_charge_diff, valley_discharge_diff, calc_time, create_by, create_time, update_by, update_time, remark from ems_daily_energy_data + + + + + + + + insert into ems_daily_energy_data + + site_id, + data_date, + total_revenue, + day_revenue, + peak_charge_diff, + peak_discharge_diff, + high_charge_diff, + high_discharge_diff, + flat_charge_diff, + flat_discharge_diff, + valley_charge_diff, + valley_discharge_diff, + calc_time, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{siteId}, + #{dataDate}, + #{totalRevenue}, + #{dayRevenue}, + #{peakChargeDiff}, + #{peakDischargeDiff}, + #{highChargeDiff}, + #{highDischargeDiff}, + #{flatChargeDiff}, + #{flatDischargeDiff}, + #{valleyChargeDiff}, + #{valleyDischargeDiff}, + #{calcTime}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_daily_energy_data + + site_id = #{siteId}, + data_date = #{dataDate}, + total_revenue = #{totalRevenue}, + day_revenue = #{dayRevenue}, + peak_charge_diff = #{peakChargeDiff}, + peak_discharge_diff = #{peakDischargeDiff}, + high_charge_diff = #{highChargeDiff}, + high_discharge_diff = #{highDischargeDiff}, + flat_charge_diff = #{flatChargeDiff}, + flat_discharge_diff = #{flatDischargeDiff}, + valley_charge_diff = #{valleyChargeDiff}, + valley_discharge_diff = #{valleyDischargeDiff}, + calc_time = #{calcTime}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_daily_energy_data where id = #{id} + + + + delete from ems_daily_energy_data where id in + + #{id} + + + + + + + INSERT INTO ems_daily_energy_data ( + id, site_id, data_date, + total_revenue, + day_revenue, + peak_charge_diff, + peak_discharge_diff, + high_charge_diff, + high_discharge_diff, + flat_charge_diff, + flat_discharge_diff, + valley_charge_diff, + valley_discharge_diff, + calc_time, + create_by, + create_time, + update_by, + update_time, + remark + ) VALUES ( + #{id}, + #{siteId}, + #{dataDate}, + #{totalRevenue}, + #{dayRevenue}, + #{peakChargeDiff}, + #{peakDischargeDiff}, + #{highChargeDiff}, + #{highDischargeDiff}, + #{flatChargeDiff}, + #{flatDischargeDiff}, + #{valleyChargeDiff}, + #{valleyDischargeDiff}, + #{calcTime}, + 'system', + NOW(), + 'system', + NOW(), + #{remark} + ) ON DUPLICATE KEY UPDATE + total_revenue = #{totalRevenue}, + day_revenue = #{dayRevenue}, + peak_charge_diff = #{peakChargeDiff}, + peak_discharge_diff = #{peakDischargeDiff}, + high_charge_diff = #{highChargeDiff}, + high_discharge_diff = #{highDischargeDiff}, + flat_charge_diff = #{flatChargeDiff}, + flat_discharge_diff = #{flatDischargeDiff}, + valley_charge_diff = #{valleyChargeDiff}, + valley_discharge_diff = #{valleyDischargeDiff}, + calc_time = #{calcTime}, + update_time = NOW(); + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsDeviceChangeLogMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDeviceChangeLogMapper.xml new file mode 100644 index 0000000..48c9a56 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsDeviceChangeLogMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + select id, log_id, log_time, siteId, deviceId, before_status, after_status, create_by, create_time, update_by, update_time, remark from ems_device_change_log + + + + + + + + insert into ems_device_change_log + + log_id, + log_time, + siteId, + deviceId, + before_status, + after_status, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{logId}, + #{logTime}, + #{siteId}, + #{deviceId}, + #{beforeStatus}, + #{afterStatus}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_device_change_log + + log_id = #{logId}, + log_time = #{logTime}, + siteId = #{siteId}, + deviceId = #{deviceId}, + before_status = #{beforeStatus}, + after_status = #{afterStatus}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_device_change_log where id = #{id} + + + + delete from ems_device_change_log where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsDevicesSettingMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDevicesSettingMapper.xml index c90b2c3..5557599 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsDevicesSettingMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsDevicesSettingMapper.xml @@ -23,10 +23,16 @@ + + + + + + - select id, device_name, device_type, slave_id, timeout_ms, retries, ip_address, ip_port, serial_port, baud_rate, data_bits, stop_bits, parity, description, created_at, updated_at, site_id, communication_status from ems_devices_setting + select id, device_name, device_type, slave_id, timeout_ms, retries, ip_address, ip_port, serial_port, baud_rate, data_bits, stop_bits, parity, description, created_at, updated_at, site_id, communication_status, device_id, parent_id, device_category,device_status, picture_url,work_status from ems_devices_setting @@ -77,6 +89,12 @@ updated_at, site_id, communication_status, + device_id, + parent_id, + device_category, + device_status, + work_status, + picture_url, #{deviceName}, @@ -96,6 +114,12 @@ #{updatedAt}, #{siteId}, #{communicationStatus}, + #{deviceId}, + #{parentId}, + #{deviceCategory}, + #{deviceStatus}, + #{workStatus}, + #{pictureUrl}, @@ -119,6 +143,12 @@ updated_at = #{updatedAt}, site_id = #{siteId}, communication_status = #{communicationStatus}, + device_id = #{deviceId}, + parent_id = #{parentId}, + device_category = #{deviceCategory}, + device_status = #{deviceStatus}, + work_status = #{workStatus}, + picture_url = #{pictureUrl}, where id = #{id} @@ -133,4 +163,76 @@ #{id} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsDhDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDhDataMapper.xml new file mode 100644 index 0000000..7205839 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsDhDataMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + select id, data_update_time,humidity, temperature, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_dh_data + + + + + + + + insert into ems_dh_data + + data_update_time, + humidity, + temperature, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + + + #{dataUpdateTime}, + #{humidity}, + #{temperature}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + + + + + update ems_dh_data + + data_update_time = #{dataUpdateTime}, + humidity = #{humidity}, + temperature = #{temperature}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + + where id = #{id} + + + + delete from ems_dh_data where id = #{id} + + + + delete from ems_dh_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsEmsDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsEmsDataMapper.xml new file mode 100644 index 0000000..39506fe --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsEmsDataMapper.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_update_time, ems_status, bms1_soc, bms2_soc, bms3_soc, bms4_soc, pcs1_yggl, pcs2_yggl, pcs3_yggl, pcs4_yggl, ems_yggl, site_id, device_id, create_by, create_time, update_by, update_time, remark from ems_ems_data + + + + + + + + insert into ems_ems_data + + data_update_time, + ems_status, + bms1_soc, + bms2_soc, + bms3_soc, + bms4_soc, + pcs1_yggl, + pcs2_yggl, + pcs3_yggl, + pcs4_yggl, + ems_yggl, + site_id, + device_id, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dataUpdateTime}, + #{emsStatus}, + #{bms1Soc}, + #{bms2Soc}, + #{bms3Soc}, + #{bms4Soc}, + #{pcs1Yggl}, + #{pcs2Yggl}, + #{pcs3Yggl}, + #{pcs4Yggl}, + #{emsYggl}, + #{siteId}, + #{deviceId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_ems_data + + data_update_time = #{dataUpdateTime}, + ems_status = #{emsStatus}, + bms1_soc = #{bms1Soc}, + bms2_soc = #{bms2Soc}, + bms3_soc = #{bms3Soc}, + bms4_soc = #{bms4Soc}, + pcs1_yggl = #{pcs1Yggl}, + pcs2_yggl = #{pcs2Yggl}, + pcs3_yggl = #{pcs3Yggl}, + pcs4_yggl = #{pcs4Yggl}, + ems_yggl = #{emsYggl}, + site_id = #{siteId}, + device_id = #{deviceId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_ems_data where id = #{id} + + + + delete from ems_ems_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml new file mode 100644 index 0000000..68823f9 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + select id, site_id, year, month, peak, high, flat, valley, create_by, create_time, update_by, update_time, remark from ems_energy_price_config + + + + + + + + insert into ems_energy_price_config + + site_id, + year, + month, + peak, + high, + flat, + valley, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{siteId}, + #{year}, + #{month}, + #{peak}, + #{high}, + #{flat}, + #{valley}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_energy_price_config + + site_id = #{siteId}, + year = #{year}, + month = #{month}, + peak = #{peak}, + high = #{high}, + flat = #{flat}, + valley = #{valley}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_energy_price_config where id = #{id} + + + + delete from ems_energy_price_config where id in + + #{id} + + + + + + + INSERT INTO ems_energy_price_config ( + id, + site_id, + year, + month, + peak, + high, + flat, + valley, + create_by, + create_time, + update_by, + update_time, + remark + ) VALUES ( + #{id}, + #{siteId}, + #{year}, + #{month}, + #{peak}, + #{high}, + #{flat}, + #{valley}, + 'system', + NOW(), + 'system', + NOW(), + #{remark} + ) ON DUPLICATE KEY UPDATE + peak = #{peak}, + high = #{high}, + flat = #{flat}, + valley = #{valley}, + update_time = NOW(); + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsFaultIssueLogMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsFaultIssueLogMapper.xml new file mode 100644 index 0000000..15ebfe7 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsFaultIssueLogMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select id, log_id, log_time, log_level, site_id, device_id, point, value, create_by, create_time, update_by, update_time, remark from ems_fault_issue_log + + + + + + + + insert into ems_fault_issue_log + + log_id, + log_time, + log_level, + site_id, + device_id, + point, + value, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{logId}, + #{logTime}, + #{logLevel}, + #{siteId}, + #{deviceId}, + #{point}, + #{value}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_fault_issue_log + + log_id = #{logId}, + log_time = #{logTime}, + log_level = #{logLevel}, + site_id = #{siteId}, + device_id = #{deviceId}, + point = #{point}, + value = #{value}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_fault_issue_log where id = #{id} + + + + delete from ems_fault_issue_log where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsFaultProtectionPlanMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsFaultProtectionPlanMapper.xml new file mode 100644 index 0000000..ea7ca86 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsFaultProtectionPlanMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, site_id, fault_name, fault_level, protection_settings, fault_delay_seconds, protection_plan, release_delay_seconds, description, is_alert, status, create_by, create_time, update_by, update_time from ems_fault_protection_plan + + + + + + + + insert into ems_fault_protection_plan + + site_id, + fault_name, + fault_level, + protection_settings, + fault_delay_seconds, + protection_plan, + release_delay_seconds, + description, + is_alert, + status, + create_by, + create_time, + update_by, + update_time, + + + #{siteId}, + #{faultName}, + #{faultLevel}, + #{protectionSettings}, + #{faultDelaySeconds}, + #{protectionPlan}, + #{releaseDelaySeconds}, + #{description}, + #{isAlert}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update ems_fault_protection_plan + + site_id = #{siteId}, + fault_name = #{faultName}, + fault_level = #{faultLevel}, + protection_settings = #{protectionSettings}, + fault_delay_seconds = #{faultDelaySeconds}, + protection_plan = #{protectionPlan}, + release_delay_seconds = #{releaseDelaySeconds}, + description = #{description}, + is_alert = #{isAlert}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from ems_fault_protection_plan where id = #{id} + + + + delete from ems_fault_protection_plan where id in + + #{id} + + + + + delete from ems_fault_protection_plan + where site_id = #{siteId} + and fault_name = #{faultName} + and fault_level = #{faultLevel} + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsMqttMessageMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsMqttMessageMapper.xml new file mode 100644 index 0000000..c101d13 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsMqttMessageMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + select id, mqtt_topic, mqtt_message, create_by, create_time, update_by, update_time from ems_mqtt_message + + + + + + + + insert into ems_mqtt_message + + id, + mqtt_topic, + mqtt_message, + create_by, + create_time, + update_by, + update_time, + + + #{id}, + #{mqttTopic}, + #{mqttMessage}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update ems_mqtt_message + + mqtt_topic = #{mqttTopic}, + mqtt_message = #{mqttMessage}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from ems_mqtt_message where id = #{id} + + + + delete from ems_mqtt_message where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml new file mode 100644 index 0000000..8c5de17 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + select id, mqtt_topic, qos, topic_name, handle_method, handle_type, siteId, create_by, create_time, update_by, update_time from ems_mqtt_topic_config + + + + + + + + insert into ems_mqtt_topic_config + + mqtt_topic, + qos, + topic_name, + handle_method, + handle_type, + siteId, + create_by, + create_time, + update_by, + update_time, + + + #{mqttTopic}, + #{qos}, + #{topicName}, + #{handleMethod}, + #{handleType}, + #{siteId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update ems_mqtt_topic_config + + mqtt_topic = #{mqttTopic}, + qos = #{qos}, + topic_name = #{topicName}, + handle_method = #{handleMethod}, + handle_type = #{handleType}, + siteId = #{siteId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from ems_mqtt_topic_config where id = #{id} + + + + delete from ems_mqtt_topic_config where id in + + #{id} + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsAlarmDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsAlarmDataMapper.xml new file mode 100644 index 0000000..de59108 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsAlarmDataMapper.xml @@ -0,0 +1,571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_timestamp, site_id, device_id, gzbz, jyzkyc, jlllyc, zlgv, dwgyyc, dwqyyc, dwgpyc, dwqpyc, glmkgw, dwxxyc, nbrjgl, zlrqdyc, zlkgwc, jlfjyc, jlkgwc, wdkgwc, nbyc, jngw, jlrqdyc, rjhjyc, jlflqyc, nbjt, wbjt, mxdbyfhkjtj, mxdlgl, lpjzyc, mjgj, sxyc, zlflqyc, zndbtxyc, nbyjgl, qdyc, idct, xxgxctxvc, bjtxxyc, tbctxvc, zldhyc, lxgl, zlzjcqyc, ywgj, bjtxyc, hmictxyc, jxszcw, hmi485txyc, yctxyc, gzz, gjz, zlblmsszcw, xtcsbpp, dwdybphgj, ddycyyx, gdycyyx, zlfjyc, srqwdkgwc, wbwdkgwc, fybyqwdkgwc, dgwdkgwc, zjjdvc, fjjdvc, jljdvc, bwjdvc, bmsjt, kkhrqyc, dwgqpdjgj, glmkgwgJ, dcgy, dcqzqy, zlgl, scdyyc, scdybfhlwtj, gzbh, dlbh, nbfjyc, zlbxsyc, dczzqy, dcdygj, wbfjyc, dcfj, dcdybfhcdtj, gzgJ, zldhmktxyc, bmsxtgz, bmstxyc, bmsgjdyc, bmsjc, bmsjf, bmsdj, bmsgj, dgfjyc, srqgwgj, gzz2, gjz2, jlfjsmyc, zlfjsmyc, jlkgSmyc, zlkgSmyc, yljzyc, create_by, create_time, update_by, update_time, remark from ems_pcs_alarm_data + + + + + + + + insert into ems_pcs_alarm_data + + data_timestamp, + site_id, + device_id, + gzbz, + jyzkyc, + jlllyc, + zlgv, + dwgyyc, + dwqyyc, + dwgpyc, + dwqpyc, + glmkgw, + dwxxyc, + nbrjgl, + zlrqdyc, + zlkgwc, + jlfjyc, + jlkgwc, + wdkgwc, + nbyc, + jngw, + jlrqdyc, + rjhjyc, + jlflqyc, + nbjt, + wbjt, + mxdbyfhkjtj, + mxdlgl, + lpjzyc, + mjgj, + sxyc, + zlflqyc, + zndbtxyc, + nbyjgl, + qdyc, + idct, + xxgxctxvc, + bjtxxyc, + tbctxvc, + zldhyc, + lxgl, + zlzjcqyc, + ywgj, + bjtxyc, + hmictxyc, + jxszcw, + hmi485txyc, + yctxyc, + gzz, + gjz, + zlblmsszcw, + xtcsbpp, + dwdybphgj, + ddycyyx, + gdycyyx, + zlfjyc, + srqwdkgwc, + wbwdkgwc, + fybyqwdkgwc, + dgwdkgwc, + zjjdvc, + fjjdvc, + jljdvc, + bwjdvc, + bmsjt, + kkhrqyc, + dwgqpdjgj, + glmkgwgJ, + dcgy, + dcqzqy, + zlgl, + scdyyc, + scdybfhlwtj, + gzbh, + dlbh, + nbfjyc, + zlbxsyc, + dczzqy, + dcdygj, + wbfjyc, + dcfj, + dcdybfhcdtj, + gzgJ, + zldhmktxyc, + bmsxtgz, + bmstxyc, + bmsgjdyc, + bmsjc, + bmsjf, + bmsdj, + bmsgj, + dgfjyc, + srqgwgj, + gzz2, + gjz2, + jlfjsmyc, + zlfjsmyc, + jlkgSmyc, + zlkgSmyc, + yljzyc, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dataTimestamp}, + #{siteId}, + #{deviceId}, + #{gzbz}, + #{jyzkyc}, + #{jlllyc}, + #{zlgv}, + #{dwgyyc}, + #{dwqyyc}, + #{dwgpyc}, + #{dwqpyc}, + #{glmkgw}, + #{dwxxyc}, + #{nbrjgl}, + #{zlrqdyc}, + #{zlkgwc}, + #{jlfjyc}, + #{jlkgwc}, + #{wdkgwc}, + #{nbyc}, + #{jngw}, + #{jlrqdyc}, + #{rjhjyc}, + #{jlflqyc}, + #{nbjt}, + #{wbjt}, + #{mxdbyfhkjtj}, + #{mxdlgl}, + #{lpjzyc}, + #{mjgj}, + #{sxyc}, + #{zlflqyc}, + #{zndbtxyc}, + #{nbyjgl}, + #{qdyc}, + #{idct}, + #{xxgxctxvc}, + #{bjtxxyc}, + #{tbctxvc}, + #{zldhyc}, + #{lxgl}, + #{zlzjcqyc}, + #{ywgj}, + #{bjtxyc}, + #{hmictxyc}, + #{jxszcw}, + #{hmi485txyc}, + #{yctxyc}, + #{gzz}, + #{gjz}, + #{zlblmsszcw}, + #{xtcsbpp}, + #{dwdybphgj}, + #{ddycyyx}, + #{gdycyyx}, + #{zlfjyc}, + #{srqwdkgwc}, + #{wbwdkgwc}, + #{fybyqwdkgwc}, + #{dgwdkgwc}, + #{zjjdvc}, + #{fjjdvc}, + #{jljdvc}, + #{bwjdvc}, + #{bmsjt}, + #{kkhrqyc}, + #{dwgqpdjgj}, + #{glmkgwgJ}, + #{dcgy}, + #{dcqzqy}, + #{zlgl}, + #{scdyyc}, + #{scdybfhlwtj}, + #{gzbh}, + #{dlbh}, + #{nbfjyc}, + #{zlbxsyc}, + #{dczzqy}, + #{dcdygj}, + #{wbfjyc}, + #{dcfj}, + #{dcdybfhcdtj}, + #{gzgJ}, + #{zldhmktxyc}, + #{bmsxtgz}, + #{bmstxyc}, + #{bmsgjdyc}, + #{bmsjc}, + #{bmsjf}, + #{bmsdj}, + #{bmsgj}, + #{dgfjyc}, + #{srqgwgj}, + #{gzz2}, + #{gjz2}, + #{jlfjsmyc}, + #{zlfjsmyc}, + #{jlkgSmyc}, + #{zlkgSmyc}, + #{yljzyc}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_pcs_alarm_data + + data_timestamp = #{dataTimestamp}, + site_id = #{siteId}, + device_id = #{deviceId}, + gzbz = #{gzbz}, + jyzkyc = #{jyzkyc}, + jlllyc = #{jlllyc}, + zlgv = #{zlgv}, + dwgyyc = #{dwgyyc}, + dwqyyc = #{dwqyyc}, + dwgpyc = #{dwgpyc}, + dwqpyc = #{dwqpyc}, + glmkgw = #{glmkgw}, + dwxxyc = #{dwxxyc}, + nbrjgl = #{nbrjgl}, + zlrqdyc = #{zlrqdyc}, + zlkgwc = #{zlkgwc}, + jlfjyc = #{jlfjyc}, + jlkgwc = #{jlkgwc}, + wdkgwc = #{wdkgwc}, + nbyc = #{nbyc}, + jngw = #{jngw}, + jlrqdyc = #{jlrqdyc}, + rjhjyc = #{rjhjyc}, + jlflqyc = #{jlflqyc}, + nbjt = #{nbjt}, + wbjt = #{wbjt}, + mxdbyfhkjtj = #{mxdbyfhkjtj}, + mxdlgl = #{mxdlgl}, + lpjzyc = #{lpjzyc}, + mjgj = #{mjgj}, + sxyc = #{sxyc}, + zlflqyc = #{zlflqyc}, + zndbtxyc = #{zndbtxyc}, + nbyjgl = #{nbyjgl}, + qdyc = #{qdyc}, + idct = #{idct}, + xxgxctxvc = #{xxgxctxvc}, + bjtxxyc = #{bjtxxyc}, + tbctxvc = #{tbctxvc}, + zldhyc = #{zldhyc}, + lxgl = #{lxgl}, + zlzjcqyc = #{zlzjcqyc}, + ywgj = #{ywgj}, + bjtxyc = #{bjtxyc}, + hmictxyc = #{hmictxyc}, + jxszcw = #{jxszcw}, + hmi485txyc = #{hmi485txyc}, + yctxyc = #{yctxyc}, + gzz = #{gzz}, + gjz = #{gjz}, + zlblmsszcw = #{zlblmsszcw}, + xtcsbpp = #{xtcsbpp}, + dwdybphgj = #{dwdybphgj}, + ddycyyx = #{ddycyyx}, + gdycyyx = #{gdycyyx}, + zlfjyc = #{zlfjyc}, + srqwdkgwc = #{srqwdkgwc}, + wbwdkgwc = #{wbwdkgwc}, + fybyqwdkgwc = #{fybyqwdkgwc}, + dgwdkgwc = #{dgwdkgwc}, + zjjdvc = #{zjjdvc}, + fjjdvc = #{fjjdvc}, + jljdvc = #{jljdvc}, + bwjdvc = #{bwjdvc}, + bmsjt = #{bmsjt}, + kkhrqyc = #{kkhrqyc}, + dwgqpdjgj = #{dwgqpdjgj}, + glmkgwgJ = #{glmkgwgJ}, + dcgy = #{dcgy}, + dcqzqy = #{dcqzqy}, + zlgl = #{zlgl}, + scdyyc = #{scdyyc}, + scdybfhlwtj = #{scdybfhlwtj}, + gzbh = #{gzbh}, + dlbh = #{dlbh}, + nbfjyc = #{nbfjyc}, + zlbxsyc = #{zlbxsyc}, + dczzqy = #{dczzqy}, + dcdygj = #{dcdygj}, + wbfjyc = #{wbfjyc}, + dcfj = #{dcfj}, + dcdybfhcdtj = #{dcdybfhcdtj}, + gzgJ = #{gzgJ}, + zldhmktxyc = #{zldhmktxyc}, + bmsxtgz = #{bmsxtgz}, + bmstxyc = #{bmstxyc}, + bmsgjdyc = #{bmsgjdyc}, + bmsjc = #{bmsjc}, + bmsjf = #{bmsjf}, + bmsdj = #{bmsdj}, + bmsgj = #{bmsgj}, + dgfjyc = #{dgfjyc}, + srqgwgj = #{srqgwgj}, + gzz2 = #{gzz2}, + gjz2 = #{gjz2}, + jlfjsmyc = #{jlfjsmyc}, + zlfjsmyc = #{zlfjsmyc}, + jlkgSmyc = #{jlkgSmyc}, + zlkgSmyc = #{zlkgSmyc}, + yljzyc = #{yljzyc}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_pcs_alarm_data where id = #{id} + + + + delete from ems_pcs_alarm_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsBranchDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsBranchDataMapper.xml index 65561e9..7060ed3 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsPcsBranchDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsBranchDataMapper.xml @@ -18,10 +18,30 @@ + + + + + + + + + + + + + + + + + + + + - select id, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, remark, site_id, device_id, branch_id from ems_pcs_branch_data + select id, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, remark, site_id, device_id, branch_id, grid_u_voltage, grid_v_voltage, grid_w_voltage, output_u_current, output_v_current, output_w_current, apparent_power, active_power, reactive_power, power_factor, frequency, internal_temp, u_igbt_temp, v_igbt_temp, w_igbt_temp, grid_status, available_power, total_load_ratio, ac_leakage_current, insulation_resistance from ems_pcs_branch_data @@ -55,8 +95,28 @@ update_time, remark, site_id, - device_id, + device_id, branch_id, + grid_u_voltage, + grid_v_voltage, + grid_w_voltage, + output_u_current, + output_v_current, + output_w_current, + apparent_power, + active_power, + reactive_power, + power_factor, + frequency, + internal_temp, + u_igbt_temp, + v_igbt_temp, + w_igbt_temp, + grid_status, + available_power, + total_load_ratio, + ac_leakage_current, + insulation_resistance, #{dischargeStatus}, @@ -69,8 +129,28 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, #{branchId}, + #{gridUVoltage}, + #{gridVVoltage}, + #{gridWVoltage}, + #{outputUCurrent}, + #{outputVCurrent}, + #{outputWCurrent}, + #{apparentPower}, + #{activePower}, + #{reactivePower}, + #{powerFactor}, + #{frequency}, + #{internalTemp}, + #{uIgbtTemp}, + #{vIgbtTemp}, + #{wIgbtTemp}, + #{gridStatus}, + #{availablePower}, + #{totalLoadRatio}, + #{acLeakageCurrent}, + #{insulationResistance}, @@ -87,8 +167,28 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, branch_id = #{branchId}, + grid_u_voltage = #{gridUVoltage}, + grid_v_voltage = #{gridVVoltage}, + grid_w_voltage = #{gridWVoltage}, + output_u_current = #{outputUCurrent}, + output_v_current = #{outputVCurrent}, + output_w_current = #{outputWCurrent}, + apparent_power = #{apparentPower}, + active_power = #{activePower}, + reactive_power = #{reactivePower}, + power_factor = #{powerFactor}, + frequency = #{frequency}, + internal_temp = #{internalTemp}, + u_igbt_temp = #{uIgbtTemp}, + v_igbt_temp = #{vIgbtTemp}, + w_igbt_temp = #{wIgbtTemp}, + grid_status = #{gridStatus}, + available_power = #{availablePower}, + total_load_ratio = #{totalLoadRatio}, + ac_leakage_current = #{acLeakageCurrent}, + insulation_resistance = #{insulationResistance}, where id = #{id} @@ -105,14 +205,88 @@ + + + INSERT INTO ems_pcs_branch_data ( + discharge_status, + dc_power, + dc_voltage, + dc_current, + site_id, + device_id, + branch_id, + grid_u_voltage, + grid_v_voltage, + grid_w_voltage, + output_u_current, + output_v_current, + output_w_current, + apparent_power, + active_power, + reactive_power, + power_factor, + frequency, + internal_temp, + u_igbt_temp, + v_igbt_temp, + w_igbt_temp, + grid_status, + available_power, + total_load_ratio, + ac_leakage_current, + insulation_resistance, + create_by, + create_time, + update_by, + update_time, + remark + ) VALUES + + ( + #{item.dischargeStatus}, + #{item.dcPower}, + #{item.dcVoltage}, + #{item.dcCurrent}, + #{item.siteId}, + #{item.deviceId}, + #{item.branchId}, + #{item.gridUVoltage}, + #{item.gridVVoltage}, + #{item.gridWVoltage}, + #{item.outputUCurrent}, + #{item.outputVCurrent}, + #{item.outputWCurrent}, + #{item.apparentPower}, + #{item.activePower}, + #{item.reactivePower}, + #{item.powerFactor}, + #{item.frequency}, + #{item.internalTemp}, + #{item.uIgbtTemp}, + #{item.vIgbtTemp}, + #{item.wIgbtTemp}, + #{item.gridStatus}, + #{item.availablePower}, + #{item.totalLoadRatio}, + #{item.acLeakageCurrent}, + #{item.insulationResistance}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark} + ) + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml index 1746e64..52e50e6 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml @@ -40,11 +40,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + + - select id, data_update_time, work_status, grid_status, device_status, control_mode, total_active_power, daily_ac_charge_energy, a_phase_voltage, a_phase_current, total_reactive_power, daily_ac_discharge_energy, b_phase_voltage, b_phase_current, total_apparent_power, pcs_module_temperature, c_phase_voltage, c_phase_current, total_power_factor, pcs_environment_temperature, ac_frequency, branch_status, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, remark, site_id, device_id, date_month, date_day, communication_status from ems_pcs_data + select id, data_update_time, work_status, grid_status, device_status, control_mode, total_active_power, daily_ac_charge_energy, + a_phase_voltage, a_phase_current, total_reactive_power, daily_ac_discharge_energy, b_phase_voltage, b_phase_current, + total_apparent_power, pcs_module_temperature, c_phase_voltage, c_phase_current, total_power_factor, pcs_environment_temperature, + ac_frequency, branch_status, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, + remark, site_id, device_id, date_month, date_day, total_ac_charge_energy, total_ac_discharge_energy, ac_charge_active_power, + ac_capacitive_reactive_power, ac_discharge_active_power, ac_inductive_reactive_power, max_capacitive_power_capacity, + max_inductive_power_capacity, max_charge_power_capacity, max_discharge_power_capacity, ac_switch_status, dc_switch_status, + remote_control_status, sys_u_current, sys_v_current, sys_w_current, dw_frequency, u_temperature, v_temperature, w_temperature, + module1_temp, module2_temp, module3_temp, module4_temp from ems_pcs_data @@ -122,10 +176,33 @@ update_time, remark, site_id, - device_id, + device_id, date_month, date_day, - communication_status, + total_ac_charge_energy, + total_ac_discharge_energy, + ac_charge_active_power, + ac_capacitive_reactive_power, + ac_discharge_active_power, + ac_inductive_reactive_power, + max_capacitive_power_capacity, + max_inductive_power_capacity, + max_charge_power_capacity, + max_discharge_power_capacity, + ac_switch_status, + dc_switch_status, + remote_control_status, + sys_u_current, + sys_v_current, + sys_w_current, + dw_frequency, + u_temperature, + v_temperature, + w_temperature, + module1_temp, + module2_temp, + module3_temp, + module4_temp, #{dataUpdateTime}, @@ -159,10 +236,33 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, #{dateMonth}, #{dateDay}, - #{communicationStatus}, + #{totalAcChargeEnergy}, + #{totalAcDischargeEnergy}, + #{acChargeActivePower}, + #{acCapacitiveReactivePower}, + #{acDischargeActivePower}, + #{acInductiveReactivePower}, + #{maxCapacitivePowerCapacity}, + #{maxInductivePowerCapacity}, + #{maxChargePowerCapacity}, + #{maxDischargePowerCapacity}, + #{acSwitchStatus}, + #{dcSwitchStatus}, + #{remoteControlStatus}, + #{sysUCurrent}, + #{sysVCurrent}, + #{sysWCurrent}, + #{dwFrequency}, + #{uTemperature}, + #{vTemperature}, + #{wTemperature}, + #{module1Temp}, + #{module2Temp}, + #{module3Temp}, + #{module4Temp}, @@ -200,10 +300,33 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, date_month = #{dateMonth}, date_day = #{dateDay}, - communication_status = #{communicationStatus}, + total_ac_charge_energy = #{totalAcChargeEnergy}, + total_ac_discharge_energy = #{totalAcDischargeEnergy}, + ac_charge_active_power = #{acChargeActivePower}, + ac_capacitive_reactive_power = #{acCapacitiveReactivePower}, + ac_discharge_active_power = #{acDischargeActivePower}, + ac_inductive_reactive_power = #{acInductiveReactivePower}, + max_capacitive_power_capacity = #{maxCapacitivePowerCapacity}, + max_inductive_power_capacity = #{maxInductivePowerCapacity}, + max_charge_power_capacity = #{maxChargePowerCapacity}, + max_discharge_power_capacity = #{maxDischargePowerCapacity}, + ac_switch_status = #{acSwitchStatus}, + dc_switch_status = #{dcSwitchStatus}, + remote_control_status = #{remoteControlStatus}, + sys_u_current = #{sysUCurrent}, + sys_v_current = #{sysVCurrent}, + sys_w_current = #{sysWCurrent}, + dw_frequency = #{dwFrequency}, + u_temperature = #{uTemperature}, + v_temperature = #{vTemperature}, + w_temperature = #{wTemperature}, + module1_temp = #{module1Temp}, + module2_temp = #{module2Temp}, + module3_temp = #{module3Temp}, + module4_temp = #{module4Temp}, where id = #{id} @@ -219,66 +342,87 @@ - - - + select CONCAT(t.date_month,'-',t.date_day) as ammeterDate, + sum(t.daily_ac_charge_energy) as chargedCap, + sum(t.daily_ac_discharge_energy) as disChargedCap + from ems_pcs_data t + inner join( SELECT p.site_id, p.device_id, p.date_month,p.date_day, MAX(p.data_update_time) AS max_update_time + FROM ems_pcs_data p + + GROUP BY p.site_id,p.device_id,p.date_month,p.date_day + ) latest ON t.site_id = latest.site_id + AND t.device_id = latest.device_id + AND t.date_month = latest.date_month + AND t.date_day = latest.date_day + AND t.data_update_time = latest.max_update_time + group by ammeterDate,t.date_month,t.date_day + order by t.date_month desc, t.date_day desc - + SELECT SUM(pd.total_active_power) as totalActivePower, + SUM(pd.total_reactive_power) as totalReactivePower, + sum(pd.daily_ac_charge_energy) as dayChargedCap, + sum(pd.daily_ac_discharge_energy) as dayDisChargedCap + FROM ( + SELECT + t.*, ROW_NUMBER() OVER(PARTITION BY t.device_id ORDER BY t.data_update_time desc) AS rn + FROM ( + SELECT p.device_id, MAX(p.data_update_time) AS max_update_time + FROM ems_pcs_data p + where p.site_id = #{siteId} + GROUP BY p.device_id + ) latest inner join ems_pcs_data t ON latest.device_id = t.device_id + AND latest.max_update_time = t.data_update_time + AND t.site_id = #{siteId} + ) AS pd + WHERE rn = 1 - + SELECT td.device_name as deviceName, + td.communication_status as communicationStatus, + tmp.site_id as siteId, + tmp.device_id as deviceId, tmp.data_update_time as dataUpdateTime,tmp.work_status as workStatus, tmp.grid_status as gridStatus,tmp.device_status as deviceStatus,tmp.control_mode as controlMode, tmp.total_active_power as totalActivePower,tmp.daily_ac_charge_energy as dailyAcChargeEnergy, @@ -289,10 +433,269 @@ tmp.c_phase_current as cPhaseVoltage,tmp.c_phase_current as cPhaseCurrent, tmp.total_power_factor as totalPowerFactor, tmp.pcs_environment_temperature as pcsEnvironmentTemperature,tmp.ac_frequency as acFrequency - from ems_pcs_data tmp left join ems_devices_setting td on tmp.device_id = td.id and tmp.site_id = td.site_id - where tmp.site_id = #{siteId} - and tmp.data_update_time = (select MAX(data_update_time) FROM ems_pcs_data where site_id = tmp.site_id - and device_id = tmp.device_id) + FROM ems_pcs_data tmp + LEFT JOIN ems_devices_setting td on tmp.device_id = td.device_id and tmp.site_id = td.site_id + INNER JOIN ( SELECT p.site_id, p.device_id, MAX(p.data_update_time) AS max_update_time + FROM ems_pcs_data p + WHERE p.site_id = #{siteId} + GROUP BY p.site_id,p.device_id + ) latest on tmp.device_id = latest.device_id and tmp.data_update_time = latest.max_update_time + WHERE tmp.site_id = #{siteId} order by tmp.device_id + + + WHERE p.site_id = #{siteId} + + AND p.data_update_time >= #{startDate} + + + AND p.data_update_time < #{endDate} + + + + + + + + + + + + + WHERE p.site_id = #{siteId} + + AND p.data_update_time >= #{startDate} + + + AND p.data_update_time < #{endDate} + + + + + + + t.total_active_power as activePower + + + t.total_reactive_power as reactivePower + + + t.sys_u_current as uCurrent, + t.sys_v_current as vCurrent, + t.sys_w_current as wCurrent + + + 0 as activePower + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsSettingMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsSettingMapper.xml new file mode 100644 index 0000000..287ab57 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsSettingMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, device_setting_id, point_address, power_address, start_command, stop_command, start_power, stop_power, cluster_num, cluster_point_address, create_by, create_time, update_by, update_time, remark from ems_pcs_setting + + + + + + + + + + insert into ems_pcs_setting + + device_setting_id, + point_address, + power_address, + start_command, + stop_command, + start_power, + stop_power, + cluster_num, + cluster_point_address, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{deviceSettingId}, + #{pointAddress}, + #{powerAddress}, + #{startCommand}, + #{stopCommand}, + #{startPower}, + #{stopPower}, + #{clusterNum}, + #{clusterPointAddress}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_pcs_setting + + device_setting_id = #{deviceSettingId}, + point_address = #{pointAddress}, + power_address = #{powerAddress}, + start_command = #{startCommand}, + stop_command = #{stopCommand}, + start_power = #{startPower}, + stop_power = #{stopPower}, + cluster_num = #{clusterNum}, + cluster_point_address = #{clusterPointAddress}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_pcs_setting where id = #{id} + + + + delete from ems_pcs_setting where id in + + #{id} + + + + + update ems_pcs_setting + + device_setting_id = #{deviceSettingId}, + point_address = #{pointAddress}, + power_address = #{powerAddress}, + start_command = #{startCommand}, + stop_command = #{stopCommand}, + start_power = #{startPower}, + stop_power = #{stopPower}, + cluster_num = #{clusterNum}, + cluster_point_address = #{clusterPointAddress}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where device_setting_id = #{deviceSettingId} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml new file mode 100644 index 0000000..7ba0254 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPointEnumMatchMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + select id, match_field, site_id, device_category, enum_code, enum_name, enum_desc, data_enum_code, create_by, create_time, update_by, update_time, remark from ems_point_enum_match + + + + + + + + insert into ems_point_enum_match + + match_field, + site_id, + device_category, + enum_code, + enum_name, + enum_desc, + data_enum_code, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{matchField}, + #{siteId}, + #{deviceCategory}, + #{enumCode}, + #{enumName}, + #{enumDesc}, + #{dataEnumCode}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_point_enum_match + + match_field = #{matchField}, + site_id = #{siteId}, + device_category = #{deviceCategory}, + enum_code = #{enumCode}, + enum_name = #{enumName}, + enum_desc = #{enumDesc}, + data_enum_code = #{dataEnumCode}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + update ems_point_enum_match + set data_enum_code = #{dataEnumCode}, update_time = now() + where id = #{id} + + + + delete from ems_point_enum_match where id = #{id} + + + + delete from ems_point_enum_match where id in + + #{id} + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml new file mode 100644 index 0000000..e0b49ee --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml @@ -0,0 +1,580 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, point_name, match_table, match_field, site_id, device_category, data_point, data_point_name, data_device, data_unit, ip_address, ip_port, data_type, need_diff_device_id, create_by, create_time, update_by, update_time, remark, is_alarm, device_id, a, k, b from ems_point_match + + + + + + + + insert into ems_point_match + + point_name, + match_table, + match_field, + site_id, + device_category, + data_point, + data_point_name, + data_device, + data_unit, + ip_address, + ip_port, + data_type, + need_diff_device_id, + create_by, + create_time, + update_by, + update_time, + remark, + is_alarm, + device_id, + a, + k, + b, + + + #{pointName}, + #{matchTable}, + #{matchField}, + #{siteId}, + #{deviceCategory}, + #{dataPoint}, + #{dataPointName}, + #{dataDevice}, + #{dataUnit}, + #{ipAddress}, + #{ipPort}, + #{dataType}, + #{needDiffDeviceId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{isAlarm}, + #{deviceId}, + #{a}, + #{k}, + #{b}, + + + + + update ems_point_match + + point_name = #{pointName}, + match_table = #{matchTable}, + match_field = #{matchField}, + site_id = #{siteId}, + device_category = #{deviceCategory}, + data_point = #{dataPoint}, + data_point_name = #{dataPointName}, + data_device = #{dataDevice}, + data_unit = #{dataUnit}, + ip_address = #{ipAddress}, + ip_port = #{ipPort}, + data_type = #{dataType}, + need_diff_device_id = #{needDiffDeviceId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + is_alarm = #{isAlarm}, + device_id = #{deviceId}, + a = #{a}, + k = #{k}, + b = #{b}, + + where id = #{id} + + + + delete from ems_point_match where id = #{id} + + + + delete from ems_point_match where id in + + #{id} + + + + + + + + + + and cluster_device_id = #{clusterDeviceId} + + + + AND ( + + ( site_id = #{siteId} + AND device_id IN + + #{deviceId} + + ) + + + ) + + + AND site_id IN + + #{siteId} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPriceTimeConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPriceTimeConfigMapper.xml new file mode 100644 index 0000000..887441a --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsPriceTimeConfigMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + select id, start_time, end_time, cost_type, price_id, create_by, create_time, update_by, update_time, remark from ems_price_time_config + + + + + + + + insert into ems_price_time_config + + start_time, + end_time, + cost_type, + price_id, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{startTime}, + #{endTime}, + #{costType}, + #{priceId}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_price_time_config + + start_time = #{startTime}, + end_time = #{endTime}, + cost_type = #{costType}, + price_id = #{priceId}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_price_time_config where id = #{id} + + + + delete from ems_price_time_config where id in + + #{id} + + + + + + + + INSERT INTO ems_price_time_config ( + start_time, end_time, cost_type, price_id, create_by, create_time, update_by, update_time, remark + ) VALUES + + + ( + #{item.startTime}, + #{item.endTime}, + #{item.costType}, + #{item.priceId}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime}, + #{item.remark} + ) + + + + + delete from ems_price_time_config where price_id in + + #{priceId} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsSiteSettingMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsSiteSettingMapper.xml index b10678a..c7e0fa9 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsSiteSettingMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsSiteSettingMapper.xml @@ -18,10 +18,11 @@ + - select id, site_name, site_address, running_time, latitude, longitude, install_capacity, install_power, remark, create_by, update_by, create_time, update_time from ems_site_setting + select id, site_name, site_address, running_time, latitude, longitude, install_capacity, install_power, remark, create_by, update_by, create_time, update_time, site_id from ems_site_setting @@ -57,6 +59,7 @@ update_by, create_time, update_time, + site_id, #{siteName}, @@ -71,6 +74,7 @@ #{updateBy}, #{createTime}, #{updateTime}, + #{siteId}, @@ -89,6 +93,7 @@ update_by = #{updateBy}, create_time = #{createTime}, update_time = #{updateTime}, + site_id = #{siteId}, where id = #{id} @@ -105,9 +110,67 @@ + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStackAlarmDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStackAlarmDataMapper.xml new file mode 100644 index 0000000..7fa6235 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStackAlarmDataMapper.xml @@ -0,0 +1,571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, data_timestamp, site_id, device_id, bmsgzzt, jczt, jfzt, dngzddyqyqdgjhz, dngzddyqyzdgjhz, dngzddyqyzzdgjhz, dngzddygyqdgjhz, dngzddygyzdgjhz, dngzddygyzzdgjhz, dngzdglqdgjhz, dngzdglzdgjhz, dngzdglzzdgjhz, dngzjydzdqdgjhz, dngzjydzdzdgjhz, dngzjydzdzzdgjhz, dngzmkqwdqdgjhz, dngzmkqwdzdgjhz, dngzmkqwdzzdgjhz, dngzmkgwdqdgjhz, dngzmkgwdzdgjhz, dngzmkgwdzzdgjhz, dngdtgyqwgjhz, dngdtgyzdgjhz, dngdtgyyzgjhz, dngdtqyqwgjhz, dngdtqyzdgjhz, dngdtqyyzgjhz, dngdtycqwgjhz, dngdtyczdgjhz, dngdtycyzgjhz, dngdtqwqwgjhz, dngdtqwzdgjhz, dngdtqwyzgjhz, dngdtgwqwgjhz, dngdtgwzdgjhz, dngdtgwyzgjhz, dngdtwcqwgjhz, dngdtwczdgjhz, dngdtwcyzgjhz, dtsocdqwgjhz, dtsocdzdgjhz, dtsocdyzgjhz, dtsocgqwgjhz, dtsocgzdgjhz, dtsocgyzgjhz, dtsohdqwgjhz, dtsohdzdgjhz, dtsohdyzgjhz, dtsohgqwgjhz, dtsohgzdgjhz, dtsohgyzgjhz, dngzkslhz, dngckslgjhz, dngzdyyc, dnjcqdkyc, dnjcqbhyc, cdjz, fdjz, bmsxtgjhz, bmsxtgzhz, srin0, srin1, srin2, srin3, yl1, yl2, yl3, yl4, yl5, yl6, yl7, yl8, dngdzgwqwgjhz, dngdzgwzdgjhz, dngdzgwzzdgjhz, dnmkdygyqwgjhz, dnmkdygyzdgjhz, dnmkdygyyzgjhz, dnmkdyqyqwgjhz, dnmkdyqyzdgjhz, dnmkdyqyyzgjhz, dycjsl, wdcjsl, didodi0, didodi1, didodi2, didodi3, didodi4, didodi5, didodi6, didodi7, didodi8, didodi9, didodi10, didodi11, didodi12, kttxsl, create_by, create_time, update_by, update_time, remark from ems_stack_alarm_data + + + + + + + + insert into ems_stack_alarm_data + + data_timestamp, + site_id, + device_id, + bmsgzzt, + jczt, + jfzt, + dngzddyqyqdgjhz, + dngzddyqyzdgjhz, + dngzddyqyzzdgjhz, + dngzddygyqdgjhz, + dngzddygyzdgjhz, + dngzddygyzzdgjhz, + dngzdglqdgjhz, + dngzdglzdgjhz, + dngzdglzzdgjhz, + dngzjydzdqdgjhz, + dngzjydzdzdgjhz, + dngzjydzdzzdgjhz, + dngzmkqwdqdgjhz, + dngzmkqwdzdgjhz, + dngzmkqwdzzdgjhz, + dngzmkgwdqdgjhz, + dngzmkgwdzdgjhz, + dngzmkgwdzzdgjhz, + dngdtgyqwgjhz, + dngdtgyzdgjhz, + dngdtgyyzgjhz, + dngdtqyqwgjhz, + dngdtqyzdgjhz, + dngdtqyyzgjhz, + dngdtycqwgjhz, + dngdtyczdgjhz, + dngdtycyzgjhz, + dngdtqwqwgjhz, + dngdtqwzdgjhz, + dngdtqwyzgjhz, + dngdtgwqwgjhz, + dngdtgwzdgjhz, + dngdtgwyzgjhz, + dngdtwcqwgjhz, + dngdtwczdgjhz, + dngdtwcyzgjhz, + dtsocdqwgjhz, + dtsocdzdgjhz, + dtsocdyzgjhz, + dtsocgqwgjhz, + dtsocgzdgjhz, + dtsocgyzgjhz, + dtsohdqwgjhz, + dtsohdzdgjhz, + dtsohdyzgjhz, + dtsohgqwgjhz, + dtsohgzdgjhz, + dtsohgyzgjhz, + dngzkslhz, + dngckslgjhz, + dngzdyyc, + dnjcqdkyc, + dnjcqbhyc, + cdjz, + fdjz, + bmsxtgjhz, + bmsxtgzhz, + srin0, + srin1, + srin2, + srin3, + yl1, + yl2, + yl3, + yl4, + yl5, + yl6, + yl7, + yl8, + dngdzgwqwgjhz, + dngdzgwzdgjhz, + dngdzgwzzdgjhz, + dnmkdygyqwgjhz, + dnmkdygyzdgjhz, + dnmkdygyyzgjhz, + dnmkdyqyqwgjhz, + dnmkdyqyzdgjhz, + dnmkdyqyyzgjhz, + dycjsl, + wdcjsl, + didodi0, + didodi1, + didodi2, + didodi3, + didodi4, + didodi5, + didodi6, + didodi7, + didodi8, + didodi9, + didodi10, + didodi11, + didodi12, + kttxsl, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dataTimestamp}, + #{siteId}, + #{deviceId}, + #{bmsgzzt}, + #{jczt}, + #{jfzt}, + #{dngzddyqyqdgjhz}, + #{dngzddyqyzdgjhz}, + #{dngzddyqyzzdgjhz}, + #{dngzddygyqdgjhz}, + #{dngzddygyzdgjhz}, + #{dngzddygyzzdgjhz}, + #{dngzdglqdgjhz}, + #{dngzdglzdgjhz}, + #{dngzdglzzdgjhz}, + #{dngzjydzdqdgjhz}, + #{dngzjydzdzdgjhz}, + #{dngzjydzdzzdgjhz}, + #{dngzmkqwdqdgjhz}, + #{dngzmkqwdzdgjhz}, + #{dngzmkqwdzzdgjhz}, + #{dngzmkgwdqdgjhz}, + #{dngzmkgwdzdgjhz}, + #{dngzmkgwdzzdgjhz}, + #{dngdtgyqwgjhz}, + #{dngdtgyzdgjhz}, + #{dngdtgyyzgjhz}, + #{dngdtqyqwgjhz}, + #{dngdtqyzdgjhz}, + #{dngdtqyyzgjhz}, + #{dngdtycqwgjhz}, + #{dngdtyczdgjhz}, + #{dngdtycyzgjhz}, + #{dngdtqwqwgjhz}, + #{dngdtqwzdgjhz}, + #{dngdtqwyzgjhz}, + #{dngdtgwqwgjhz}, + #{dngdtgwzdgjhz}, + #{dngdtgwyzgjhz}, + #{dngdtwcqwgjhz}, + #{dngdtwczdgjhz}, + #{dngdtwcyzgjhz}, + #{dtsocdqwgjhz}, + #{dtsocdzdgjhz}, + #{dtsocdyzgjhz}, + #{dtsocgqwgjhz}, + #{dtsocgzdgjhz}, + #{dtsocgyzgjhz}, + #{dtsohdqwgjhz}, + #{dtsohdzdgjhz}, + #{dtsohdyzgjhz}, + #{dtsohgqwgjhz}, + #{dtsohgzdgjhz}, + #{dtsohgyzgjhz}, + #{dngzkslhz}, + #{dngckslgjhz}, + #{dngzdyyc}, + #{dnjcqdkyc}, + #{dnjcqbhyc}, + #{cdjz}, + #{fdjz}, + #{bmsxtgjhz}, + #{bmsxtgzhz}, + #{srin0}, + #{srin1}, + #{srin2}, + #{srin3}, + #{yl1}, + #{yl2}, + #{yl3}, + #{yl4}, + #{yl5}, + #{yl6}, + #{yl7}, + #{yl8}, + #{dngdzgwqwgjhz}, + #{dngdzgwzdgjhz}, + #{dngdzgwzzdgjhz}, + #{dnmkdygyqwgjhz}, + #{dnmkdygyzdgjhz}, + #{dnmkdygyyzgjhz}, + #{dnmkdyqyqwgjhz}, + #{dnmkdyqyzdgjhz}, + #{dnmkdyqyyzgjhz}, + #{dycjsl}, + #{wdcjsl}, + #{didodi0}, + #{didodi1}, + #{didodi2}, + #{didodi3}, + #{didodi4}, + #{didodi5}, + #{didodi6}, + #{didodi7}, + #{didodi8}, + #{didodi9}, + #{didodi10}, + #{didodi11}, + #{didodi12}, + #{kttxsl}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_stack_alarm_data + + data_timestamp = #{dataTimestamp}, + site_id = #{siteId}, + device_id = #{deviceId}, + bmsgzzt = #{bmsgzzt}, + jczt = #{jczt}, + jfzt = #{jfzt}, + dngzddyqyqdgjhz = #{dngzddyqyqdgjhz}, + dngzddyqyzdgjhz = #{dngzddyqyzdgjhz}, + dngzddyqyzzdgjhz = #{dngzddyqyzzdgjhz}, + dngzddygyqdgjhz = #{dngzddygyqdgjhz}, + dngzddygyzdgjhz = #{dngzddygyzdgjhz}, + dngzddygyzzdgjhz = #{dngzddygyzzdgjhz}, + dngzdglqdgjhz = #{dngzdglqdgjhz}, + dngzdglzdgjhz = #{dngzdglzdgjhz}, + dngzdglzzdgjhz = #{dngzdglzzdgjhz}, + dngzjydzdqdgjhz = #{dngzjydzdqdgjhz}, + dngzjydzdzdgjhz = #{dngzjydzdzdgjhz}, + dngzjydzdzzdgjhz = #{dngzjydzdzzdgjhz}, + dngzmkqwdqdgjhz = #{dngzmkqwdqdgjhz}, + dngzmkqwdzdgjhz = #{dngzmkqwdzdgjhz}, + dngzmkqwdzzdgjhz = #{dngzmkqwdzzdgjhz}, + dngzmkgwdqdgjhz = #{dngzmkgwdqdgjhz}, + dngzmkgwdzdgjhz = #{dngzmkgwdzdgjhz}, + dngzmkgwdzzdgjhz = #{dngzmkgwdzzdgjhz}, + dngdtgyqwgjhz = #{dngdtgyqwgjhz}, + dngdtgyzdgjhz = #{dngdtgyzdgjhz}, + dngdtgyyzgjhz = #{dngdtgyyzgjhz}, + dngdtqyqwgjhz = #{dngdtqyqwgjhz}, + dngdtqyzdgjhz = #{dngdtqyzdgjhz}, + dngdtqyyzgjhz = #{dngdtqyyzgjhz}, + dngdtycqwgjhz = #{dngdtycqwgjhz}, + dngdtyczdgjhz = #{dngdtyczdgjhz}, + dngdtycyzgjhz = #{dngdtycyzgjhz}, + dngdtqwqwgjhz = #{dngdtqwqwgjhz}, + dngdtqwzdgjhz = #{dngdtqwzdgjhz}, + dngdtqwyzgjhz = #{dngdtqwyzgjhz}, + dngdtgwqwgjhz = #{dngdtgwqwgjhz}, + dngdtgwzdgjhz = #{dngdtgwzdgjhz}, + dngdtgwyzgjhz = #{dngdtgwyzgjhz}, + dngdtwcqwgjhz = #{dngdtwcqwgjhz}, + dngdtwczdgjhz = #{dngdtwczdgjhz}, + dngdtwcyzgjhz = #{dngdtwcyzgjhz}, + dtsocdqwgjhz = #{dtsocdqwgjhz}, + dtsocdzdgjhz = #{dtsocdzdgjhz}, + dtsocdyzgjhz = #{dtsocdyzgjhz}, + dtsocgqwgjhz = #{dtsocgqwgjhz}, + dtsocgzdgjhz = #{dtsocgzdgjhz}, + dtsocgyzgjhz = #{dtsocgyzgjhz}, + dtsohdqwgjhz = #{dtsohdqwgjhz}, + dtsohdzdgjhz = #{dtsohdzdgjhz}, + dtsohdyzgjhz = #{dtsohdyzgjhz}, + dtsohgqwgjhz = #{dtsohgqwgjhz}, + dtsohgzdgjhz = #{dtsohgzdgjhz}, + dtsohgyzgjhz = #{dtsohgyzgjhz}, + dngzkslhz = #{dngzkslhz}, + dngckslgjhz = #{dngckslgjhz}, + dngzdyyc = #{dngzdyyc}, + dnjcqdkyc = #{dnjcqdkyc}, + dnjcqbhyc = #{dnjcqbhyc}, + cdjz = #{cdjz}, + fdjz = #{fdjz}, + bmsxtgjhz = #{bmsxtgjhz}, + bmsxtgzhz = #{bmsxtgzhz}, + srin0 = #{srin0}, + srin1 = #{srin1}, + srin2 = #{srin2}, + srin3 = #{srin3}, + yl1 = #{yl1}, + yl2 = #{yl2}, + yl3 = #{yl3}, + yl4 = #{yl4}, + yl5 = #{yl5}, + yl6 = #{yl6}, + yl7 = #{yl7}, + yl8 = #{yl8}, + dngdzgwqwgjhz = #{dngdzgwqwgjhz}, + dngdzgwzdgjhz = #{dngdzgwzdgjhz}, + dngdzgwzzdgjhz = #{dngdzgwzzdgjhz}, + dnmkdygyqwgjhz = #{dnmkdygyqwgjhz}, + dnmkdygyzdgjhz = #{dnmkdygyzdgjhz}, + dnmkdygyyzgjhz = #{dnmkdygyyzgjhz}, + dnmkdyqyqwgjhz = #{dnmkdyqyqwgjhz}, + dnmkdyqyzdgjhz = #{dnmkdyqyzdgjhz}, + dnmkdyqyyzgjhz = #{dnmkdyqyyzgjhz}, + dycjsl = #{dycjsl}, + wdcjsl = #{wdcjsl}, + didodi0 = #{didodi0}, + didodi1 = #{didodi1}, + didodi2 = #{didodi2}, + didodi3 = #{didodi3}, + didodi4 = #{didodi4}, + didodi5 = #{didodi5}, + didodi6 = #{didodi6}, + didodi7 = #{didodi7}, + didodi8 = #{didodi8}, + didodi9 = #{didodi9}, + didodi10 = #{didodi10}, + didodi11 = #{didodi11}, + didodi12 = #{didodi12}, + kttxsl = #{kttxsl}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_stack_alarm_data where id = #{id} + + + + delete from ems_stack_alarm_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyCurveMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyCurveMapper.xml new file mode 100644 index 0000000..c651646 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyCurveMapper.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, strategy_id, task_number, start_date, end_date, power_data, create_by, create_time, update_by, update_time, remark, site_id, template_id, month, isDelete from ems_strategy_curve + + + + + + + + insert into ems_strategy_curve + + strategy_id, + task_number, + start_date, + end_date, + power_data, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + template_id, + month, + isDelete, + + + #{strategyId}, + #{taskNumber}, + #{startDate}, + #{endDate}, + #{powerData}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{templateId}, + #{month}, + #{isDelete}, + + + + + update ems_strategy_curve + + strategy_id = #{strategyId}, + task_number = #{taskNumber}, + start_date = #{startDate}, + end_date = #{endDate}, + power_data = #{powerData}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + template_id = #{templateId}, + month = #{month}, + isDelete = #{isDelete}, + + where id = #{id} + + + + delete from ems_strategy_curve where id = #{id} + + + + delete from ems_strategy_curve where id in + + #{id} + + + + + + + update ems_strategy_curve set isDelete = 0 + where site_id = #{siteId} + and strategy_id = #{strategyId} + + + + update ems_strategy_curve set isDelete = 0 + where template_id = #{templateId} + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyLogMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyLogMapper.xml new file mode 100644 index 0000000..11a7aba --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyLogMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, strategy_id, template_id, site_id, device_id, start_time, end_time, charge_discharge_power, charge_status, execution_date, anti_reverse, power_down_type, create_by, create_time, update_by, update_time, remark from ems_strategy_log + + + + + + + + insert into ems_strategy_log + + strategy_id, + template_id, + site_id, + device_id, + start_time, + end_time, + charge_discharge_power, + charge_status, + execution_date, + anti_reverse, + power_down_type, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{strategyId}, + #{templateId}, + #{siteId}, + #{deviceId}, + #{startTime}, + #{endTime}, + #{chargeDischargePower}, + #{chargeStatus}, + #{executionDate}, + #{antiReverse}, + #{powerDownType}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update ems_strategy_log + + strategy_id = #{strategyId}, + template_id = #{templateId}, + site_id = #{siteId}, + device_id = #{deviceId}, + start_time = #{startTime}, + end_time = #{endTime}, + charge_discharge_power = #{chargeDischargePower}, + charge_status = #{chargeStatus}, + execution_date = #{executionDate}, + anti_reverse = #{antiReverse}, + power_down_type = #{powerDownType}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_strategy_log where id = #{id} + + + + delete from ems_strategy_log where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyMapper.xml new file mode 100644 index 0000000..b286573 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyMapper.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + select id, strategy_name, strategy_type, status, create_time, update_time, description, main_strategy from ems_strategy + + + + + + + + insert into ems_strategy + + strategy_name, + strategy_type, + status, + create_time, + update_time, + description, + main_strategy, + + + #{strategyName}, + #{strategyType}, + #{status}, + #{createTime}, + #{updateTime}, + #{description}, + #{mainStrategy}, + + + + + update ems_strategy + + strategy_name = #{strategyName}, + strategy_type = #{strategyType}, + status = #{status}, + create_time = #{createTime}, + update_time = #{updateTime}, + description = #{description}, + main_strategy = #{mainStrategy}, + + where id = #{id} + + + + delete from ems_strategy where id = #{id} + + + + delete from ems_strategy where id in + + #{id} + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyRunningMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyRunningMapper.xml new file mode 100644 index 0000000..8d78504 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyRunningMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + select id, main_strategy_id, auxiliary_strategy_id, status, create_time, update_time, site_id, device_id, remark from ems_strategy_running + + + + + + + + insert into ems_strategy_running + + main_strategy_id, + auxiliary_strategy_id, + status, + create_time, + update_time, + site_id, + device_id, + remark, + + + #{mainStrategyId}, + #{auxiliaryStrategyId}, + #{status}, + #{createTime}, + #{updateTime}, + #{siteId}, + #{deviceId}, + #{remark}, + + + + + update ems_strategy_running + + main_strategy_id = #{mainStrategyId}, + auxiliary_strategy_id = #{auxiliaryStrategyId}, + status = #{status}, + create_time = #{createTime}, + update_time = #{updateTime}, + site_id = #{siteId}, + device_id = #{deviceId}, + remark = #{remark}, + + where id = #{id} + + + + delete from ems_strategy_running where id = #{id} + + + + delete from ems_strategy_running where id in + + #{id} + + + + + + + update ems_strategy_running set `status`= 4 where id = #{id} + + + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyTempMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyTempMapper.xml new file mode 100644 index 0000000..747078c --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyTempMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select id, strategy_id, template_name, sdc_limit, sdc_down, sdc_up, start_time, end_time, charge_discharge_power, charge_status, create_by, create_time, update_by, update_time, remark, site_id, template_id from ems_strategy_temp + + + + + + + + insert into ems_strategy_temp + + strategy_id, + template_name, + sdc_limit, + sdc_down, + sdc_up, + start_time, + end_time, + charge_discharge_power, + charge_status, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + template_id, + + + #{strategyId}, + #{templateName}, + #{sdcLimit}, + #{sdcDown}, + #{sdcUp}, + #{startTime}, + #{endTime}, + #{chargeDischargePower}, + #{chargeStatus}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{templateId}, + + + + + update ems_strategy_temp + + strategy_id = #{strategyId}, + template_name = #{templateName}, + sdc_limit = #{sdcLimit}, + sdc_down = #{sdcDown}, + sdc_up = #{sdcUp}, + start_time = #{startTime}, + end_time = #{endTime}, + charge_discharge_power = #{chargeDischargePower}, + charge_status = #{chargeStatus}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + template_id = #{templateId}, + + where id = #{id} + + + + delete from ems_strategy_temp where id = #{id} + + + + delete from ems_strategy_temp where id in + + #{id} + + + + + + + + + + + delete from ems_strategy_temp where template_id = #{templateId} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsStrategyTimeConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsStrategyTimeConfigMapper.xml new file mode 100644 index 0000000..3138f41 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsStrategyTimeConfigMapper.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + select id, strategy_id, month, charge_discharge_mode, create_by, create_time, update_by, update_time, remark, site_id, template_id, isPost from ems_strategy_time_config + + + + + + + + insert into ems_strategy_time_config + + strategy_id, + month, + charge_discharge_mode, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + template_id, + isPost, + + + #{strategyId}, + #{month}, + #{chargeDischargeMode}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{templateId}, + #{isPost}, + + + + + update ems_strategy_time_config + + strategy_id = #{strategyId}, + month = #{month}, + charge_discharge_mode = #{chargeDischargeMode}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + template_id = #{templateId}, + isPost = #{isPost}, + + where id = #{id} + + + + delete from ems_strategy_time_config where id = #{id} + + + + delete from ems_strategy_time_config where id in + + #{id} + + + + + + + update ems_strategy_time_config set template_id = '' where template_id = #{templateId} + + + + + + update ems_strategy_time_config set isPost = 1 where template_id = #{templateId} + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsTicketMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsTicketMapper.xml new file mode 100644 index 0000000..fe7ef31 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsTicketMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, ticket_no, user_id, title, content, images, status, expected_complete_time, complete_time, create_time, create_by, update_by, update_time, work_user_id, isDelete from ems_ticket + + + + + + + + insert into ems_ticket + + ticket_no, + user_id, + title, + content, + images, + status, + expected_complete_time, + complete_time, + create_time, + create_by, + update_by, + update_time, + work_user_id, + isDelete, + + + #{ticketNo}, + #{userId}, + #{title}, + #{content}, + #{images}, + #{status}, + #{expectedCompleteTime}, + #{completeTime}, + #{createTime}, + #{createBy}, + #{updateBy}, + #{updateTime}, + #{workUserId}, + #{isDelete}, + + + + + update ems_ticket + + ticket_no = #{ticketNo}, + user_id = #{userId}, + title = #{title}, + content = #{content}, + images = #{images}, + status = #{status}, + expected_complete_time = #{expectedCompleteTime}, + complete_time = #{completeTime}, + create_time = #{createTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + update_time = #{updateTime}, + work_user_id = #{workUserId}, + isDelete = #{isDelete}, + + where id = #{id} + + + + delete from ems_ticket where id = #{id} + + + + delete from ems_ticket where id in + + #{id} + + + + + update ems_ticket set isDelete = 0 where id = #{id} + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsXfDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsXfDataMapper.xml new file mode 100644 index 0000000..45bcf36 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/EmsXfDataMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + select id, data_timestamp, dczt, yszt, pszt, dcfzt, create_by, create_time, update_by, update_time, remark, site_id, device_id from ems_xf_data + + + + + + + + insert into ems_xf_data + + data_timestamp, + dczt, + yszt, + pszt, + dcfzt, + create_by, + create_time, + update_by, + update_time, + remark, + site_id, + device_id, + + + #{dataTimestamp}, + #{dczt}, + #{yszt}, + #{pszt}, + #{dcfzt}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + #{siteId}, + #{deviceId}, + + + + + update ems_xf_data + + data_timestamp = #{dataTimestamp}, + dczt = #{dczt}, + yszt = #{yszt}, + pszt = #{pszt}, + dcfzt = #{dcfzt}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + site_id = #{siteId}, + device_id = #{deviceId}, + + where id = #{id} + + + + delete from ems_xf_data where id = #{id} + + + + delete from ems_xf_data where id in + + #{id} + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/MqttSyncLogMapper.xml b/ems-system/src/main/resources/mapper/ems/MqttSyncLogMapper.xml new file mode 100644 index 0000000..01a0bd6 --- /dev/null +++ b/ems-system/src/main/resources/mapper/ems/MqttSyncLogMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + select id, sync_id, topic, operate_type, table_name, content, status, error_msg, sync_object, target, create_time from mqtt_sync_log + + + + + + + + insert into mqtt_sync_log + + sync_id, + topic, + operate_type, + table_name, + content, + status, + error_msg, + sync_object, + target, + create_time, + + + #{syncId}, + #{topic}, + #{operateType}, + #{tableName}, + #{content}, + #{status}, + #{errorMsg}, + #{syncObject}, + #{target}, + #{createTime}, + + + + + update mqtt_sync_log + + sync_id = #{syncId}, + topic = #{topic}, + operate_type = #{operateType}, + table_name = #{tableName}, + content = #{content}, + status = #{status}, + error_msg = #{errorMsg}, + sync_object = #{syncObject}, + target = #{target}, + create_time = #{createTime}, + + where id = #{id} + + + + delete from mqtt_sync_log where id = #{id} + + + + delete from mqtt_sync_log where id in + + #{id} + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/system/SysUserMapper.xml b/ems-system/src/main/resources/mapper/system/SysUserMapper.xml index 8323545..c8751d2 100644 --- a/ems-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ems-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -24,7 +24,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + @@ -49,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.remark, - d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + d.dept_id, d.parent_id, d.ancestors, d.dept_name, u.belong_site , d.order_num, d.leader, d.status as dept_status, r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status from sys_user u left join sys_dept d on u.dept_id = d.dept_id @@ -158,6 +159,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" pwd_update_date, create_by, remark, + belong_site, create_time )values( #{userId}, @@ -173,6 +175,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{pwdUpdateDate}, #{createBy}, #{remark}, + #{belongSite}, sysdate() ) @@ -192,6 +195,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" login_date = #{loginDate}, update_by = #{updateBy}, remark = #{remark}, + belong_site = #{belongSite}, update_time = sysdate() where user_id = #{userId} diff --git a/pom.xml b/pom.xml index dfc25b0..d56bd7d 100644 --- a/pom.xml +++ b/pom.xml @@ -154,7 +154,34 @@ poi-ooxml ${poi.version} + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + + org.springframework.integration + spring-integration-mqtt + + + + com.infiniteautomation + modbus4j + 3.1.0 + + + + io.github.resilience4j + resilience4j-annotations + 1.7.1 + + + org.springframework.retry + spring-retry + 1.3.4 + org.apache.velocity