diff --git a/README.md b/README.md
index 10c6b52..bdcfb0f 100644
--- a/README.md
+++ b/README.md
@@ -42,53 +42,3 @@
16. 缓存监控:对系统的缓存信息查询,命令统计等。
17. 在线构建器:拖动表单元素生成相应的HTML代码。
18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
-
-## 在线体验
-
-- admin/admin123
-- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
-
-演示地址:http://vue.ruoyi.vip
-文档地址:http://doc.ruoyi.vip
-
-## 演示图
-
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-  |
-  |
-
-
-
-
-## 若依前后端分离交流群
-
-QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GsOo-OLz53J8y_9TPoO6XXSGNRTgbFxA&authKey=R7Uy%2Feq%2BZsoKNqHvRKhiXpypW7DAogoWapOawUGHokJSBIBIre2%2FoiAZeZBSLuBc&noverify=0&group_code=191164766) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=PmYavuzsOthVqfdAPbo4uAeIbu7Ttjgc&authKey=p52l8%2FXa4PS1JcEmS3VccKSwOPJUZ1ZfQ69MEKzbrooNUljRtlKjvsXf04bxNp3G&noverify=0&group_code=174569686) 点击按钮入群。
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9d54e53..01e3267 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
org.springframework.boot
spring-boot-starter
-
+
com.github.xiaoymin
knife4j-spring-boot-starter
@@ -104,7 +104,7 @@
mysql
mysql-connector-java
- runtime
+
@@ -298,8 +298,8 @@
org.apache.maven.plugins
maven-compiler-plugin
- 14
- 14
+ 16
+ 16
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsChargeDetailController.java b/src/main/java/com/evobms/project/bms/controller/BmsChargeDetailController.java
new file mode 100644
index 0000000..ee6a363
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsChargeDetailController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsChargeDetail;
+import com.evobms.project.bms.service.IBmsChargeDetailService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS充电过程详细数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/chargedetail/data")
+public class BmsChargeDetailController extends BaseController
+{
+ @Autowired
+ private IBmsChargeDetailService bmsChargeDetailService;
+
+ /**
+ * 查询BMS充电过程详细数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsChargeDetail bmsChargeDetail)
+ {
+ startPage();
+ List list = bmsChargeDetailService.selectBmsChargeDetailList(bmsChargeDetail);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS充电过程详细数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS充电过程详细数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsChargeDetail bmsChargeDetail)
+ {
+ List list = bmsChargeDetailService.selectBmsChargeDetailList(bmsChargeDetail);
+ ExcelUtil util = new ExcelUtil(BmsChargeDetail.class);
+ util.exportExcel(response, list, "BMS充电过程详细数据数据");
+ }
+
+ /**
+ * 获取BMS充电过程详细数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsChargeDetailService.selectBmsChargeDetailById(id));
+ }
+
+ /**
+ * 新增BMS充电过程详细数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS充电过程详细数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsChargeDetail bmsChargeDetail)
+ {
+ return toAjax(bmsChargeDetailService.insertBmsChargeDetail(bmsChargeDetail));
+ }
+
+ /**
+ * 修改BMS充电过程详细数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS充电过程详细数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsChargeDetail bmsChargeDetail)
+ {
+ return toAjax(bmsChargeDetailService.updateBmsChargeDetail(bmsChargeDetail));
+ }
+
+ /**
+ * 删除BMS充电过程详细数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS充电过程详细数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsChargeDetailService.deleteBmsChargeDetailByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsChargeTemperatureController.java b/src/main/java/com/evobms/project/bms/controller/BmsChargeTemperatureController.java
new file mode 100644
index 0000000..ba81bca
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsChargeTemperatureController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsChargeTemperature;
+import com.evobms.project.bms.service.IBmsChargeTemperatureService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS充电座温度数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/chargetemperature/data")
+public class BmsChargeTemperatureController extends BaseController
+{
+ @Autowired
+ private IBmsChargeTemperatureService bmsChargeTemperatureService;
+
+ /**
+ * 查询BMS充电座温度数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsChargeTemperature bmsChargeTemperature)
+ {
+ startPage();
+ List list = bmsChargeTemperatureService.selectBmsChargeTemperatureList(bmsChargeTemperature);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS充电座温度数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS充电座温度数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsChargeTemperature bmsChargeTemperature)
+ {
+ List list = bmsChargeTemperatureService.selectBmsChargeTemperatureList(bmsChargeTemperature);
+ ExcelUtil util = new ExcelUtil(BmsChargeTemperature.class);
+ util.exportExcel(response, list, "BMS充电座温度数据数据");
+ }
+
+ /**
+ * 获取BMS充电座温度数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsChargeTemperatureService.selectBmsChargeTemperatureById(id));
+ }
+
+ /**
+ * 新增BMS充电座温度数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS充电座温度数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsChargeTemperature bmsChargeTemperature)
+ {
+ return toAjax(bmsChargeTemperatureService.insertBmsChargeTemperature(bmsChargeTemperature));
+ }
+
+ /**
+ * 修改BMS充电座温度数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS充电座温度数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsChargeTemperature bmsChargeTemperature)
+ {
+ return toAjax(bmsChargeTemperatureService.updateBmsChargeTemperature(bmsChargeTemperature));
+ }
+
+ /**
+ * 删除BMS充电座温度数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS充电座温度数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsChargeTemperatureService.deleteBmsChargeTemperatureByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsRuntimeDataController.java b/src/main/java/com/evobms/project/bms/controller/BmsRuntimeDataController.java
new file mode 100644
index 0000000..9fa8c3f
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsRuntimeDataController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsRuntimeData;
+import com.evobms.project.bms.service.IBmsRuntimeDataService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS实时运行数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/runtime/data")
+public class BmsRuntimeDataController extends BaseController
+{
+ @Autowired
+ private IBmsRuntimeDataService bmsRuntimeDataService;
+
+ /**
+ * 查询BMS实时运行数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsRuntimeData bmsRuntimeData)
+ {
+ startPage();
+ List list = bmsRuntimeDataService.selectBmsRuntimeDataList(bmsRuntimeData);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS实时运行数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS实时运行数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsRuntimeData bmsRuntimeData)
+ {
+ List list = bmsRuntimeDataService.selectBmsRuntimeDataList(bmsRuntimeData);
+ ExcelUtil util = new ExcelUtil(BmsRuntimeData.class);
+ util.exportExcel(response, list, "BMS实时运行数据数据");
+ }
+
+ /**
+ * 获取BMS实时运行数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsRuntimeDataService.selectBmsRuntimeDataById(id));
+ }
+
+ /**
+ * 新增BMS实时运行数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS实时运行数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsRuntimeData bmsRuntimeData)
+ {
+ return toAjax(bmsRuntimeDataService.insertBmsRuntimeData(bmsRuntimeData));
+ }
+
+ /**
+ * 修改BMS实时运行数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS实时运行数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsRuntimeData bmsRuntimeData)
+ {
+ return toAjax(bmsRuntimeDataService.updateBmsRuntimeData(bmsRuntimeData));
+ }
+
+ /**
+ * 删除BMS实时运行数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS实时运行数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsRuntimeDataService.deleteBmsRuntimeDataByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsSopDataController.java b/src/main/java/com/evobms/project/bms/controller/BmsSopDataController.java
new file mode 100644
index 0000000..31f4cba
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsSopDataController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsSopData;
+import com.evobms.project.bms.service.IBmsSopDataService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS功率能力(SOP)数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/sop/data")
+public class BmsSopDataController extends BaseController
+{
+ @Autowired
+ private IBmsSopDataService bmsSopDataService;
+
+ /**
+ * 查询BMS功率能力(SOP)数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsSopData bmsSopData)
+ {
+ startPage();
+ List list = bmsSopDataService.selectBmsSopDataList(bmsSopData);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS功率能力(SOP)数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS功率能力(SOP)数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsSopData bmsSopData)
+ {
+ List list = bmsSopDataService.selectBmsSopDataList(bmsSopData);
+ ExcelUtil util = new ExcelUtil(BmsSopData.class);
+ util.exportExcel(response, list, "BMS功率能力(SOP)数据数据");
+ }
+
+ /**
+ * 获取BMS功率能力(SOP)数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsSopDataService.selectBmsSopDataById(id));
+ }
+
+ /**
+ * 新增BMS功率能力(SOP)数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS功率能力(SOP)数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsSopData bmsSopData)
+ {
+ return toAjax(bmsSopDataService.insertBmsSopData(bmsSopData));
+ }
+
+ /**
+ * 修改BMS功率能力(SOP)数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS功率能力(SOP)数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsSopData bmsSopData)
+ {
+ return toAjax(bmsSopDataService.updateBmsSopData(bmsSopData));
+ }
+
+ /**
+ * 删除BMS功率能力(SOP)数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS功率能力(SOP)数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsSopDataService.deleteBmsSopDataByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsSystemStatusController.java b/src/main/java/com/evobms/project/bms/controller/BmsSystemStatusController.java
new file mode 100644
index 0000000..ce22a43
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsSystemStatusController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsSystemStatus;
+import com.evobms.project.bms.service.IBmsSystemStatusService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS系统状态数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/systemstatus/data")
+public class BmsSystemStatusController extends BaseController
+{
+ @Autowired
+ private IBmsSystemStatusService bmsSystemStatusService;
+
+ /**
+ * 查询BMS系统状态数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsSystemStatus bmsSystemStatus)
+ {
+ startPage();
+ List list = bmsSystemStatusService.selectBmsSystemStatusList(bmsSystemStatus);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS系统状态数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS系统状态数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsSystemStatus bmsSystemStatus)
+ {
+ List list = bmsSystemStatusService.selectBmsSystemStatusList(bmsSystemStatus);
+ ExcelUtil util = new ExcelUtil(BmsSystemStatus.class);
+ util.exportExcel(response, list, "BMS系统状态数据数据");
+ }
+
+ /**
+ * 获取BMS系统状态数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsSystemStatusService.selectBmsSystemStatusById(id));
+ }
+
+ /**
+ * 新增BMS系统状态数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS系统状态数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsSystemStatus bmsSystemStatus)
+ {
+ return toAjax(bmsSystemStatusService.insertBmsSystemStatus(bmsSystemStatus));
+ }
+
+ /**
+ * 修改BMS系统状态数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS系统状态数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsSystemStatus bmsSystemStatus)
+ {
+ return toAjax(bmsSystemStatusService.updateBmsSystemStatus(bmsSystemStatus));
+ }
+
+ /**
+ * 删除BMS系统状态数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS系统状态数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsSystemStatusService.deleteBmsSystemStatusByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/BmsVoltageChannelDataController.java b/src/main/java/com/evobms/project/bms/controller/BmsVoltageChannelDataController.java
new file mode 100644
index 0000000..8984dbc
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/controller/BmsVoltageChannelDataController.java
@@ -0,0 +1,104 @@
+package com.evobms.project.bms.controller;
+
+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.evobms.framework.aspectj.lang.annotation.Log;
+import com.evobms.framework.aspectj.lang.enums.BusinessType;
+import com.evobms.project.bms.domain.BmsVoltageChannelData;
+import com.evobms.project.bms.service.IBmsVoltageChannelDataService;
+import com.evobms.framework.web.controller.BaseController;
+import com.evobms.framework.web.domain.AjaxResult;
+import com.evobms.common.utils.poi.ExcelUtil;
+import com.evobms.framework.web.page.TableDataInfo;
+
+/**
+ * BMS电压通道数据Controller
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@RestController
+@RequestMapping("/bms/voltagechannel/data")
+public class BmsVoltageChannelDataController extends BaseController
+{
+ @Autowired
+ private IBmsVoltageChannelDataService bmsVoltageChannelDataService;
+
+ /**
+ * 查询BMS电压通道数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ startPage();
+ List list = bmsVoltageChannelDataService.selectBmsVoltageChannelDataList(bmsVoltageChannelData);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出BMS电压通道数据列表
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:export')")
+ @Log(title = "BMS电压通道数据", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ List list = bmsVoltageChannelDataService.selectBmsVoltageChannelDataList(bmsVoltageChannelData);
+ ExcelUtil util = new ExcelUtil(BmsVoltageChannelData.class);
+ util.exportExcel(response, list, "BMS电压通道数据数据");
+ }
+
+ /**
+ * 获取BMS电压通道数据详细信息
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ return success(bmsVoltageChannelDataService.selectBmsVoltageChannelDataById(id));
+ }
+
+ /**
+ * 新增BMS电压通道数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:add')")
+ @Log(title = "BMS电压通道数据", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ return toAjax(bmsVoltageChannelDataService.insertBmsVoltageChannelData(bmsVoltageChannelData));
+ }
+
+ /**
+ * 修改BMS电压通道数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:edit')")
+ @Log(title = "BMS电压通道数据", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ return toAjax(bmsVoltageChannelDataService.updateBmsVoltageChannelData(bmsVoltageChannelData));
+ }
+
+ /**
+ * 删除BMS电压通道数据
+ */
+ @PreAuthorize("@ss.hasPermi('bms:data:remove')")
+ @Log(title = "BMS电压通道数据", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids)
+ {
+ return toAjax(bmsVoltageChannelDataService.deleteBmsVoltageChannelDataByIds(ids));
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java b/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java
index cc795d7..78ba944 100644
--- a/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java
+++ b/src/main/java/com/evobms/project/bms/controller/GBT32960MqttReceiver.java
@@ -2,48 +2,68 @@ package com.evobms.project.bms.controller;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
+@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true")
public class GBT32960MqttReceiver {
- private static final String BROKER = "tcp://localhost:1883";
- private static final String CLIENT_ID = "evobms-client";
- private static final String TOPIC = "/bbox/EVO0002/#";
- private static final String DEVICE_SN = "EVO0002";
+ @Value("${mqtt.host}")
+ private String broker;
+ @Value("${mqtt.clientId}")
+ private String clientId;
+ @Value("${mqtt.username:}")
+ private String username;
+ @Value("${mqtt.password:}")
+ private String password;
+ @Value("${mqtt.connectionTimeout:30}")
+ private int connectionTimeout;
+ @Value("${mqtt.keepAliveInterval:60}")
+ private int keepAliveInterval;
+ @Value("${mqtt.automaticReconnect:true}")
+ private boolean automaticReconnect;
+ @Value("${mqtt.cleanSession:true}")
+ private boolean cleanSession;
+ @Value("${mqtt.subscribeTopic:/bbox/+/#}")
+ private String subscribeTopic;
@Bean
- public void initMQtt() throws MqttException {
- MqttClient client = new MqttClient(BROKER, CLIENT_ID, new MemoryPersistence());
+ public void initMQtt() {
+ try {
+ MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());
- MqttConnectOptions options = new MqttConnectOptions();
- options.setCleanSession(true);
-
- client.setCallback(new MqttCallback() {
- @Override
- public void connectionLost(Throwable cause) {
- System.out.println("MQTT连接断开: " + cause.getMessage());
+ MqttConnectOptions options = new MqttConnectOptions();
+ options.setCleanSession(cleanSession);
+ options.setAutomaticReconnect(automaticReconnect);
+ options.setConnectionTimeout(connectionTimeout);
+ options.setKeepAliveInterval(keepAliveInterval);
+ if (username != null && !username.isEmpty()) {
+ options.setUserName(username);
+ }
+ if (password != null && !password.isEmpty()) {
+ options.setPassword(password.toCharArray());
}
- @Override
- public void messageArrived(String topic, MqttMessage message) {
- System.out.println("\n收到MQTT消息,主题: " + topic);
- System.out.println("QoS: " + message.getQos());
+ client.setCallback(new MqttCallback() {
+ @Override
+ public void connectionLost(Throwable cause) {
+ }
- // 直接处理字节数组
- byte[] payload = message.getPayload();
- // GBT32960FullDecoder.parseGBT32960Data(payload, DEVICE_SN);
+ @Override
+ public void messageArrived(String topic, MqttMessage message) {
+ byte[] payload = message.getPayload();
+ }
- }
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken token) {
+ }
+ });
- @Override
- public void deliveryComplete(IMqttDeliveryToken token) {
- // 发布完成回调
- }
- });
-
- client.connect(options);
- client.subscribe(TOPIC);
- System.out.println("已成功连接到MQTT Broker并订阅主题: " + TOPIC);
+ client.connect(options);
+ client.subscribe(subscribeTopic);
+ } catch (Exception e) {
+ }
}
}
diff --git a/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java b/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java
index 03f0edb..37f9664 100644
--- a/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java
+++ b/src/main/java/com/evobms/project/bms/controller/MqttPublishController.java
@@ -48,7 +48,6 @@ public class MqttPublishController {
if (mqttService == null) {
return AjaxResult.error("MQTT服务未启用");
}
-
mqttService.sendMessage(topic, message);
log.info("发布消息成功 -> 主题: {}, 内容: {}", topic, message);
return AjaxResult.success("消息发布成功", "主题: " + topic + ", 内容: " + message);
diff --git a/src/main/java/com/evobms/project/bms/controller/MqttTestController.java b/src/main/java/com/evobms/project/bms/controller/MqttTestController.java
index ce5da7f..f7da812 100644
--- a/src/main/java/com/evobms/project/bms/controller/MqttTestController.java
+++ b/src/main/java/com/evobms/project/bms/controller/MqttTestController.java
@@ -38,9 +38,7 @@ public class MqttTestController {
public Map testHandleDeviceData(
@RequestParam String topic,
@RequestParam byte[] payload) {
-
Map result = new HashMap<>();
-
try {
// 调用handleDeviceData方法
mqttService.handleDeviceData(topic, payload);
@@ -50,14 +48,12 @@ public class MqttTestController {
result.put("message", "消息处理成功");
result.put("topic", topic);
result.put("payload", payload);
-
// 解析主题获取设备编号(模拟方法内部逻辑)
String[] topicParts = topic.split("/");
if (topicParts.length >= 3) {
String deviceCode = topicParts[1];
result.put("extractedDeviceCode", deviceCode);
}
-
} catch (Exception e) {
log.error("测试处理设备数据发生错误: {}", e.getMessage(), e);
result.put("success", false);
@@ -70,7 +66,6 @@ public class MqttTestController {
/**
* 生成测试数据
- *
* @return 测试用的JSON数据
*/
@GetMapping("/generateTestData")
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsChargeDetail.java b/src/main/java/com/evobms/project/bms/domain/BmsChargeDetail.java
index 6a7cf38..a740017 100644
--- a/src/main/java/com/evobms/project/bms/domain/BmsChargeDetail.java
+++ b/src/main/java/com/evobms/project/bms/domain/BmsChargeDetail.java
@@ -1,75 +1,87 @@
package com.evobms.project.bms.domain;
+import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import com.github.xiaoymin.knife4j.annotations.Ignore;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
import com.evobms.framework.aspectj.lang.annotation.Excel;
import com.evobms.framework.web.domain.BaseEntity;
+/**
+ * BMS充电过程详细数据对象 bms_charge_detail
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@EqualsAndHashCode(callSuper = true)
@Data
-@ApiModel(description = "BMS充电过程详细数据")
-public class BmsChargeDetail extends BaseEntity {
+public class BmsChargeDetail extends BaseEntity
+{
private static final long serialVersionUID = 1L;
- @ApiModelProperty("主键ID")
+ /** 主键ID */
private Long id;
- @ApiModelProperty("设备ID")
+ /** 设备ID */
@Excel(name = "设备ID")
private String deviceId;
- @ApiModelProperty("数据时间戳")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
private Date timestamp;
- @ApiModelProperty("慢充电流(A)")
+ /** 慢充电流(A) */
@Excel(name = "慢充电流(A)")
- private java.math.BigDecimal acChargeCurrent;
+ private BigDecimal acChargeCurrent;
- @ApiModelProperty("慢充电压(V)")
+ /** 慢充电压(V) */
@Excel(name = "慢充电压(V)")
- private java.math.BigDecimal acChargeVoltage;
+ private BigDecimal acChargeVoltage;
- @ApiModelProperty("快充电流(A)")
+ /** 快充电流(A) */
@Excel(name = "快充电流(A)")
- private java.math.BigDecimal dcChargeCurrent;
+ private BigDecimal dcChargeCurrent;
- @ApiModelProperty("快充电压(V)")
+ /** 快充电压(V) */
@Excel(name = "快充电压(V)")
- private java.math.BigDecimal dcChargeVoltage;
+ private BigDecimal dcChargeVoltage;
- @ApiModelProperty("充电时长(min)")
+ /** 充电时长(min) */
@Excel(name = "充电时长(min)")
- private Integer chargeTime;
+ private Long chargeTime;
- @ApiModelProperty("慢充停止码")
+ /** 慢充停止码 */
@Excel(name = "慢充停止码")
private Integer acStopCode;
- @ApiModelProperty("快充停止码")
+ /** 快充停止码 */
@Excel(name = "快充停止码")
private Integer dcStopCode;
- @ApiModelProperty("慢充CP值")
+ /** 慢充CP值 */
@Excel(name = "慢充CP值")
private Integer acCpValue;
- @ApiModelProperty("慢充枪阻值")
+ /** 慢充枪阻值 */
@Excel(name = "慢充枪阻值")
private Integer acGunResistance;
- @ApiModelProperty("充电阶段")
+ /** 充电阶段 */
@Excel(name = "充电阶段")
private Integer chargingStage;
- @ApiModelProperty("慢充阶段")
+ /** 慢充阶段 */
@Excel(name = "慢充阶段")
private Integer acStage;
- @ApiModelProperty("快充阶段")
+ /** 快充阶段 */
@Excel(name = "快充阶段")
private Integer dcStage;
+
+
}
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsChargeTemperature.java b/src/main/java/com/evobms/project/bms/domain/BmsChargeTemperature.java
new file mode 100644
index 0000000..e169c0c
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/domain/BmsChargeTemperature.java
@@ -0,0 +1,47 @@
+package com.evobms.project.bms.domain;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.evobms.framework.aspectj.lang.annotation.Excel;
+import com.evobms.framework.web.domain.BaseEntity;
+
+/**
+ * BMS充电座温度数据对象 bms_charge_temperature
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BmsChargeTemperature extends BaseEntity
+{
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /** 主键ID */
+ private Long id;
+
+ /** 设备ID */
+ @Excel(name = "设备ID")
+ private String deviceId;
+
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date timestap;
+
+ /** 温度编号(1-8) */
+ @Excel(name = "温度编号(1-8)")
+ private Integer tempIndex;
+
+ /** 温度(℃) */
+ @Excel(name = "温度(℃)")
+ private BigDecimal temperature;
+
+}
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsRuntimeData.java b/src/main/java/com/evobms/project/bms/domain/BmsRuntimeData.java
new file mode 100644
index 0000000..bc9ed29
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/domain/BmsRuntimeData.java
@@ -0,0 +1,77 @@
+package com.evobms.project.bms.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.evobms.framework.aspectj.lang.annotation.Excel;
+import com.evobms.framework.web.domain.BaseEntity;
+
+/**
+ * BMS实时运行数据对象 bms_runtime_data
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BmsRuntimeData extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 主键ID */
+ private Long id;
+
+ /** 设备ID */
+ @Excel(name = "设备ID")
+ private String deviceId;
+
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date timestap;
+
+ /** 车速(km/h) */
+ @Excel(name = "车速(km/h)")
+ private BigDecimal vehicleSpeed;
+
+ /** 总里程(km) */
+ @Excel(name = "总里程(km)")
+ private Long mileage;
+
+ /** 系统电压(V) */
+ @Excel(name = "系统电压(V)")
+ private BigDecimal systemVoltage;
+
+ /** 系统电流(A) */
+ @Excel(name = "系统电流(A)")
+ private BigDecimal systemCurrent;
+
+ /** 绝缘电阻(KΩ) */
+ @Excel(name = "绝缘电阻(KΩ)")
+ private Long insulationResistance;
+
+ /** 最大SOC(%) */
+ @Excel(name = "最大SOC(%)")
+ private BigDecimal socMax;
+
+ /** 最小SOC(%) */
+ @Excel(name = "最小SOC(%)")
+ private BigDecimal socMin;
+
+ /** GPV电压(V) */
+ @Excel(name = "GPV电压(V)")
+ private BigDecimal gpvVoltage;
+
+ /** 行车阶段 */
+ @Excel(name = "行车阶段")
+ private Integer runStatus;
+
+ /** 行车上电阶段 */
+ @Excel(name = "行车上电阶段")
+ private Integer powerStatus;
+
+}
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsSopData.java b/src/main/java/com/evobms/project/bms/domain/BmsSopData.java
index 41a8de4..801de71 100644
--- a/src/main/java/com/evobms/project/bms/domain/BmsSopData.java
+++ b/src/main/java/com/evobms/project/bms/domain/BmsSopData.java
@@ -2,66 +2,86 @@ package com.evobms.project.bms.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
import com.evobms.framework.aspectj.lang.annotation.Excel;
import com.evobms.framework.web.domain.BaseEntity;
+/**
+ * BMS功率能力(SOP)数据对象 bms_sop_data
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
@Data
-@ApiModel(description = "BMS功率能力(SOP)数据")
-public class BmsSopData extends BaseEntity {
+@EqualsAndHashCode(callSuper = false)
+public class BmsSopData extends BaseEntity
+{
private static final long serialVersionUID = 1L;
- @ApiModelProperty("主键ID")
+ /** 主键ID */
private Long id;
- @ApiModelProperty("设备ID")
+ /** 设备ID */
@Excel(name = "设备ID")
private String deviceId;
- @ApiModelProperty("数据时间戳")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
- private Date timestamp;
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date timestap;
- @ApiModelProperty("10秒放电SOP(A)")
+ /** 10秒放电SOP(A) */
@Excel(name = "10秒放电SOP(A)")
- private Integer dischargeSop10s;
+ private Long dischargeSop10s;
- @ApiModelProperty("30秒放电SOP(A)")
+ /** 30秒放电SOP(A) */
@Excel(name = "30秒放电SOP(A)")
- private Integer dischargeSop30s;
+ private Long dischargeSop30s;
- @ApiModelProperty("60秒放电SOP(A)")
+ /** 60秒放电SOP(A) */
@Excel(name = "60秒放电SOP(A)")
- private Integer dischargeSop60s;
+ private Long dischargeSop60s;
- @ApiModelProperty("持续放电SOP(A)")
+ /** 持续放电SOP(A) */
@Excel(name = "持续放电SOP(A)")
- private Integer dischargeSopContinuous;
+ private Long dischargeSopContinuous;
- @ApiModelProperty("10秒回馈SOP(A)")
+ /** 放电融合SOP(A) */
+ @Excel(name = "放电融合SOP(A)")
+ private Long dischargeSopTotal;
+
+ /** 10秒回馈SOP(A) */
@Excel(name = "10秒回馈SOP(A)")
- private Integer regenSop10s;
+ private Long regenSop10s;
- @ApiModelProperty("30秒回馈SOP(A)")
+ /** 30秒回馈SOP(A) */
@Excel(name = "30秒回馈SOP(A)")
- private Integer regenSop30s;
+ private Long regenSop30s;
- @ApiModelProperty("60秒回馈SOP(A)")
+ /** 60秒回馈SOP(A) */
@Excel(name = "60秒回馈SOP(A)")
- private Integer regenSop60s;
+ private Long regenSop60s;
- @ApiModelProperty("持续回馈SOP(A)")
+ /** 持续回馈SOP(A) */
@Excel(name = "持续回馈SOP(A)")
- private Integer regenSopContinuous;
+ private Long regenSopContinuous;
- @ApiModelProperty("充电SOP(A)")
+ /** 回馈融合SOP(A) */
+ @Excel(name = "回馈融合SOP(A)")
+ private Long regenSopTotal;
+
+ /** 充电SOP(A) */
@Excel(name = "充电SOP(A)")
- private Integer chargeSop;
+ private Long chargeSop;
- @ApiModelProperty("慢充SOP(A)")
+ /** 慢充SOP(A) */
@Excel(name = "慢充SOP(A)")
- private Integer acChargeSop;
+ private Long acChargeSop;
+
+
+
+
}
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsSystemStatus.java b/src/main/java/com/evobms/project/bms/domain/BmsSystemStatus.java
index 0d65d05..913d019 100644
--- a/src/main/java/com/evobms/project/bms/domain/BmsSystemStatus.java
+++ b/src/main/java/com/evobms/project/bms/domain/BmsSystemStatus.java
@@ -1,59 +1,61 @@
package com.evobms.project.bms.domain;
+import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
import com.evobms.framework.aspectj.lang.annotation.Excel;
import com.evobms.framework.web.domain.BaseEntity;
+/**
+ * BMS系统状态数据对象 bms_system_status
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@EqualsAndHashCode(callSuper = true)
@Data
-@ApiModel(description = "BMS系统状态数据")
-public class BmsSystemStatus extends BaseEntity {
+public class BmsSystemStatus extends BaseEntity
+{
private static final long serialVersionUID = 1L;
- @ApiModelProperty("主键ID")
+ /** 主键ID */
private Long id;
- @ApiModelProperty("设备ID")
+ /** 设备ID */
@Excel(name = "设备ID")
private String deviceId;
- @ApiModelProperty("数据时间戳")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
- private Date timestamp;
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date timestap;
- @ApiModelProperty("继电器状态")
+ /** 继电器状态 */
@Excel(name = "继电器状态")
- private Integer relayStatus;
+ private Long relayStatus;
- @ApiModelProperty("ON/A+/CC状态")
+ /** ON/A+/CC状态 */
@Excel(name = "ON/A+/CC状态")
- private Integer onaaccStatus;
+ private Long onaaccStatus;
- @ApiModelProperty("系统复位次数")
+ /** 系统复位次数 */
@Excel(name = "系统复位次数")
- private Integer resetCount;
+ private Long resetCount;
- @ApiModelProperty("电池循环次数")
+ /** 电池循环次数 */
@Excel(name = "电池循环次数")
- private Integer cycleCount;
+ private Long cycleCount;
- @ApiModelProperty("2.5V采样电压(V)")
+ /** 2.5V采样电压(V) */
@Excel(name = "2.5V采样电压(V)")
- private java.math.BigDecimal sample25v;
+ private BigDecimal sample25v;
- @ApiModelProperty("5V采样电压(V)")
+ /** 5V采样电压(V) */
@Excel(name = "5V采样电压(V)")
- private java.math.BigDecimal sample5v;
+ private BigDecimal sample5v;
- @ApiModelProperty("单体数量")
- @Excel(name = "单体数量")
- private Integer cellCount;
-
- @ApiModelProperty("温度探头数量")
- @Excel(name = "温度探头数量")
- private Integer tempSensorCount;
}
diff --git a/src/main/java/com/evobms/project/bms/domain/BmsVoltageChannelData.java b/src/main/java/com/evobms/project/bms/domain/BmsVoltageChannelData.java
new file mode 100644
index 0000000..df9ba05
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/domain/BmsVoltageChannelData.java
@@ -0,0 +1,49 @@
+package com.evobms.project.bms.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.evobms.framework.aspectj.lang.annotation.Excel;
+import com.evobms.framework.web.domain.BaseEntity;
+
+/**
+ * BMS电压通道数据对象 bms_voltage_channel_data
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class BmsVoltageChannelData extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 主键ID */
+ private Long id;
+
+ /** 设备ID */
+ @Excel(name = "设备ID")
+ private String deviceId;
+
+ /** 数据时间戳 */
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @Excel(name = "数据时间戳", width = 30, dateFormat = "yyyy-MM-dd")
+ private Date timestap;
+
+ /** 通道类型(RTP/RTN) */
+ @Excel(name = "通道类型(RTP/RTN)")
+ private String channelType;
+
+ /** 通道编号 */
+ @Excel(name = "通道编号")
+ private Integer channelIndex;
+
+ /** 电压(V) */
+ @Excel(name = "电压(V)")
+ private BigDecimal voltage;
+
+}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsChargeDetailMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsChargeDetailMapper.java
index b605020..f72b6d9 100644
--- a/src/main/java/com/evobms/project/bms/mapper/BmsChargeDetailMapper.java
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsChargeDetailMapper.java
@@ -1,9 +1,61 @@
package com.evobms.project.bms.mapper;
-import com.evobms.project.bms.domain.BmsChargeDetail;
import java.util.List;
+import com.evobms.project.bms.domain.BmsChargeDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-public interface BmsChargeDetailMapper {
- int insertBmsChargeDetail(BmsChargeDetail data);
- List selectBmsChargeDetailList(BmsChargeDetail filter);
+/**
+ * BMS充电过程详细数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsChargeDetailMapper extends BaseMapper {
+ /**
+ * 查询BMS充电过程详细数据
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return BMS充电过程详细数据
+ */
+ public BmsChargeDetail selectBmsChargeDetailById(Long id);
+
+ /**
+ * 查询BMS充电过程详细数据列表
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return BMS充电过程详细数据集合
+ */
+ public List selectBmsChargeDetailList(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 新增BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ public int insertBmsChargeDetail(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 修改BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ public int updateBmsChargeDetail(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 删除BMS充电过程详细数据
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return 结果
+ */
+ public int deleteBmsChargeDetailById(Long id);
+
+ /**
+ * 批量删除BMS充电过程详细数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsChargeDetailByIds(Long[] ids);
}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsChargeTemperatureMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsChargeTemperatureMapper.java
new file mode 100644
index 0000000..3c0811a
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsChargeTemperatureMapper.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.mapper;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsChargeTemperature;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * BMS充电座温度数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsChargeTemperatureMapper extends BaseMapper {
+ /**
+ * 查询BMS充电座温度数据
+ *
+ * @param id BMS充电座温度数据主键
+ * @return BMS充电座温度数据
+ */
+ public BmsChargeTemperature selectBmsChargeTemperatureById(Long id);
+
+ /**
+ * 查询BMS充电座温度数据列表
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return BMS充电座温度数据集合
+ */
+ public List selectBmsChargeTemperatureList(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 新增BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ public int insertBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 修改BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ public int updateBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 删除BMS充电座温度数据
+ *
+ * @param id BMS充电座温度数据主键
+ * @return 结果
+ */
+ public int deleteBmsChargeTemperatureById(Long id);
+
+ /**
+ * 批量删除BMS充电座温度数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsChargeTemperatureByIds(Long[] ids);
+}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsRuntimeDataMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsRuntimeDataMapper.java
new file mode 100644
index 0000000..3153bbf
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsRuntimeDataMapper.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.mapper;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsRuntimeData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * BMS实时运行数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsRuntimeDataMapper extends BaseMapper {
+ /**
+ * 查询BMS实时运行数据
+ *
+ * @param id BMS实时运行数据主键
+ * @return BMS实时运行数据
+ */
+ public BmsRuntimeData selectBmsRuntimeDataById(Long id);
+
+ /**
+ * 查询BMS实时运行数据列表
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return BMS实时运行数据集合
+ */
+ public List selectBmsRuntimeDataList(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 新增BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ public int insertBmsRuntimeData(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 修改BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ public int updateBmsRuntimeData(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 删除BMS实时运行数据
+ *
+ * @param id BMS实时运行数据主键
+ * @return 结果
+ */
+ public int deleteBmsRuntimeDataById(Long id);
+
+ /**
+ * 批量删除BMS实时运行数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsRuntimeDataByIds(Long[] ids);
+}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsSopDataMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsSopDataMapper.java
index 65e6660..87b7336 100644
--- a/src/main/java/com/evobms/project/bms/mapper/BmsSopDataMapper.java
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsSopDataMapper.java
@@ -1,9 +1,61 @@
package com.evobms.project.bms.mapper;
-import com.evobms.project.bms.domain.BmsSopData;
import java.util.List;
+import com.evobms.project.bms.domain.BmsSopData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-public interface BmsSopDataMapper {
- int insertBmsSopData(BmsSopData data);
- List selectBmsSopDataList(BmsSopData filter);
+/**
+ * BMS功率能力(SOP)数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsSopDataMapper extends BaseMapper {
+ /**
+ * 查询BMS功率能力(SOP)数据
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return BMS功率能力(SOP)数据
+ */
+ public BmsSopData selectBmsSopDataById(Long id);
+
+ /**
+ * 查询BMS功率能力(SOP)数据列表
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return BMS功率能力(SOP)数据集合
+ */
+ public List selectBmsSopDataList(BmsSopData bmsSopData);
+
+ /**
+ * 新增BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ public int insertBmsSopData(BmsSopData bmsSopData);
+
+ /**
+ * 修改BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ public int updateBmsSopData(BmsSopData bmsSopData);
+
+ /**
+ * 删除BMS功率能力(SOP)数据
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return 结果
+ */
+ public int deleteBmsSopDataById(Long id);
+
+ /**
+ * 批量删除BMS功率能力(SOP)数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsSopDataByIds(Long[] ids);
}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsSystemStatusMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsSystemStatusMapper.java
index 1ae6a08..d8700c7 100644
--- a/src/main/java/com/evobms/project/bms/mapper/BmsSystemStatusMapper.java
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsSystemStatusMapper.java
@@ -1,9 +1,61 @@
package com.evobms.project.bms.mapper;
-import com.evobms.project.bms.domain.BmsSystemStatus;
import java.util.List;
+import com.evobms.project.bms.domain.BmsSystemStatus;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-public interface BmsSystemStatusMapper {
- int insertBmsSystemStatus(BmsSystemStatus data);
- List selectBmsSystemStatusList(BmsSystemStatus filter);
+/**
+ * BMS系统状态数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsSystemStatusMapper extends BaseMapper {
+ /**
+ * 查询BMS系统状态数据
+ *
+ * @param id BMS系统状态数据主键
+ * @return BMS系统状态数据
+ */
+ public BmsSystemStatus selectBmsSystemStatusById(Long id);
+
+ /**
+ * 查询BMS系统状态数据列表
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return BMS系统状态数据集合
+ */
+ public List selectBmsSystemStatusList(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 新增BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ public int insertBmsSystemStatus(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 修改BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ public int updateBmsSystemStatus(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 删除BMS系统状态数据
+ *
+ * @param id BMS系统状态数据主键
+ * @return 结果
+ */
+ public int deleteBmsSystemStatusById(Long id);
+
+ /**
+ * 批量删除BMS系统状态数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsSystemStatusByIds(Long[] ids);
}
diff --git a/src/main/java/com/evobms/project/bms/mapper/BmsVoltageChannelDataMapper.java b/src/main/java/com/evobms/project/bms/mapper/BmsVoltageChannelDataMapper.java
new file mode 100644
index 0000000..91246c2
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/mapper/BmsVoltageChannelDataMapper.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.mapper;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsVoltageChannelData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * BMS电压通道数据Mapper接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface BmsVoltageChannelDataMapper extends BaseMapper {
+ /**
+ * 查询BMS电压通道数据
+ *
+ * @param id BMS电压通道数据主键
+ * @return BMS电压通道数据
+ */
+ public BmsVoltageChannelData selectBmsVoltageChannelDataById(Long id);
+
+ /**
+ * 查询BMS电压通道数据列表
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return BMS电压通道数据集合
+ */
+ public List selectBmsVoltageChannelDataList(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 新增BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ public int insertBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 修改BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ public int updateBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 删除BMS电压通道数据
+ *
+ * @param id BMS电压通道数据主键
+ * @return 结果
+ */
+ public int deleteBmsVoltageChannelDataById(Long id);
+
+ /**
+ * 批量删除BMS电压通道数据
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsVoltageChannelDataByIds(Long[] ids);
+}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsChargeDetailService.java b/src/main/java/com/evobms/project/bms/service/IBmsChargeDetailService.java
index b50ff56..42c7096 100644
--- a/src/main/java/com/evobms/project/bms/service/IBmsChargeDetailService.java
+++ b/src/main/java/com/evobms/project/bms/service/IBmsChargeDetailService.java
@@ -1,7 +1,61 @@
package com.evobms.project.bms.service;
+import java.util.List;
import com.evobms.project.bms.domain.BmsChargeDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
-public interface IBmsChargeDetailService {
- int insertBmsChargeDetail(BmsChargeDetail data);
+/**
+ * BMS充电过程详细数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsChargeDetailService extends IService {
+ /**
+ * 查询BMS充电过程详细数据
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return BMS充电过程详细数据
+ */
+ public BmsChargeDetail selectBmsChargeDetailById(Long id);
+
+ /**
+ * 查询BMS充电过程详细数据列表
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return BMS充电过程详细数据集合
+ */
+ public List selectBmsChargeDetailList(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 新增BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ public int insertBmsChargeDetail(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 修改BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ public int updateBmsChargeDetail(BmsChargeDetail bmsChargeDetail);
+
+ /**
+ * 批量删除BMS充电过程详细数据
+ *
+ * @param ids 需要删除的BMS充电过程详细数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsChargeDetailByIds(Long[] ids);
+
+ /**
+ * 删除BMS充电过程详细数据信息
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return 结果
+ */
+ public int deleteBmsChargeDetailById(Long id);
}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsChargeTemperatureService.java b/src/main/java/com/evobms/project/bms/service/IBmsChargeTemperatureService.java
new file mode 100644
index 0000000..6edc586
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/IBmsChargeTemperatureService.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.service;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsChargeTemperature;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * BMS充电座温度数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsChargeTemperatureService extends IService {
+ /**
+ * 查询BMS充电座温度数据
+ *
+ * @param id BMS充电座温度数据主键
+ * @return BMS充电座温度数据
+ */
+ public BmsChargeTemperature selectBmsChargeTemperatureById(Long id);
+
+ /**
+ * 查询BMS充电座温度数据列表
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return BMS充电座温度数据集合
+ */
+ public List selectBmsChargeTemperatureList(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 新增BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ public int insertBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 修改BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ public int updateBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature);
+
+ /**
+ * 批量删除BMS充电座温度数据
+ *
+ * @param ids 需要删除的BMS充电座温度数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsChargeTemperatureByIds(Long[] ids);
+
+ /**
+ * 删除BMS充电座温度数据信息
+ *
+ * @param id BMS充电座温度数据主键
+ * @return 结果
+ */
+ public int deleteBmsChargeTemperatureById(Long id);
+}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsRuntimeDataService.java b/src/main/java/com/evobms/project/bms/service/IBmsRuntimeDataService.java
new file mode 100644
index 0000000..e90df5b
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/IBmsRuntimeDataService.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.service;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsRuntimeData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * BMS实时运行数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsRuntimeDataService extends IService {
+ /**
+ * 查询BMS实时运行数据
+ *
+ * @param id BMS实时运行数据主键
+ * @return BMS实时运行数据
+ */
+ public BmsRuntimeData selectBmsRuntimeDataById(Long id);
+
+ /**
+ * 查询BMS实时运行数据列表
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return BMS实时运行数据集合
+ */
+ public List selectBmsRuntimeDataList(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 新增BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ public int insertBmsRuntimeData(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 修改BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ public int updateBmsRuntimeData(BmsRuntimeData bmsRuntimeData);
+
+ /**
+ * 批量删除BMS实时运行数据
+ *
+ * @param ids 需要删除的BMS实时运行数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsRuntimeDataByIds(Long[] ids);
+
+ /**
+ * 删除BMS实时运行数据信息
+ *
+ * @param id BMS实时运行数据主键
+ * @return 结果
+ */
+ public int deleteBmsRuntimeDataById(Long id);
+}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsSopDataService.java b/src/main/java/com/evobms/project/bms/service/IBmsSopDataService.java
index 8436310..e59cfb9 100644
--- a/src/main/java/com/evobms/project/bms/service/IBmsSopDataService.java
+++ b/src/main/java/com/evobms/project/bms/service/IBmsSopDataService.java
@@ -1,7 +1,61 @@
package com.evobms.project.bms.service;
+import java.util.List;
import com.evobms.project.bms.domain.BmsSopData;
+import com.baomidou.mybatisplus.extension.service.IService;
-public interface IBmsSopDataService {
- int insertBmsSopData(BmsSopData data);
+/**
+ * BMS功率能力(SOP)数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsSopDataService extends IService {
+ /**
+ * 查询BMS功率能力(SOP)数据
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return BMS功率能力(SOP)数据
+ */
+ public BmsSopData selectBmsSopDataById(Long id);
+
+ /**
+ * 查询BMS功率能力(SOP)数据列表
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return BMS功率能力(SOP)数据集合
+ */
+ public List selectBmsSopDataList(BmsSopData bmsSopData);
+
+ /**
+ * 新增BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ public int insertBmsSopData(BmsSopData bmsSopData);
+
+ /**
+ * 修改BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ public int updateBmsSopData(BmsSopData bmsSopData);
+
+ /**
+ * 批量删除BMS功率能力(SOP)数据
+ *
+ * @param ids 需要删除的BMS功率能力(SOP)数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsSopDataByIds(Long[] ids);
+
+ /**
+ * 删除BMS功率能力(SOP)数据信息
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return 结果
+ */
+ public int deleteBmsSopDataById(Long id);
}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsSystemStatusService.java b/src/main/java/com/evobms/project/bms/service/IBmsSystemStatusService.java
index 01afb85..3ad0685 100644
--- a/src/main/java/com/evobms/project/bms/service/IBmsSystemStatusService.java
+++ b/src/main/java/com/evobms/project/bms/service/IBmsSystemStatusService.java
@@ -1,7 +1,61 @@
package com.evobms.project.bms.service;
+import java.util.List;
import com.evobms.project.bms.domain.BmsSystemStatus;
+import com.baomidou.mybatisplus.extension.service.IService;
-public interface IBmsSystemStatusService {
- int insertBmsSystemStatus(BmsSystemStatus data);
+/**
+ * BMS系统状态数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsSystemStatusService extends IService {
+ /**
+ * 查询BMS系统状态数据
+ *
+ * @param id BMS系统状态数据主键
+ * @return BMS系统状态数据
+ */
+ public BmsSystemStatus selectBmsSystemStatusById(Long id);
+
+ /**
+ * 查询BMS系统状态数据列表
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return BMS系统状态数据集合
+ */
+ public List selectBmsSystemStatusList(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 新增BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ public int insertBmsSystemStatus(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 修改BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ public int updateBmsSystemStatus(BmsSystemStatus bmsSystemStatus);
+
+ /**
+ * 批量删除BMS系统状态数据
+ *
+ * @param ids 需要删除的BMS系统状态数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsSystemStatusByIds(Long[] ids);
+
+ /**
+ * 删除BMS系统状态数据信息
+ *
+ * @param id BMS系统状态数据主键
+ * @return 结果
+ */
+ public int deleteBmsSystemStatusById(Long id);
}
diff --git a/src/main/java/com/evobms/project/bms/service/IBmsVoltageChannelDataService.java b/src/main/java/com/evobms/project/bms/service/IBmsVoltageChannelDataService.java
new file mode 100644
index 0000000..2a9aded
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/IBmsVoltageChannelDataService.java
@@ -0,0 +1,61 @@
+package com.evobms.project.bms.service;
+
+import java.util.List;
+import com.evobms.project.bms.domain.BmsVoltageChannelData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * BMS电压通道数据Service接口
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+public interface IBmsVoltageChannelDataService extends IService {
+ /**
+ * 查询BMS电压通道数据
+ *
+ * @param id BMS电压通道数据主键
+ * @return BMS电压通道数据
+ */
+ public BmsVoltageChannelData selectBmsVoltageChannelDataById(Long id);
+
+ /**
+ * 查询BMS电压通道数据列表
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return BMS电压通道数据集合
+ */
+ public List selectBmsVoltageChannelDataList(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 新增BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ public int insertBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 修改BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ public int updateBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData);
+
+ /**
+ * 批量删除BMS电压通道数据
+ *
+ * @param ids 需要删除的BMS电压通道数据主键集合
+ * @return 结果
+ */
+ public int deleteBmsVoltageChannelDataByIds(Long[] ids);
+
+ /**
+ * 删除BMS电压通道数据信息
+ *
+ * @param id BMS电压通道数据主键
+ * @return 结果
+ */
+ public int deleteBmsVoltageChannelDataById(Long id);
+}
diff --git a/src/main/java/com/evobms/project/bms/service/MqttService.java b/src/main/java/com/evobms/project/bms/service/MqttService.java
index ec12864..0b4b073 100644
--- a/src/main/java/com/evobms/project/bms/service/MqttService.java
+++ b/src/main/java/com/evobms/project/bms/service/MqttService.java
@@ -3,38 +3,39 @@ package com.evobms.project.bms.service;
import com.alibaba.fastjson2.JSON;
import com.evobms.common.utils.DateUtils;
import com.evobms.project.battery.domain.ExtremeValues;
-import com.evobms.project.battery.domain.SubsystemVoltage;
import com.evobms.project.battery.domain.SubsystemTemperature;
+import com.evobms.project.battery.domain.SubsystemVoltage;
import com.evobms.project.battery.service.IExtremeValuesService;
-import com.evobms.project.battery.service.ISubsystemVoltageService;
import com.evobms.project.battery.service.ISubsystemTemperatureService;
+import com.evobms.project.battery.service.ISubsystemVoltageService;
+import com.evobms.project.bms.domain.*;
+import com.evobms.project.bms.mapper.BmsVoltageChannelDataMapper;
import com.evobms.project.summary.domain.ChargeDischargeSummary;
import com.evobms.project.summary.service.IChargeDischargeSummaryService;
+import com.evobms.project.system.domain.BmsDevices;
import com.evobms.project.system.mapper.BmsDevicesMapper;
+import com.evobms.project.system.service.IBmsDevicesService;
import com.evobms.project.vehicledata.domain.VehicleData;
import com.evobms.project.vehicledata.domain.VehicleLocation;
import com.evobms.project.vehicledata.service.IVehicleDataService;
import com.evobms.project.vehicledata.service.IVehicleLocationService;
+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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.MessageChannel;
import org.springframework.stereotype.Service;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.math.BigDecimal;
-import java.util.*;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
+import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
+import java.util.*;
import java.util.stream.Collectors;
-import com.evobms.project.system.service.IBmsDevicesService;
-import com.evobms.project.system.domain.BmsDevices;
-
import static com.evobms.project.bms.controller.GBT32960FullDecoder.parseGBT32960Data;
/**
@@ -47,30 +48,37 @@ import static com.evobms.project.bms.controller.GBT32960FullDecoder.parseGBT3296
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true")
public class MqttService {
private static final Logger log = LoggerFactory.getLogger(MqttService.class);
-
@Autowired
private MessageChannel mqttOutboundChannel;
-
@Autowired
private IBmsDevicesService bmsDevicesService;
-
@Autowired
private IVehicleDataService vehicleDataService;
-
@Autowired
private IVehicleLocationService vehicleLocationService;
-
@Autowired
private IExtremeValuesService extremeValuesService;
-
@Autowired
private ISubsystemVoltageService subsystemVoltageService;
-
@Autowired
private ISubsystemTemperatureService subsystemTemperatureService;
-
@Autowired
private IChargeDischargeSummaryService chargeDischargeSummaryService;
+ @Autowired
+ private IBmsChargeDetailService bmsChargeDetailService;
+ @Autowired
+ private IBmsRuntimeDataService bmsRuntimeDataService;
+ @Autowired
+ private IBmsSopDataService bmsSopDataService;
+ @Autowired
+ private IBmsSystemStatusService bmsSystemStatusService;
+ @Autowired
+ private IBmsChargeTemperatureService bmsChargeTemperatureService;
+ @Autowired
+ private BmsVoltageChannelDataMapper bmsVoltageChannelDataMapper;
+ @Autowired
+ private IBmsVoltageChannelDataService bmsVoltageChannelDataService;
+
@Autowired
private BmsDevicesMapper bmsDevicesMapper;
@@ -83,34 +91,6 @@ public class MqttService {
@Value("${mqtt.dataHeaderLength:12}")
private int dataHeaderLength;
- /**
- * 发送MQTT消息
- *
- * @param topic 主题
- * @param payload 消息内容
- */
- public void sendMessage(String topic, String payload) {
- log.info("发送MQTT消息 -> 主题: {}, QOS: {}, 载荷: {}", topic, defaultQos, payload);
- mqttOutboundChannel.send(MessageBuilder.withPayload(payload)
- .setHeader("mqtt_topic", topic)
- .setHeader("mqtt_qos", defaultQos)
- .build());
- }
-
- /**
- * 发送MQTT字节消息
- *
- * @param topic 主题
- * @param payload 原始字节
- */
- public void sendMessageBytes(String topic, byte[] payload) {
- log.info("发送MQTT字节消息 -> 主题: {}, QOS: {}, 长度: {}, HEX: {}", topic, defaultQos, payload.length, toHex(payload));
- mqttOutboundChannel.send(MessageBuilder.withPayload(payload)
- .setHeader("mqtt_topic", topic)
- .setHeader("mqtt_qos", defaultQos)
- .build());
- }
-
private static String toHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
@@ -164,6 +144,28 @@ public class MqttService {
return cipher.doFinal(plaintext);
}
+ /**
+ * 发送MQTT消息
+ *
+ * @param topic 主题
+ * @param payload 消息内容
+ */
+ public void sendMessage(String topic, String payload) {
+ log.info("发送MQTT消息 -> 主题: {}, QOS: {}, 载荷: {}", topic, defaultQos, payload);
+ mqttOutboundChannel.send(MessageBuilder.withPayload(payload).setHeader("mqtt_topic", topic).setHeader("mqtt_qos", defaultQos).build());
+ }
+
+ /**
+ * 发送MQTT字节消息
+ *
+ * @param topic 主题
+ * @param payload 原始字节
+ */
+ public void sendMessageBytes(String topic, byte[] payload) {
+ log.info("发送MQTT字节消息 -> 主题: {}, QOS: {}, 长度: {}, HEX: {}", topic, defaultQos, payload.length, toHex(payload));
+ mqttOutboundChannel.send(MessageBuilder.withPayload(payload).setHeader("mqtt_topic", topic).setHeader("mqtt_qos", defaultQos).build());
+ }
+
/**
* 发送设备控制命令
*
@@ -184,6 +186,7 @@ public class MqttService {
/**
* 处理接收到的设备数据
+ *
* @param topic 主题
* @param message 消息内容
*/
@@ -222,6 +225,7 @@ public class MqttService {
/**
* 逐字段解析数据字符串 - 直接解析十六进制数据
+ *
* @param data 十六进制数据字符串
* @param deviceSn 设备SN码
*/
@@ -352,8 +356,7 @@ public class MqttService {
// 索引32: 充电状态
byte chargeStatus = message[startIndex + 2];
- log.info("设备 {} - 充电状态: 0x{} ({})", deviceSn,
- String.format("%02X", chargeStatus), getChargeStatusDescription(chargeStatus));
+ log.info("设备 {} - 充电状态: 0x{} ({})", deviceSn, String.format("%02X", chargeStatus), getChargeStatusDescription(chargeStatus));
// 索引40-41: 总电压 (0.1V)
int totalVoltage = ((message[startIndex + 10] & 0xFF) << 8) | (message[startIndex + 11] & 0xFF);
@@ -406,16 +409,10 @@ public class MqttService {
// 转成十六进制字符串,例如 "00", "01"
String locationStatusHex = String.format("%02X", locationStatus);
// 索引53-56: 经度 (0.000001°)
- long longitude = ((message[startIndex + 2] & 0xFFL) << 24) |
- ((message[startIndex + 3] & 0xFFL) << 16) |
- ((message[startIndex + 4] & 0xFFL) << 8) |
- (message[startIndex + 5] & 0xFFL);
+ long longitude = ((message[startIndex + 2] & 0xFFL) << 24) | ((message[startIndex + 3] & 0xFFL) << 16) | ((message[startIndex + 4] & 0xFFL) << 8) | (message[startIndex + 5] & 0xFFL);
// 索引57-60: 纬度 (0.000001°)
- long latitude = ((message[startIndex + 6] & 0xFFL) << 24) |
- ((message[startIndex + 7] & 0xFFL) << 16) |
- ((message[startIndex + 8] & 0xFFL) << 8) |
- (message[startIndex + 9] & 0xFFL);
+ long latitude = ((message[startIndex + 6] & 0xFFL) << 24) | ((message[startIndex + 7] & 0xFFL) << 16) | ((message[startIndex + 8] & 0xFFL) << 8) | (message[startIndex + 9] & 0xFFL);
if (longitude != 0 || latitude != 0) {
double lon = longitude / 1000000.0;
@@ -525,8 +522,7 @@ public class MqttService {
int storageCurrent = ((message[startIndex + 5] & 0xFF) << 8) | (message[startIndex + 6] & 0xFF);
double storageCurrentValue = (storageCurrent - 10000) * 0.1;
- log.info("设备 {} - 储能装置: 子系统{}/{}, 电压{}V, 电流{}A", deviceSn,
- subsystemNum, subsystemCount, storageVoltageValue, storageCurrentValue);
+ log.info("设备 {} - 储能装置: 子系统{}/{}, 电压{}V, 电流{}A", deviceSn, subsystemNum, subsystemCount, storageVoltageValue, storageCurrentValue);
// 索引83-84: 单体电压总数
int totalCellCount = ((message[startIndex + 7] & 0xFF) << 8) | (message[startIndex + 8] & 0xFF);
@@ -535,8 +531,7 @@ public class MqttService {
// 索引87: 本帧电芯总数
int frameCellCount = message[startIndex + 11] & 0xFF;
- log.info("设备 {} - 电芯信息: 总数{}个, 本帧{}-{}", deviceSn,
- totalCellCount, startCellIndex, startCellIndex + frameCellCount - 1);
+ log.info("设备 {} - 电芯信息: 总数{}个, 本帧{}-{}", deviceSn, totalCellCount, startCellIndex, startCellIndex + frameCellCount - 1);
// 索引88开始: 单体电压数据 (每个电芯2字节)
int voltageDataStart = startIndex + 12;
@@ -603,8 +598,7 @@ public class MqttService {
// 索引451-452: 单体温度总数
int totalTempCount = ((message[startIndex + 3] & 0xFF) << 8) | (message[startIndex + 4] & 0xFF);
- log.info("设备 {} - 温度探头: 子系统{}/{}, 总数{}个", deviceSn,
- subsystemNum, subsystemCount, totalTempCount);
+ log.info("设备 {} - 温度探头: 子系统{}/{}, 总数{}个", deviceSn, subsystemNum, subsystemCount, totalTempCount);
// 索引453开始: 单体温度数据 (每个探头1字节)
int tempDataStart = startIndex + 5;
@@ -662,7 +656,7 @@ public class MqttService {
long dischargeEnergy = ((message[startIndex + 3] & 0xFFL) << 24) | ((message[startIndex + 4] & 0xFFL) << 16) | ((message[startIndex + 5] & 0xFFL) << 8) | (message[startIndex + 6] & 0xFFL);
// 索引550-553: 累计充电电量 (0.1kWh)
- long chargeEnergy = ((message[startIndex + 7] & 0xFFL) << 24) |((message[startIndex + 8] & 0xFFL) << 16) | ((message[startIndex + 9] & 0xFFL) << 8) | (message[startIndex + 10] & 0xFFL);
+ long chargeEnergy = ((message[startIndex + 7] & 0xFFL) << 24) | ((message[startIndex + 8] & 0xFFL) << 16) | ((message[startIndex + 9] & 0xFFL) << 8) | (message[startIndex + 10] & 0xFFL);
double dischargeKwh = dischargeEnergy * 0.1;
double chargeKwh = chargeEnergy * 0.1;
@@ -699,8 +693,7 @@ public class MqttService {
int maxTemp = temperatures.stream().mapToInt(v -> v).max().orElse(0);
double avgTemp = temperatures.stream().mapToInt(v -> v).average().orElse(0);
- log.info("设备 {} - 温度统计: 最小值{}°C, 最大值{}°C, 平均值{}°C",
- deviceSn, minTemp, maxTemp, avgTemp);
+ log.info("设备 {} - 温度统计: 最小值{}°C, 最大值{}°C, 平均值{}°C", deviceSn, minTemp, maxTemp, avgTemp);
}
@@ -724,8 +717,7 @@ public class MqttService {
List voltages = new ArrayList<>();
for (int i = 0; i < cellCount; i++) {
- int voltage = ((message[startIndex + i * 2] & 0xFF) << 8) |
- (message[startIndex + i * 2 + 1] & 0xFF);
+ int voltage = ((message[startIndex + i * 2] & 0xFF) << 8) | (message[startIndex + i * 2 + 1] & 0xFF);
double voltageValue = voltage * 0.001; // mV转V
voltages.add(voltageValue);
@@ -783,12 +775,7 @@ public class MqttService {
* 检查时间有效性
*/
private boolean isValidTime(int year, int month, int day, int hour, int minute, int second) {
- return year >= 2000 && year <= 2100 &&
- month >= 1 && month <= 12 &&
- day >= 1 && day <= 31 &&
- hour >= 0 && hour <= 23 &&
- minute >= 0 && minute <= 59 &&
- second >= 0 && second <= 59;
+ return year >= 2000 && year <= 2100 && month >= 1 && month <= 12 && day >= 1 && day <= 31 && hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59 && second >= 0 && second <= 59;
}
/**
@@ -798,8 +785,7 @@ public class MqttService {
int len = hex.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
- data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
- + Character.digit(hex.charAt(i + 1), 16));
+ data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16));
}
return data;
}
@@ -884,8 +870,7 @@ public class MqttService {
vehicleLocationService.insertVehicleLocation(ve);
}
- private void saveExtremeData(String deviceSn, int maxVoltageSubsystemNo, int maxVoltageBatteryNo, double maxVoltageValue, int minVoltageSubsystemNo, int minVoltageBatteryNo, double minVoltageValue, int maxTempSubsystemNo,
- int maxTempProbeNo, int maxTempValue, int minTempSubsystemNo, int minTempProbeNo, int minTempValue, Date frameTime) {
+ private void saveExtremeData(String deviceSn, int maxVoltageSubsystemNo, int maxVoltageBatteryNo, double maxVoltageValue, int minVoltageSubsystemNo, int minVoltageBatteryNo, double minVoltageValue, int maxTempSubsystemNo, int maxTempProbeNo, int maxTempValue, int minTempSubsystemNo, int minTempProbeNo, int minTempValue, Date frameTime) {
ExtremeValues ex = new ExtremeValues();
ex.setDeviceId(deviceSn);
ex.setTimestamp(frameTime);
@@ -950,93 +935,190 @@ public class MqttService {
*/
private void parseExtendedDataAtIndex(byte[] message, int startIndex, String deviceSn, Date frameTime) {
try {
- int base = startIndex;
int need = (716 - 530 + 1);
- if (message.length < base + need) {
+ if (message.length < startIndex + need) {
log.warn("设备 {}: 扩展数据索引越界", deviceSn);
return;
}
// 系统计数/绝缘/车速/总压
- long resetCount = ((message[base + 0] & 0xFFL) << 24) | ((message[base + 1] & 0xFFL) << 16) | ((message[base + 2] & 0xFFL) << 8) | (message[base + 3] & 0xFFL); // 复位次数(u32)
- int insulationVal = ((message[base + 4] & 0xFF) << 8) | (message[base + 5] & 0xFF); // 绝缘值(单位KΩ)
- int carSpdRaw = ((message[base + 6] & 0xFF) << 8) | (message[base + 7] & 0xFF); // 车速原始(×0.1km/h)
+ long resetCount = ((message[startIndex] & 0xFFL) << 24) | ((message[startIndex + 1] & 0xFFL) << 16) | ((message[startIndex + 2] & 0xFFL) << 8) | (message[startIndex + 3] & 0xFFL); // 复位次数(u32)
+ int insulationVal = ((message[startIndex + 4] & 0xFF) << 8) | (message[startIndex + 5] & 0xFF); // 绝缘值(单位KΩ)
+ int carSpdRaw = ((message[startIndex + 6] & 0xFF) << 8) | (message[startIndex + 7] & 0xFF); // 车速原始(×0.1km/h)
double carSpd = carSpdRaw * 0.1;
- int gpvRaw = ((message[base + 8] & 0xFF) << 8) | (message[base + 9] & 0xFF); // GPV(×0.1V)
+ int gpvRaw = ((message[startIndex + 8] & 0xFF) << 8) | (message[startIndex + 9] & 0xFF); // GPV(×0.1V)
double gpv = gpvRaw * 0.1;
// RTP1..7(×0.1V)
- double rtp1 = (((message[base + 10] & 0xFF) << 8) | (message[base + 11] & 0xFF)) * 0.1;
- double rtp2 = (((message[base + 12] & 0xFF) << 8) | (message[base + 13] & 0xFF)) * 0.1;
- double rtp3 = (((message[base + 14] & 0xFF) << 8) | (message[base + 15] & 0xFF)) * 0.1;
- double rtp4 = (((message[base + 16] & 0xFF) << 8) | (message[base + 17] & 0xFF)) * 0.1;
- double rtp5 = (((message[base + 18] & 0xFF) << 8) | (message[base + 19] & 0xFF)) * 0.1;
- double rtp6 = (((message[base + 20] & 0xFF) << 8) | (message[base + 21] & 0xFF)) * 0.1;
- double rtp7 = (((message[base + 22] & 0xFF) << 8) | (message[base + 23] & 0xFF)) * 0.1;
+ double rtp1 = (((message[startIndex + 10] & 0xFF) << 8) | (message[startIndex + 11] & 0xFF)) * 0.1;
+ double rtp2 = (((message[startIndex + 12] & 0xFF) << 8) | (message[startIndex + 13] & 0xFF)) * 0.1;
+ double rtp3 = (((message[startIndex + 14] & 0xFF) << 8) | (message[startIndex + 15] & 0xFF)) * 0.1;
+ double rtp4 = (((message[startIndex + 16] & 0xFF) << 8) | (message[startIndex + 17] & 0xFF)) * 0.1;
+ double rtp5 = (((message[startIndex + 18] & 0xFF) << 8) | (message[startIndex + 19] & 0xFF)) * 0.1;
+ double rtp6 = (((message[startIndex + 20] & 0xFF) << 8) | (message[startIndex + 21] & 0xFF)) * 0.1;
+ double rtp7 = (((message[startIndex + 22] & 0xFF) << 8) | (message[startIndex + 23] & 0xFF)) * 0.1;
// RTN探针序号
- int rtn1 = message[base + 24] & 0xFF; // RTN1
- int rtn2 = message[base + 25] & 0xFF; // RTN2
- int rtn3 = message[base + 26] & 0xFF; // RTN3
- int rtn4 = message[base + 27] & 0xFF; // RTN4
- double realSocMax = (((message[base + 28] & 0xFF) << 8) | (message[base + 29] & 0xFF)) * 0.1; // RealSOC最大(×0.1%)
- double realSocMin = (((message[base + 30] & 0xFF) << 8) | (message[base + 31] & 0xFF)) * 0.1; // RealSOC最小(×0.1%)
+ int rtn1 = message[startIndex + 24] & 0xFF; // RTN1
+ int rtn2 = message[startIndex + 25] & 0xFF; // RTN2
+ int rtn3 = message[startIndex + 26] & 0xFF; // RTN3
+ int rtn4 = message[startIndex + 27] & 0xFF; // RTN4
+ double realSocMax = (((message[startIndex + 28] & 0xFF) << 8) | (message[startIndex + 29] & 0xFF)) * 0.1; // RealSOC最大(×0.1%)
+ double realSocMin = (((message[startIndex + 30] & 0xFF) << 8) | (message[startIndex + 31] & 0xFF)) * 0.1; // RealSOC最小(×0.1%)
// 充电座温度(℃,需减40)
- int chgBs1Tmp = (message[base + 32] & 0xFF) - 40;
- int chgBs2Tmp = (message[base + 33] & 0xFF) - 40;
- int chgBs3Tmp = (message[base + 34] & 0xFF) - 40;
- int chgBs4Tmp = (message[base + 35] & 0xFF) - 40;
- int chgBs5Tmp = (message[base + 36] & 0xFF) - 40;
- int chgBs6Tmp = (message[base + 37] & 0xFF) - 40;
- int chgBs7Tmp = (message[base + 38] & 0xFF) - 40;
- int chgBs8Tmp = (message[base + 39] & 0xFF) - 40;
+ int chgBs1Tmp = (message[startIndex + 32] & 0xFF) - 40;
+ int chgBs2Tmp = (message[startIndex + 33] & 0xFF) - 40;
+ int chgBs3Tmp = (message[startIndex + 34] & 0xFF) - 40;
+ int chgBs4Tmp = (message[startIndex + 35] & 0xFF) - 40;
+ int chgBs5Tmp = (message[startIndex + 36] & 0xFF) - 40;
+ int chgBs6Tmp = (message[startIndex + 37] & 0xFF) - 40;
+ int chgBs7Tmp = (message[startIndex + 38] & 0xFF) - 40;
+ int chgBs8Tmp = (message[startIndex + 39] & 0xFF) - 40;
// 慢充/快充电流电压(×0.1)
- double tChgCur = (((message[base + 40] & 0xFF) << 8) | (message[base + 41] & 0xFF)) * 0.1; // 慢充电流(A)
- double tChgVol = (((message[base + 42] & 0xFF) << 8) | (message[base + 43] & 0xFF)) * 0.1; // 慢充电压(V)
- double fChgCur = (((message[base + 44] & 0xFF) << 8) | (message[base + 45] & 0xFF)) * 0.1; // 快充电流(A)
- double fChgVol = (((message[base + 46] & 0xFF) << 8) | (message[base + 47] & 0xFF)) * 0.1; // 快充电压(V)
+ double tChgCur = (((message[startIndex + 40] & 0xFF) << 8) | (message[startIndex + 41] & 0xFF)) * 0.1; // 慢充电流(A)
+ double tChgVol = (((message[startIndex + 42] & 0xFF) << 8) | (message[startIndex + 43] & 0xFF)) * 0.1; // 慢充电压(V)
+ double fChgCur = (((message[startIndex + 44] & 0xFF) << 8) | (message[startIndex + 45] & 0xFF)) * 0.1; // 快充电流(A)
+ double fChgVol = (((message[startIndex + 46] & 0xFF) << 8) | (message[startIndex + 47] & 0xFF)) * 0.1; // 快充电压(V)
// 放电/回馈SOP能力(A)
- int disSop10 = ((message[base + 48] & 0xFF) << 8) | (message[base + 49] & 0xFF);
- int disSop30 = ((message[base + 50] & 0xFF) << 8) | (message[base + 51] & 0xFF);
- int disSop60 = ((message[base + 52] & 0xFF) << 8) | (message[base + 53] & 0xFF);
- int disSopCont = ((message[base + 54] & 0xFF) << 8) | (message[base + 55] & 0xFF);
- int regSop10 = ((message[base + 56] & 0xFF) << 8) | (message[base + 57] & 0xFF);
- int regSop30 = ((message[base + 58] & 0xFF) << 8) | (message[base + 59] & 0xFF);
- int regSop60 = ((message[base + 60] & 0xFF) << 8) | (message[base + 61] & 0xFF);
- int regSopCont = ((message[base + 62] & 0xFF) << 8) | (message[base + 63] & 0xFF);
- int disSopTol = ((message[base + 64] & 0xFF) << 8) | (message[base + 65] & 0xFF);
- int regSopTol = ((message[base + 66] & 0xFF) << 8) | (message[base + 67] & 0xFF);
+ long disSop10 = ((message[startIndex + 48] & 0xFF) << 8) | (message[startIndex + 49] & 0xFF);
+ long disSop30 = ((message[startIndex + 50] & 0xFF) << 8) | (message[startIndex + 51] & 0xFF);
+ long disSop60 = ((message[startIndex + 52] & 0xFF) << 8) | (message[startIndex + 53] & 0xFF);
+ long disSopCont = ((message[startIndex + 54] & 0xFF) << 8) | (message[startIndex + 55] & 0xFF);
+ long regSop10 = ((message[startIndex + 56] & 0xFF) << 8) | (message[startIndex + 57] & 0xFF);
+ long regSop30 = ((message[startIndex + 58] & 0xFF) << 8) | (message[startIndex + 59] & 0xFF);
+ long regSop60 = ((message[startIndex + 60] & 0xFF) << 8) | (message[startIndex + 61] & 0xFF);
+ long regSopCont = ((message[startIndex + 62] & 0xFF) << 8) | (message[startIndex + 63] & 0xFF);
+ long disSopTol = ((message[startIndex + 64] & 0xFF) << 8) | (message[startIndex + 65] & 0xFF);
+ long regSopTol = ((message[startIndex + 66] & 0xFF) << 8) | (message[startIndex + 67] & 0xFF);
// 版本与编码
- int hwVer = ((message[base + 68] & 0xFF) << 8) | (message[base + 69] & 0xFF); // 硬件版本
- int swVer = ((message[base + 70] & 0xFF) << 8) | (message[base + 71] & 0xFF); // 软件版本
- String bmsCode = readAsciiRange(message, 602, 28, base); // BMS编码(28字节ASCII)
- String vin = readAsciiRange(message, 629, 21, base); // VIN码(21字节ASCII)
+ int hwVer = ((message[startIndex + 68] & 0xFF) << 8) | (message[startIndex + 69] & 0xFF); // 硬件版本
+ int swVer = ((message[startIndex + 70] & 0xFF) << 8) | (message[startIndex + 71] & 0xFF); // 软件版本
+ String bmsCode = readAsciiRange(message, 602, 28, startIndex); // BMS编码(28字节ASCII)
+ String vin = readAsciiRange(message, 629, 21, startIndex); // VIN码(21字节ASCII)
// 系统状态
- int sysVolRaw = ((message[base + (649 - 530)] & 0xFF) << 8) | (message[base + (650 - 530)] & 0xFF); // 系统电压(×0.1V)
- int sysCurRaw = ((message[base + (651 - 530)] & 0xFF) << 8) | (message[base + (652 - 530)] & 0xFF); // 系统电流(×0.1A)
+ int sysVolRaw = ((message[startIndex + (649 - 530)] & 0xFF) << 8) | (message[startIndex + (650 - 530)] & 0xFF); // 系统电压(×0.1V)
+ int sysCurRaw = ((message[startIndex + (651 - 530)] & 0xFF) << 8) | (message[startIndex + (652 - 530)] & 0xFF); // 系统电流(×0.1A)
double sysVol = sysVolRaw * 0.1;
double sysCur = sysCurRaw * 0.1;
- int cellCount = ((message[base + (653 - 530)] & 0xFF) << 8) | (message[base + (654 - 530)] & 0xFF);
- int tempSensorCount = ((message[base + (655 - 530)] & 0xFF) << 8) | (message[base + (656 - 530)] & 0xFF);
- int relayStatus = ((message[base + (657 - 530)] & 0xFF) << 8) | (message[base + (658 - 530)] & 0xFF);
- int onaaccStatus = ((message[base + (659 - 530)] & 0xFF) << 8) | (message[base + (660 - 530)] & 0xFF);
- int acStopCode = message[base + (661 - 530)] & 0xFF;
- int dcStopCode = message[base + (662 - 530)] & 0xFF;
- int cycleCount = ((message[base + (663 - 530)] & 0xFF) << 8) | (message[base + (664 - 530)] & 0xFF);
- long devId = ((message[base + (665 - 530)] & 0xFFL) << 24) | ((message[base + (666 - 530)] & 0xFFL) << 16) | ((message[base + (667 - 530)] & 0xFFL) << 8) | (message[base + (668 - 530)] & 0xFFL);
- String clientCode = readAsciiRange(message, 669, 28, base); // 客户编码(28字节ASCII)
- double samp25v = (((message[base + (696 - 530)] & 0xFF) << 8) | (message[base + (697 - 530)] & 0xFF)) * 0.001; // 2.5V采样(×0.001V)
- double samp5v = (((message[base + (698 - 530)] & 0xFF) << 8) | (message[base + (699 - 530)] & 0xFF)) * 0.001; // 5V采样(×0.001V)
- int chargeSop = ((message[base + (700 - 530)] & 0xFF) << 8) | (message[base + (701 - 530)] & 0xFF); // 充电SOP(A)
- int acChargeSop = ((message[base + (702 - 530)] & 0xFF) << 8) | (message[base + (703 - 530)] & 0xFF); // 慢充SOP(A)
+ int cellCount = ((message[startIndex + (653 - 530)] & 0xFF) << 8) | (message[startIndex + (654 - 530)] & 0xFF);
+ int tempSensorCount = ((message[startIndex + (655 - 530)] & 0xFF) << 8) | (message[startIndex + (656 - 530)] & 0xFF);
+ int relayStatus = ((message[startIndex + (657 - 530)] & 0xFF) << 8) | (message[startIndex + (658 - 530)] & 0xFF);
+ int onaaccStatus = ((message[startIndex + (659 - 530)] & 0xFF) << 8) | (message[startIndex + (660 - 530)] & 0xFF);
+ int acStopCode = message[startIndex + (661 - 530)] & 0xFF;
+ int dcStopCode = message[startIndex + (662 - 530)] & 0xFF;
+ int cycleCount = ((message[startIndex + (663 - 530)] & 0xFF) << 8) | (message[startIndex + (664 - 530)] & 0xFF);
+ long devId = ((message[startIndex + (665 - 530)] & 0xFFL) << 24) | ((message[startIndex + (666 - 530)] & 0xFFL) << 16) | ((message[startIndex + (667 - 530)] & 0xFFL) << 8) | (message[startIndex + (668 - 530)] & 0xFFL);
+ String clientCode = readAsciiRange(message, 669, 28, startIndex); // 客户编码(28字节ASCII)
+ double samp25v = (((message[startIndex + (696 - 530)] & 0xFF) << 8) | (message[startIndex + (697 - 530)] & 0xFF)) * 0.001; // 2.5V采样(×0.001V)
+ double samp5v = (((message[startIndex + (698 - 530)] & 0xFF) << 8) | (message[startIndex + (699 - 530)] & 0xFF)) * 0.001; // 5V采样(×0.001V)
+ long chargeSop = ((message[startIndex + (700 - 530)] & 0xFF) << 8) | (message[startIndex + (701 - 530)] & 0xFF); // 充电SOP(A)
+ long acChargeSop = ((message[startIndex + (702 - 530)] & 0xFF) << 8) | (message[startIndex + (703 - 530)] & 0xFF); // 慢充SOP(A)
// 运行阶段/充电阶段/时间与里程
- int runSts = message[base + (704 - 530)] & 0xFF; // 行车阶段
- int runPwrSts = message[base + (705 - 530)] & 0xFF; // 行车上电阶段
- int tChgCp = message[base + (706 - 530)] & 0xFF; // 慢充CP值
- int tChgR = message[base + (707 - 530)] & 0xFF; // 慢充枪阻值
- int tChgSts = message[base + (708 - 530)] & 0xFF; // 慢充阶段
- int fChgSts2 = message[base + (709 - 530)] & 0xFF; // 快充阶段
- int chgSts = message[base + (710 - 530)] & 0xFF; // 充电阶段
- int chgTime = ((message[base + (711 - 530)] & 0xFF) << 8) | (message[base + (712 - 530)] & 0xFF); // 充电时长(min)
- long mileage = ((message[base + (713 - 530)] & 0xFFL) << 24) | ((message[base + (714 - 530)] & 0xFFL) << 16) | ((message[base + (715 - 530)] & 0xFFL) << 8) | (message[base + (716 - 530)] & 0xFFL); // 里程(u32)
- log.info("设备 {} 扩展数据: resetCount={}, insulationValKOhm={}, carSpeedKmH={}, GPV0_1V={}, RTPs(V)=[{},{},{},{},{},{},{}], RTNs=[{},{},{},{}], realSOCMax0_1={}, realSOCMin0_1={}, chargeSeatTempsC=[{},{},{},{},{},{},{},{}]", deviceSn, resetCount, insulationVal, carSpd, gpv, rtp1, rtp2, rtp3, rtp4, rtp5, rtp6, rtp7, rtn1, rtn2, rtn3, rtn4, realSocMax, realSocMin, chgBs1Tmp, chgBs2Tmp, chgBs3Tmp, chgBs4Tmp, chgBs5Tmp, chgBs6Tmp, chgBs7Tmp, chgBs8Tmp);
+ int runSts = message[startIndex + (704 - 530)] & 0xFF; // 行车阶段
+ int runPwrSts = message[startIndex + (705 - 530)] & 0xFF; // 行车上电阶段
+ int tChgCp = message[startIndex + (706 - 530)] & 0xFF; // 慢充CP值
+ int tChgR = message[startIndex + (707 - 530)] & 0xFF; // 慢充枪阻值
+ int tChgSts = message[startIndex + (708 - 530)] & 0xFF; // 慢充阶段
+ int fChgSts2 = message[startIndex + (709 - 530)] & 0xFF; // 快充阶段
+ int chgSts = message[startIndex + (710 - 530)] & 0xFF; // 充电阶段
+ long chgTime = ((message[startIndex + (711 - 530)] & 0xFF) << 8) | (message[startIndex + (712 - 530)] & 0xFF); // 充电时长(min)
+ long mileage = ((message[startIndex + (713 - 530)] & 0xFFL) << 24) | ((message[startIndex + (714 - 530)] & 0xFFL) << 16) | ((message[startIndex + (715 - 530)] & 0xFFL) << 8) | (message[startIndex + (716 - 530)] & 0xFFL); // 里程(u32)
+ BmsChargeDetail bmsChargeDetail = new BmsChargeDetail();
+ bmsChargeDetail.setDeviceId(deviceSn);
+ bmsChargeDetail.setTimestamp(frameTime);
+ bmsChargeDetail.setAcChargeCurrent(BigDecimal.valueOf(tChgCur));
+ bmsChargeDetail.setAcChargeVoltage(BigDecimal.valueOf(tChgVol));
+ bmsChargeDetail.setDcChargeCurrent(BigDecimal.valueOf(fChgCur));
+ bmsChargeDetail.setDcChargeVoltage(BigDecimal.valueOf(fChgVol));
+ bmsChargeDetail.setChargeTime(chgTime);
+ bmsChargeDetail.setAcStopCode(acStopCode);
+ bmsChargeDetail.setDcStopCode(dcStopCode);
+ bmsChargeDetail.setAcCpValue(tChgCp);
+ bmsChargeDetail.setAcGunResistance(tChgR);
+ bmsChargeDetail.setChargingStage(chgSts);
+ bmsChargeDetail.setAcStage(tChgSts);
+ bmsChargeDetail.setDcStage(fChgSts2);
+ bmsChargeDetail.setCreateTime(new Date());
+ bmsChargeDetail.setCreateBy(deviceSn);
+ bmsChargeDetailService.insertBmsChargeDetail(bmsChargeDetail);
+
+ BmsRuntimeData rd = new BmsRuntimeData();
+ rd.setDeviceId(deviceSn);
+ rd.setTimestap(frameTime);
+ rd.setVehicleSpeed(BigDecimal.valueOf(carSpd));
+ rd.setMileage(mileage);
+ rd.setSystemVoltage(BigDecimal.valueOf(sysVol));
+ rd.setSystemCurrent(BigDecimal.valueOf(sysCur));
+ rd.setInsulationResistance((long) insulationVal);
+ rd.setSocMax(BigDecimal.valueOf(realSocMax));
+ rd.setSocMin(BigDecimal.valueOf(realSocMin));
+ rd.setGpvVoltage(BigDecimal.valueOf(gpv));
+ rd.setRunStatus(runSts);
+ rd.setPowerStatus(runPwrSts);
+ rd.setCreateTime(new Date());
+ rd.setCreateBy(deviceSn);
+ bmsRuntimeDataService.insertBmsRuntimeData(rd);
+
+ BmsSopData sop = new BmsSopData();
+ sop.setDeviceId(deviceSn);
+ sop.setTimestap(frameTime);
+ sop.setDischargeSop10s(disSop10);
+ sop.setDischargeSop30s(disSop30);
+ sop.setDischargeSop60s(disSop60);
+ sop.setDischargeSopContinuous(disSopCont);
+ sop.setRegenSop10s(regSop10);
+ sop.setRegenSop30s(regSop30);
+ sop.setRegenSop60s(regSop60);
+ sop.setRegenSopContinuous(regSopCont);
+ sop.setChargeSop(chargeSop);
+ sop.setAcChargeSop(acChargeSop);
+ sop.setCreateTime(new Date());
+ sop.setCreateBy(deviceSn);
+ bmsSopDataService.insertBmsSopData(sop);
+
+ BmsSystemStatus ss = new BmsSystemStatus();
+ ss.setDeviceId(deviceSn);
+ ss.setTimestap(frameTime);
+ ss.setRelayStatus((long) relayStatus);
+ ss.setOnaaccStatus((long) onaaccStatus);
+ ss.setResetCount(resetCount);
+ ss.setCycleCount((long) cycleCount);
+ ss.setSample25v(BigDecimal.valueOf(samp25v));
+ ss.setSample5v(BigDecimal.valueOf(samp5v));
+ /*ss.setCellCount(cellCount);
+ ss.setTempSensorCount(tempSensorCount);*/
+ ss.setCreateTime(new Date());
+ ss.setCreateBy(deviceSn);
+ bmsSystemStatusService.insertBmsSystemStatus(ss);
+
+ int[] chargeTemps = {chgBs1Tmp, chgBs2Tmp, chgBs3Tmp, chgBs4Tmp, chgBs5Tmp, chgBs6Tmp, chgBs7Tmp, chgBs8Tmp};
+ List chargeTempsList = new ArrayList<>();
+ for (int i = 0; i < chargeTemps.length; i++) {
+ BmsChargeTemperature ct = new BmsChargeTemperature();
+ ct.setDeviceId(deviceSn);
+ ct.setTimestap(frameTime);
+ ct.setTempIndex(i + 1);
+ ct.setTemperature(BigDecimal.valueOf(chargeTemps[i]));
+ ct.setCreateTime(new Date());
+ ct.setCreateBy(deviceSn);
+ chargeTempsList.add(ct);
+ }
+ bmsChargeTemperatureService.saveBatch(chargeTempsList);
+
+ double[] rtpVals = {rtp1, rtp2, rtp3, rtp4, rtp5, rtp6, rtp7};
+ List channels = new ArrayList<>();
+ for (int i = 0; i < rtpVals.length; i++) {
+ BmsVoltageChannelData ch = new BmsVoltageChannelData();
+ ch.setDeviceId(deviceSn);
+ ch.setTimestap(frameTime);
+ ch.setChannelType("RTP");
+ ch.setChannelIndex(i + 1);
+ ch.setVoltage(BigDecimal.valueOf(rtpVals[i]));
+ ch.setCreateTime(new Date());
+ ch.setCreateBy(deviceSn);
+ channels.add(ch);
+ }
+ if (!channels.isEmpty()) {
+ bmsVoltageChannelDataService.saveBatch(channels);
+ }
+
log.info("设备 {} 充电详情: tChgCurA={}, tChgVolV={}, fChgCurA={}, fChgVolV={}, disSOP(A)=[{},{},{},{}], regSOP(A)=[{},{},{},{}], disSopTolA={}, regSopTolA={}", deviceSn, tChgCur, tChgVol, fChgCur, fChgVol, disSop10, disSop30, disSop60, disSopCont, regSop10, regSop30, regSop60, regSopCont, disSopTol, regSopTol);
log.info("设备 {} 版本与编码: hwVer={}, swVer={}, BMSCode='{}', VIN='{}', clientCode='{}', devId={}", deviceSn, hwVer, swVer, bmsCode, vin, clientCode, devId);
log.info("设备 {} 系统状态: sysVolV={}, sysCurA={}, cellCount={}, tempSensorCount={}, relayStatus={}, onaaccStatus={}, acStopCode={}, dcStopCode={}, cycleCount={}, samp25V={}, samp5V={}, chargeSopA={}, acChargeSopA={}", deviceSn, sysVol, sysCur, cellCount, tempSensorCount, relayStatus, onaaccStatus, acStopCode, dcStopCode, cycleCount, samp25v, samp5v, chargeSop, acChargeSop);
@@ -1048,6 +1130,7 @@ public class MqttService {
/**
* 读取 ASCII 字符串
+ *
* @param startAbs BatteryData 绝对索引(例如 602 对应 BMS编码起始)
* @param len 字节长度
* @param base 530 的映射起点(message 中的 startIndex)
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsChargeDetailServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsChargeDetailServiceImpl.java
index 2fb14d5..da5abbb 100644
--- a/src/main/java/com/evobms/project/bms/service/impl/BmsChargeDetailServiceImpl.java
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsChargeDetailServiceImpl.java
@@ -1,18 +1,97 @@
package com.evobms.project.bms.service.impl;
-import com.evobms.project.bms.domain.BmsChargeDetail;
-import com.evobms.project.bms.mapper.BmsChargeDetailMapper;
-import com.evobms.project.bms.service.IBmsChargeDetailService;
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsChargeDetailMapper;
+import com.evobms.project.bms.domain.BmsChargeDetail;
+import com.evobms.project.bms.service.IBmsChargeDetailService;
+/**
+ * BMS充电过程详细数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
@Service
-public class BmsChargeDetailServiceImpl implements IBmsChargeDetailService {
+public class BmsChargeDetailServiceImpl extends ServiceImpl implements IBmsChargeDetailService
+{
@Autowired
- private BmsChargeDetailMapper mapper;
+ private BmsChargeDetailMapper bmsChargeDetailMapper;
+ /**
+ * 查询BMS充电过程详细数据
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return BMS充电过程详细数据
+ */
@Override
- public int insertBmsChargeDetail(BmsChargeDetail data) {
- return mapper.insertBmsChargeDetail(data);
+ public BmsChargeDetail selectBmsChargeDetailById(Long id)
+ {
+ return bmsChargeDetailMapper.selectBmsChargeDetailById(id);
+ }
+
+ /**
+ * 查询BMS充电过程详细数据列表
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return BMS充电过程详细数据
+ */
+ @Override
+ public List selectBmsChargeDetailList(BmsChargeDetail bmsChargeDetail)
+ {
+ return bmsChargeDetailMapper.selectBmsChargeDetailList(bmsChargeDetail);
+ }
+
+ /**
+ * 新增BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsChargeDetail(BmsChargeDetail bmsChargeDetail)
+ {
+ bmsChargeDetail.setCreateTime(DateUtils.getNowDate());
+ return bmsChargeDetailMapper.insertBmsChargeDetail(bmsChargeDetail);
+ }
+
+ /**
+ * 修改BMS充电过程详细数据
+ *
+ * @param bmsChargeDetail BMS充电过程详细数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsChargeDetail(BmsChargeDetail bmsChargeDetail)
+ {
+ bmsChargeDetail.setUpdateTime(DateUtils.getNowDate());
+ return bmsChargeDetailMapper.updateBmsChargeDetail(bmsChargeDetail);
+ }
+
+ /**
+ * 批量删除BMS充电过程详细数据
+ *
+ * @param ids 需要删除的BMS充电过程详细数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsChargeDetailByIds(Long[] ids)
+ {
+ return bmsChargeDetailMapper.deleteBmsChargeDetailByIds(ids);
+ }
+
+ /**
+ * 删除BMS充电过程详细数据信息
+ *
+ * @param id BMS充电过程详细数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsChargeDetailById(Long id)
+ {
+ return bmsChargeDetailMapper.deleteBmsChargeDetailById(id);
}
}
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsChargeTemperatureServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsChargeTemperatureServiceImpl.java
new file mode 100644
index 0000000..b958f72
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsChargeTemperatureServiceImpl.java
@@ -0,0 +1,97 @@
+package com.evobms.project.bms.service.impl;
+
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsChargeTemperatureMapper;
+import com.evobms.project.bms.domain.BmsChargeTemperature;
+import com.evobms.project.bms.service.IBmsChargeTemperatureService;
+
+/**
+ * BMS充电座温度数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@Service
+public class BmsChargeTemperatureServiceImpl extends ServiceImpl implements IBmsChargeTemperatureService
+{
+ @Autowired
+ private BmsChargeTemperatureMapper bmsChargeTemperatureMapper;
+
+ /**
+ * 查询BMS充电座温度数据
+ *
+ * @param id BMS充电座温度数据主键
+ * @return BMS充电座温度数据
+ */
+ @Override
+ public BmsChargeTemperature selectBmsChargeTemperatureById(Long id)
+ {
+ return bmsChargeTemperatureMapper.selectBmsChargeTemperatureById(id);
+ }
+
+ /**
+ * 查询BMS充电座温度数据列表
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return BMS充电座温度数据
+ */
+ @Override
+ public List selectBmsChargeTemperatureList(BmsChargeTemperature bmsChargeTemperature)
+ {
+ return bmsChargeTemperatureMapper.selectBmsChargeTemperatureList(bmsChargeTemperature);
+ }
+
+ /**
+ * 新增BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature)
+ {
+ bmsChargeTemperature.setCreateTime(DateUtils.getNowDate());
+ return bmsChargeTemperatureMapper.insertBmsChargeTemperature(bmsChargeTemperature);
+ }
+
+ /**
+ * 修改BMS充电座温度数据
+ *
+ * @param bmsChargeTemperature BMS充电座温度数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsChargeTemperature(BmsChargeTemperature bmsChargeTemperature)
+ {
+ bmsChargeTemperature.setUpdateTime(DateUtils.getNowDate());
+ return bmsChargeTemperatureMapper.updateBmsChargeTemperature(bmsChargeTemperature);
+ }
+
+ /**
+ * 批量删除BMS充电座温度数据
+ *
+ * @param ids 需要删除的BMS充电座温度数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsChargeTemperatureByIds(Long[] ids)
+ {
+ return bmsChargeTemperatureMapper.deleteBmsChargeTemperatureByIds(ids);
+ }
+
+ /**
+ * 删除BMS充电座温度数据信息
+ *
+ * @param id BMS充电座温度数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsChargeTemperatureById(Long id)
+ {
+ return bmsChargeTemperatureMapper.deleteBmsChargeTemperatureById(id);
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsRuntimeDataServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsRuntimeDataServiceImpl.java
new file mode 100644
index 0000000..27d3459
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsRuntimeDataServiceImpl.java
@@ -0,0 +1,97 @@
+package com.evobms.project.bms.service.impl;
+
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsRuntimeDataMapper;
+import com.evobms.project.bms.domain.BmsRuntimeData;
+import com.evobms.project.bms.service.IBmsRuntimeDataService;
+
+/**
+ * BMS实时运行数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@Service
+public class BmsRuntimeDataServiceImpl extends ServiceImpl implements IBmsRuntimeDataService
+{
+ @Autowired
+ private BmsRuntimeDataMapper bmsRuntimeDataMapper;
+
+ /**
+ * 查询BMS实时运行数据
+ *
+ * @param id BMS实时运行数据主键
+ * @return BMS实时运行数据
+ */
+ @Override
+ public BmsRuntimeData selectBmsRuntimeDataById(Long id)
+ {
+ return bmsRuntimeDataMapper.selectBmsRuntimeDataById(id);
+ }
+
+ /**
+ * 查询BMS实时运行数据列表
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return BMS实时运行数据
+ */
+ @Override
+ public List selectBmsRuntimeDataList(BmsRuntimeData bmsRuntimeData)
+ {
+ return bmsRuntimeDataMapper.selectBmsRuntimeDataList(bmsRuntimeData);
+ }
+
+ /**
+ * 新增BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsRuntimeData(BmsRuntimeData bmsRuntimeData)
+ {
+ bmsRuntimeData.setCreateTime(DateUtils.getNowDate());
+ return bmsRuntimeDataMapper.insertBmsRuntimeData(bmsRuntimeData);
+ }
+
+ /**
+ * 修改BMS实时运行数据
+ *
+ * @param bmsRuntimeData BMS实时运行数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsRuntimeData(BmsRuntimeData bmsRuntimeData)
+ {
+ bmsRuntimeData.setUpdateTime(DateUtils.getNowDate());
+ return bmsRuntimeDataMapper.updateBmsRuntimeData(bmsRuntimeData);
+ }
+
+ /**
+ * 批量删除BMS实时运行数据
+ *
+ * @param ids 需要删除的BMS实时运行数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsRuntimeDataByIds(Long[] ids)
+ {
+ return bmsRuntimeDataMapper.deleteBmsRuntimeDataByIds(ids);
+ }
+
+ /**
+ * 删除BMS实时运行数据信息
+ *
+ * @param id BMS实时运行数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsRuntimeDataById(Long id)
+ {
+ return bmsRuntimeDataMapper.deleteBmsRuntimeDataById(id);
+ }
+}
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsSopDataServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsSopDataServiceImpl.java
index 778daf3..edf6863 100644
--- a/src/main/java/com/evobms/project/bms/service/impl/BmsSopDataServiceImpl.java
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsSopDataServiceImpl.java
@@ -1,18 +1,97 @@
package com.evobms.project.bms.service.impl;
-import com.evobms.project.bms.domain.BmsSopData;
-import com.evobms.project.bms.mapper.BmsSopDataMapper;
-import com.evobms.project.bms.service.IBmsSopDataService;
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsSopDataMapper;
+import com.evobms.project.bms.domain.BmsSopData;
+import com.evobms.project.bms.service.IBmsSopDataService;
+/**
+ * BMS功率能力(SOP)数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
@Service
-public class BmsSopDataServiceImpl implements IBmsSopDataService {
+public class BmsSopDataServiceImpl extends ServiceImpl implements IBmsSopDataService
+{
@Autowired
- private BmsSopDataMapper mapper;
+ private BmsSopDataMapper bmsSopDataMapper;
+ /**
+ * 查询BMS功率能力(SOP)数据
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return BMS功率能力(SOP)数据
+ */
@Override
- public int insertBmsSopData(BmsSopData data) {
- return mapper.insertBmsSopData(data);
+ public BmsSopData selectBmsSopDataById(Long id)
+ {
+ return bmsSopDataMapper.selectBmsSopDataById(id);
+ }
+
+ /**
+ * 查询BMS功率能力(SOP)数据列表
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return BMS功率能力(SOP)数据
+ */
+ @Override
+ public List selectBmsSopDataList(BmsSopData bmsSopData)
+ {
+ return bmsSopDataMapper.selectBmsSopDataList(bmsSopData);
+ }
+
+ /**
+ * 新增BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsSopData(BmsSopData bmsSopData)
+ {
+ bmsSopData.setCreateTime(DateUtils.getNowDate());
+ return bmsSopDataMapper.insertBmsSopData(bmsSopData);
+ }
+
+ /**
+ * 修改BMS功率能力(SOP)数据
+ *
+ * @param bmsSopData BMS功率能力(SOP)数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsSopData(BmsSopData bmsSopData)
+ {
+ bmsSopData.setUpdateTime(DateUtils.getNowDate());
+ return bmsSopDataMapper.updateBmsSopData(bmsSopData);
+ }
+
+ /**
+ * 批量删除BMS功率能力(SOP)数据
+ *
+ * @param ids 需要删除的BMS功率能力(SOP)数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsSopDataByIds(Long[] ids)
+ {
+ return bmsSopDataMapper.deleteBmsSopDataByIds(ids);
+ }
+
+ /**
+ * 删除BMS功率能力(SOP)数据信息
+ *
+ * @param id BMS功率能力(SOP)数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsSopDataById(Long id)
+ {
+ return bmsSopDataMapper.deleteBmsSopDataById(id);
}
}
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsSystemStatusServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsSystemStatusServiceImpl.java
index 37e9da2..505e4ab 100644
--- a/src/main/java/com/evobms/project/bms/service/impl/BmsSystemStatusServiceImpl.java
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsSystemStatusServiceImpl.java
@@ -1,18 +1,97 @@
package com.evobms.project.bms.service.impl;
-import com.evobms.project.bms.domain.BmsSystemStatus;
-import com.evobms.project.bms.mapper.BmsSystemStatusMapper;
-import com.evobms.project.bms.service.IBmsSystemStatusService;
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsSystemStatusMapper;
+import com.evobms.project.bms.domain.BmsSystemStatus;
+import com.evobms.project.bms.service.IBmsSystemStatusService;
+/**
+ * BMS系统状态数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
@Service
-public class BmsSystemStatusServiceImpl implements IBmsSystemStatusService {
+public class BmsSystemStatusServiceImpl extends ServiceImpl implements IBmsSystemStatusService
+{
@Autowired
- private BmsSystemStatusMapper mapper;
+ private BmsSystemStatusMapper bmsSystemStatusMapper;
+ /**
+ * 查询BMS系统状态数据
+ *
+ * @param id BMS系统状态数据主键
+ * @return BMS系统状态数据
+ */
@Override
- public int insertBmsSystemStatus(BmsSystemStatus data) {
- return mapper.insertBmsSystemStatus(data);
+ public BmsSystemStatus selectBmsSystemStatusById(Long id)
+ {
+ return bmsSystemStatusMapper.selectBmsSystemStatusById(id);
+ }
+
+ /**
+ * 查询BMS系统状态数据列表
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return BMS系统状态数据
+ */
+ @Override
+ public List selectBmsSystemStatusList(BmsSystemStatus bmsSystemStatus)
+ {
+ return bmsSystemStatusMapper.selectBmsSystemStatusList(bmsSystemStatus);
+ }
+
+ /**
+ * 新增BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsSystemStatus(BmsSystemStatus bmsSystemStatus)
+ {
+ bmsSystemStatus.setCreateTime(DateUtils.getNowDate());
+ return bmsSystemStatusMapper.insertBmsSystemStatus(bmsSystemStatus);
+ }
+
+ /**
+ * 修改BMS系统状态数据
+ *
+ * @param bmsSystemStatus BMS系统状态数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsSystemStatus(BmsSystemStatus bmsSystemStatus)
+ {
+ bmsSystemStatus.setUpdateTime(DateUtils.getNowDate());
+ return bmsSystemStatusMapper.updateBmsSystemStatus(bmsSystemStatus);
+ }
+
+ /**
+ * 批量删除BMS系统状态数据
+ *
+ * @param ids 需要删除的BMS系统状态数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsSystemStatusByIds(Long[] ids)
+ {
+ return bmsSystemStatusMapper.deleteBmsSystemStatusByIds(ids);
+ }
+
+ /**
+ * 删除BMS系统状态数据信息
+ *
+ * @param id BMS系统状态数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsSystemStatusById(Long id)
+ {
+ return bmsSystemStatusMapper.deleteBmsSystemStatusById(id);
}
}
diff --git a/src/main/java/com/evobms/project/bms/service/impl/BmsVoltageChannelDataServiceImpl.java b/src/main/java/com/evobms/project/bms/service/impl/BmsVoltageChannelDataServiceImpl.java
new file mode 100644
index 0000000..f489599
--- /dev/null
+++ b/src/main/java/com/evobms/project/bms/service/impl/BmsVoltageChannelDataServiceImpl.java
@@ -0,0 +1,97 @@
+package com.evobms.project.bms.service.impl;
+
+import java.util.List;
+import com.evobms.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.evobms.project.bms.mapper.BmsVoltageChannelDataMapper;
+import com.evobms.project.bms.domain.BmsVoltageChannelData;
+import com.evobms.project.bms.service.IBmsVoltageChannelDataService;
+
+/**
+ * BMS电压通道数据Service业务层处理
+ *
+ * @author tzy
+ * @date 2026-02-23
+ */
+@Service
+public class BmsVoltageChannelDataServiceImpl extends ServiceImpl implements IBmsVoltageChannelDataService
+{
+ @Autowired
+ private BmsVoltageChannelDataMapper bmsVoltageChannelDataMapper;
+
+ /**
+ * 查询BMS电压通道数据
+ *
+ * @param id BMS电压通道数据主键
+ * @return BMS电压通道数据
+ */
+ @Override
+ public BmsVoltageChannelData selectBmsVoltageChannelDataById(Long id)
+ {
+ return bmsVoltageChannelDataMapper.selectBmsVoltageChannelDataById(id);
+ }
+
+ /**
+ * 查询BMS电压通道数据列表
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return BMS电压通道数据
+ */
+ @Override
+ public List selectBmsVoltageChannelDataList(BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ return bmsVoltageChannelDataMapper.selectBmsVoltageChannelDataList(bmsVoltageChannelData);
+ }
+
+ /**
+ * 新增BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ @Override
+ public int insertBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ bmsVoltageChannelData.setCreateTime(DateUtils.getNowDate());
+ return bmsVoltageChannelDataMapper.insertBmsVoltageChannelData(bmsVoltageChannelData);
+ }
+
+ /**
+ * 修改BMS电压通道数据
+ *
+ * @param bmsVoltageChannelData BMS电压通道数据
+ * @return 结果
+ */
+ @Override
+ public int updateBmsVoltageChannelData(BmsVoltageChannelData bmsVoltageChannelData)
+ {
+ bmsVoltageChannelData.setUpdateTime(DateUtils.getNowDate());
+ return bmsVoltageChannelDataMapper.updateBmsVoltageChannelData(bmsVoltageChannelData);
+ }
+
+ /**
+ * 批量删除BMS电压通道数据
+ *
+ * @param ids 需要删除的BMS电压通道数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsVoltageChannelDataByIds(Long[] ids)
+ {
+ return bmsVoltageChannelDataMapper.deleteBmsVoltageChannelDataByIds(ids);
+ }
+
+ /**
+ * 删除BMS电压通道数据信息
+ *
+ * @param id BMS电压通道数据主键
+ * @return 结果
+ */
+ @Override
+ public int deleteBmsVoltageChannelDataById(Long id)
+ {
+ return bmsVoltageChannelDataMapper.deleteBmsVoltageChannelDataById(id);
+ }
+}
diff --git a/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java b/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java
index fb194b8..e2d8238 100644
--- a/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java
+++ b/src/main/java/com/evobms/project/system/controller/BmsDevicesController.java
@@ -22,6 +22,24 @@ import com.evobms.common.utils.poi.ExcelUtil;
import com.evobms.framework.web.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.evobms.project.vehicledata.dto.DeviceRealtimeDTO;
+import com.evobms.project.vehicledata.dto.NameValueDTO;
+import com.evobms.project.vehicledata.dto.DeviceRealtimeDTO.SystemStatusSection;
+import com.evobms.project.vehicledata.dto.DeviceRealtimeDTO.RunStatusSection;
+import com.evobms.project.vehicledata.dto.DeviceRealtimeDTO.ChargeSection;
+import com.evobms.project.vehicledata.dto.DeviceRealtimeDTO.StatisticsSection;
+import com.evobms.project.vehicledata.dto.LineSeriesDTO;
+import com.evobms.project.vehicledata.dto.TimePointDTO;
+import com.evobms.project.vehicledata.service.IVehicleDataService;
+import com.evobms.project.vehicledata.domain.VehicleData;
+import com.evobms.project.battery.service.IExtremeValuesService;
+import com.evobms.project.battery.domain.ExtremeValues;
+import com.evobms.project.bms.service.*;
+import com.evobms.project.bms.domain.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.stream.Collectors;
/**
* BBOX管理Controller
@@ -75,6 +93,167 @@ public class BmsDevicesController extends BaseController
return success(bmsDevicesService.selectBmsDevicesById(id));
}
+ @Autowired private IVehicleDataService vehicleDataService;
+ @Autowired private IExtremeValuesService extremeValuesService;
+ @Autowired private IBmsSystemStatusService bmsSystemStatusService;
+ @Autowired private IBmsChargeDetailService bmsChargeDetailService;
+ @Autowired private IBmsChargeTemperatureService bmsChargeTemperatureService;
+ @Autowired private IBmsVoltageChannelDataService bmsVoltageChannelDataService;
+ @Autowired private IBmsSopDataService bmsSopDataService;
+
+ @GetMapping("/realtime/{deviceId}")
+ @ApiOperation("设备实时数据")
+ public AjaxResult realtime(@PathVariable("deviceId") String deviceId) {
+ DeviceRealtimeDTO dto = new DeviceRealtimeDTO();
+ dto.setDeviceId(deviceId);
+ VehicleData vd = vehicleDataService.selectLatestByDeviceId(deviceId);
+ ExtremeValues ev = extremeValuesService.selectLatestByDeviceId(deviceId);
+ SystemStatusSection sys = new SystemStatusSection();
+ if (vd != null) {
+ sys.setTotalVoltage(vd.getTotalVoltage());
+ sys.setTotalCurrent(vd.getTotalCurrent());
+ sys.setSoc(vd.getSoc());
+ }
+ if (ev != null) {
+ sys.setMaxCellVoltage(ev.getMaxVoltageValue());
+ sys.setMaxCellPos(ev.getMaxVoltageSubsystemNo() == null || ev.getMaxVoltageBatteryNo() == null ? null :
+ ev.getMaxVoltageSubsystemNo() + "-" + ev.getMaxVoltageBatteryNo());
+ sys.setMinCellVoltage(ev.getMinVoltageValue());
+ sys.setMinCellPos(ev.getMinVoltageSubsystemNo() == null || ev.getMinVoltageBatteryNo() == null ? null :
+ ev.getMinVoltageSubsystemNo() + "-" + ev.getMinVoltageBatteryNo());
+ sys.setMaxTemp(ev.getMaxTempValue());
+ sys.setMaxTempPos(ev.getMaxTempSubsystemNo() == null || ev.getMaxTempProbeNo() == null ? null :
+ ev.getMaxTempSubsystemNo() + "-" + ev.getMaxTempProbeNo());
+ sys.setMinTemp(ev.getMinTempValue());
+ sys.setMinTempPos(ev.getMinTempSubsystemNo() == null || ev.getMinTempProbeNo() == null ? null :
+ ev.getMinTempSubsystemNo() + "-" + ev.getMinTempProbeNo());
+ }
+ dto.setSystemStatus(sys);
+
+ RunStatusSection run = new RunStatusSection();
+ if (vd != null) {
+ run.setChargingStatus(vd.getChargingStatus());
+ }
+ BmsSystemStatus ss = bmsSystemStatusService.lambdaQuery()
+ .eq(BmsSystemStatus::getDeviceId, deviceId)
+ .orderByDesc(BmsSystemStatus::getCreateTime).last("limit 1").one();
+ if (ss != null) {
+ run.setRelayStatus(ss.getRelayStatus());
+ run.setOnaaccStatus(ss.getOnaaccStatus());
+ run.setResetCount(ss.getResetCount());
+ run.setCycleCount(ss.getCycleCount());
+ run.setSample25v(ss.getSample25v());
+ run.setSample5v(ss.getSample5v());
+ }
+ dto.setRunStatus(run);
+
+ ChargeSection chg = new ChargeSection();
+ BmsChargeDetail cd = bmsChargeDetailService.lambdaQuery()
+ .eq(BmsChargeDetail::getDeviceId, deviceId)
+ .orderByDesc(BmsChargeDetail::getCreateTime).last("limit 1").one();
+ if (cd != null) {
+ chg.setAcChargeCurrent(cd.getAcChargeCurrent());
+ chg.setAcChargeVoltage(cd.getAcChargeVoltage());
+ chg.setDcChargeCurrent(cd.getDcChargeCurrent());
+ chg.setDcChargeVoltage(cd.getDcChargeVoltage());
+ chg.setChargeTime(cd.getChargeTime());
+ chg.setAcStopCode(cd.getAcStopCode());
+ chg.setDcStopCode(cd.getDcStopCode());
+ chg.setAcCpValue(cd.getAcCpValue());
+ chg.setAcGunResistance(cd.getAcGunResistance());
+ chg.setChargingStage(cd.getChargingStage());
+ chg.setAcStage(cd.getAcStage());
+ chg.setDcStage(cd.getDcStage());
+ }
+ dto.setCharge(chg);
+
+ StatisticsSection stat = new StatisticsSection();
+ if (ss != null) {
+ stat.setCycleCount(ss.getCycleCount());
+ }
+ stat.setTotalRunHours(0L);
+ stat.setTotalChargeHours(0L);
+ stat.setTotalDischargeHours(0L);
+ dto.setStatistics(stat);
+
+ List temps = bmsChargeTemperatureService.lambdaQuery()
+ .eq(BmsChargeTemperature::getDeviceId, deviceId)
+ .orderByDesc(BmsChargeTemperature::getCreateTime).last("limit 8").list();
+ List tempItems = new ArrayList<>();
+ if (temps != null) {
+ String ts = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ for (BmsChargeTemperature t : temps) {
+ NameValueDTO nv = new NameValueDTO();
+ nv.setName("T" + t.getTempIndex());
+ nv.setValue(t.getTemperature() == null ? 0 : t.getTemperature().longValue());
+ nv.setCreateTime(ts);
+ tempItems.add(nv);
+ }
+ }
+ dto.setTemperatures(tempItems);
+
+ List chs = bmsVoltageChannelDataService.lambdaQuery()
+ .eq(BmsVoltageChannelData::getDeviceId, deviceId)
+ .orderByDesc(BmsVoltageChannelData::getCreateTime).last("limit 16").list();
+ List voltItems = new ArrayList<>();
+ if (chs != null) {
+ String ts = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ for (BmsVoltageChannelData c : chs) {
+ NameValueDTO nv = new NameValueDTO();
+ nv.setName((c.getChannelType() == null ? "CH" : c.getChannelType()) + "-" + c.getChannelIndex());
+ nv.setValue(c.getVoltage() == null ? 0 : c.getVoltage().longValue());
+ nv.setCreateTime(ts);
+ voltItems.add(nv);
+ }
+ }
+ dto.setVoltages(voltItems);
+
+ dto.setFaults(new ArrayList<>());
+ // 折线图:最近24小时(按createTime过滤),默认RTP-1与T1
+ Date now = new Date();
+ Date begin = new Date(now.getTime() - 24L * 3600_000L);
+ List vtrend = bmsVoltageChannelDataService.lambdaQuery()
+ .eq(BmsVoltageChannelData::getDeviceId, deviceId)
+ .eq(BmsVoltageChannelData::getChannelType, "RTP")
+ .eq(BmsVoltageChannelData::getChannelIndex, 1)
+ .ge(BmsVoltageChannelData::getCreateTime, begin)
+ .le(BmsVoltageChannelData::getCreateTime, now)
+ .orderByAsc(BmsVoltageChannelData::getCreateTime)
+ .list();
+ java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ List vpoints = new ArrayList<>();
+ for (BmsVoltageChannelData it : vtrend) {
+ TimePointDTO p = new TimePointDTO();
+ p.setTime(it.getCreateTime() == null ? null : f.format(it.getCreateTime()));
+ p.setValue(it.getVoltage());
+ vpoints.add(p);
+ }
+ LineSeriesDTO vseries = new LineSeriesDTO();
+ vseries.setName("RTP-1");
+ vseries.setPoints(vpoints);
+ dto.setVoltageTrend(java.util.Collections.singletonList(vseries));
+
+ List ttrend = bmsChargeTemperatureService.lambdaQuery()
+ .eq(BmsChargeTemperature::getDeviceId, deviceId)
+ .eq(BmsChargeTemperature::getTempIndex, 1)
+ .ge(BmsChargeTemperature::getCreateTime, begin)
+ .le(BmsChargeTemperature::getCreateTime, now)
+ .orderByAsc(BmsChargeTemperature::getCreateTime)
+ .list();
+ List tpoints = new ArrayList<>();
+ for (BmsChargeTemperature it : ttrend) {
+ TimePointDTO p = new TimePointDTO();
+ p.setTime(it.getCreateTime() == null ? null : f.format(it.getCreateTime()));
+ p.setValue(it.getTemperature());
+ tpoints.add(p);
+ }
+ LineSeriesDTO tseries = new LineSeriesDTO();
+ tseries.setName("T1");
+ tseries.setPoints(tpoints);
+ dto.setTemperatureTrend(java.util.Collections.singletonList(tseries));
+ return success(dto);
+ }
+
/**
* 新增BBOX管理
*/
diff --git a/src/main/java/com/evobms/project/vehicledata/controller/BatteryChartController.java b/src/main/java/com/evobms/project/vehicledata/controller/BatteryChartController.java
index f6b36e2..06543ad 100644
--- a/src/main/java/com/evobms/project/vehicledata/controller/BatteryChartController.java
+++ b/src/main/java/com/evobms/project/vehicledata/controller/BatteryChartController.java
@@ -1,43 +1,46 @@
package com.evobms.project.vehicledata.controller;
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.evobms.framework.web.domain.R;
+import com.evobms.project.battery.domain.ExtremeValues;
+import com.evobms.project.battery.domain.SubsystemTemperature;
+import com.evobms.project.battery.domain.SubsystemVoltage;
+import com.evobms.project.battery.service.IExtremeValuesService;
+import com.evobms.project.battery.service.ISubsystemTemperatureService;
+import com.evobms.project.battery.service.ISubsystemVoltageService;
+import com.evobms.project.system.domain.BmsDevices;
+import com.evobms.project.system.mapper.BmsDevicesMapper;
import com.evobms.project.vehicledata.domain.HomeDashboardDTO;
-import org.apache.ibatis.annotations.Result;
+import com.evobms.project.vehicledata.domain.VehicleData;
+import com.evobms.project.vehicledata.domain.VehicleLocation;
+import com.evobms.project.vehicledata.dto.*;
+import com.evobms.project.vehicledata.service.IVehicleDataService;
+import com.evobms.project.vehicledata.service.IVehicleLocationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import com.evobms.project.vehicledata.service.IVehicleDataService;
-import com.evobms.project.vehicledata.service.IVehicleLocationService;
-import com.evobms.project.vehicledata.domain.VehicleData;
-import com.evobms.project.vehicledata.domain.VehicleLocation;
-import com.evobms.project.vehicledata.dto.ChartDataPoint;
-import com.evobms.project.battery.service.ISubsystemVoltageService;
-import com.evobms.project.battery.service.ISubsystemTemperatureService;
-import com.evobms.project.battery.domain.SubsystemVoltage;
-import com.evobms.project.battery.domain.SubsystemTemperature;
-import com.evobms.project.battery.service.IExtremeValuesService;
-import com.evobms.project.battery.domain.ExtremeValues;
+
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
/**
- * 图标组件Controller
+ * 首页数据Controller
*
* @author 田志阳
* @date 2025-11-15
*/
@RestController
-@Api(tags = "图表组件")
+@Api(tags = "首页数据统计")
public class BatteryChartController {
@Autowired
@@ -55,45 +58,37 @@ public class BatteryChartController {
@Autowired
private IExtremeValuesService extremeValuesService;
+ @Autowired
+ private BmsDevicesMapper bmsDevicesMapper;
+
// 图表数据:按最近 hours 小时返回整车电压/电流/SOC 的时间序列
@GetMapping("/battery-data/{deviceId}/chart")
- @ApiOperation(value = "整车电压电流SOC时间序列", notes = "按最近hours小时返回时间序列")
- public List getChartData(
- @ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId,
- @ApiParam(value = "最近多少小时的数据", defaultValue = "24") @RequestParam(value = "hours", required = false, defaultValue = "24") int hours) {
+ @ApiOperation(value = "-整车电压电流SOC时间序列", notes = "按最近hours小时返回时间序列")
+ public List getChartData(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "最近多少小时的数据", defaultValue = "24") @RequestParam(value = "hours", required = false, defaultValue = "24") int hours) {
long millis = System.currentTimeMillis() - (long) hours * 3600_000L;
Date startTime = new Date(millis);
List rows = vehicleDataService.selectByDeviceAndStartTime(deviceId, startTime);
- return rows.stream().map(v -> new ChartDataPoint(
- v.getTimestamp(),
- v.getTotalVoltage() == null ? 0 : v.getTotalVoltage().doubleValue(),
- v.getTotalCurrent() == null ? 0 : v.getTotalCurrent().doubleValue(),
- v.getSoc() == null ? 0 : v.getSoc()
- )).collect(Collectors.toList());
+ return rows.stream().map(v -> new ChartDataPoint(v.getTimestamp(), v.getTotalVoltage() == null ? 0 : v.getTotalVoltage().doubleValue(), v.getTotalCurrent() == null ? 0 : v.getTotalCurrent().doubleValue(), v.getSoc() == null ? 0 : v.getSoc())).collect(Collectors.toList());
}
// 整车最新:返回 deviceId 最新的一条整车数据
@GetMapping("/vehicle-data/{deviceId}/latest")
- @ApiOperation(value = "整车最新数据", notes = "返回指定设备最新整车数据")
+ @ApiOperation(value = "-整车最新数据", notes = "返回指定设备最新整车数据")
public VehicleData latestVehicleData(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId) {
return vehicleDataService.selectLatestByDeviceId(deviceId);
}
// 位置最新:返回 deviceId 最新的一条位置数据
@GetMapping("/vehicle-location/{deviceId}/latest")
- @ApiOperation(value = "车辆最新位置", notes = "返回指定设备最新位置数据")
+ @ApiOperation(value = "-车辆最新位置", notes = "返回指定设备最新位置数据")
public VehicleLocation latestVehicleLocation(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId) {
return vehicleLocationService.selectLatestByDeviceId(deviceId);
}
// 位置轨迹:按时间范围返回位置列表,start/end 为毫秒时间戳,可选 limit 限制条数
@GetMapping("/vehicle-location/{deviceId}")
- @ApiOperation(value = "车辆位置轨迹", notes = "按时间范围返回位置列表")
- public List locationRange(
- @ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId,
- @ApiParam(value = "开始时间戳(毫秒)", required = true) @RequestParam("start") long startMillis,
- @ApiParam(value = "结束时间戳(毫秒)", required = true) @RequestParam("end") long endMillis,
- @ApiParam(value = "限制返回条数") @RequestParam(value = "limit", required = false) Integer limit) {
+ @ApiOperation(value = "-车辆位置轨迹", notes = "按时间范围返回位置列表")
+ public List locationRange(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "开始时间戳(毫秒)", required = true) @RequestParam("start") long startMillis, @ApiParam(value = "结束时间戳(毫秒)", required = true) @RequestParam("end") long endMillis, @ApiParam(value = "限制返回条数") @RequestParam(value = "limit", required = false) Integer limit) {
Date start = new Date(startMillis);
Date end = new Date(endMillis);
return vehicleLocationService.selectByDeviceAndRange(deviceId, start, end, limit);
@@ -101,27 +96,21 @@ public class BatteryChartController {
// 子系统最新帧(电压):返回指定子系统号最新的一帧电压数据
@GetMapping("/subsystem-voltage/{deviceId}/{subsystemNo}/latest")
- @ApiOperation(value = "子系统最新电压帧", notes = "返回指定子系统最新电压数据")
- public SubsystemVoltage latestVoltage(
- @ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId,
- @ApiParam(value = "子系统号", required = true) @PathVariable("subsystemNo") Integer subsystemNo) {
+ @ApiOperation(value = "-子系统最新电压帧", notes = "返回指定子系统最新电压数据")
+ public SubsystemVoltage latestVoltage(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "子系统号", required = true) @PathVariable("subsystemNo") Integer subsystemNo) {
return subsystemVoltageService.selectLatestByDeviceAndSubsystem(deviceId, subsystemNo);
}
// 子系统最新帧(温度):返回指定子系统号最新的一帧温度数据
@GetMapping("/subsystem-temperature/{deviceId}/{subsystemNo}/latest")
- @ApiOperation(value = "子系统最新温度帧", notes = "返回指定子系统最新温度数据")
- public SubsystemTemperature latestTemperature(
- @ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId,
- @ApiParam(value = "子系统号", required = true) @PathVariable("subsystemNo") Integer subsystemNo) {
+ @ApiOperation(value = "-子系统最新温度帧", notes = "返回指定子系统最新温度数据")
+ public SubsystemTemperature latestTemperature(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "子系统号", required = true) @PathVariable("subsystemNo") Integer subsystemNo) {
return subsystemTemperatureService.selectLatestByDeviceAndSubsystem(deviceId, subsystemNo);
}
@GetMapping("/extreme-values/{deviceId}/latest")
- @ApiOperation(value = "极值最新数据", notes = "返回指定设备极值数据,支持before筛选")
- public ExtremeValues latestExtremeValues(
- @ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId,
- @ApiParam(value = "筛选指定时间之前的数据(yyyy-MM-dd HH:mm:ss 或 毫秒时间戳)") @RequestParam(value = "before", required = false) String before) {
+ @ApiOperation(value = "-极值最新数据", notes = "返回指定设备极值数据,支持before筛选")
+ public ExtremeValues latestExtremeValues(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "筛选指定时间之前的数据(yyyy-MM-dd HH:mm:ss 或 毫秒时间戳)") @RequestParam(value = "before", required = false) String before) {
if (before == null || before.isEmpty()) {
return extremeValuesService.selectLatestByDeviceId(deviceId);
}
@@ -137,12 +126,351 @@ public class BatteryChartController {
}
return extremeValuesService.selectLatestByDeviceIdBefore(deviceId, beforeTime);
}
+
@GetMapping("/api/dashboard/home")
- @ApiOperation(value = "首页所有分布数据", notes = "获取首页大屏的分布统计数据")
- public R home(){
+ @ApiOperation(value = "-首页所有分布数据", notes = "获取首页大屏的分布统计数据")
+ public R home() {
HomeDashboardDTO dto = vehicleDataService.getHomeDashboard();
return R.ok(dto);
}
+ /* @GetMapping("/monitor/dashboard/summary")
+ @ApiOperation(value = "首页卡片统计", notes = "返回项目数、设备数、在线数、故障数")
+ public R summary() {
+ long deviceCount = bmsDevicesMapper.selectCount(null);
+ long onlineCount = bmsDevicesMapper.selectCount(new QueryWrapper().eq("status", "online"));
+ long projectCount = 22L;
+ long faultCount = 12L;
+ DashboardSummaryDTO dto = new DashboardSummaryDTO();
+ dto.setProjectCount(projectCount);
+ dto.setDeviceCount(deviceCount);
+ dto.setOnlineCount(onlineCount);
+ dto.setFaultCount(faultCount);
+ return R.ok(dto);
+ }*/
+
+ /* @GetMapping("/monitor/dashboard/soc-distribution")
+ @ApiOperation(value = "设备SOC分布", notes = "按每台设备最新SOC值统计")
+ public R> socDistribution(@ApiParam(value = "分桶边界,逗号分隔,例:0,20,40,60,80,100") @RequestParam(value = "bins", required = false, defaultValue = "0,20,40,60,80,100") String bins, @ApiParam(value = "是否包含离线设备", defaultValue = "false") @RequestParam(value = "includeOffline", required = false, defaultValue = "false") boolean includeOffline) {
+ List edges = Stream.of(bins.split(",")).map(String::trim).filter(s -> !s.isEmpty()).map(Integer::parseInt).sorted().toList();
+ if (edges.size() < 2) {
+ return R.ok(new ArrayList<>());
+ }
+ long[] counts = new long[edges.size() - 1];
+ QueryWrapper qw = new QueryWrapper<>();
+ if (!includeOffline) {
+ //查询在线设备
+ qw.eq("status", "online");
+ }
+ List devices = bmsDevicesMapper.selectList(qw);
+
+ for (BmsDevices d : devices) {
+ String deviceId = d.getDeviceId();
+ if (deviceId == null || deviceId.isEmpty()) {
+ continue;
+ }
+ VehicleData latest = vehicleDataService.selectLatestByDeviceId(deviceId);
+ Integer soc = latest == null ? null : latest.getSoc();
+ //过滤
+ if (soc == null || soc < 0 || soc > 100) {
+ continue;
+ }
+ for (int i = 0; i < counts.length; i++) {
+ int min = edges.get(i);
+ int max = edges.get(i + 1);
+ boolean isLast = (i == counts.length - 1);
+ boolean inRange = isLast ? (soc >= min && soc <= max) : (soc >= min && soc < max);
+ if (inRange) {
+ counts[i]++;
+ break;
+ }
+ }
+ }
+
+ List items = new ArrayList<>(counts.length);
+ String ts = Instant.now().toString();
+ for (int i = 0; i < counts.length; i++) {
+ int min = edges.get(i);
+ int max = edges.get(i + 1);
+ NameValueDTO nv = new NameValueDTO();
+ nv.setName(min + "-" + max + "%");
+ nv.setValue(counts[i]);
+ nv.setCreateTime(ts);
+ items.add(nv);
+ }
+
+ return R.ok(items);
+ }
+*/
+ @GetMapping("/monitor/dashboard/overview")
+ @ApiOperation(value = "首页概览聚合", notes = "返回基础统计、SOC分布、日充放电趋势")
+ public R overview(@ApiParam(value = "SOC分桶,默认 0,20,40,60,80,100") @RequestParam(value = "bins", required = false, defaultValue = "0,20,40,60,80,100") String bins, @ApiParam(value = "趋势统计天数", defaultValue = "7") @RequestParam(value = "days", required = false, defaultValue = "7") int days, @ApiParam(value = "运行时长档位(小时)", defaultValue = "10,50,100,150,200,250,300") @RequestParam(value = "runtimeBins", required = false, defaultValue = "10,50,100,150,200,250,300") String runtimeBins) {
+ DashboardOverviewDTO out = new DashboardOverviewDTO();
+ // summary
+ long deviceCount = bmsDevicesMapper.selectCount(null);
+ long onlineCount = bmsDevicesMapper.selectCount(new QueryWrapper().eq("status", "online"));
+ long projectCount = 22L;
+ long faultCount = 12L;
+ DashboardSummaryDTO s = new DashboardSummaryDTO();
+ s.setProjectCount(projectCount);
+ s.setDeviceCount(deviceCount);
+ s.setOnlineCount(onlineCount);
+ s.setFaultCount(faultCount);
+ out.setSummary(s);
+ // soc distribution
+ List edges = Stream.of(bins.split(",")).map(String::trim).filter(x -> !x.isEmpty()).map(Integer::parseInt).sorted().toList();
+ long[] counts = new long[Math.max(0, edges.size() - 1)];
+ if (counts.length > 0) {
+ List devices = bmsDevicesMapper.selectList(new QueryWrapper().eq("status", "online"));
+ for (BmsDevices d : devices) {
+ String did = d.getDeviceId();
+ if (did == null || did.isEmpty()) continue;
+ VehicleData latest = vehicleDataService.selectLatestByDeviceId(did);
+ Integer soc = latest == null ? null : latest.getSoc();
+ if (soc == null || soc < 0 || soc > 100) continue;
+ for (int i = 0; i < counts.length; i++) {
+ int min = edges.get(i), max = edges.get(i + 1);
+ boolean last = i == counts.length - 1;
+ boolean in = last ? soc >= min && soc <= max : soc >= min && soc < max;
+ if (in) {
+ counts[i]++;
+ break;
+ }
+ }
+ }
+ }
+ String ts = Instant.now().toString();
+ List pie = new ArrayList<>();
+ for (int i = 0; i < counts.length; i++) {
+ int min = edges.get(i), max = edges.get(i + 1);
+ NameValueDTO nv = new NameValueDTO();
+ nv.setName(min + "-" + max + "%");
+ nv.setValue(counts[i]);
+ nv.setCreateTime(ts);
+ pie.add(nv);
+ }
+ out.setSocDistribution(pie);
+ // trend (simple heuristic by VehicleData records)
+ int safeDays = Math.max(1, Math.min(31, days));
+ Date endTime = new Date();
+ Date startTime = Date.from(Instant.ofEpochMilli(endTime.getTime()).minusSeconds(safeDays * 86400L));
+ // 复用 selectVehicleDataList 进行时间范围查询
+ VehicleData q = new VehicleData();
+ Map params = new HashMap<>();
+ params.put("beginTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTime));
+ params.put("endTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endTime));
+ q.setParams(params);
+ List all = vehicleDataService.selectVehicleDataList(q);
+ all.sort((a, b) -> {
+ if (a.getDeviceId() == null)
+ return -1;
+ if (b.getDeviceId() == null)
+ return 1;
+ int c = a.getDeviceId().compareTo(b.getDeviceId());
+ if (c != 0) return c;
+ return a.getTimestamp().compareTo(b.getTimestamp());
+ });
+ Map byDate = new HashMap<>();
+ SimpleDateFormat dayFmt = new SimpleDateFormat("yyyy-MM-dd");
+ // 初始化天数
+ LocalDate today = LocalDate.now();
+ for (int i = safeDays - 1; i >= 0; i--) {
+ LocalDate d = today.minusDays(i);
+ DashboardTrendItemDTO item = new DashboardTrendItemDTO();
+ item.setDate(d.toString());
+ item.setChargeDuration(0);
+ item.setDischargeDuration(0);
+ byDate.put(d.toString(), item);
+ }
+ // 累加相邻样本间隔(秒)
+ for (int i = 0; i < all.size() - 1; i++) {
+ VehicleData cur = all.get(i);
+ VehicleData nex = all.get(i + 1);
+ if (cur.getDeviceId() == null || !cur.getDeviceId().equals(nex.getDeviceId())) continue;
+ if (cur.getTimestamp() == null || nex.getTimestamp() == null) continue;
+ long delta = (nex.getTimestamp().getTime() - cur.getTimestamp().getTime()) / 1000L;
+ if (delta <= 0 || delta > 6 * 3600) continue; // 限制单段不超过6小时
+ String key = dayFmt.format(cur.getTimestamp());
+ DashboardTrendItemDTO item = byDate.get(key);
+ if (item == null) continue;
+ Integer st = cur.getChargingStatus();
+ if (st != null && (st == 1 || st == 2)) {
+ item.setChargeDuration(item.getChargeDuration() + delta);
+ } else if (st != null && st == 3) {
+ item.setDischargeDuration(item.getDischargeDuration() + delta);
+ }
+ }
+ List trend = byDate.values().stream().sorted(java.util.Comparator.comparing(DashboardTrendItemDTO::getDate)).collect(Collectors.toList());
+ out.setTrend(trend);
+ // runtime summary + distribution
+ long sumChargeSec = trend.stream().mapToLong(DashboardTrendItemDTO::getChargeDuration).sum();
+ long sumDischargeSec = trend.stream().mapToLong(DashboardTrendItemDTO::getDischargeDuration).sum();
+ RuntimeSummaryDTO rsum = new RuntimeSummaryDTO();
+ rsum.setTotalChargeHours(sumChargeSec / 3600);
+ rsum.setTotalDischargeHours(sumDischargeSec / 3600);
+ rsum.setTotalRunHours((sumChargeSec + sumDischargeSec) / 3600);
+ rsum.setTotalChargeEnergyKWh(0);
+ rsum.setTotalDischargeEnergyKWh(0);
+ rsum.setTotalChargeCapacityAh(0);
+ rsum.setTotalDischargeCapacityAh(0);
+ out.setRuntimeSummary(rsum);
+ // 每设备运行小时(近 days),按 chargingStatus in (1,2,3) 累加
+ Map runSecByDevice = new HashMap<>();
+ for (int i = 0; i < all.size() - 1; i++) {
+ VehicleData cur = all.get(i);
+ VehicleData nex = all.get(i + 1);
+ if (cur.getDeviceId() == null || !cur.getDeviceId().equals(nex.getDeviceId())) continue;
+ if (cur.getTimestamp() == null || nex.getTimestamp() == null) continue;
+ long delta = (nex.getTimestamp().getTime() - cur.getTimestamp().getTime()) / 1000L;
+ if (delta <= 0 || delta > 6 * 3600) continue;
+ Integer st = cur.getChargingStatus();
+ if (st != null && (st == 1 || st == 2 || st == 3)) {
+ runSecByDevice.merge(cur.getDeviceId(), delta, Long::sum);
+ }
+ }
+ List hb = Stream.of(runtimeBins.split(",")).map(String::trim).filter(x -> !x.isEmpty()).map(Integer::parseInt).sorted().toList();
+ long[] hCounts = new long[Math.max(0, hb.size() - 1)];
+ for (Map.Entry e : runSecByDevice.entrySet()) {
+ long hours = e.getValue() / 3600;
+ for (int i = 0; i < hCounts.length; i++) {
+ int min = hb.get(i), max = hb.get(i + 1);
+ boolean last = i == hCounts.length - 1;
+ boolean in = last ? hours >= min && hours <= max : hours >= min && hours < max;
+ if (in) { hCounts[i]++; break; }
+ }
+ }
+ List runtimeDist = new ArrayList<>();
+ String now = Instant.now().toString();
+ for (int i = 0; i < hCounts.length; i++) {
+ int min = hb.get(i), max = hb.get(i + 1);
+ NameValueDTO nv = new NameValueDTO();
+ nv.setName(min + "h");
+ nv.setValue(hCounts[i]);
+ nv.setCreateTime(now);
+ runtimeDist.add(nv);
+ }
+ out.setRuntimeDuration(runtimeDist);
+ return R.ok(out);
+ }
+
+ @GetMapping("/monitor/device/latest-locations")
+ @ApiOperation(value = "所有设备最新位置", notes = "返回每个设备的设备对象与其最新位置")
+ public R> latestLocations(@ApiParam(value = "是否仅包含在线设备", defaultValue = "false") @RequestParam(value = "onlineOnly", required = false, defaultValue = "false") boolean onlineOnly) {
+ QueryWrapper qw = new QueryWrapper<>();
+ if (onlineOnly) {
+ qw.eq("status", "online");
+ }
+ List devices = bmsDevicesMapper.selectList(qw);
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ List result = new ArrayList<>(devices.size());
+ for (BmsDevices d : devices) {
+ String did = d.getDeviceId();
+ VehicleLocation loc = did == null ? null : vehicleLocationService.selectLatestByDeviceId(did);
+ TrackPointDTO p = null;
+ if (loc != null) {
+ p = new TrackPointDTO();
+ p.setTimestamp(loc.getTimestamp() == null ? null : fmt.format(loc.getTimestamp()));
+ p.setLongitude(loc.getLongitude() == null ? null : loc.getLongitude().doubleValue());
+ p.setLatitude(loc.getLatitude() == null ? null : loc.getLatitude().doubleValue());
+ p.setPositioningStatus(loc.getPositioningStatus());
+ }
+ DeviceLatestLocationDTO dto = new DeviceLatestLocationDTO();
+ dto.setDevice(d);
+ dto.setLocation(p);
+ result.add(dto);
+ }
+ return R.ok(result);
+ }
+
+ @GetMapping("/monitor/device/{deviceId}/track")
+ @ApiOperation(value = "设备轨迹", notes = "返回指定时间范围内的轨迹")
+ public R deviceTrack(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId, @ApiParam(value = "开始时间戳(毫秒)", required = true) @RequestParam("start") long startMillis, @ApiParam(value = "结束时间戳(毫秒)", required = true) @RequestParam("end") long endMillis, @ApiParam(value = "限制返回条数", defaultValue = "1000") @RequestParam(value = "limit", required = false, defaultValue = "1000") Integer limit, @ApiParam(value = "是否包含无效定位", defaultValue = "false") @RequestParam(value = "includeInvalid", required = false, defaultValue = "false") boolean includeInvalid) {
+ Date start = new Date(startMillis);
+ Date end = new Date(endMillis);
+ //查询车辆位置信息
+ List rows = vehicleLocationService.selectByDeviceAndRange(deviceId, start, end, limit);
+
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ //位置列表按 timestamp 升序排序,空时间的记录排在最后。
+ List list = rows.stream()
+ .filter(v -> includeInvalid || (v.getPositioningStatus() != null && v.getPositioningStatus() == 1))
+ .sorted((a, b) -> {
+ Date ta = a.getTimestamp(), tb = b.getTimestamp();
+ if (ta == null && tb == null) return 0;
+ if (ta == null) return 1;
+ if (tb == null) return -1;
+ return ta.compareTo(tb);
+ })
+ .map(v -> {
+ TrackPointDTO p = new TrackPointDTO();
+ p.setTimestamp(v.getTimestamp() == null ? null : fmt.format(v.getTimestamp()));
+ p.setLongitude(v.getLongitude() == null ? null : v.getLongitude().doubleValue());
+ p.setLatitude(v.getLatitude() == null ? null : v.getLatitude().doubleValue());
+ p.setPositioningStatus(v.getPositioningStatus());
+ return p;
+ }).collect(Collectors.toList());
+ DeviceTrackDTO dto = new DeviceTrackDTO();
+ dto.setDeviceId(deviceId);
+ // 基本设备信息
+ BmsDevices dev = bmsDevicesMapper.selectOne(new QueryWrapper().eq("device_id", deviceId));
+ if (dev != null) {
+ dto.setDeviceName(dev.getDeviceName());
+ dto.setDeviceSn(dev.getDeviceSn());
+ dto.setDeviceType(dev.getDeviceType());
+ dto.setStatus(dev.getStatus());
+ dto.setFirmwareVersion(dev.getFirmwareVersion());
+ dto.setLastOnline(dev.getLastOnline() == null ? null : fmt.format(dev.getLastOnline()));
+ }
+ // 运行时指标(取最新整车数据)
+ VehicleData latest = vehicleDataService.selectLatestByDeviceId(deviceId);
+ if (latest != null) {
+ dto.setVehicleSpeed(latest.getVehicleSpeed());
+ dto.setTotalMileage(latest.getTotalMileage());
+ dto.setTotalVoltage(latest.getTotalVoltage());
+ dto.setTotalCurrent(latest.getTotalCurrent());
+ dto.setSoc(latest.getSoc());
+ }
+ dto.setTrackList(list);
+ return R.ok(dto);
+ }
+
+ @GetMapping("/monitor/device/{deviceId}/detail")
+ @ApiOperation(value = "设备详细信息", notes = "聚合设备、整车、位置等信息")
+ public R deviceDetail(@ApiParam(value = "设备ID", required = true) @PathVariable("deviceId") String deviceId) {
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ DeviceDetailDTO out = new DeviceDetailDTO();
+ out.setDeviceId(deviceId);
+ BmsDevices dev = bmsDevicesMapper.selectOne(new QueryWrapper().eq("device_id", deviceId));
+ if (dev != null) {
+ out.setDeviceName(dev.getDeviceName());
+ out.setDeviceSn(dev.getDeviceSn());
+ out.setDeviceType(dev.getDeviceType());
+ out.setStatus(dev.getStatus());
+ out.setFirmwareVersion(dev.getFirmwareVersion());
+ out.setLastOnline(dev.getLastOnline() == null ? null : fmt.format(dev.getLastOnline()));
+ }
+ VehicleData v = vehicleDataService.selectLatestByDeviceId(deviceId);
+ if (v != null) {
+ out.setTotalVoltage(v.getTotalVoltage());
+ out.setTotalCurrent(v.getTotalCurrent());
+ out.setSoc(v.getSoc());
+ out.setVehicleStatus(v.getVehicleStatus());
+ out.setChargingStatus(v.getChargingStatus());
+ out.setOperationMode(v.getOperationMode());
+ out.setDcdcStatus(v.getDcdcStatus());
+ out.setGearPosition(v.getGearPosition());
+ out.setInsulationResistance(v.getInsulationResistance());
+ }
+ VehicleLocation loc = vehicleLocationService.selectLatestByDeviceId(deviceId);
+ if (loc != null) {
+ out.setLongitude(loc.getLongitude() == null ? null : loc.getLongitude().doubleValue());
+ out.setLatitude(loc.getLatitude() == null ? null : loc.getLatitude().doubleValue());
+ out.setLocationTime(loc.getTimestamp() == null ? null : fmt.format(loc.getTimestamp()));
+ out.setPositioningStatus(loc.getPositioningStatus());
+ }
+ out.setLastMaintenanceTime(null);
+ out.setLastUpgradeTime(null);
+ return R.ok(out);
+ }
}
diff --git a/src/main/java/com/evobms/project/vehicledata/dto/FrontPageDTO.java b/src/main/java/com/evobms/project/vehicledata/dto/FrontPageDTO.java
new file mode 100644
index 0000000..58e411b
--- /dev/null
+++ b/src/main/java/com/evobms/project/vehicledata/dto/FrontPageDTO.java
@@ -0,0 +1,8 @@
+package com.evobms.project.vehicledata.dto;
+
+import lombok.Data;
+
+@Data
+public class FrontPageDTO {
+
+}
diff --git a/src/main/resources/application-druid.yml b/src/main/resources/application-druid.yml
index 0137c99..02a9004 100644
--- a/src/main/resources/application-druid.yml
+++ b/src/main/resources/application-druid.yml
@@ -6,7 +6,7 @@ spring:
druid:
# 主库数据源
master:
- url: jdbc:mysql://192.168.5.121:3306/evo_bms1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ url: jdbc:mysql://192.168.5.121:3306/evo_bms1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
# 从库数据源
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 30b9f09..4d85b7c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -79,7 +79,7 @@ spring:
# 端口,默认为6379
port: 6379
# 数据库索引
- database: 0
+ database: 12
# 密码
password:
# 连接超时时间
diff --git a/src/main/resources/mybatis/bms/BmsChargeDetailMapper.xml b/src/main/resources/mybatis/bms/BmsChargeDetailMapper.xml
index 11f7eba..d0ea250 100644
--- a/src/main/resources/mybatis/bms/BmsChargeDetailMapper.xml
+++ b/src/main/resources/mybatis/bms/BmsChargeDetailMapper.xml
@@ -29,7 +29,7 @@
insert into bms_charge_detail
device_id,
- timestamp,
+ `timestamp`,
ac_charge_current,
ac_charge_voltage,
dc_charge_current,
diff --git a/src/main/resources/mybatis/bms/BmsChargeTemperatureMapper.xml b/src/main/resources/mybatis/bms/BmsChargeTemperatureMapper.xml
new file mode 100644
index 0000000..f94be85
--- /dev/null
+++ b/src/main/resources/mybatis/bms/BmsChargeTemperatureMapper.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, device_id, timestap, temp_index, temperature, create_by, update_by, create_time, update_time from bms_charge_temperature
+
+
+
+
+
+
+
+ insert into bms_charge_temperature
+
+ device_id,
+ timestap,
+ temp_index,
+ temperature,
+ create_by,
+ update_by,
+ create_time,
+ update_time,
+
+
+ #{deviceId},
+ #{timestap},
+ #{tempIndex},
+ #{temperature},
+ #{createBy},
+ #{updateBy},
+ #{createTime},
+ #{updateTime},
+
+
+
+
+ update bms_charge_temperature
+
+ device_id = #{deviceId},
+ timestap = #{timestap},
+ temp_index = #{tempIndex},
+ temperature = #{temperature},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+
+ where id = #{id}
+
+
+
+ delete from bms_charge_temperature where id = #{id}
+
+
+
+ delete from bms_charge_temperature where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/mybatis/bms/BmsRuntimeDataMapper.xml b/src/main/resources/mybatis/bms/BmsRuntimeDataMapper.xml
new file mode 100644
index 0000000..ca1fb7d
--- /dev/null
+++ b/src/main/resources/mybatis/bms/BmsRuntimeDataMapper.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, device_id, timestap, vehicle_speed, mileage, system_voltage, system_current, insulation_resistance, soc_max, soc_min, gpv_voltage, run_status, power_status, create_by, update_by, create_time, update_time from bms_runtime_data
+
+
+
+
+
+
+
+ insert into bms_runtime_data
+
+ device_id,
+ timestap,
+ vehicle_speed,
+ mileage,
+ system_voltage,
+ system_current,
+ insulation_resistance,
+ soc_max,
+ soc_min,
+ gpv_voltage,
+ run_status,
+ power_status,
+ create_by,
+ update_by,
+ create_time,
+ update_time,
+
+
+ #{deviceId},
+ #{timestap},
+ #{vehicleSpeed},
+ #{mileage},
+ #{systemVoltage},
+ #{systemCurrent},
+ #{insulationResistance},
+ #{socMax},
+ #{socMin},
+ #{gpvVoltage},
+ #{runStatus},
+ #{powerStatus},
+ #{createBy},
+ #{updateBy},
+ #{createTime},
+ #{updateTime},
+
+
+
+
+ update bms_runtime_data
+
+ device_id = #{deviceId},
+ timestap = #{timestap},
+ vehicle_speed = #{vehicleSpeed},
+ mileage = #{mileage},
+ system_voltage = #{systemVoltage},
+ system_current = #{systemCurrent},
+ insulation_resistance = #{insulationResistance},
+ soc_max = #{socMax},
+ soc_min = #{socMin},
+ gpv_voltage = #{gpvVoltage},
+ run_status = #{runStatus},
+ power_status = #{powerStatus},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+
+ where id = #{id}
+
+
+
+ delete from bms_runtime_data where id = #{id}
+
+
+
+ delete from bms_runtime_data where id in
+
+ #{id}
+
+
+
diff --git a/src/main/resources/mybatis/bms/BmsVoltageChannelDataMapper.xml b/src/main/resources/mybatis/bms/BmsVoltageChannelDataMapper.xml
new file mode 100644
index 0000000..97bc7a5
--- /dev/null
+++ b/src/main/resources/mybatis/bms/BmsVoltageChannelDataMapper.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, device_id, timestap, channel_type, channel_index, voltage, create_by, update_by, create_time, update_time from bms_voltage_channel_data
+
+
+
+
+
+
+
+ insert into bms_voltage_channel_data
+
+ device_id,
+ timestap,
+ channel_type,
+ channel_index,
+ voltage,
+ create_by,
+ update_by,
+ create_time,
+ update_time,
+
+
+ #{deviceId},
+ #{timestap},
+ #{channelType},
+ #{channelIndex},
+ #{voltage},
+ #{createBy},
+ #{updateBy},
+ #{createTime},
+ #{updateTime},
+
+
+
+
+ update bms_voltage_channel_data
+
+ device_id = #{deviceId},
+ timestap = #{timestap},
+ channel_type = #{channelType},
+ channel_index = #{channelIndex},
+ voltage = #{voltage},
+ create_by = #{createBy},
+ update_by = #{updateBy},
+ create_time = #{createTime},
+ update_time = #{updateTime},
+
+ where id = #{id}
+
+
+
+ delete from bms_voltage_channel_data where id = #{id}
+
+
+
+ delete from bms_voltage_channel_data where id in
+
+ #{id}
+
+
+
\ No newline at end of file