From 2e8866ba2c1dbbe8aab3bb40f3788a53bf831d6a Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期五, 14 三月 2025 16:29:11 +0800
Subject: [PATCH] A200设备代码从LithiumBms迁移到本项目

---
 src/main/resources/mapper/BattgroupUsrMapper.xml                        |   10 
 src/main/java/com/whyc/pojo/db_alarm/AlarmParam.java                    |   63 
 src/main/java/com/whyc/service/ActmRealstateService.java                |   24 
 src/main/java/com/whyc/webSocket/DevLineSocket.java                     |   74 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/DevA200Testparam.java     |  114 +
 src/main/java/com/whyc/pojo/db_user/BattgroupBaojigroup.java            |   38 
 src/main/java/com/whyc/mapper/BaojigroupMapper.java                     |   15 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/ActmRealstate.java        |  127 +
 src/main/java/com/whyc/controller/DevActmTestparamController.java       |   68 
 src/main/java/com/whyc/controller/BatttestdataInfController.java        |   62 
 src/main/java/com/whyc/service/SubTablePageInfoService.java             |  290 +++
 src/main/resources/mapper/BatttestdataInfMapper.xml                     |   87 +
 src/main/java/com/whyc/mapper/DevInfMapper.java                         |   23 
 src/main/java/com/whyc/mapper/AlarmParamMapper.java                     |    6 
 src/main/java/com/whyc/service/BattgroupUsrService.java                 |   29 
 src/main/java/com/whyc/mapper/DevalarmDataMapper.java                   |   14 
 src/main/java/com/whyc/controller/BattgroupBaojigroupController.java    |   75 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateChangeevent.java |   57 
 src/main/resources/mapper/BatttestdataIdMapper.xml                      |    5 
 src/main/resources/mapper/BattgroupBaojigroupMapper.xml                 |    9 
 src/main/java/com/whyc/pojo/db_alarm/DevalarmDataYear.java              |   80 
 src/main/java/com/whyc/service/DevA200TestparamService.java             |  293 +++
 src/main/resources/mapper/DevInfMapper.xml                              |   81 
 src/main/java/com/whyc/webSocket/DevInfSocket.java                      |  109 +
 src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateCfg.java         |   48 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/A200Realstate.java        |  113 +
 src/main/java/com/whyc/pojo/db_user/Baojigroup.java                     |   47 
 src/main/java/com/whyc/service/BatttestdataInfService.java              |  183 ++
 src/main/java/com/whyc/service/BatttestdataIdService.java               |    7 
 src/main/java/com/whyc/mapper/ActmRealstateMapper.java                  |    6 
 src/main/java/com/whyc/mapper/BatttestdataIdMapper.java                 |    6 
 src/main/java/com/whyc/util/TestparamHttpUtil.java                      |   77 
 src/main/java/com/whyc/controller/DevA200TestparamController.java       |   81 
 src/main/resources/mapper/DevalarmDataMapper.xml                        |   70 
 src/main/java/com/whyc/mapper/BattRtdataMapper.java                     |    6 
 src/main/java/com/whyc/controller/WorkstateChangeeventController.java   |   25 
 src/main/java/com/whyc/service/AlarmParamService.java                   |   24 
 src/main/resources/mapper/BaojigroupMapper.xml                          |   63 
 src/main/java/com/whyc/controller/DevInfController.java                 |   83 +
 src/main/java/com/whyc/pojo/db_user/BattgroupUsr.java                   |   28 
 src/main/java/com/whyc/webSocket/DevRtstateSocket.java                  |  155 +
 src/main/java/com/whyc/mapper/DevActmTestparamMapper.java               |    6 
 src/main/java/com/whyc/service/ExcelExportService.java                  |  321 +++
 pom.xml                                                                 |    5 
 src/main/java/com/whyc/service/UserInfService.java                      |    9 
 src/main/java/com/whyc/webSocket/DevStaticSocket.java                   |  122 +
 src/main/java/com/whyc/controller/DevalarmDataHisController.java        |   51 
 src/main/java/com/whyc/mapper/BattgroupBaojigroupMapper.java            |   11 
 src/main/java/com/whyc/mapper/A200RealstateMapper.java                  |    6 
 src/main/java/com/whyc/service/DevalarmDataService.java                 |   88 +
 src/main/java/com/whyc/webSocket/DevAlmPopUp.java                       |   74 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/DevActmTestparam.java     |   74 
 src/main/java/com/whyc/webSocket/DevalarmSocket.java                    |  109 +
 src/main/java/com/whyc/service/DevActmTestparamService.java             |  221 ++
 src/main/java/com/whyc/service/WorkstateChangeeventService.java         |   46 
 src/main/java/com/whyc/mapper/DocUserMapper.java                        |   15 
 src/main/java/com/whyc/controller/AlarmParamMapperController.java       |   26 
 src/main/java/com/whyc/pojo/db_alarm/DevalarmData.java                  |   82 
 src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataId.java        |  121 +
 src/main/java/com/whyc/mapper/BatttestdataInfMapper.java                |   22 
 src/main/java/com/whyc/service/BaojigroupService.java                   |   85 +
 src/main/java/com/whyc/service/DevInfService.java                       |  251 +++
 src/main/java/com/whyc/mapper/BattgroupUsrMapper.java                   |    9 
 src/main/java/com/whyc/mapper/DevA200TestparamMapper.java               |    6 
 src/main/java/com/whyc/mapper/WorkstateCfgMapper.java                   |    6 
 src/main/java/com/whyc/service/BattgroupBaojigroupService.java          |   33 
 src/main/java/com/whyc/service/BattRtdataService.java                   |   39 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/BattRtdata.java           |   73 
 src/main/java/com/whyc/pojo/db_lithium_ram_db/DevInf.java               |   80 
 src/main/java/com/whyc/mapper/WorkstateChangeeventMapper.java           |    6 
 src/main/java/com/whyc/service/A200RealstateService.java                |   24 
 src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataInf.java       |  133 +
 72 files changed, 4,929 insertions(+), 0 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0324d63..6c1fa63 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,6 +161,11 @@
             <artifactId>commons-lang3</artifactId>
             <version>3.4</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
         <!--澶栭儴寮曞叆-浜鸿劯璇嗗埆sdk-->
         <dependency>
             <groupId>org.apache.tomcat.embed</groupId>
diff --git a/src/main/java/com/whyc/controller/AlarmParamMapperController.java b/src/main/java/com/whyc/controller/AlarmParamMapperController.java
new file mode 100644
index 0000000..4407a5e
--- /dev/null
+++ b/src/main/java/com/whyc/controller/AlarmParamMapperController.java
@@ -0,0 +1,26 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.service.AlarmParamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Api(tags = "鍛婅鍙傛暟绠$悊")
+@RequestMapping("almParam")
+public class AlarmParamMapperController {
+    @Autowired
+    private AlarmParamService service;
+
+
+    @ApiOperation(value = "鑾峰彇璁惧鍛婅鍙傛暟")
+    @GetMapping("getAlmParam")
+    public Response getAlmParam(@RequestParam Integer devId){
+        return service.getAlmParam(devId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/BattgroupBaojigroupController.java b/src/main/java/com/whyc/controller/BattgroupBaojigroupController.java
new file mode 100644
index 0000000..ca8d78b
--- /dev/null
+++ b/src/main/java/com/whyc/controller/BattgroupBaojigroupController.java
@@ -0,0 +1,75 @@
+package com.whyc.controller;
+
+import com.whyc.dto.BaojiDto;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.BaojigroupService;
+import com.whyc.service.BattgroupBaojigroupService;
+import com.whyc.service.BattgroupUsrService;
+import com.whyc.util.ActionUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "鍖呮満缁勭鐞�")
+@RequestMapping("baoji")
+public class BattgroupBaojigroupController {
+    @Autowired
+    private BattgroupBaojigroupService groupService;
+
+    @Autowired
+    private BattgroupUsrService usrService;
+
+    @Autowired
+    private BaojigroupService baojiService;
+
+
+    @ApiOperation(value = "娣诲姞鍖呮満缁�")
+    @GetMapping("addBaoji")
+    public Response addBaoji(@RequestParam String baojiName){
+        return baojiService.addBaoji(baojiName);
+    }
+
+    @ApiOperation(value = "鍒犻櫎鍖呮満缁勫強浠ヤ笅璁惧鍜岀敤鎴�")
+    @PostMapping("delBaoji")
+    public Response delBaoji(@RequestBody List<Integer> baojiIdList){
+        return baojiService.delBaoji(baojiIdList);
+    }
+
+    @ApiOperation(value = "缂栬緫鍖呮満缁�")
+    @GetMapping("updateBaoji")
+    public Response updateBaoji(@RequestParam int baojiGroupId,@RequestParam String baojiGroupName){
+        return baojiService.updateBaoji(baojiGroupId,baojiGroupName);
+    }
+
+    @ApiOperation(value = "鏌ヨ鎵�鏈夌殑鍖呮満缁勫強鍖呮満缁勪笅璁惧淇℃伅鍜岀鐞嗕汉")
+    @PostMapping("getBaojiInfo")
+    public Response getBaojiInfo(){
+        return baojiService.getBaojiInfo();
+    }
+
+    @ApiOperation(value = "鍖呮満缁勪笅娣诲姞鍜岀Щ闄よ澶�")
+    @PostMapping("opreateDevInBaoji")
+    public Response opreateDevInBaoji(@RequestBody BaojiDto dto){
+        return groupService.opreateDevInBaoji(dto);
+    }
+
+
+    @ApiOperation(value = "鍖呮満缁勪笅娣诲姞鍜岀Щ闄ょ敤鎴�")
+    @PostMapping("opreateUsrInBaoji")
+    public Response opreateUsrInBaoji(@RequestBody BaojiDto dto){
+        return usrService.opreateUsrInBaoji(dto);
+    }
+
+    @ApiOperation(value = "鏌ヨ鐧诲綍鐢ㄦ埛瀵瑰簲鐨勫寘鏈虹粍")
+    @GetMapping("getUsrBaoji")
+    public Response getUsrBaoji(){
+        UserInf uinf= ActionUtil.getUser();
+        return baojiService.getUsrBaoji(uinf.getUid());
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/BatttestdataInfController.java b/src/main/java/com/whyc/controller/BatttestdataInfController.java
new file mode 100644
index 0000000..79aa8f9
--- /dev/null
+++ b/src/main/java/com/whyc/controller/BatttestdataInfController.java
@@ -0,0 +1,62 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.service.BatttestdataInfService;
+import com.whyc.service.ExcelExportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+@RestController
+@Api(tags = "娴嬭瘯绠$悊")
+@RequestMapping("tinf")
+public class BatttestdataInfController {
+    @Autowired
+    private BatttestdataInfService service;
+
+    @Autowired
+    private ExcelExportService exportService;
+
+    @ApiOperation(value = "娴嬭瘯缁熻鏈勾/鏈湀")
+    @GetMapping("getDevTinfByYearMonth")
+    public Map<String, Object> getDevTinfByYearMonth(@RequestParam Integer uid){
+        return service.getDevTinfByYearMonth(uid);
+    }
+
+    @ApiOperation(value = "娴嬭瘯缁熻鏈懆")
+    @GetMapping("getDevTinfByWeek")
+    public Map<String, Object> getDevTinfByWeek(@RequestParam Integer uid){
+        return service.getDevTinfByWeek(uid);
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧鐨勫厖鏀剧數璁板綍")
+    @GetMapping("getTinfById")
+    public Response getTinfById(@RequestParam Integer devId){
+        return service.getTinfById(devId);
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃繃绋�")
+    @GetMapping("getTdataById")
+    public Response getTdataById(@RequestParam Integer devId,@RequestParam Integer testRecordCount){
+        return service.getTdataById(devId,testRecordCount);
+    }
+
+    @ApiOperation(value = "瀵煎嚭鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃褰�")
+    @GetMapping("exportData")
+    public void exportData(@RequestParam Integer devId, @RequestParam Integer testRecordCount
+            , HttpServletResponse resp){
+        if(devId/100000000==1){
+            exportService.exportExcelA200(devId,testRecordCount,resp);
+        }else{
+            exportService.exportExcelActm(devId,testRecordCount,resp);
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/DevA200TestparamController.java b/src/main/java/com/whyc/controller/DevA200TestparamController.java
new file mode 100644
index 0000000..f3996f4
--- /dev/null
+++ b/src/main/java/com/whyc/controller/DevA200TestparamController.java
@@ -0,0 +1,81 @@
+package com.whyc.controller;
+
+import com.whyc.dto.A200ResDto;
+import com.whyc.dto.Response;
+import com.whyc.service.DevA200TestparamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "a200涓�浣撴満鎺у埗鎿嶄綔")
+@RequestMapping("a200param")
+public class DevA200TestparamController {
+    @Autowired
+    private DevA200TestparamService service;
+
+
+    @ApiOperation(value = "璇诲彇a200涓�浣撴満鍙傛暟")
+    @GetMapping("getA200Param")
+    public Object getA200Param(@RequestParam int devId){
+        return service.getA200Param(devId);
+    }
+
+    @ApiOperation(value = "璁剧疆a200涓�浣撴満鍙傛暟")
+    @PostMapping("setA200Param")
+    public Object setA200Param(@RequestBody A200ResDto param){
+        return service.setA200Param(param);
+    }
+
+    @ApiOperation(value = "鎵归噺璁剧疆a200涓�浣撴満鍙傛暟")
+    @PostMapping("setA200ParamPl")
+    public Object setA200ParamPl(@RequestBody A200ResDto param){
+        return service.setA200ParamPl(param);
+    }
+
+    /*@ApiOperation(value = "鎵归噺璁剧疆a200涓�浣撴満鍙傛暟(娴嬭瘯澶氱嚎绋�)")
+    @PostMapping("setA200ParamPl2")
+    public Object setA200ParamPl2(@RequestBody A200ResDto param){
+        return service.setA200ParamPl2(param);
+    }*/
+
+    @ApiOperation(value = "鍚姩a200涓�浣撴満鏀剧數/鍏呯數")
+    @GetMapping("startA200Param")
+    public Object startA200Param(@RequestParam int devId,@RequestParam int type){
+        return service.startA200Param(devId,type);
+    }
+
+    @ApiOperation(value = "鍋滄a200涓�浣撴満鏀剧數/鍏呯數")
+    @GetMapping("stopA200Param")
+    public Object stopA200Param(@RequestParam int devId){
+        return service.stopA200Param(devId);
+    }
+
+    @ApiOperation(value = "鎵归噺鍚姩a200涓�浣撴満")
+    @PostMapping("startA200ParamPl")
+    public Response startA200ParamPl(@RequestBody List<Integer> devIds,@RequestParam int type){
+        return service.startA200ParamPl(devIds,type);
+    }
+
+    @ApiOperation(value = "鎵归噺鍋滄a200涓�浣撴満")
+    @PostMapping("stopA200ParamPl")
+    public Response stopA200ParamPl(@RequestBody List<Integer> devIds){
+        return service.stopA200ParamPl(devIds);
+    }
+
+    @ApiOperation(value = "鏆傚仠/缁х画鍚姩a200涓�浣撴満")
+    @GetMapping("pauseA200Param")
+    public Object pauseA200Param(@RequestParam int devId,@RequestParam int type){
+        return service.pauseA200Param(devId,type);
+    }
+
+    @ApiOperation(value = "鎵归噺鏆傚仠/缁х画鍚姩a200涓�浣撴満")
+    @PostMapping("pauseA200ParamPl")
+    public Response pauseA200ParamPl(@RequestBody List<Integer> devIds,@RequestParam int type){
+        return service.pauseA200ParamPl(devIds,type);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/DevActmTestparamController.java b/src/main/java/com/whyc/controller/DevActmTestparamController.java
new file mode 100644
index 0000000..19d1da6
--- /dev/null
+++ b/src/main/java/com/whyc/controller/DevActmTestparamController.java
@@ -0,0 +1,68 @@
+package com.whyc.controller;
+
+import com.whyc.dto.ActmResDto;
+import com.whyc.dto.Response;
+import com.whyc.service.DevActmTestparamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "actm鍧囪 浠帶鍒舵搷浣�")
+@RequestMapping("actmparam")
+public class DevActmTestparamController {
+
+    @Autowired
+    private DevActmTestparamService service;
+
+    @ApiOperation(value = "璇诲彇actm涓�浣撴満鍙傛暟")
+    @GetMapping("getActmParam")
+    public Object getActmParam(@RequestParam int devId,@RequestParam int index){
+        return service.getActmParam(devId,index);
+    }
+
+    @ApiOperation(value = "璁剧疆actm鍧囪 浠弬鏁�")
+    @PostMapping("setActmParam")
+    public Object setActmParam(@RequestBody ActmResDto param){
+        return service.setActmParam(param);
+    }
+
+    @ApiOperation(value = "鎵归噺璁剧疆actm鍧囪 浠弬鏁�")
+    @PostMapping("setActmParamPl")
+    public Object setActmParamPl(@RequestBody ActmResDto param){
+        return service.setActmParamPl(param);
+    }
+
+    @ApiOperation(value = "鎵归噺璁剧疆actm鍧囪 浠弬鏁�(澶氱嚎绋�)")
+    @PostMapping("setActmParamPl2")
+    public Object setActmParamPl2(@RequestBody ActmResDto param){
+        return service.setActmParamPl2(param);
+    }
+    @ApiOperation(value = "鍚姩,鏆傚仠,缁х画,鍋滄actm鍧囪 浠�")
+    @GetMapping("controllerActmParam")
+    public Object controllerActmParam(@RequestParam int devId,@RequestParam int index,@RequestParam int type){
+        return service.controllerActmParam(devId,index,type);
+    }
+
+    @ApiOperation(value = "鎵归噺鎺у埗actm鍧囪 浠�")
+    @PostMapping("controllActmParamPl")
+    public Response controllActmParamPl(@RequestBody List<Integer> devIds,@RequestParam int index,@RequestParam int type){
+        return service.controllActmParamPl(devIds,index,type);
+    }
+
+    @ApiOperation(value = "璁剧疆鐢垫睜缁勬暟涓庣數姹犺妭鏁�")
+    @PostMapping("setActmBatteryStorageNumber")
+    public Object setActmBatteryStorageNumber(@RequestBody ActmResDto param){
+        return service.setActmBatteryStorageNumber(param);
+    }
+
+    @ApiOperation(value = "鎵归噺璁捐缃數姹犵粍鏁颁笌鐢垫睜鑺傛暟")
+    @PostMapping("setActmBatteryStorageNumberPl")
+    public Object setActmBatteryStorageNumberPl(@RequestBody ActmResDto param){
+        return service.setActmBatteryStorageNumberPl(param);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/DevInfController.java b/src/main/java/com/whyc/controller/DevInfController.java
new file mode 100644
index 0000000..47d3162
--- /dev/null
+++ b/src/main/java/com/whyc/controller/DevInfController.java
@@ -0,0 +1,83 @@
+package com.whyc.controller;
+
+import com.whyc.dto.DevInfDto;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import com.whyc.service.DevInfService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Api(tags = "璁惧")
+@RequestMapping("devInf")
+public class DevInfController {
+    @Autowired
+    private DevInfService service;
+
+
+
+    @ApiOperation(value = "娣诲姞璁惧")
+    @PostMapping("addDev")
+    public Response addDev(@RequestBody DevInf devInf){
+        return service.addDev(devInf);
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧淇℃伅")
+    @PostMapping("getAllInf")
+    public Response getAllInf(@RequestBody DevInfDto devInfDto){
+        return service.getAllInf(101, devInfDto);
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧淇℃伅(涓嶅垎椤电敤浜庡寘鏈虹粍)")
+    @GetMapping("getDinf")
+    public Response getDinf(){
+        return service.getDinf();
+    }
+    @ApiOperation(value = "鏍规嵁璁惧id鑾峰彇璁惧淇℃伅")
+    @GetMapping("getDinfById")
+    public Response getDinfById(@RequestParam Integer devId){
+        return service.getDinfById(devId);
+    }
+
+    @ApiOperation(value = "鑾峰彇宸︿晶鍒楄〃")
+    @GetMapping("getDevBytype")
+    public Response getDevBytype(@RequestParam(required = false) Integer devType){
+        return service.getDevBytype(devType);
+    }
+
+    @ApiOperation(value = "鏂拌幏鍙栧乏渚у垪琛�")
+    @GetMapping("getLine")
+    public Response getLine(){
+        return service.getDevType(101);
+    }
+
+
+    @ApiOperation(value = "缂栬緫璁惧淇℃伅")
+    @PostMapping("updateInf")
+    public Response updateInf(@RequestBody DevInf dinf){
+        return service.updateInf(dinf);
+    }
+
+    @ApiOperation(value = "鍒犻櫎璁惧(鍚屾椂鍒犻櫎瀹炴椂鍜屽寘鏈虹粍淇℃伅)")
+    @GetMapping("delDinf")
+    public Response delDinf( Integer devId){
+        return service.delDinf(devId);
+    }
+
+    @ApiOperation(value = "寮哄埗绉婚櫎鎵归噺璁惧")
+    @PostMapping("cancelContPl")
+    public Response cancelContPl(@RequestBody List<Integer> devIds){
+        return service.cancelContPl(devIds);
+    }
+
+    @ApiOperation(value = "娴嬭瘯璁惧缁熻")
+    @GetMapping("getDevStaticByType")
+    public Map<String,Object>  getDevStaticByType(){
+        return service.getDevStaticByType(101);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/DevalarmDataHisController.java b/src/main/java/com/whyc/controller/DevalarmDataHisController.java
new file mode 100644
index 0000000..49bb05c
--- /dev/null
+++ b/src/main/java/com/whyc/controller/DevalarmDataHisController.java
@@ -0,0 +1,51 @@
+package com.whyc.controller;
+
+import com.whyc.dto.DalmDto;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.DevalarmDataService;
+import com.whyc.util.ActionUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+
+@RestController
+@Api(tags = "鍘嗗彶鍛婅绠$悊")
+@RequestMapping("tinf")
+public class DevalarmDataHisController {
+    @Autowired
+    private DevalarmDataService dataService;
+
+    @ApiOperation(value = "娴嬭瘯瀹炴椂鍛婅")
+    @PostMapping("getDAlmInf")
+    public Response getDAlmInf(@RequestParam int uid, @RequestBody DalmDto dto){
+        return dataService.getDAlmInf(uid,dto);
+    }
+    @ApiOperation(value = "寮圭獥鍛婅")
+    @GetMapping("getDAlmPopUp")
+    public Response getDAlmPopUp(){
+        UserInf uinf= ActionUtil.getUser();
+        return dataService.getDAlmPopUp(uinf.getUid());
+    }
+
+    @ApiOperation(value = "鑾峰彇鍘嗗彶鍛婅")
+    @PostMapping("getDAlmHis")
+    public Response getDAlmHis( @RequestBody DalmDto dto) throws ParseException {
+        return dataService.getDAlmHis(dto);
+    }
+
+    @ApiOperation(value = "纭瀹炴椂鍛婅")
+    @GetMapping("confiirmAlm")
+    public Response confiirmAlm(@RequestParam int num){
+        return dataService.confiirmAlm(num);
+    }
+
+    @ApiOperation(value = "鑾峰彇鎵�鏈夌殑鍛婅绫诲瀷")
+    @GetMapping("getAllAlmName")
+    public Response getAllAlmName(){
+        return dataService.getAllAlmName();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/controller/WorkstateChangeeventController.java b/src/main/java/com/whyc/controller/WorkstateChangeeventController.java
new file mode 100644
index 0000000..f74a409
--- /dev/null
+++ b/src/main/java/com/whyc/controller/WorkstateChangeeventController.java
@@ -0,0 +1,25 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.service.WorkstateChangeeventService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Api(tags = "璁惧宸ヤ綔鐘舵�佸垏鎹簨浠�")
+@RequestMapping("workEvent")
+public class WorkstateChangeeventController {
+    @Autowired
+    private WorkstateChangeeventService service;
+
+    @ApiOperation(value = "璇诲彇璁惧宸ヤ綔鐘舵�佺殑鍒囨崲杩囩▼")
+    @GetMapping("getWorkEvent")
+    public Response getWorkEvent(@RequestParam int devId){
+        return service.getWorkEvent(devId);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/A200RealstateMapper.java b/src/main/java/com/whyc/mapper/A200RealstateMapper.java
new file mode 100644
index 0000000..813234b
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/A200RealstateMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.A200Realstate;
+
+public interface A200RealstateMapper extends CustomMapper<A200Realstate>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/ActmRealstateMapper.java b/src/main/java/com/whyc/mapper/ActmRealstateMapper.java
new file mode 100644
index 0000000..322d416
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/ActmRealstateMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.ActmRealstate;
+
+public interface ActmRealstateMapper extends CustomMapper<ActmRealstate>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/AlarmParamMapper.java b/src/main/java/com/whyc/mapper/AlarmParamMapper.java
new file mode 100644
index 0000000..6bd50a1
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/AlarmParamMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_alarm.AlarmParam;
+
+public interface AlarmParamMapper extends CustomMapper<AlarmParam>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BaojigroupMapper.java b/src/main/java/com/whyc/mapper/BaojigroupMapper.java
new file mode 100644
index 0000000..9f11aa8
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BaojigroupMapper.java
@@ -0,0 +1,15 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_user.Baojigroup;
+
+import java.util.List;
+
+public interface BaojigroupMapper extends CustomMapper<Baojigroup>{
+    //鑾峰彇鏈�澶х殑鍖呮満缁勭紪鍙�
+    Integer getMaxBaojiGroupId();
+
+    //鏌ヨ鎵�鏈夌殑鍖呮満缁勫強鍖呮満缁勪笅璁惧淇℃伅鍜岀鐞嗕汉
+    List<Baojigroup> getBaojiInfo();
+    //鏌ヨ鐧诲綍鐢ㄦ埛瀵瑰簲鐨勫寘鏈虹粍
+    List<Baojigroup> getUsrBaoji(int uid);
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BattRtdataMapper.java b/src/main/java/com/whyc/mapper/BattRtdataMapper.java
new file mode 100644
index 0000000..c015a0e
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BattRtdataMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.BattRtdata;
+
+public interface BattRtdataMapper extends CustomMapper<BattRtdata>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BattgroupBaojigroupMapper.java b/src/main/java/com/whyc/mapper/BattgroupBaojigroupMapper.java
new file mode 100644
index 0000000..92fc425
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BattgroupBaojigroupMapper.java
@@ -0,0 +1,11 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_user.BattgroupBaojigroup;
+
+import java.util.List;
+
+public interface BattgroupBaojigroupMapper extends CustomMapper<BattgroupBaojigroup>{
+
+    //鍖呮満缁勪笅绉婚櫎璁惧
+    void delDevInBaoji(List<BattgroupBaojigroup> devList);
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BattgroupUsrMapper.java b/src/main/java/com/whyc/mapper/BattgroupUsrMapper.java
new file mode 100644
index 0000000..a933f24
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BattgroupUsrMapper.java
@@ -0,0 +1,9 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_user.BattgroupUsr;
+
+import java.util.List;
+
+public interface BattgroupUsrMapper extends CustomMapper<BattgroupUsr>{
+    void delUsrInBaoji(List<BattgroupUsr> usrList);
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BatttestdataIdMapper.java b/src/main/java/com/whyc/mapper/BatttestdataIdMapper.java
new file mode 100644
index 0000000..27d5bb5
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BatttestdataIdMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_batt_testdata.BatttestdataId;
+
+public interface BatttestdataIdMapper extends CustomMapper<BatttestdataId>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/BatttestdataInfMapper.java b/src/main/java/com/whyc/mapper/BatttestdataInfMapper.java
new file mode 100644
index 0000000..9fb800c
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/BatttestdataInfMapper.java
@@ -0,0 +1,22 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_batt_testdata.BatttestdataInf;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BatttestdataInfMapper extends CustomMapper<BatttestdataInf>{
+    //鍏呮斁鐢典竴浣撴満娴嬭瘯缁熻
+    List<BatttestdataInf> getDevTinf(@Param("uid") int uid);
+    //鏈勾
+    List<BatttestdataInf> getDevTinfByYear(@Param("uid")int userId);
+
+    //鏈湀
+    List<BatttestdataInf> getDevTinfByMonth(@Param("uid")int userId);
+
+    //杩戜竴鍛�(mysql涓笉浼氱畻涓婁粖澶�)
+    List<BatttestdataInf> getDevTinfByWeek(@Param("uid")int userId,@Param("type")int type);
+
+    //鑾峰彇鍏呮斁鐢垫暟鎹�
+    List<BatttestdataInf> getTinfById( @Param("type")int type, @Param("devId")Integer devId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/DevA200TestparamMapper.java b/src/main/java/com/whyc/mapper/DevA200TestparamMapper.java
new file mode 100644
index 0000000..70e37ae
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DevA200TestparamMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.DevA200Testparam;
+
+public interface DevA200TestparamMapper extends CustomMapper<DevA200Testparam>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/DevActmTestparamMapper.java b/src/main/java/com/whyc/mapper/DevActmTestparamMapper.java
new file mode 100644
index 0000000..2fb2bf6
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DevActmTestparamMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.DevActmTestparam;
+
+public interface DevActmTestparamMapper extends CustomMapper<DevActmTestparam>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/DevInfMapper.java b/src/main/java/com/whyc/mapper/DevInfMapper.java
new file mode 100644
index 0000000..5440d9a
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DevInfMapper.java
@@ -0,0 +1,23 @@
+package com.whyc.mapper;
+
+import com.whyc.dto.DevInfDto;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DevInfMapper extends CustomMapper<DevInf>{
+    //鏌ヨ鍖呮満浜虹鐞嗙殑璁惧id
+    List<DevInf> getAllInf(@Param("dto") DevInfDto dto);
+    //鏌ヨ璇ョ被鍨嬫渶澶ц澶囩紪鍙�
+    Integer getMaxDevId(Integer devType);
+    //鑾峰彇宸︿晶娉
+    List<DevInf> getLine(@Param("uid") Integer uid);
+
+    //鑾峰彇宸︿晶娉
+    List<DevInf> getDevType(@Param("uid") Integer uid,@Param("devType") Integer devType);
+
+    //璁惧鍒嗙被鎬绘暟缁熻
+    List<DevInf> getDevStaticByType(@Param("uid") Integer userId);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/DevalarmDataMapper.java b/src/main/java/com/whyc/mapper/DevalarmDataMapper.java
new file mode 100644
index 0000000..ff280c5
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DevalarmDataMapper.java
@@ -0,0 +1,14 @@
+package com.whyc.mapper;
+
+import com.whyc.dto.DalmDto;
+import com.whyc.pojo.db_alarm.DevalarmData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DevalarmDataMapper extends CustomMapper<DevalarmData>{
+    //鑾峰彇璁惧鍛婅淇℃伅
+    List<DevalarmData> getDAlmInf(@Param("dto") DalmDto dto);
+    //寮圭獥鍛婅
+    List<DevalarmData> getDAlmPopUp(@Param("uid") int uid);
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/DocUserMapper.java b/src/main/java/com/whyc/mapper/DocUserMapper.java
new file mode 100644
index 0000000..8a7b0fe
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/DocUserMapper.java
@@ -0,0 +1,15 @@
+package com.whyc.mapper;
+
+
+import com.whyc.pojo.db_user.UserInf;
+
+import java.util.List;
+
+public interface DocUserMapper extends CustomMapper<UserInf>{
+    //鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+    List<UserInf> getAllUser(UserInf userInf);
+    //鏌ヨ瀵嗙爜
+    String selectSnId(String name);
+    //鏌ヨ鎵�鏈夌敤鎴�(鏉冮檺绠$悊鐢�)
+    List<UserInf> getAllDocUser();
+}
diff --git a/src/main/java/com/whyc/mapper/WorkstateCfgMapper.java b/src/main/java/com/whyc/mapper/WorkstateCfgMapper.java
new file mode 100644
index 0000000..9479ed1
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/WorkstateCfgMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.WorkstateCfg;
+
+public interface WorkstateCfgMapper extends CustomMapper<WorkstateCfg>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/mapper/WorkstateChangeeventMapper.java b/src/main/java/com/whyc/mapper/WorkstateChangeeventMapper.java
new file mode 100644
index 0000000..d34dc62
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/WorkstateChangeeventMapper.java
@@ -0,0 +1,6 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_lithium_ram_db.WorkstateChangeevent;
+
+public interface WorkstateChangeeventMapper extends CustomMapper<WorkstateChangeevent>{
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/pojo/db_alarm/AlarmParam.java b/src/main/java/com/whyc/pojo/db_alarm/AlarmParam.java
new file mode 100644
index 0000000..65e67ed
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_alarm/AlarmParam.java
@@ -0,0 +1,63 @@
+package com.whyc.pojo.db_alarm;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧鍛婅鍙傛暟琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_alarm",value ="tb_alarm_param")
+@ApiModel(value="AlarmParam瀵硅薄", description="璁惧鍛婅鍙傛暟琛�")
+public class AlarmParam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鍛婅id")
+    private Integer almId;
+
+    @ApiModelProperty(value = "鍛婅鍚嶇О")
+    private String almName;
+
+    @ApiModelProperty(value = "涓婇檺鍛婅绛夌骇")
+    private Integer almHighLevel;
+
+    @ApiModelProperty(value = "涓婇檺鍛婅闃堝��")
+    private Float almHighCoe;
+
+    @ApiModelProperty(value = "涓婇檺鍛婅浣胯兘")
+    private Integer almHighEn;
+
+    @ApiModelProperty(value = "涓嬮檺鍛婅绛夌骇")
+    private Integer almLowLevel;
+
+    @ApiModelProperty(value = "涓嬮檺鍛婅浣胯兘")
+    private Float almLowCoe;
+
+    @ApiModelProperty(value = "涓嬮檺鍛婅浣胯兘")
+    private Integer almLowEn;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_alarm/DevalarmData.java b/src/main/java/com/whyc/pojo/db_alarm/DevalarmData.java
new file mode 100644
index 0000000..3f1b650
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_alarm/DevalarmData.java
@@ -0,0 +1,82 @@
+package com.whyc.pojo.db_alarm;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧瀹炴椂鍛婅璁板綍琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_alarm",value ="tb_devalarm_data")
+@ApiModel(value="DevalarmData瀵硅薄", description="璁惧瀹炴椂鍛婅璁板綍琛�")
+public class DevalarmData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private int num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鍛婅ID")
+    private Integer almId;
+
+    @TableField(exist = false)
+    private String almName;
+
+    @ApiModelProperty(value = "鍛婅绫诲瀷銆�1-涓婇檺鍛婅  2-涓嬮檺鍛婅銆�")
+    private Integer almSignalId;
+
+    @ApiModelProperty(value = "鍛婅寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date almStarttime;
+
+    @ApiModelProperty(value = "鍛婅鍊�")
+    private Float almValue;
+
+    @ApiModelProperty(value = "鍛婅鏄惁纭")
+    private Integer almIsConfirmed;
+
+    @ApiModelProperty(value = "纭鐢ㄦ埛ID")
+    private Integer confirmedUid;
+
+    @TableField(exist = false)
+    private String confirmedUname;
+
+    @ApiModelProperty(value = "纭鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date confirmedTime;
+
+    @ApiModelProperty(value = "鍛婅缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date almEndtime;
+
+    @ApiModelProperty(value = "鍛婅璁板綍鐘舵�乕0-瀹炴椂鍛婅  1-鍘嗗彶鍛婅  2-鍙栨秷鍛婅]")
+    private Integer almClearedType;
+
+    @TableField(exist = false)
+    private DevInf devInf;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_alarm/DevalarmDataYear.java b/src/main/java/com/whyc/pojo/db_alarm/DevalarmDataYear.java
new file mode 100644
index 0000000..d0e7333
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_alarm/DevalarmDataYear.java
@@ -0,0 +1,80 @@
+package com.whyc.pojo.db_alarm;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧鍘嗗彶鍛婅璁板綍琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("tb_devalarm_data_Year")
+@ApiModel(value="DevalarmDataYear瀵硅薄", description="璁惧鍘嗗彶鍛婅璁板綍琛�")
+public class DevalarmDataYear implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private int num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鍛婅ID")
+    private Integer almId;
+
+    @TableField(exist = false)
+    private String almName;
+
+    @ApiModelProperty(value = "鍛婅绫诲瀷銆�1-涓婇檺鍛婅  2-涓嬮檺鍛婅銆�")
+    private Integer almSignalId;
+
+    @ApiModelProperty(value = "鍛婅寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date almStarttime;
+
+    @ApiModelProperty(value = "鍛婅鍊�")
+    private Float almValue;
+
+    @ApiModelProperty(value = "鍛婅鏄惁纭")
+    private Integer almIsConfirmed;
+
+    @ApiModelProperty(value = "纭鐢ㄦ埛ID")
+    private Integer confirmedUid;
+
+    @TableField(exist = false)
+    private String confirmedUname;
+
+    @ApiModelProperty(value = "纭鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date confirmedTime;
+
+    @ApiModelProperty(value = "鍛婅缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date almEndtime;
+
+    @ApiModelProperty(value = "鍛婅璁板綍鐘舵�乕0-瀹炴椂鍛婅  1-鍘嗗彶鍛婅  2-鍙栨秷鍛婅]")
+    private Integer almClearedType;
+
+    @TableField(exist = false)
+    private DevInf devInf;
+}
diff --git a/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataId.java b/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataId.java
new file mode 100644
index 0000000..2f1ba38
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataId.java
@@ -0,0 +1,121 @@
+package com.whyc.pojo.db_batt_testdata;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鐢垫睜鍘嗗彶鏁版嵁璁板綍琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="BatttestdataId瀵硅薄", description="璁惧鐢垫睜鍘嗗彶鏁版嵁璁板綍琛�")
+public class BatttestdataId implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private int num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鐢垫睜缁勭紪鍙穂0-缁�1 1-缁�2 ... 4-缁�4]")
+    private Integer battIdx;
+
+    @ApiModelProperty(value = "娴嬭瘯娆℃暟")
+    private Integer testRecordCount;
+
+    @ApiModelProperty(value = "娴嬭瘯绫诲瀷")
+    private Integer testType;
+
+    @ApiModelProperty(value = "娴嬭瘯绗旀暟")
+    private Integer recordNum;
+
+    @ApiModelProperty(value = "娴嬭瘯寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date testStarttime;
+
+    @ApiModelProperty(value = "璁板綍鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date recordTime;
+
+    @ApiModelProperty(value = "娴嬭瘯鏃堕暱(绉�)")
+    private int testTimelong;
+
+    @ApiModelProperty(value = "缁勭鐢靛帇")
+    private Double groupVol;
+
+    @ApiModelProperty(value = "娴嬭瘯鐢垫祦")
+    private Double testCurr;
+
+    @ApiModelProperty(value = "娴嬭瘯瀹归噺")
+    private Double testCap;
+
+    @ApiModelProperty(value = "鍗曚綋缂栧彿")
+    private Integer monNum;
+
+    @ApiModelProperty(value = "鍗曚綋鐢靛帇")
+    private Double monVol;
+
+    @ApiModelProperty(value = "鍗曚綋娓╁害")
+    private Double monTmp;
+
+    @ApiModelProperty(value = "鍗曚綋鐢垫祦")
+    private Double monCurr;
+
+    @ApiModelProperty(value = "鍗曚綋瀹归噺")
+    private Double monCap;
+
+    @ApiModelProperty(value = "鍗曚綋鑳介噺")
+    private Double monWh;
+
+    @ApiModelProperty(value = "鍗曚綋鐘舵��")
+    private String monState;
+
+    @ApiModelProperty(value = "鏁呴殰淇℃伅")
+    private String monFault;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕佹祴璇�")
+    private Integer needTest;
+
+    @TableField(exist = false)
+    private List<Float> monVols;
+
+    @TableField(exist = false)
+    private List<Integer> monNums;
+
+    @TableField(exist = false)
+    private List<Float> monCurrs;
+
+    @TableField(exist = false)
+    private List<Float> monCaps;
+
+    @TableField(exist = false)
+    private List<Float> monWhs;
+
+
+    @ApiModelProperty(value = "鏈�澶ф俯搴�")
+    private Float maxTemp;
+
+    @ApiModelProperty(value = "鏈�灏忔俯搴�")
+    private Float minTemp;
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataInf.java b/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataInf.java
new file mode 100644
index 0000000..6d58b89
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_batt_testdata/BatttestdataInf.java
@@ -0,0 +1,133 @@
+package com.whyc.pojo.db_batt_testdata;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 鐢垫睜缁勫巻鍙叉暟鎹�昏〃
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_batt_testdata",value ="tb_batttestdata_inf")
+@ApiModel(value="BatttestdataInf瀵硅薄", description="鐢垫睜缁勫巻鍙叉暟鎹�昏〃")
+public class BatttestdataInf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鐢垫睜缁勭紪鍙穂0-缁�1 1-缁�2 ... 4-缁�4]")
+    private Integer battIdx;
+
+    @ApiModelProperty(value = "娴嬭瘯绫诲瀷")
+    private Integer testType;
+
+    @ApiModelProperty(value = "娴嬭瘯璁板綍娆℃暟")
+    private Integer testRecordCount;
+
+    @ApiModelProperty(value = "璁板綍绗旀暟")
+    private Integer recordNum;
+
+    @ApiModelProperty(value = "娴嬭瘯寮�濮嬫椂闂�")
+    private Date testStarttime;
+
+    @ApiModelProperty(value = "娴嬭瘯鏃堕暱")
+    private Integer testTimelong;
+
+    @ApiModelProperty(value = "璁板綍鏃堕棿")
+    private Date recordTime;
+
+    @ApiModelProperty(value = "鍋滄鍘熷洜")
+    private Integer testStoptype;
+
+    @ApiModelProperty(value = "缁勭鐢靛帇")
+    private Float groupVol;
+
+    @ApiModelProperty(value = "娴嬭瘯鐢垫祦")
+    private Float testCurr;
+
+    @ApiModelProperty(value = "娴嬭瘯瀹归噺")
+    private Float testCap;
+
+    @ApiModelProperty(value = "鏈�澶у崟浣撶數鍘�")
+    private Float maxMonvol;
+
+    @ApiModelProperty(value = "鏈�澶у崟浣撶數鍘嬬紪鍙�")
+    private Integer maxMonvolnum;
+
+    @ApiModelProperty(value = "鏈�灏忓崟浣撶數鍘�")
+    private Float minMonvol;
+
+    @ApiModelProperty(value = "鏈�灏忓崟浣撶數鍘嬬紪鍙�")
+    private Integer minMonvolnum;
+
+
+    @ApiModelProperty(value = "鍗曚覆涓婇檺")
+    private Float monVolHigh;
+
+    @ApiModelProperty(value = "鐢垫祦闃堝��")
+    private Float testcurrLimit;
+
+    @ApiModelProperty(value = "鐢佃姱涓叉暟")
+    private Integer batteryNumber;
+
+    @ApiModelProperty(value = "鍏呯數闄愬帇")
+    private Float charVoltage;
+
+    @ApiModelProperty(value = "閲囬泦棰戠巼(绉�)")
+    private Integer saveInverter;
+
+    @ApiModelProperty(value = "鏈�楂樻俯搴�(鈩�)")
+    private Float maxTemp;
+
+    @ApiModelProperty(value = "鏈�浣庢俯搴�")
+    private Float minTemp;
+
+    @ApiModelProperty(value = "缁勭鐢靛帇涓嬮檺")
+    private Float groupVolLow;
+
+    @ApiModelProperty(value = "PACK/妯$粍鍙�")
+    private String batteryName;
+
+    @ApiModelProperty(value = "鍗曚覆涓嬮檺")
+    private Float monVolLow;
+
+    @ApiModelProperty(value = "鐢靛帇闃堝��")
+    private Float volThreshold;
+
+    @ApiModelProperty(value = "鐢垫睜绫诲瀷[0-閾侀攤 1-涓夊厓閿�  2-閽涢吀閿傜數 3-閿伴吀閿俔")
+    private Integer battType;
+
+
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    @TableField(exist = false)
+    private Integer devType;
+
+    @ApiModelProperty(value = "澶╂暟")
+    @TableField(exist = false)
+    private String weekDay;
+
+    @ApiModelProperty(value = "鍋滄鍘熷洜")
+    private String stopTypeReason;
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/A200Realstate.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/A200Realstate.java
new file mode 100644
index 0000000..ce6488d
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/A200Realstate.java
@@ -0,0 +1,113 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * A200 璁惧瀹炴椂鐘舵�佽〃
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_a200_realstate")
+@ApiModel(value="A200Realstate瀵硅薄", description="A200 璁惧瀹炴椂鐘舵�佽〃")
+public class A200Realstate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date recordTime;
+
+    @ApiModelProperty(value = "PACK/妯$粍鍙�")
+    private String batteryName;
+
+    @ApiModelProperty(value = "娴嬭瘯绫诲瀷[1-鏀剧數  2-鍏呯數]")
+    private Integer testType;
+
+    @ApiModelProperty(value = "鏄惁姝e湪娴嬭瘯")
+    private Integer isTesting;
+
+    @ApiModelProperty(value = "娴嬭瘯寮�濮嬫椂闂�")
+    private String startTestTime;
+
+    @ApiModelProperty(value = "娴嬭瘯鏃堕暱(绉�)")
+    private Integer testDuration;
+
+    @ApiModelProperty(value = "娴嬭瘯缁撴潫鏃堕棿")
+    private String stopTestTime;
+
+    @ApiModelProperty(value = "鏈�楂樺崟浣撶數鍘嬶紙V锛�")
+    private Double maxBatteryVoltage;
+
+    @ApiModelProperty(value = "鏈�浣庡崟浣撶數鍘�(V)")
+    private Double minBatteryVoltage;
+
+    @ApiModelProperty(value = "鏈�楂樺崟浣撶數鍘嬪搴旂數鑺紪鍙�")
+    private Integer maxBatteryVoltageNumber;
+
+    @ApiModelProperty(value = "鏈�浣庡崟浣撶數鍘嬪搴旂數鑺紪鍙�")
+    private Integer minBatteryVoltageNumber;
+
+    @ApiModelProperty(value = "鐢佃姱鍘嬪樊锛坢V锛�")
+    private Double diffBatteryVoltage;
+
+    @ApiModelProperty(value = "缁勭鐢靛帇(V)")
+    private Double storageVoltage;
+
+    @ApiModelProperty(value = "娴嬭瘯鐢垫祦锛圓锛�")
+    private Double testCurrent;
+
+    @ApiModelProperty(value = "娴嬭瘯瀹归噺锛圓H锛�")
+    private Double testCapacity;
+
+    @ApiModelProperty(value = "鏈�灏忔俯搴�")
+    private Double minBatteryTemperature;
+
+    @ApiModelProperty(value = "鏈�澶ф俯搴�")
+    private Double maxBatteryTemperature;
+
+    @ApiModelProperty(value = "鏈�澶ф俯搴﹀搴旀俯搴﹀簭鍙�")
+    private Integer maxBatteryTemperatureNumber;
+
+    @ApiModelProperty(value = "鏈�灏忔俯搴﹀搴旀俯搴﹀簭鍙�")
+    private Integer minBatteryTemperatureNumber;
+
+    @ApiModelProperty(value = "鍋滄満鍘熷洜")
+    private String stopReason;
+
+    @ApiModelProperty(value = "鍋滄満鍘熷洜搴忓彿")
+    private Integer stopReasonNumber;
+
+    @ApiModelProperty(value = "鏁呴殰鐘舵�乕0-鏃犳晠闅�  1-鏈夋晠闅淽")
+    private Integer faultState;
+
+    @ApiModelProperty(value = "骞冲潎鍗曚綋鐢靛帇/娓╁害")
+    private Double avgMonVol;
+
+    @ApiModelProperty(value = "鍗曚綋娓╁害骞冲潎鍊�")
+    private Double avgMonTmp;
+
+    @ApiModelProperty(value = "鏄惁鏆傚仠娴嬭瘯[0-鏈殏鍋�  1-鏆傚仠涓璢")
+    private Integer testPause;
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/ActmRealstate.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/ActmRealstate.java
new file mode 100644
index 0000000..86c8059
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/ActmRealstate.java
@@ -0,0 +1,127 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * ACTM 璁惧瀹炴椂鐘舵�佽〃
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_actm_realstate")
+@ApiModel(value="ActmRealstate瀵硅薄", description="ACTM 璁惧瀹炴椂鐘舵�佽〃")
+public class ActmRealstate implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "妯$粍搴忓彿 浠�0寮�濮�")
+    private Integer batteryStorageIndex;
+
+    @ApiModelProperty(value = "妯$粍缂栧彿")
+    private String moduleCode;
+
+    @ApiModelProperty(value = "宸ヤ綔妯″紡")
+    private Integer workMode;
+
+    @ApiModelProperty(value = "鐢垫睜绫诲瀷")
+    private Integer batteryType;
+
+    @ApiModelProperty(value = "鐢佃姱涓叉暟")
+    private Integer batteryNumber;
+
+    @ApiModelProperty(value = "鍗曚綋鐩爣鐢靛帇")
+    private Double batteryVoltageThreshold;
+
+    @ApiModelProperty(value = "妯$粍鐩爣鐢靛帇")
+    private Double storageVoltageThreshold;
+
+    @ApiModelProperty(value = "宸ヤ綔鐢垫祦")
+    private Double testCurrent;
+
+    @ApiModelProperty(value = "娓╁害浼犳劅鍣ㄦ暟閲�")
+    private Integer ntcCount;
+
+    @ApiModelProperty(value = "娴嬭瘯璁板綍Id")
+    private Integer testDataId;
+
+    @ApiModelProperty(value = "鏄惁姝e湪娴嬭瘯")
+    private Integer isTesting;
+
+    @ApiModelProperty(value = "鏄惁娴嬭瘯鏆傚仠")
+    private Integer isTestPause;
+
+    @ApiModelProperty(value = "娴嬭瘯寮�濮嬫椂闂�")
+    private String startTestTime;
+
+    @ApiModelProperty(value = "娴嬭瘯鏃堕暱(绉�)")
+    private Integer testDuration;
+
+    @ApiModelProperty(value = "娴嬭瘯缁撴潫鏃堕棿")
+    private String stopTestTime;
+
+    @ApiModelProperty(value = "鐢靛帇Max")
+    private Double maxBatteryVoltage;
+
+    @ApiModelProperty(value = "鐢靛帇Min")
+    private Double minBatteryVoltage;
+
+    @ApiModelProperty(value = "骞冲潎鐢靛帇")
+    private Double avgBatteryVoltage;
+
+    @ApiModelProperty(value = "鐢佃姱鍘嬪樊")
+    private Double diffBatteryVoltage;
+
+    @ApiModelProperty(value = "妯$粍鎬荤數鍘�")
+    private Double storageVoltage;
+
+    @ApiModelProperty(value = "娓╁害鍗曚綅")
+    private String temperatureUnitType;
+
+    @ApiModelProperty(value = "妯$粍鐘舵��")
+    private String moduleStatus;
+
+    @ApiModelProperty(value = "妯$粍鐘舵�佺被鍨�")
+    private Integer moduleStatusInt;
+
+    @ApiModelProperty(value = "妯$粍鐘舵�侀鑹�")
+    private String moduleStatusColor;
+
+    @ApiModelProperty(value = "鏁呴殰淇℃伅")
+    private String faultInfo;
+
+    @ApiModelProperty(value = "骞冲潎鍗曚綋鐢靛帇/娓╁害")
+    private Double avgMonVol;
+
+    @ApiModelProperty(value = "鍗曚綋娓╁害骞冲潎鍊�")
+    private Double avgMonTmp;
+
+    @ApiModelProperty(value = "褰撳墠鎺ュ叆鐢垫睜缁勬暟閲�")
+    private int batteryCount;
+
+    @ApiModelProperty(value = "鐢垫睜鏁伴噺")
+    private int batteryMoncount;
+
+    @ApiModelProperty(value = "鍋滄鍘熷洜")
+    private String stopTypeReason;
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/BattRtdata.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/BattRtdata.java
new file mode 100644
index 0000000..6a85f1c
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/BattRtdata.java
@@ -0,0 +1,73 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 鐢垫睜缁勫崟浣撳疄鏃剁姸鎬佷俊鎭〃
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_batt_rtdata")
+@ApiModel(value="BattRtdata瀵硅薄", description="鐢垫睜缁勫崟浣撳疄鏃剁姸鎬佷俊鎭〃")
+public class BattRtdata implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鐢垫睜缁勭紪鍙穂0-缁�1 1-缁�2 ... 4-缁�4]")
+    private Integer battIdx;
+
+    @ApiModelProperty(value = "鍗曚綋缂栧彿")
+    private Integer monNum;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    private Date recordTime;
+
+    @ApiModelProperty(value = "鍗曚綋鐢靛帇")
+    private Double monVol;
+
+    @ApiModelProperty(value = "鍗曚綋娓╁害")
+    private Double monTmp;
+
+    @ApiModelProperty(value = "鍗曚綋鐢垫祦")
+    private Double monCurr;
+
+    @ApiModelProperty(value = "鍗曚綋瀹归噺")
+    private Double monCap;
+
+    @ApiModelProperty(value = "鍗曚綋鑳介噺")
+    private Double monWh;
+
+    @ApiModelProperty(value = "鍗曚綋鐘舵��")
+    private String monState;
+
+    @ApiModelProperty(value = "鏁呴殰淇℃伅")
+    private String monFault;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕佹祴璇�")
+    private Integer needTest;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevA200Testparam.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevA200Testparam.java
new file mode 100644
index 0000000..2be1435
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevA200Testparam.java
@@ -0,0 +1,114 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * A200娴嬭瘯鍙傛暟琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_dev_a200_testparam")
+@ApiModel(value="DevA200Testparam瀵硅薄", description="A200娴嬭瘯鍙傛暟琛�")
+public class DevA200Testparam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鍛戒护")
+    private Integer opCmd;
+
+    @ApiModelProperty(value = "杩斿洖鍝嶅簲鐮�")
+    private Integer returnCode;
+
+    @ApiModelProperty(value = "pack/妯$粍鍙�")
+    private String batteryName;
+
+    @ApiModelProperty(value = "鏍囩О瀹归噺(AH锛�")
+    private Double  nominalCapacity;
+
+    @ApiModelProperty(value = "鐢垫睜绫诲瀷[0-纾烽吀閾侀攤  1-涓夊厓閿�   2-澶吀閿� 4-閿伴吀閿俔")
+    private Integer batteryType;
+
+    @ApiModelProperty(value = "鐢佃姱涓叉暟")
+    private Integer batteryNumber;
+
+    @ApiModelProperty(value = "鐢佃姱鍘嬪樊")
+    private Double diffBatteryVoltage;
+
+    @ApiModelProperty(value = "鏀剧數鐢垫祦")
+    private Double dischargeCurrent;
+
+    @ApiModelProperty(value = "鏀剧數鐩爣鐢靛帇锛圴锛�")
+    private Double dischargeVoltage;
+
+    @ApiModelProperty(value = "鏀剧數鏃堕棿(绉�)")
+    private Integer dischargeTime;
+
+    @ApiModelProperty(value = "棰勬斁瀹归噺锛圓H锛�")
+    private Double dischargeCapacity;
+
+    @ApiModelProperty(value = "棰勬斁瀹归噺闄愬埗鏄惁寮�鍚�")
+    private Integer isDischargeCapacityEnable;
+
+    @ApiModelProperty(value = "鍗曚覆涓嬮檺锛圴锛�")
+    private Double minBatteryVoltage;
+
+    @ApiModelProperty(value = "鍗曚覆涓嬮檺鏄惁寮�鍚�")
+    private Integer isMinBatteryVoltageEnable;
+
+    @ApiModelProperty(value = "鍏呯數鐩爣鐢靛帇锛圴锛�")
+    private Double chargeVoltage;
+
+    @ApiModelProperty(value = "鍏呯數淇濇姢鐢靛帇")
+    private Double chargeProtectVoltage;
+
+    @ApiModelProperty(value = "鍏呯數鐢垫祦锛圓锛�")
+    private Double chargeCurrent;
+
+    @ApiModelProperty(value = "鍏呯數鍋滄満鐢垫祦锛圓锛�")
+    private Double chargeStopCurrent;
+
+    @ApiModelProperty(value = "鍏呯數鏃堕棿锛堢锛�")
+    private Integer chargeTime;
+
+    @ApiModelProperty(value = "鍏呯數瀹归噺")
+    private Double chargeCapacity;
+
+    @ApiModelProperty(value = "棰勫厖瀹归噺闄愬埗鏄惁寮�鍚�")
+    private Integer isChargeCapacityEnable;
+
+    @ApiModelProperty(value = "鍗曚覆涓婇檺")
+    private Double maxBatteryVoltage;
+
+    @ApiModelProperty(value = "鍗曚覆涓婇檺闄愬埗鏄惁寮�鍚�")
+    private Integer isMaxBatteryVoltageEnable;
+
+    @ApiModelProperty(value = "鍏呯數鍔熺巼锛圞W锛�")
+    private Double chargePower;
+
+    @ApiModelProperty(value = "鍗曚綋娓╁害淇濇姢")
+    private Integer batteryTemperatureProtect;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevActmTestparam.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevActmTestparam.java
new file mode 100644
index 0000000..44641b5
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevActmTestparam.java
@@ -0,0 +1,74 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * actm 娴嬭瘯鍙傛暟琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_dev_actm_testparam")
+@ApiModel(value="DevActmTestparam瀵硅薄", description="actm 娴嬭瘯鍙傛暟琛�")
+public class DevActmTestparam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    private Integer devId;
+
+    @ApiModelProperty(value = "鎿嶄綔鍛戒护")
+    private Integer opCmd;
+
+    @ApiModelProperty(value = "妯$粍闇�瑕侊紝浠�0寮�濮�")
+    private Integer batteryStorageIndex;
+
+    @ApiModelProperty(value = "妯$粍缂栧彿")
+    private String moduleCode;
+
+    @ApiModelProperty(value = "宸ヤ綔妯″紡[0-鍏呯數   1-鏀剧數   2-鍧囪 ]")
+    private Integer workMode;
+
+    @ApiModelProperty(value = "鐢垫睜绫诲瀷[0-閾侀攤 1-涓夊厓閿� 2-閽涢吀閿� 3-閿伴吀閿俔")
+    private Integer batteryType;
+
+    @ApiModelProperty(value = "褰撳墠閰嶇疆鐨勭數鑺暟閲�")
+    private Integer batteryNumber;
+
+    @ApiModelProperty(value = "褰撳墠閰嶇疆鐨勬俯搴︿紶鎰熷櫒鏁伴噺")
+    private Integer ntcCount;
+
+    @ApiModelProperty(value = "娴嬭瘯鐢垫睜鍒楄〃[娴嬭瘯鐢垫睜鍒楄〃鏄皢寰呮祴鐢佃姱缂栧彿鐢ㄩ�楀彿鍒嗛殧鐨勫瓧绗︿覆銆備緥濡傦細1,2,4,6 琛ㄧず娴嬭瘯1#銆�2#銆�4#銆�6#鐢佃姱锛屽叾浣欐病鏈夊寘鍚殑鐢佃姱涓嶈繘琛屾祴璇昡")
+    private String testBatteryArray;
+
+    @ApiModelProperty(value = "鐢靛帇闃堝��")
+    private Double voltage;
+
+    @ApiModelProperty(value = "宸ヤ綔鐢垫祦")
+    private Double current;
+
+    @ApiModelProperty(value = "鍙厤缃殑鏈�澶х數鑺暟閲廩鍙]")
+    private Integer maxBatteryNumber;
+
+    @ApiModelProperty(value = "鍙厤缃殑鏈�澶ф俯搴︿紶鎰熷櫒鏁伴噺[鍙]")
+    private Integer maxNtcCount;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevInf.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevInf.java
new file mode 100644
index 0000000..c51f568
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/DevInf.java
@@ -0,0 +1,80 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_dev_inf")
+@ApiModel(value="DevInf瀵硅薄", description="")
+public class DevInf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num", type = IdType.AUTO)
+    private Integer num;
+
+    private Integer devId;
+
+    private String devIp;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷锛�1锛歛200(涓�浣撴満),2锛歛ctm(鍧囪 浠�)")
+    private Integer devType;
+
+    @ApiModelProperty(value = "璁惧鍨嬪彿")
+    private String devModel;
+
+    private String devIdcode;
+
+    @ApiModelProperty(value = "璁惧鐘舵�侊紱0:鏂紑锛�1鍦ㄧ嚎")
+    private int devOnline;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "璁惧鎵归噺娴嬭瘯鐘舵�乕0-鏈壒閲�  1-鎵归噺涓璢")
+    private Integer batchState;
+
+    @ApiModelProperty(value = "缁忓害")
+    private Double longitude;
+
+    @ApiModelProperty(value = "绾害")
+    private Double latitude;
+
+    @ApiModelProperty(value = "鏄惁闇�瑕侀噸鏂板姞杞芥暟鎹甗0- 涓嶉渶瑕侀噸杞�  1-闇�瑕侀噸杞絔'")
+    private Integer reloadEn;
+
+    @TableField(exist = false)
+    private List<Integer> baojiIdList;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "a200瀹炴椂鏁版嵁")
+    private Object state;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "actm瀹炴椂鏁版嵁")
+    private Object actmstates;
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateCfg.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateCfg.java
new file mode 100644
index 0000000..4c1be11
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateCfg.java
@@ -0,0 +1,48 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧宸ヤ綔鍒囨崲鎻忚堪閰嶇疆琛�
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_workstate_cfg")
+@ApiModel(value="WorkstateCfg瀵硅薄", description="璁惧宸ヤ綔鍒囨崲鎻忚堪閰嶇疆琛�")
+public class WorkstateCfg implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷[1-A200鍏呮斁鐢典竴浣撴満  2-ACTM鍧囪 浠猐")
+    private Integer devType;
+
+    @ApiModelProperty(value = "涓婁竴娆″伐浣滅姸鎬�")
+    private Integer lastWorkState;
+
+    @ApiModelProperty(value = "褰撳墠璁惧宸ヤ綔鐘舵��")
+    private Integer nowWorkState;
+
+    @ApiModelProperty(value = "浜嬩欢鎻忚堪")
+    private String eventStr;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateChangeevent.java b/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateChangeevent.java
new file mode 100644
index 0000000..a22a1dd
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_lithium_ram_db/WorkstateChangeevent.java
@@ -0,0 +1,57 @@
+package com.whyc.pojo.db_lithium_ram_db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧宸ヤ綔鐘舵�佸垏鎹簨浠惰〃
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-09-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_lithium_ram_db",value ="tb_workstate_changeevent")
+@ApiModel(value="WorkstateChangeevent瀵硅薄", description="璁惧宸ヤ綔鐘舵�佸垏鎹簨浠惰〃")
+public class WorkstateChangeevent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "鑷涓婚敭")
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    @ApiModelProperty(value = "璁惧ID")
+    private Integer devId;
+
+    @ApiModelProperty(value = "鐢垫睜缁勫彿[0-缁�1  1-缁�2....]")
+    private Integer battIdx;
+
+    @ApiModelProperty(value = "涓婁竴娆″伐浣滅姸鎬�")
+    private Integer lastWorkState;
+
+    @ApiModelProperty(value = "褰撳墠璁惧宸ヤ綔鐘舵��")
+    private Integer nowWorkState;
+
+    @ApiModelProperty(value = "璁惧宸ヤ綔鐘舵�佸垏鎹㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date recordTime;
+
+    @ApiModelProperty(value = "浜嬩欢鎻忚堪")
+    @TableField(exist = false)
+    private String eventStr;
+}
diff --git a/src/main/java/com/whyc/pojo/db_user/Baojigroup.java b/src/main/java/com/whyc/pojo/db_user/Baojigroup.java
new file mode 100644
index 0000000..2fa4d8a
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_user/Baojigroup.java
@@ -0,0 +1,47 @@
+package com.whyc.pojo.db_user;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_user",value ="tb_baojigroup")
+@ApiModel(value="Baojigroup瀵硅薄", description="")
+public class Baojigroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num", type = IdType.AUTO)
+    private Integer num;
+
+    private Integer baojiGroupId;
+
+    private String baojiGroupName;
+
+    @TableField(exist = false)
+    private List<UserInf> usrList;
+
+    @TableField(exist = false)
+    private List<DevInf> devList;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_user/BattgroupBaojigroup.java b/src/main/java/com/whyc/pojo/db_user/BattgroupBaojigroup.java
new file mode 100644
index 0000000..8811ac5
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_user/BattgroupBaojigroup.java
@@ -0,0 +1,38 @@
+package com.whyc.pojo.db_user;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lxw
+ * @since 2024-08-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_user",value ="tb_battgroup_baojigroup")
+@ApiModel(value="BattgroupBaojigroup瀵硅薄", description="")
+public class BattgroupBaojigroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    private Integer baojiGroupId;
+
+    private Integer devId;
+
+
+}
diff --git a/src/main/java/com/whyc/pojo/db_user/BattgroupUsr.java b/src/main/java/com/whyc/pojo/db_user/BattgroupUsr.java
new file mode 100644
index 0000000..d9eaa51
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/db_user/BattgroupUsr.java
@@ -0,0 +1,28 @@
+package com.whyc.pojo.db_user;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName(schema = "db_user",value ="tb_battgroup_usr")
+@ApiModel(value="BattgroupUsr瀵硅薄", description="")
+public class BattgroupUsr implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num", type = IdType.AUTO)
+    private Long num;
+
+    private Integer baojiGroupId;
+
+    private Integer uid;
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/A200RealstateService.java b/src/main/java/com/whyc/service/A200RealstateService.java
new file mode 100644
index 0000000..83c5917
--- /dev/null
+++ b/src/main/java/com/whyc/service/A200RealstateService.java
@@ -0,0 +1,24 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.A200RealstateMapper;
+import com.whyc.pojo.db_lithium_ram_db.A200Realstate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class A200RealstateService {
+
+    @Autowired(required = false)
+    private A200RealstateMapper mapper;
+
+    //涓�浣撴満A200瀹炴椂鏁版嵁
+    public Response getA200State(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        A200Realstate a200state=mapper.selectOne(wrapper);
+        return new Response().setII(1,a200state!=null,a200state,"涓�浣撴満A200瀹炴椂鏁版嵁");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/ActmRealstateService.java b/src/main/java/com/whyc/service/ActmRealstateService.java
new file mode 100644
index 0000000..66c2750
--- /dev/null
+++ b/src/main/java/com/whyc/service/ActmRealstateService.java
@@ -0,0 +1,24 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.ActmRealstateMapper;
+import com.whyc.pojo.db_lithium_ram_db.ActmRealstate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ActmRealstateService {
+
+    @Autowired(required = false)
+    private ActmRealstateMapper mapper;
+    //鍧囪 浠狝ctm瀹炴椂鏁版嵁
+    public Response getActmState(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        List<ActmRealstate> list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鍧囪 浠狝ctm瀹炴椂鏁版嵁");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/AlarmParamService.java b/src/main/java/com/whyc/service/AlarmParamService.java
new file mode 100644
index 0000000..d75700b
--- /dev/null
+++ b/src/main/java/com/whyc/service/AlarmParamService.java
@@ -0,0 +1,24 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.AlarmParamMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class AlarmParamService {
+    @Autowired(required = false)
+    private AlarmParamMapper mapper;
+
+    //鑾峰彇璁惧鍛婅鍙傛暟
+    public Response getAlmParam(Integer devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.orderByAsc("num");
+        List list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鑾峰彇璁惧鍛婅鍙傛暟");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BaojigroupService.java b/src/main/java/com/whyc/service/BaojigroupService.java
new file mode 100644
index 0000000..edfcb0c
--- /dev/null
+++ b/src/main/java/com/whyc/service/BaojigroupService.java
@@ -0,0 +1,85 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.BaojigroupMapper;
+import com.whyc.mapper.BattgroupBaojigroupMapper;
+import com.whyc.mapper.BattgroupUsrMapper;
+import com.whyc.pojo.db_user.Baojigroup;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class BaojigroupService {
+    @Autowired(required = false)
+    private BaojigroupMapper mapper;
+
+    @Autowired(required = false)
+    private BattgroupBaojigroupMapper groupMapper;
+
+    @Autowired(required = false)
+    private BattgroupUsrMapper usrMapper;
+
+    //鍖呮満缁勪笅娣诲姞璁惧
+    public Response addBaoji(String baojiName) {
+        Baojigroup baojigroup=new Baojigroup();
+        //鑾峰彇鏈�澶х殑鍖呮満缁勭紪鍙�
+        Integer baojiGroupId=getMaxBaojiGroupId();
+        baojigroup.setBaojiGroupId(baojiGroupId);
+        baojigroup.setBaojiGroupName(baojiName);
+        int bl=mapper.insert(baojigroup);
+        return new Response().set(1,bl>0);
+    }
+    //鑾峰彇鏈�澶х殑鍖呮満缁勭紪鍙�
+    private Integer getMaxBaojiGroupId() {
+        //鏌ヨ璇ョ被鍨嬫渶澶ц澶囩紪鍙�
+        Integer baojiGroupId=mapper.getMaxBaojiGroupId();
+        if(baojiGroupId==null){
+            baojiGroupId=1000;
+        }
+        return baojiGroupId+1;
+    }
+
+    //鍒犻櫎鍖呮満缁�
+    @Transactional
+    public Response delBaoji(List<Integer> baojiIdList) {
+        if(baojiIdList!=null){
+            for (Integer baojiId:baojiIdList) {
+                //鍒犻櫎鍖呮満缁�
+                UpdateWrapper baojiWrapper=new UpdateWrapper();
+                baojiWrapper.eq("baoji_group_id",baojiId);
+                mapper.delete(baojiWrapper);
+                //鍒犻櫎鍖呮満缁勪笅鏈烘埧
+                UpdateWrapper groupWrapper=new UpdateWrapper();
+                groupWrapper.eq("baoji_group_id",baojiId);
+                groupMapper.delete(groupWrapper);
+                //鍒犻櫎鍖呮満缁勪笅鐢ㄦ埛
+                UpdateWrapper usrWrapper=new UpdateWrapper();
+                usrWrapper.eq("baoji_group_id",baojiId);
+                usrMapper.delete(usrWrapper);
+            }
+        }
+        return new Response().set(1,true,"鍒犻櫎鍖呮満缁�");
+    }
+   //缂栬緫鍖呮満缁�
+    public Response updateBaoji(int baojiGroupId,String baojiGroupName) {
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.set("baoji_group_name",baojiGroupName);
+        wrapper.eq("baoji_group_id",baojiGroupId);
+        int flag=mapper.update(null,wrapper);
+        return new Response().set(1,flag>0);
+    }
+    //鏌ヨ鎵�鏈夌殑鍖呮満缁勫強鍖呮満缁勪笅璁惧淇℃伅鍜岀鐞嗕汉
+    public Response getBaojiInfo() {
+        List<Baojigroup> list=mapper.getBaojiInfo();
+        return new Response().setII(1,list!=null,list,"");
+    }
+    //鏌ヨ鐧诲綍鐢ㄦ埛瀵瑰簲鐨勫寘鏈虹粍
+    public Response getUsrBaoji(int uid) {
+        List<Baojigroup> list=mapper.getUsrBaoji(uid);
+        return new Response().setII(1,list!=null,list,"鏌ヨ鐧诲綍鐢ㄦ埛瀵瑰簲鐨勫寘鏈虹粍");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BattRtdataService.java b/src/main/java/com/whyc/service/BattRtdataService.java
new file mode 100644
index 0000000..40df4cd
--- /dev/null
+++ b/src/main/java/com/whyc/service/BattRtdataService.java
@@ -0,0 +1,39 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.BattRtdataMapper;
+import com.whyc.pojo.db_lithium_ram_db.BattRtdata;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BattRtdataService {
+
+    @Autowired(required = false)
+    private BattRtdataMapper mapper;
+
+
+    //鑾峰彇a200鐢垫睜缁勬暟鎹�
+    public Response getA200RtdataState(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.orderByAsc("batt_idx");
+        wrapper.orderByAsc("mon_num");
+        List<BattRtdata> list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鑾峰彇鐢垫睜缁勬暟鎹�");
+    }
+
+    //鑾峰彇actm鐢垫睜缁勬暟鎹�
+    public Response getActmRtdataState(int devId,Integer index) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.eq("batt_idx",index);
+        wrapper.orderByAsc("batt_idx");
+        wrapper.orderByAsc("mon_num");
+        List<BattRtdata> list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鑾峰彇鐢垫睜缁勬暟鎹�");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BattgroupBaojigroupService.java b/src/main/java/com/whyc/service/BattgroupBaojigroupService.java
new file mode 100644
index 0000000..c8c3b18
--- /dev/null
+++ b/src/main/java/com/whyc/service/BattgroupBaojigroupService.java
@@ -0,0 +1,33 @@
+package com.whyc.service;
+
+import com.whyc.dto.BaojiDto;
+import com.whyc.dto.Response;
+import com.whyc.mapper.BattgroupBaojigroupMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class BattgroupBaojigroupService {
+    @Autowired(required = false)
+    private BattgroupBaojigroupMapper mapper;
+
+
+
+    //鍖呮満缁勪笅娣诲姞璁惧
+    @Transactional
+    public Response opreateDevInBaoji(BaojiDto dto) {
+        if(dto.getAdddevList()!=null&&dto.getAdddevList().size()>0){
+            mapper.insertBatchSomeColumn(dto.getAdddevList());
+        }
+        if(dto.getDeldevList()!=null&&dto.getDeldevList().size()>0){
+            mapper.delDevInBaoji(dto.getDeldevList());
+        }
+        return new Response().set(1,true);
+    }
+    //鍖呮満缁勪笅绉婚櫎璁惧
+    /*public Response delDevInBaoji(List<BattgroupBaojigroup> devList) {
+        mapper.delDevInBaoji(devList);
+        return new Response().set(1,"绉婚櫎鎴愬姛");
+    }*/
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BattgroupUsrService.java b/src/main/java/com/whyc/service/BattgroupUsrService.java
new file mode 100644
index 0000000..d92dc06
--- /dev/null
+++ b/src/main/java/com/whyc/service/BattgroupUsrService.java
@@ -0,0 +1,29 @@
+package com.whyc.service;
+
+import com.whyc.dto.BaojiDto;
+import com.whyc.dto.Response;
+import com.whyc.mapper.BattgroupUsrMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BattgroupUsrService {
+    @Autowired(required = false)
+    private BattgroupUsrMapper mapper;
+
+    //鍖呮満缁勪笅娣诲姞鐢ㄦ埛
+    public Response opreateUsrInBaoji(BaojiDto dto) {
+        if(dto.getAddusrList()!=null&&dto.getAddusrList().size()>0){
+            mapper.insertBatchSomeColumn(dto.getAddusrList());
+        }
+        if(dto.getDelusrList()!=null&&dto.getDelusrList().size()>0){
+            mapper.delUsrInBaoji(dto.getDelusrList());
+        }
+        return new Response().set(1,true);
+    }
+    /*//鍖呮満缁勪笅绉婚櫎鐢ㄦ埛
+    public Response delUsrInBaoji(List<BattgroupUsr> usrList) {
+        mapper.delUsrInBaoji(usrList);
+        return new Response().set(1,"绉婚櫎鎴愬姛");
+    }*/
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BatttestdataIdService.java b/src/main/java/com/whyc/service/BatttestdataIdService.java
new file mode 100644
index 0000000..93f1162
--- /dev/null
+++ b/src/main/java/com/whyc/service/BatttestdataIdService.java
@@ -0,0 +1,7 @@
+package com.whyc.service;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class BatttestdataIdService {
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/BatttestdataInfService.java b/src/main/java/com/whyc/service/BatttestdataInfService.java
new file mode 100644
index 0000000..4a72dec
--- /dev/null
+++ b/src/main/java/com/whyc/service/BatttestdataInfService.java
@@ -0,0 +1,183 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.BatttestdataIdMapper;
+import com.whyc.mapper.BatttestdataInfMapper;
+import com.whyc.pojo.db_batt_testdata.BatttestdataId;
+import com.whyc.pojo.db_batt_testdata.BatttestdataInf;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class BatttestdataInfService {
+
+    @Autowired(required = false)
+    private BatttestdataInfMapper mapper;
+
+    @Autowired(required = false)
+    private BatttestdataIdMapper dataMapper;
+
+    @Autowired(required = false)
+    private SubTablePageInfoService subService;
+
+    //鍏呮斁鐢典竴浣撴満娴嬭瘯缁熻
+    public Map<String, Object> getDevTinfByYearMonth(int userId) {
+        Map<String,Object> map=new HashMap<>();
+        //鏈勾
+        List<BatttestdataInf> listYear=mapper.getDevTinfByYear(userId);
+
+        Map<String,Object> a200Map=new HashMap<>();
+        Map<String,Object> actmMap=new HashMap<>();
+
+        Map<Integer,Integer> a200YearMap=new HashMap<>();
+        a200YearMap.put(2,0);
+        a200YearMap.put(3,0);
+        Map<Integer,Integer> actmYearMap=new HashMap<>();
+        actmYearMap.put(2,0);
+        actmYearMap.put(3,0);
+        actmYearMap.put(4,0);
+        //鏈勾
+        Map<Integer, List<BatttestdataInf>> typeMapY = listYear.stream().collect(Collectors.groupingBy(BatttestdataInf::getDevType));
+
+        for (Integer type : typeMapY.keySet()) {
+            List<BatttestdataInf> list=typeMapY.get(type);
+            Map<Integer, List<BatttestdataInf>> testMapY = list.stream().collect(Collectors.groupingBy(BatttestdataInf::getTestType));
+            for (Integer test : testMapY.keySet()) {
+                if(type==1){
+                    a200YearMap.put(test, testMapY.get(test).size());
+                }
+                if(type==2){
+                    actmYearMap.put(test, testMapY.get(test).size());
+                }
+
+            }
+        }
+        a200Map.put("a200YearMap",a200YearMap);
+        actmMap.put("actmYearMap",actmYearMap);
+
+        //鏈湀
+        Map<Integer,Integer> a200MonthMap=new HashMap<>();
+        a200MonthMap.put(2,0);
+        a200MonthMap.put(3,0);
+        Map<Integer,Integer> actmMonthMap=new HashMap<>();
+        actmMonthMap.put(2,0);
+        actmMonthMap.put(3,0);
+        actmMonthMap.put(4,0);
+        List<BatttestdataInf> listMonth=mapper.getDevTinfByMonth(userId);
+        Map<Integer, List<BatttestdataInf>> typeMapM = listMonth.stream().collect(Collectors.groupingBy(BatttestdataInf::getDevType));
+        for (Integer type : typeMapM.keySet()) {
+            List<BatttestdataInf> list=typeMapM.get(type);
+            Map<Integer, List<BatttestdataInf>> testMapM = list.stream().collect(Collectors.groupingBy(BatttestdataInf::getTestType));
+            for (Integer test : testMapM.keySet()) {
+                if(type==1){
+                    a200MonthMap.put(test, testMapM.get(test).size());
+                }
+                if(type==2){
+                    actmMonthMap.put(test, testMapM.get(test).size());
+                }
+
+            }
+        }
+        a200Map.put("a200MonthMap",a200MonthMap);
+        actmMap.put("actmMonthMap",actmMonthMap);
+
+        map.put("a200Map",a200Map);
+        map.put("actmMap",actmMap);
+        return map;
+    }
+    //杩戜竴鍛ㄧ數姹犳祴璇曡秼鍔跨粺璁�(浠庡綋鍓嶆椂闂村紑濮�)
+    public Map<String, Object> getDevTinfByWeek(int userId) {
+        Map<String,Object> map=new HashMap<>();
+
+        Map<String,Object> a200dataMap=new HashMap<>();
+        Map<String,Object> actmdataMap=new HashMap<>();
+
+        Map<Integer,Integer> a200weekDateMap=new HashMap<>();
+        a200weekDateMap.put(2,0);
+        a200weekDateMap.put(3,0);
+
+        Map<Integer,Integer> actmweekDataMap=new HashMap<>();
+        actmweekDataMap.put(2,0);
+        actmweekDataMap.put(3,0);
+        actmweekDataMap.put(4,0);
+
+        // 褰撳墠鏃ユ湡
+        LocalDate today = LocalDate.now();
+        for(int i=0;i<7;i++){
+            LocalDate resultDate = today.minusDays(i);
+            a200dataMap.put(resultDate.toString(),a200weekDateMap);
+            actmdataMap.put(resultDate.toString(),actmweekDataMap);
+        }
+
+        List<BatttestdataInf> listW1=mapper.getDevTinfByWeek(userId,1);
+        Map<String, List<BatttestdataInf>> typeMapW1 = listW1.stream().collect(Collectors.groupingBy(BatttestdataInf::getWeekDay));
+        for (String day : typeMapW1.keySet()) {
+            List<BatttestdataInf> list1=typeMapW1.get(day);
+            Map<Integer, List<BatttestdataInf>> testMapM1 = list1.stream().collect(Collectors.groupingBy(BatttestdataInf::getTestType));
+            //杩戜竴鍛╝200
+            Map<Integer,Integer> a200weekMap=new HashMap<>();
+            a200weekMap.put(2,0);
+            a200weekMap.put(3,0);
+            for (Integer test : testMapM1.keySet()) {
+                a200weekMap.put(test, testMapM1.get(test).size());
+            }
+            a200dataMap.put(day,a200weekMap);
+        }
+
+        List<BatttestdataInf> listW2=mapper.getDevTinfByWeek(userId,2);
+        Map<String, List<BatttestdataInf>> typeMapW2= listW2.stream().collect(Collectors.groupingBy(BatttestdataInf::getWeekDay));
+        for (String day : typeMapW2.keySet()) {
+            List<BatttestdataInf> list2=typeMapW2.get(day);
+            Map<Integer, List<BatttestdataInf>> testMapM2 = list2.stream().collect(Collectors.groupingBy(BatttestdataInf::getTestType));
+            //杩戜竴鍛╝ctm
+            Map<Integer,Integer> actmweekMap=new HashMap<>();
+            actmweekMap.put(2,0);
+            actmweekMap.put(3,0);
+            actmweekMap.put(4,0);
+            for (Integer test : testMapM2.keySet()) {
+                actmweekMap.put(test, testMapM2.get(test).size());
+            }
+            actmdataMap.put(day,actmweekMap);
+        }
+        map.put("a200",a200dataMap);
+        map.put("actm",actmdataMap);
+        return map;
+    }
+   //鑾峰彇璁惧鐨勫厖鏀剧數璁板綍
+    public Response getTinfById(Integer devId) {
+        Map<String,Object> map=new HashMap<>();
+        //鑾峰彇鍏呮斁鐢垫暟鎹�
+        List<BatttestdataInf> listDis=mapper.getTinfById(3,devId);
+        List<BatttestdataInf> listChr=mapper.getTinfById(2,devId);
+        map.put("dis",listDis);
+        map.put("chr",listChr);
+        if(devId/100000000==2){
+            List<BatttestdataInf> listJun=mapper.getTinfById(4,devId);
+            map.put("jun",listJun);
+        }
+
+        return new Response().setII(1,true,map,"鑾峰彇璁惧鐨勫厖鏀剧數璁板綍");
+    }
+    //鑾峰彇璁惧鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃繃绋�
+    public Response getTdataById(Integer devId, Integer testRecordCount) {
+        List<BatttestdataId> list=subService.getTdataById(devId,testRecordCount);
+
+        return new Response().setII(1,list!=null,list,"鑾峰彇璁惧鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃繃绋�");
+    }
+    //鑾峰彇鏀剧數inf
+    public BatttestdataInf getTinfExport(Integer devId, Integer testRecordCount) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.eq("test_record_count",testRecordCount);
+        wrapper.last("limit 1");
+        BatttestdataInf tinf=mapper.selectOne(wrapper);
+        return  tinf;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/DevA200TestparamService.java b/src/main/java/com/whyc/service/DevA200TestparamService.java
new file mode 100644
index 0000000..6b60997
--- /dev/null
+++ b/src/main/java/com/whyc/service/DevA200TestparamService.java
@@ -0,0 +1,293 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.whyc.dto.A200ResDto;
+import com.whyc.dto.Response;
+import com.whyc.dto.ResultA200Dto;
+import com.whyc.factory.ThreadPoolExecutorFactory;
+import com.whyc.mapper.DevA200TestparamMapper;
+import com.whyc.mapper.DevInfMapper;
+import com.whyc.pojo.db_lithium_ram_db.DevA200Testparam;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import com.whyc.util.ActionUtil;
+import com.whyc.util.JsonUtil;
+import com.whyc.util.TestparamHttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+@Service
+public class DevA200TestparamService {
+    @Autowired(required = false)
+    private DevA200TestparamMapper mapper;
+
+    @Autowired(required = false)
+    private DevInfMapper dinfMapper;
+
+    private final RestTemplate restTemplate;
+
+    @Autowired
+    public DevA200TestparamService(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+    //鎵归噺澶勭悊鍙戦�佹帴鍙h姹�
+    public ResultA200Dto getA200Dto(String url){
+        ResultA200Dto dto= null;
+        String results =null;
+        try {
+            results = restTemplate.postForObject(url, null, String.class);
+        } catch (RestClientException e) {
+            results=" {\n" +
+                    "      \"code\": \"205\",\n" +
+                    "      \"msg\": \"鎺ュ彛璋冪敤鍑洪敊\",\n" +
+                    "      \"data\": null,\n" +
+                    "      \"count\": 0\n" +
+                    "    }";
+        }finally {
+            dto = ActionUtil.getGson().fromJson(results, ResultA200Dto.class);
+        }
+        return dto;
+    }
+    //璇诲彇a200涓�浣撴満鍙傛暟
+    public Object getA200Param(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/getTestParameter";
+        ResultA200Dto dto= getA200Dto(url);
+        if(dto.getCode().equals("200")){
+            DevA200Testparam a200Param=new DevA200Testparam();
+            copyA200DTO(dto.getData(),a200Param);
+            a200Param.setDevId(devId);
+            a200Param.setReturnCode(Integer.parseInt(dto.getCode()));
+            UpdateWrapper updateWrapper=new UpdateWrapper();
+            updateWrapper.eq("dev_id",devId);
+            mapper.update(a200Param,updateWrapper);
+        }
+        return dto;
+    }
+
+
+    //璁剧疆a200涓�浣撴満鍙傛暟
+    public Object setA200Param(A200ResDto param) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",param.getDevId());
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/setTestParameter";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        //param杞琷son瀛楃涓�
+        String paramJson = JsonUtil.getGson().toJson(param);
+        paramMap.add("testParameter",paramJson);
+        ResultA200Dto dto= (ResultA200Dto) TestparamHttpUtil.postforform_dataA200(restTemplate,url,paramMap);
+        return dto;
+    }
+
+    //鎵归噺璁剧疆a200涓�浣撴満鍙傛暟
+    public Object setA200ParamPl2(A200ResDto param) {
+        Map<Integer,Object> map=new HashMap<>();
+        int size=param.getDevIds().size();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(size);
+            for (int i=0;i<size;i++) {
+                int finaldevId=param.getDevIds().get(i);
+                poolExecutor.execute(() -> {
+                    int finalIIdevId=finaldevId;
+                    param.setDevId(finalIIdevId);
+                    ResultA200Dto dto= (ResultA200Dto) setA200Param(param);
+                    map.put(finalIIdevId,dto);
+                    latch.countDown();
+                });
+            }
+            latch.await(4, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().setII(1,true,map,"鎵归噺璁剧疆a200涓�浣撴満鍙傛暟");
+    }
+    //鎵归噺璁剧疆a200涓�浣撴満鍙傛暟
+    public Object setA200ParamPl(A200ResDto param) {
+        Map<Integer,Object> map=new HashMap<>();
+        int size=param.getDevIds().size();
+        for (int i=0;i<size;i++) {
+            int finaldevId=param.getDevIds().get(i);
+            param.setDevId(finaldevId);
+            ResultA200Dto dto= (ResultA200Dto) setA200Param(param);
+            map.put(finaldevId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺璁剧疆a200涓�浣撴満鍙傛暟");
+    }
+
+    //鍚姩a200涓�浣撴満鏀剧數/鍏呯數
+    public Object startA200Param(int devId,int type) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/startTest";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        paramMap.add("testType",type);//1	鏀剧數,2	鍏呯數
+        ResultA200Dto dto= (ResultA200Dto) TestparamHttpUtil.postforform_dataA200(restTemplate,url,paramMap);
+        return dto;
+    }
+    //a200涓�浣撴満鏆傚仠/缁х画
+    public Object pauseA200Param(int devId, int type) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/pauseTest";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        paramMap.add("controlType",type);//1	鏆傚仠娴嬭瘯 ,2缁х画娴嬭瘯
+        ResultA200Dto dto= (ResultA200Dto) TestparamHttpUtil.postforform_dataA200(restTemplate,url,paramMap);
+        return dto;
+    }
+    //鍋滄a200涓�浣撴満鏀剧數/鍏呯數
+    public Object stopA200Param(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/stopTest";
+        ResultA200Dto dto= getA200Dto(url);
+        return dto;
+    }
+
+    //鎵归噺鍚姩a200涓�浣撴満
+    public Response startA200ParamPl2(List<Integer> devIds,int type) {
+        Map<Integer,Object> map=new HashMap<>();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(devIds.size());
+            for (int devId:devIds) {
+                poolExecutor.execute(() -> {
+                    ResultA200Dto dto= (ResultA200Dto) startA200Param(devId,type);
+                    map.put(devId,dto);
+                    latch.countDown();
+                });
+            }
+            latch.await(10, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().set(1,true,"鎵归噺鎺у埗a200涓�浣撴満");
+    }
+
+    //鎵归噺鍚姩a200涓�浣撴満
+    public Response startA200ParamPl(List<Integer> devIds,int type) {
+        Map<Integer,Object> map=new HashMap<>();
+        for (int devId:devIds) {
+            ResultA200Dto dto= (ResultA200Dto) startA200Param(devId,type);
+            UpdateWrapper wrapper=new UpdateWrapper();
+            wrapper.eq("dev_id",devId);
+            wrapper.set("batch_state",1);
+            dinfMapper.update(null,wrapper);
+            map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺鎺у埗a200涓�浣撴満");
+    }
+
+    //鎵归噺鍋滄a200涓�浣撴満
+    public Response stopA200ParamPl2(List<Integer> devIds) {
+        Map<Integer,Object> map=new HashMap<>();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(devIds.size());
+            for (int devId:devIds) {
+                poolExecutor.execute(() -> {
+                    ResultA200Dto dto= (ResultA200Dto) stopA200Param(devId);
+                    map.put(devId,dto);
+                    latch.countDown();
+                });
+            }
+            latch.await(10, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().set(1,true,"鎵归噺鍋滄a200涓�浣撴満");
+    }
+    //鎵归噺鍋滄a200涓�浣撴満
+    public Response stopA200ParamPl(List<Integer> devIds) {
+        Map<Integer,Object> map=new HashMap<>();
+        for (int devId:devIds) {
+                ResultA200Dto dto= (ResultA200Dto) stopA200Param(devId);
+                map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺鍋滄a200涓�浣撴満");
+    }
+
+    //鎵归噺鏆傚仠/缁х画鍚姩a200涓�浣撴満
+    public Response pauseA200ParamPl(List<Integer> devIds,int type) {
+        Map<Integer,Object> map=new HashMap<>();
+        for (int devId:devIds) {
+            ResultA200Dto dto= (ResultA200Dto) pauseA200Param(devId,type);
+            UpdateWrapper wrapper=new UpdateWrapper();
+            wrapper.eq("dev_id",devId);
+            wrapper.set("batch_state",1);
+            dinfMapper.update(null,wrapper);
+            map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺鎺у埗a200涓�浣撴満");
+    }
+
+    //灏哾to鎷疯礉鑷硃aram
+    private void copyA200DTO(Object data, DevA200Testparam a200Param) {
+        A200ResDto dto= (A200ResDto) data;
+        a200Param.setBatteryName(dto.getBatteryName());
+        a200Param.setNominalCapacity(dto.getNominalCapacity());
+        a200Param.setBatteryType(dto.getBatteryType());
+        a200Param.setBatteryNumber(dto.getBatteryNumber());
+        a200Param.setDiffBatteryVoltage(dto.getDiffBatteryVoltage());
+        a200Param.setDischargeCurrent(dto.getDischargeCurrent());
+        a200Param.setDischargeVoltage(dto.getDischargeVoltage());
+        a200Param.setDischargeTime(dto.getDischargeTime());
+        a200Param.setDischargeCapacity(dto.getDischargeCapacity());
+        if(dto.getIsDischargeCapacityEnable()){
+            a200Param.setIsDischargeCapacityEnable(1);
+        }else{
+            a200Param.setIsDischargeCapacityEnable(0);
+        }
+        a200Param.setMinBatteryVoltage(dto.getMinBatteryVoltage());
+        if(dto.getIsMinBatteryVoltageEnable()){
+            a200Param.setIsMinBatteryVoltageEnable(1);
+        }else{
+            a200Param.setIsMinBatteryVoltageEnable(0);
+        }
+        a200Param.setChargeVoltage(dto.getChargeVoltage());
+        a200Param.setChargeProtectVoltage(dto.getChargeProtectVoltage());
+        a200Param.setChargeCurrent(dto.getChargeCurrent());
+        a200Param.setChargeStopCurrent(dto.getChargeStopCurrent());
+        a200Param.setChargeTime(dto.getChargeTime());
+        a200Param.setChargeCapacity(dto.getChargeCapacity());
+        if(dto.getIsChargeCapacityEnable()){
+            a200Param.setIsChargeCapacityEnable(1);
+        }else{
+            a200Param.setIsChargeCapacityEnable(0);
+        }
+
+        a200Param.setMaxBatteryVoltage(dto.getMaxBatteryVoltage());
+        if(dto.getIsMaxBatteryVoltageEnable()){
+            a200Param.setIsMaxBatteryVoltageEnable(1);
+        }else{
+            a200Param.setIsMaxBatteryVoltageEnable(0);
+        }
+        a200Param.setChargePower(dto.getChargePower());
+        a200Param.setBatteryTemperatureProtect(dto.getBatteryTemperatureProtect());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/DevActmTestparamService.java b/src/main/java/com/whyc/service/DevActmTestparamService.java
new file mode 100644
index 0000000..b3bc1c5
--- /dev/null
+++ b/src/main/java/com/whyc/service/DevActmTestparamService.java
@@ -0,0 +1,221 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.whyc.dto.ActmPlContDto;
+import com.whyc.dto.ActmResDto;
+import com.whyc.dto.Response;
+import com.whyc.dto.ResultActmDto;
+import com.whyc.factory.ThreadPoolExecutorFactory;
+import com.whyc.mapper.DevActmTestparamMapper;
+import com.whyc.mapper.DevInfMapper;
+import com.whyc.pojo.db_lithium_ram_db.DevActmTestparam;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import com.whyc.util.TestparamHttpUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+
+@Service
+public class DevActmTestparamService {
+    @Autowired(required = false)
+    private DevActmTestparamMapper mapper;
+
+    @Autowired(required = false)
+    private DevInfMapper dinfMapper;
+
+    private final RestTemplate restTemplate;
+
+    @Autowired
+    public DevActmTestparamService(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    //璇诲彇Actm涓�浣撴満鍙傛暟
+    public Object getActmParam(int devId,int index) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/getTestParameter";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        paramMap.add("batteryStorageIndex",index);
+        ResultActmDto dto= (ResultActmDto) TestparamHttpUtil.postforform_dataActm(restTemplate,url,paramMap);
+        if(dto.getCode().equals("200")){
+            DevActmTestparam actmParam=new DevActmTestparam();
+            copyActmDTO(dto.getData(),actmParam);
+            actmParam.setDevId(devId);
+            UpdateWrapper updateWrapper=new UpdateWrapper();
+            updateWrapper.eq("dev_id",devId);
+            mapper.update(actmParam,updateWrapper);
+        }
+        return dto;
+    }
+
+
+    //璁剧疆Actm鍧囪 浠弬鏁�
+    public Object setActmParam(ActmResDto param) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",param.getDevId());
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/setTestParameter";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        paramMap.add("batteryStorageIndex",param.getBatteryStorageIndex());
+        paramMap.add("moduleCode",param.getModuleCode());
+        paramMap.add("workMode",param.getWorkMode());
+        paramMap.add("batteryType",param.getBatteryType());
+        paramMap.add("batteryNumber",param.getBatteryNumber());
+        paramMap.add("ntcCount",param.getNtcCount());
+        paramMap.add("testBatteryArray",param.getTestBatteryArray());
+        paramMap.add("voltage",param.getVoltage());
+        paramMap.add("current",param.getCurrent());
+        ResultActmDto dto= (ResultActmDto) TestparamHttpUtil.postforform_dataActm(restTemplate,url,paramMap);
+        return dto;
+    }
+
+    //鎵归噺璁剧疆Actm鍧囪 浠弬鏁�
+    public Object setActmParamPl2(ActmResDto param) {
+        Map<Integer,Object> map=new HashMap<>();
+        int size=param.getDevIds().size();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(size);
+            for (Integer devId:param.getDevIds()) {
+                poolExecutor.execute(() -> {
+                    param.setDevId(devId);
+                    ResultActmDto dto= (ResultActmDto) setActmParam(param);
+                    map.put(devId,dto);
+                    latch.countDown();
+                });
+            }
+            latch.await(10, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().setII(1,true,map,"鎵归噺璁剧疆Actm鍧囪 浠弬鏁�");
+    }
+
+    //鎵归噺璁剧疆Actm鍧囪 浠弬鏁�
+    public Object setActmParamPl(ActmResDto param) {
+        Map<Integer,Object> map=new HashMap<>();
+        int size=param.getDevIds().size();
+        for (Integer devId:param.getDevIds()) {
+            param.setDevId(devId);
+            ResultActmDto dto= (ResultActmDto) setActmParam(param);
+            map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺璁剧疆Actm鍧囪 浠弬鏁�");
+    }
+
+
+    //鍚姩,鏆傚仠,缁х画,鍋滄actm鍧囪 浠�
+    public Object controllerActmParam(int devId,int index,int type) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        switch (type){
+            case 1:url=url+"/startTest";break;        //鍚姩
+            case 2:url=url+"/pauseTest";break;        //鏆傚仠
+            case 3:url=url+"/continueTest";break;     //缁х画
+            case 4:url=url+"/stopTest";break;         //鍋滄
+        }
+        paramMap.add("batteryStorageIndex",index);
+        ResultActmDto dto= (ResultActmDto) TestparamHttpUtil.postforform_dataActm(restTemplate,url,paramMap);
+        return dto;
+    }
+
+
+    //鎵归噺鎺у埗Actm鍧囪 浠�
+    public Response controllActmParamPl2(List<ActmPlContDto> actmPlContDtos) {
+        Map<Integer,Object> map=new HashMap<>();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(actmPlContDtos.size());
+            for (ActmPlContDto actmPlContDto:actmPlContDtos) {
+                poolExecutor.execute(() -> {
+                    ResultActmDto dto= (ResultActmDto) controllerActmParam(actmPlContDto.getDevId(),actmPlContDto.getIndex(),actmPlContDto.getType());
+                    map.put(actmPlContDto.getDevId(),dto);
+                    latch.countDown();
+                });
+            }
+            latch.await(10, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().set(1,true,"鎵归噺璁剧疆Actm鍧囪 浠弬鏁�");
+    }
+
+    //鎵归噺鎺у埗Actm鍧囪 浠�
+    public Response controllActmParamPl(List<Integer> devIds,  int index,  int type) {
+        Map<Integer,Object> map=new HashMap<>();
+        for (Integer devId:devIds) {
+                ResultActmDto dto= (ResultActmDto) controllerActmParam(devId,index,type);
+                if(type==1){
+                    UpdateWrapper wrapper=new UpdateWrapper();
+                    wrapper.eq("dev_id",devId);
+                    wrapper.set("batch_state",1);
+                    dinfMapper.update(null,wrapper);
+                }
+                map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺鎺у埗Actm鍧囪 浠�");
+    }
+
+    //灏哾to鎷疯礉鑷硃aram
+    private void copyActmDTO(Object data, DevActmTestparam actmParam) {
+        ActmResDto dto= (ActmResDto) data;
+        actmParam.setBatteryStorageIndex(dto.getBatteryStorageIndex());
+        actmParam.setModuleCode(dto.getModuleCode());
+        actmParam.setWorkMode(dto.getWorkMode());
+        actmParam.setBatteryType(dto.getBatteryType());
+        actmParam.setBatteryNumber(dto.getBatteryNumber());
+        actmParam.setNtcCount(dto.getNtcCount());
+        actmParam.setTestBatteryArray(dto.getTestBatteryArray());
+        actmParam.setVoltage(dto.getVoltage());
+        actmParam.setCurrent(dto.getCurrent());
+        actmParam.setMaxBatteryNumber(dto.getMaxBatteryNumber());
+        actmParam.setMaxNtcCount(dto.getMaxNtcCount());
+    }
+    //璁剧疆鐢垫睜缁勬暟涓庣數姹犺妭鏁�
+    public Object setActmBatteryStorageNumber(ActmResDto param) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",param.getDevId());
+        wrapper.last("limit 1");
+        DevInf dinf=dinfMapper.selectOne(wrapper);
+        String url="http://"+dinf.getDevIp()+":8080/webService/setBatteryStorageNumber";
+        //灏嗚姹傚ご閮ㄥ拰鍙傛暟鍚堟垚涓�涓姹�
+        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
+        paramMap.add("batteryStorageNumber",param.getBatteryStorageNumber());
+        paramMap.add("batteryNumber",param.getBatteryNumber());
+        ResultActmDto dto= (ResultActmDto) TestparamHttpUtil.postforform_dataActm(restTemplate,url,paramMap);
+        return dto;
+    }
+    //鎵归噺璁捐缃數姹犵粍鏁颁笌鐢垫睜鑺傛暟
+    public Object setActmBatteryStorageNumberPl(ActmResDto param) {
+        Map<Integer,Object> map=new HashMap<>();
+        int size=param.getDevIds().size();
+        for (Integer devId:param.getDevIds()) {
+            param.setDevId(devId);
+            ResultActmDto dto= (ResultActmDto) setActmBatteryStorageNumber(param);
+            map.put(devId,dto);
+        }
+        return new Response().setII(1,true,map,"鎵归噺璁捐缃數姹犵粍鏁颁笌鐢垫睜鑺傛暟");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/DevInfService.java b/src/main/java/com/whyc/service/DevInfService.java
new file mode 100644
index 0000000..9f96050
--- /dev/null
+++ b/src/main/java/com/whyc/service/DevInfService.java
@@ -0,0 +1,251 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.whyc.dto.DevInfDto;
+import com.whyc.dto.Response;
+import com.whyc.mapper.A200RealstateMapper;
+import com.whyc.mapper.ActmRealstateMapper;
+import com.whyc.mapper.BattgroupBaojigroupMapper;
+import com.whyc.mapper.DevInfMapper;
+import com.whyc.pojo.db_lithium_ram_db.A200Realstate;
+import com.whyc.pojo.db_lithium_ram_db.ActmRealstate;
+import com.whyc.pojo.db_lithium_ram_db.DevInf;
+import com.whyc.pojo.db_user.BattgroupBaojigroup;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DevInfService {
+    @Autowired(required = false)
+    private DevInfMapper mapper;
+
+    @Autowired(required = false)
+    private A200RealstateMapper a200Mapper;
+
+    @Autowired(required = false)
+    private ActmRealstateMapper actmMapper;
+
+    @Autowired(required = false)
+    private BattgroupBaojigroupMapper battBjmapper;
+
+    //娣诲姞璁惧
+    @Transactional
+    public Response addDev(DevInf devInf) {
+        QueryWrapper wrapper=new QueryWrapper();
+        //鍒ゆ柇璁惧绫诲瀷鐢熸垚devId
+        int devId=getDevId(devInf.getDevType());
+        devInf.setDevId(devId);
+        devInf.setCreateTime(new Date());
+        int bl=mapper.insert(devInf);
+        if(bl>0){
+            if(devInf.getBaojiIdList()!=null){
+                List<BattgroupBaojigroup> listBj=new ArrayList<>();
+                for (int baojiId:devInf.getBaojiIdList()) {
+                    BattgroupBaojigroup baojigroup=new BattgroupBaojigroup();
+                    baojigroup.setDevId(devId);
+                    baojigroup.setBaojiGroupId(baojiId);
+                    listBj.add(baojigroup);
+                }
+                //灏嗚澶囨坊鍔犺繘鎸囧畾鐨勫寘鏈虹粍
+                battBjmapper.insertBatchSomeColumn(listBj);
+            }
+        }
+        return new Response().set(1,bl>0);
+    }
+   //鍒ゆ柇璁惧绫诲瀷鐢熸垚devId
+    private int getDevId(Integer devType) {
+        //鏌ヨ璇ョ被鍨嬫渶澶ц澶囩紪鍙�
+        Integer devId=mapper.getMaxDevId(devType);
+        if(devId==null){
+            switch (devType){
+                case 1:devId=100000000;break;
+                case 2:devId=200000000;break;
+            }
+        }
+        return devId+1;
+    }
+
+    //鑾峰彇鎵�鏈夌殑璁惧淇℃伅
+    public Response getAllInf(Integer uid, DevInfDto devInfDto) {
+        Map<String, Object> allMap = new HashMap<>();
+        PageHelper.startPage(devInfDto.getPageNum(), devInfDto.getPageSize());
+        devInfDto.setUid(uid);
+        List<DevInf> listype=mapper.getAllInf(devInfDto);
+        PageInfo pageInfo=new PageInfo(listype);
+
+        List<DevInf> list=mapper.getLine(uid);
+        Map<Integer, List<DevInf>> typeDevMap = list.stream().collect(Collectors.groupingBy(DevInf::getDevType));
+        Map<Integer, List<DevInf>> onlineDevMap = list.stream().collect(Collectors.groupingBy(DevInf::getDevOnline));
+        Map<Integer, Object> typeMap = new HashMap<>();
+        typeMap.put(1,0);
+        typeMap.put(2,0);
+        Map<Integer, Object> onlineMap = new HashMap<>();
+        onlineMap.put(0,0);
+        onlineMap.put(1,0);
+        int devSum = list.size();
+        for (Integer type : typeDevMap.keySet()) {
+            typeMap.put(type, typeDevMap.get(type).size());
+        }
+        for (Integer online : onlineDevMap.keySet()) {
+            onlineMap.put(online, onlineDevMap.get(online).size());
+        }
+        allMap.put("type",typeMap);
+        allMap.put("onlineMap",onlineMap);
+        allMap.put("devSum",devSum);
+        allMap.put("pageInfo",pageInfo);
+
+        return new Response().setII(1,listype!=null,allMap,"鑾峰彇鎵�鏈夌殑璁惧淇℃伅");
+    }
+
+    //鑾峰彇宸︿晶鍒楄〃
+    public Response getDevBytype(Integer devType) {
+        QueryWrapper wrapper=new QueryWrapper();
+        if (devType!=null){
+            wrapper.eq("dev_type",devType);
+        }
+        wrapper.orderByAsc("dev_id");
+        List<DevInf> list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鑾峰彇宸︿晶鍒楄〃");
+    }
+   //鑾峰彇宸︿晶娉
+    public Response getDevType(int uid) {
+        Map<String, Object> allMap = new HashMap<>();
+        List<DevInf> a200List=mapper.getDevType(uid,1);
+        for (DevInf a200:a200List) {
+            QueryWrapper a200wrapper= Wrappers.query();
+            a200wrapper.eq("dev_id",a200.getDevId());
+            a200wrapper.last("limit 1");
+            A200Realstate a200state=a200Mapper.selectOne(a200wrapper);
+            //a200.setA200sTate(a200state);
+            a200.setState(a200state!=null?a200state:null);
+        }
+        List<DevInf> actmList=mapper.getDevType(uid,2);
+        for (DevInf actm:actmList) {
+            QueryWrapper actmwrapper= Wrappers.query();
+            actmwrapper.eq("dev_id",actm.getDevId());
+            List<ActmRealstate> actmstates=actmMapper.selectList(actmwrapper);
+            //actm.setActmsTate(actmstate);
+            actm.setActmstates(actmstates!=null?actmstates:null);
+        }
+        allMap.put("a200List",a200List);
+        allMap.put("actmList",actmList);
+        return new Response().setII(1,allMap.size()>0,allMap,"鑾峰彇宸︿晶鍒楄〃");
+    }
+    //缂栬緫璁惧淇℃伅
+    public Response updateInf(DevInf dinf) {
+        //缂栬緫璁惧灏遍噸缃姞杞�
+        dinf.setReloadEn(1);
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.eq("dev_id",dinf.getDevId());
+        int flag=mapper.update(dinf,wrapper);
+        return new Response().set(1,flag>0,"缂栬緫璁惧淇℃伅");
+    }
+    //鑾峰彇璁惧淇℃伅(涓嶅垎椤电敤浜庡寘鏈虹粍)
+    public Response getDinf() {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.orderByAsc("dev_id");
+        List<DevInf> list=mapper.selectList(wrapper);
+        return new Response().setII(1,list!=null,list,"鑾峰彇璁惧淇℃伅(涓嶅垎椤电敤浜庡寘鏈虹粍)");
+    }
+
+    //鏍规嵁璁惧id鑾峰彇璁惧淇℃伅
+    public Response getDinfById(Integer devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=mapper.selectOne(wrapper);
+        return new Response().setII(1,dinf!=null,dinf,"鏍规嵁璁惧id鑾峰彇璁惧淇℃伅");
+    }
+    //鍒犻櫎璁惧(鍚屾椂鍒犻櫎瀹炴椂鍜屽寘鏈虹粍淇℃伅)
+    @Transactional
+    public Response delDinf(Integer devId) {
+        //鍏堝垹闄ゅ寘鏈虹粍淇℃伅
+        UpdateWrapper baojiWrapper=new UpdateWrapper();
+        baojiWrapper.eq("dev_id",devId);
+        battBjmapper.delete(baojiWrapper);
+        //鍐嶅垹闄ゅ疄鏃朵俊鎭�
+        if(devId/100000000==1){
+            UpdateWrapper a200Wrapper=new UpdateWrapper();
+            a200Wrapper.eq("dev_id",devId);
+            a200Mapper.delete(a200Wrapper);
+        }else{
+            UpdateWrapper actmWrapper=new UpdateWrapper();
+            actmWrapper.eq("dev_id",devId);
+            actmMapper.delete(actmWrapper);
+        }
+        //鏈�鍚庡垹闄よ澶囦俊鎭�
+        UpdateWrapper dinfWrapper=new UpdateWrapper();
+        dinfWrapper.eq("dev_id",devId);
+        mapper.delete(dinfWrapper);
+        return new Response().set(1,true,"鍒犻櫎璁惧(鍚屾椂鍒犻櫎瀹炴椂鍜屽寘鏈虹粍淇℃伅)");
+    }
+    //寮哄埗绉婚櫎鎵归噺璁惧
+    @Transactional
+    public Response cancelContPl(List<Integer> devIds) {
+        for (Integer devId:devIds) {
+            UpdateWrapper wrapper=new UpdateWrapper();
+            wrapper.eq("dev_id",devId);
+            wrapper.set("batch_state",0);
+            mapper.update(null,wrapper);
+        }
+        return new Response().set(1,true,"寮哄埗绉婚櫎鎵归噺璁惧");
+    }
+    //璁惧鍒嗙被鎬绘暟缁熻
+    public Map<String,Object> getDevStaticByType(int userId) {
+        Map<String,Object> map=new HashMap<>();
+        Map<Integer,Integer> staticTypeMap=new HashMap<>();
+        staticTypeMap.put(1,0);
+        staticTypeMap.put(2,0);
+
+        Map<Integer,Integer> a200staticStateMap=new HashMap<>();
+        a200staticStateMap.put(0,0);
+        a200staticStateMap.put(1,0);
+        Map<Integer,Integer> actmstaticStateMap=new HashMap<>();
+        actmstaticStateMap.put(0,0);
+        actmstaticStateMap.put(1,0);
+        Map<String,Object> typestateMap=new HashMap<>();
+        typestateMap.put("a200",a200staticStateMap);
+        typestateMap.put("actm",actmstaticStateMap);
+        List<DevInf> list=mapper.getDevStaticByType(userId);
+        Map<Integer, List<DevInf>> typeMap = list.stream().collect(Collectors.groupingBy(DevInf::getDevType));
+        for (Integer type : typeMap.keySet()) {
+            staticTypeMap.put(type, typeMap.get(type).size());
+            List<DevInf> typeList= typeMap.get(type);
+            Map<Integer, List<DevInf>> stateMap = typeList.stream().collect(Collectors.groupingBy(DevInf::getDevOnline));
+            if(type==1){
+                for (Integer state : stateMap.keySet()) {
+                    a200staticStateMap.put(state, stateMap.get(state).size());
+                }
+                typestateMap.put("a200", a200staticStateMap);
+            }
+            if(type==2){
+                for (Integer state : stateMap.keySet()) {
+                    actmstaticStateMap.put(state, stateMap.get(state).size());
+                }
+                typestateMap.put("actm", actmstaticStateMap);
+            }
+        }
+        map.put("dinf",list!=null?list:null);
+        map.put("type",staticTypeMap);
+        map.put("state",typestateMap);
+        return map;
+    }
+
+    //鏍规嵁devId鑾峰彇璁惧淇℃伅
+    public DevInf getDinfByDevId(int devId){
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.last("limit 1");
+        DevInf dinf=mapper.selectOne(wrapper);
+        return dinf;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/DevalarmDataService.java b/src/main/java/com/whyc/service/DevalarmDataService.java
new file mode 100644
index 0000000..6a82cae
--- /dev/null
+++ b/src/main/java/com/whyc/service/DevalarmDataService.java
@@ -0,0 +1,88 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.whyc.constant.DevAlmEnum;
+import com.whyc.dto.DalmDto;
+import com.whyc.dto.Response;
+import com.whyc.mapper.DevalarmDataMapper;
+import com.whyc.pojo.db_alarm.DevalarmData;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.util.ActionUtil;
+import com.whyc.util.SubTablePageInfoUtil;
+import com.whyc.util.ThreadLocalUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DevalarmDataService {
+
+    @Autowired(required = false)
+    private DevalarmDataMapper mapper;
+
+    @Autowired(required = false)
+    private SubTablePageInfoUtil service;
+
+    @Autowired(required = false)
+    private UserInfService uinfService;
+
+    //鑾峰彇璁惧鍛婅淇℃伅
+    public Response getDAlmInf(int uid, DalmDto dto) {
+        PageHelper.startPage(dto.getPageNum(),dto.getPageSize());
+        dto.setUid(uid);
+        List<DevalarmData> list=mapper.getDAlmInf(dto);
+        for (DevalarmData data:list) {
+            UserInf uinf=uinfService.getUinfByUId(data.getConfirmedUid());
+            data.setConfirmedUname(uinf!=null?uinf.getUname():"");
+            int almId=data.getAlmId();
+            data.setAlmName(DevAlmEnum.getValue(almId));
+        }
+        PageInfo pageInfo=new PageInfo(list);
+        return new Response().setII(1,list!=null,pageInfo,"鑾峰彇璁惧鍛婅淇℃伅");
+    }
+    //鑾峰彇鍘嗗彶鍛婅
+    public Response getDAlmHis(DalmDto dto) throws ParseException {
+        UserInf uinf= ActionUtil.getUser();
+        dto.setUid(uinf.getUid());
+        if(dto.getStartTime()==null){
+            dto.setStartTime(ThreadLocalUtil.parse("2024-01-01 00:00:00",1));
+        }
+        if(dto.getEndTime()==null){
+            dto.setEndTime(new Date());
+        }
+        PageInfo pageInfo=service.getPageInfo(dto.getPageNum(),dto.getPageSize(),dto.getStartTime(),dto.getEndTime()
+                ,"db_alarm", "tb_devalarm_data", dto);
+        return new Response().setII(1,pageInfo!=null,pageInfo,"鑾峰彇璁惧鍛婅淇℃伅");
+    }
+   //纭瀹炴椂鍛婅
+    public Response confiirmAlm(int num) {
+        UserInf uinf= ActionUtil.getUser();
+        UpdateWrapper wrapper=new UpdateWrapper();
+        wrapper.set("alm_is_confirmed",1);
+        wrapper.set("confirmed_uid",uinf.getUid());
+        wrapper.set("confirmed_time",new Date());
+        wrapper.eq("num",num);
+        int flag=mapper.update((DevalarmData) ActionUtil.objeNull,wrapper);
+        return new Response().set(1,flag>0,"纭瀹炴椂鍛婅");
+    }
+    //鑾峰彇鎵�鏈夌殑鍛婅绫诲瀷
+    public Response getAllAlmName() {
+        Map<Integer,String> map=DevAlmEnum.getOpInfo();
+        return new Response().setII(1,true,map,"鑾峰彇鎵�鏈夌殑鍛婅绫诲瀷");
+    }
+    //寮圭獥鍛婅
+    public Response getDAlmPopUp(Integer uid) {
+        List<DevalarmData> list=mapper.getDAlmPopUp(uid);
+        for (DevalarmData data:list) {
+            int almId=data.getAlmId();
+            data.setAlmName(DevAlmEnum.getValue(almId));
+        }
+        return new Response().setII(1,list!=null,list,"寮圭獥鍛婅");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/ExcelExportService.java b/src/main/java/com/whyc/service/ExcelExportService.java
new file mode 100644
index 0000000..c353fbc
--- /dev/null
+++ b/src/main/java/com/whyc/service/ExcelExportService.java
@@ -0,0 +1,321 @@
+package com.whyc.service;
+
+import com.whyc.dto.ActmstopReason;
+import com.whyc.pojo.db_batt_testdata.BatttestdataId;
+import com.whyc.pojo.db_batt_testdata.BatttestdataInf;
+import com.whyc.util.ActionUtil;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+
+@Service
+public class ExcelExportService {
+    @Autowired(required = false)
+    private SubTablePageInfoService subService;
+
+    @Autowired(required = false)
+    private BatttestdataInfService infService;
+
+    //瀵煎嚭鏂囦欢
+    public void exportExcel1(Integer devId,  Integer testRecordCount,HttpServletResponse response) {
+        Workbook workbook = new XSSFWorkbook();
+        Sheet sheet = workbook.createSheet("璁惧鍘嗗彶鏁版嵁");
+        String[] titiles=new String[]{"娴嬭瘯鏃堕棿","鐢垫睜缁勭紪鍙�","鍗曚綋缂栧彿","娴嬭瘯娆℃暟","娴嬭瘯绫诲瀷","娴嬭瘯璁板綍鏁�"
+                                    ,"缁勭鐢靛帇(V)","娴嬭瘯鐢垫祦(A)","娴嬭瘯瀹归噺(AH)","鍗曚綋鐢靛帇(V)","鍗曚綋娓╁害(鈩�)"
+                                    ,"鍗曚綋鐢垫祦(A)","鍗曚綋瀹归噺(AH)","鍗曚綋鑳介噺","鍗曚綋鐘舵��","鏁呴殰淇℃伅"};
+        int rowNum=0;
+        // 鍒涘缓鏍囬琛�
+        Row row = sheet.createRow(rowNum);
+        // 濉厖鏁版嵁
+        for(int i=0;i<titiles.length;i++){
+            row.createCell(i).setCellValue(titiles[i]);
+        }
+        rowNum++;
+        List<BatttestdataId> list=subService.getTdataById(devId,testRecordCount);
+        if(list!=null){
+            //鏁版嵁鏍�
+            for (int i = 0; i < list.size(); i++) {
+                sheet.createRow(rowNum);  //鍒涘缓琛�
+                BatttestdataId tdata=list.get(i);
+                for(int j=0;j<titiles.length;j++){
+                    sheet.getRow(rowNum).createCell(0 ).setCellValue(ActionUtil.secToTime(tdata.getTestTimelong()));
+                    sheet.getRow(rowNum).createCell(1).setCellValue(tdata.getBattIdx()+1);
+                    sheet.getRow(rowNum).createCell(2 ).setCellValue(tdata.getMonNum());
+                    sheet.getRow(rowNum).createCell(3).setCellValue(tdata.getTestRecordCount());
+                    sheet.getRow(rowNum).createCell(4).setCellValue(tdata.getTestType());
+                    sheet.getRow(rowNum).createCell(5).setCellValue(tdata.getRecordNum());
+                    sheet.getRow(rowNum).createCell(6).setCellValue(tdata.getGroupVol());
+                    sheet.getRow(rowNum).createCell(7).setCellValue(tdata.getTestCurr());
+                    sheet.getRow(rowNum).createCell(8).setCellValue(tdata.getTestCap());
+                    sheet.getRow(rowNum).createCell(9 ).setCellValue(tdata.getMonVol());
+                    sheet.getRow(rowNum).createCell(10 ).setCellValue(tdata.getMonTmp());
+                    sheet.getRow(rowNum).createCell(11 ).setCellValue(tdata.getMonCurr());
+                    sheet.getRow(rowNum).createCell(12 ).setCellValue(tdata.getMonCap());
+                    sheet.getRow(rowNum).createCell(13 ).setCellValue(tdata.getMonWh());
+                    sheet.getRow(rowNum).createCell(14 ).setCellValue(tdata.getMonState());
+                    sheet.getRow(rowNum).createCell(15 ).setCellValue(tdata.getMonFault());
+                }
+                rowNum++;
+            }
+        }
+        try {
+            // 鍐欏叆鍒拌緭鍑烘祦
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            workbook.write(byteArrayOutputStream);
+            workbook.close();
+
+            // 璁剧疆鍝嶅簲澶�
+            String filename = "璁惧鍘嗗彶鏁版嵁";
+            /*response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+
+                    new String(filename.getBytes("UTF-8"), "ISO8859-1")+
+                    ".xlsx");*/
+            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode (filename, "utf-8") + ".xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+
+            // 鍐欏叆鍝嶅簲娴佸苟鍏抽棴
+            response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+            response.getOutputStream().flush();
+            response.getOutputStream().close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    //瀵煎嚭鏂囦欢A200
+    public void exportExcelA200(Integer devId,  Integer testRecordCount,HttpServletResponse response) {
+        Workbook wb = new XSSFWorkbook();
+        //娴嬭瘯鎶ュ憡灏侀潰
+        exportExcelCoverA200(devId,testRecordCount,wb);
+        Sheet sheet = wb.createSheet("娴嬭瘯鏁版嵁璇︽儏");
+        // 鍒涘缓涓�涓崟鍏冩牸鏍峰紡锛屽苟璁剧疆瀛椾綋澶у皬涓�5
+        CellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 璁剧疆姘村钩灞呬腑
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 璁剧疆鍨傜洿灞呬腑
+
+        Font font = wb.createFont();
+        font.setFontHeightInPoints((short)20);
+        cellStyle.setFont(font);
+
+        String[] titiles=new String[]{"Time(H:M:S)","Group V(V)","Group A(A)","Cap (AH)","Temp H(掳C)","Temp L(掳C)"};
+        List<BatttestdataId> list=subService.getTdataByIdWithListA200(devId,testRecordCount);
+
+        int rowNum=0;
+        // 鍒涘缓鏍囬琛�
+        Row row = sheet.createRow(rowNum);
+        row.setHeightInPoints(20.0f);
+        // 濉厖鏁版嵁
+        for(int i=0;i<titiles.length;i++){
+            row.createCell(i).setCellValue(titiles[i]);
+        }
+        if(list!=null&&list.size()>0){
+            List<Integer> monNums=list.get(0).getMonNums();
+            for (int i=0;i<monNums.size();i++){
+                row.createCell(i+titiles.length).setCellValue("V"+monNums.get(i));
+            }
+        }
+        rowNum++;
+
+        if(list!=null){
+            //鏁版嵁鏍�
+            for (int i = 0; i < list.size(); i++) {
+                Row row1 =  sheet.createRow(rowNum);  //鍒涘缓琛�
+                row1.setHeightInPoints(20.0f);
+                BatttestdataId tdata=list.get(i);
+                sheet.getRow(rowNum).createCell(0 ).setCellValue(ActionUtil.secToTime(tdata.getTestTimelong()));
+                sheet.getRow(rowNum).createCell(1).setCellValue(String.format("%.1f",tdata.getGroupVol()));
+                sheet.getRow(rowNum).createCell(2).setCellValue(String.format("%.1f",tdata.getTestCurr()));
+                sheet.getRow(rowNum).createCell(3).setCellValue(String.format("%.1f",tdata.getTestCap()));
+                sheet.getRow(rowNum).createCell(4).setCellValue(String.format("%.1f",tdata.getMaxTemp()));
+                sheet.getRow(rowNum).createCell(5).setCellValue(String.format("%.1f",tdata.getMinTemp()));
+                if (tdata.getMonVols() != null) {
+                    List<Float> monVols = tdata.getMonVols();
+                    for (int j = 0; j < monVols.size(); j++) {
+                        sheet.getRow(rowNum).createCell(6 + j).setCellValue(String.format("%.3f", monVols.get(j)));
+                    }
+                }
+                rowNum++;
+            }
+        }
+        try {
+            // 鍐欏叆鍒拌緭鍑烘祦
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            wb.write(byteArrayOutputStream);
+            wb.close();
+
+            // 璁剧疆鍝嶅簲澶�
+            String filename = "璁惧鍘嗗彶鏁版嵁";
+            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode (filename, "utf-8") + ".xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+
+            // 鍐欏叆鍝嶅簲娴佸苟鍏抽棴
+            response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+            response.getOutputStream().flush();
+            response.getOutputStream().close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+    //娴嬭瘯鎶ュ憡灏侀潰
+    private void exportExcelCoverA200(Integer devId, Integer testRecordCount, Workbook wb) {
+        Sheet sheet = wb.createSheet("娴嬭瘯鎶ュ憡灏侀潰");
+        // 鍒涘缓涓�涓崟鍏冩牸鏍峰紡锛屽苟璁剧疆瀛椾綋澶у皬涓�5
+        CellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 璁剧疆姘村钩灞呬腑
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 璁剧疆鍨傜洿灞呬腑
+
+        Font font = wb.createFont();
+        font.setFontHeightInPoints((short)20);
+        cellStyle.setFont(font);
+
+        //鑾峰彇鏀剧數inf
+        BatttestdataInf tinf=infService.getTinfExport(devId,testRecordCount);
+        String[] titiles33=new String[]{"PACK/妯$粍鍙�:","娴嬭瘯寮�濮嬫椂闂�:","娴嬭瘯缁撴潫鏃堕棿:","鏁版嵁绫诲瀷:","鍋滄鍘熷洜:","棰勬斁瀹归噺(AH):"
+                ,"鏀剧數鐢垫祦(A):","娴嬭瘯鏃堕暱(h:m:s):","鍗曚覆涓嬮檺(V):","缁勭涓嬮檺(V):","鐢佃姱涓叉暟:","鏈�楂樻俯搴�(掳C):","鏈�浣庢俯搴�(掳C):","閲囬泦棰戠巼(绉�):"};
+        String[] titiles34=new String[]{tinf.getBatteryName(),ActionUtil.sdf.format(tinf.getTestStarttime()),ActionUtil.sdf.format(tinf.getRecordTime()), "鏀剧數鏁版嵁",tinf.getStopTypeReason(),String.format("%.1f",tinf.getTestCap())
+                ,String.format("%.1f",tinf.getTestCurr()),ActionUtil.secToTime(tinf.getTestTimelong()),String.format("%.1f",tinf.getMonVolLow()),String.format("%.1f",tinf.getGroupVolLow()),String.valueOf(tinf.getBatteryNumber())
+                ,String.format("%.1f",tinf.getMaxTemp()),String.format("%.1f",tinf.getMinTemp()),String.valueOf(tinf.getSaveInverter())};
+
+        String[] titiles23=new String[]{"PACK/妯$粍鍙�:","娴嬭瘯寮�濮嬫椂闂�:","娴嬭瘯缁撴潫鏃堕棿:","鏁版嵁绫诲瀷:","鍋滄鍘熷洜:","鍏呯數闄愭祦(A):"
+               ,"娴嬭瘯鏃堕暱(h:m:s):","鍗曚覆涓婇檺(V):","鐢垫祦闃�鍊�(A):","鐢佃姱涓叉暟:","鍏呯數闄愬帇(V)","鏈�楂樻俯搴�(掳C):","鏈�浣庢俯搴�(掳C):","閲囬泦棰戠巼(绉�):"};
+        String[] titiles24=new String[]{tinf.getBatteryName(),ActionUtil.sdf.format(tinf.getTestStarttime()),ActionUtil.sdf.format(tinf.getRecordTime()), "鍏呯數鏁版嵁",tinf.getStopTypeReason(),String.format("%.1f",tinf.getTestCurr())
+                ,ActionUtil.secToTime(tinf.getTestTimelong()),String.format("%.1f",tinf.getMonVolHigh()),String.format("%.1f",tinf.getTestcurrLimit()),String.valueOf(tinf.getBatteryNumber())
+                ,String.format("%.1f",tinf.getCharVoltage()),String.format("%.1f",tinf.getMaxTemp()),String.format("%.1f",tinf.getMinTemp()),String.valueOf(tinf.getSaveInverter())};
+
+
+        int rowNum=5;
+        if(tinf.getTestType()==3){//鏀剧數
+            for (int i=0;i<titiles33.length;i++){
+                Row row =  sheet.createRow(rowNum);  //鍒涘缓琛�
+                row.setHeightInPoints(20.0f);
+                row.createCell(3).setCellValue(titiles33[i]);
+                row.createCell(4).setCellValue(titiles34[i]);
+                rowNum++;
+            }
+        }else{
+            for (int i=0;i<titiles23.length;i++){
+                Row row =  sheet.createRow(rowNum);  //鍒涘缓琛�
+                row.setHeightInPoints(20.0f);
+                row.createCell(3).setCellValue(titiles23[i]);
+                row.createCell(4).setCellValue(titiles24[i]);
+                rowNum++;
+            }
+        }
+    }
+    //ACTM瀵煎嚭
+    public void exportExcelActm(Integer devId, Integer testRecordCount, HttpServletResponse response) {
+        Workbook wb = new XSSFWorkbook();
+        //娴嬭瘯鎶ュ憡灏侀潰
+        exportExcelCoverActm(devId,testRecordCount,wb);
+        Sheet sheet = wb.createSheet("娴嬭瘯鏁版嵁");
+        // 鍒涘缓涓�涓崟鍏冩牸鏍峰紡锛屽苟璁剧疆瀛椾綋澶у皬涓�5
+        CellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 璁剧疆姘村钩灞呬腑
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 璁剧疆鍨傜洿灞呬腑
+
+        Font font = wb.createFont();
+        font.setFontHeightInPoints((short)20);
+        cellStyle.setFont(font);
+
+        String[] titiles=new String[]{"娴嬭瘯鏃堕暱"};
+        List<BatttestdataId> list=subService.getTdataByIdWithListActm(devId,testRecordCount);
+
+        int rowNum=0;
+        // 鍒涘缓鏍囬琛�
+        Row row = sheet.createRow(rowNum);
+        row.setHeightInPoints(20.0f);
+        // 濉厖鏁版嵁
+        for(int i=0;i<titiles.length;i++){
+            row.createCell(i).setCellValue(titiles[i]);
+        }
+        if(list!=null&&list.size()>0){
+            List<Integer> monNums=list.get(0).getMonNums();
+            for (int i=0;i<monNums.size();i++){
+                row.createCell(4*i+titiles.length).setCellValue(monNums.get(i)+"#鐢靛帇");
+                row.createCell(4*i+titiles.length+1).setCellValue(monNums.get(i)+"#鐢垫祦");
+                row.createCell(4*i+titiles.length+2).setCellValue(monNums.get(i)+"#瀹归噺锛圓H锛�");
+                row.createCell(4*i+titiles.length+3).setCellValue(monNums.get(i)+"#鑳介噺锛圵H锛�");
+            }
+        }
+        rowNum++;
+
+        if(list!=null){
+            //鏁版嵁鏍�
+            for (int i = 0; i < list.size(); i++) {
+                Row row1 =  sheet.createRow(rowNum);  //鍒涘缓琛�
+                row1.setHeightInPoints(20.0f);
+                BatttestdataId tdata=list.get(i);
+                sheet.getRow(rowNum).createCell(0 ).setCellValue(ActionUtil.secToTime(tdata.getTestTimelong()));
+                List<Float> monVols = tdata.getMonVols();
+                List<Float> monCurrs = tdata.getMonCurrs();
+                List<Float> monCaps = tdata.getMonCaps();
+                List<Float> monWhs = tdata.getMonWhs();
+                List<Integer> monNums=list.get(i).getMonNums();
+                for (int j = 0; j < monNums.size(); j++) {
+                    sheet.getRow(rowNum).createCell(4*j+1 ).setCellValue(String.format("%.3f", monVols.get(j)));
+                    sheet.getRow(rowNum).createCell(4*j+1+1).setCellValue(String.format("%.3f", monCurrs.get(j)));
+                    sheet.getRow(rowNum).createCell(4*j+1+2).setCellValue(String.format("%.3f", monCaps.get(j)));
+                    sheet.getRow(rowNum).createCell(4*j+1+3).setCellValue(String.format("%.3f", monWhs.get(j)));
+
+
+                }
+                rowNum++;
+            }
+        }
+        try {
+            // 鍐欏叆鍒拌緭鍑烘祦
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            wb.write(byteArrayOutputStream);
+            wb.close();
+
+            // 璁剧疆鍝嶅簲澶�
+            String filename = "璁惧鍘嗗彶鏁版嵁";
+            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode (filename, "utf-8") + ".xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+
+            // 鍐欏叆鍝嶅簲娴佸苟鍏抽棴
+            response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+            response.getOutputStream().flush();
+            response.getOutputStream().close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+    //娴嬭瘯鎶ュ憡灏侀潰
+    private void exportExcelCoverActm(Integer devId, Integer testRecordCount, Workbook wb) {
+        Sheet sheet = wb.createSheet("妯$粍閰嶇疆");
+        // 鍒涘缓涓�涓崟鍏冩牸鏍峰紡锛屽苟璁剧疆瀛椾綋澶у皬涓�5
+        CellStyle cellStyle = wb.createCellStyle();
+        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 璁剧疆姘村钩灞呬腑
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 璁剧疆鍨傜洿灞呬腑
+
+        Font font = wb.createFont();
+        font.setFontHeightInPoints((short)20);
+        cellStyle.setFont(font);
+
+        //鑾峰彇鏀剧數inf
+        BatttestdataInf tinf=infService.getTinfExport(devId,testRecordCount);
+
+        String[] titiles3=new String[]{"鐢垫睜鍖呭簭鍙�:","妯$粍缂栧彿:","宸ヤ綔妯″紡:","鐢垫睜绫诲瀷:","鐢垫睜涓叉暟:","鐢靛帇闃�鍊�(v):"
+                ,"宸ヤ綔鐢垫祦(A):","寮�濮嬫祴璇曟椂闂�:","缁撴潫娴嬭瘯鏃堕棿:","鍋滄鍘熷洜:"};
+        String[] titiles4=new String[]{String.valueOf(tinf.getBattIdx()+1),tinf.getBatteryName(),ActmstopReason.getTestType(tinf.getTestType()),ActmstopReason.getBattType(tinf.getBattType()),String.valueOf(tinf.getBatteryNumber()),String.format("%.1f",tinf.getVolThreshold())
+                ,String.format("%.1f",tinf.getTestCurr()), ActionUtil.sdf.format(tinf.getTestStarttime()),ActionUtil.sdf.format(tinf.getRecordTime()), tinf.getStopTypeReason()};
+
+        int rowNum=5;
+        for (int i=0;i<titiles3.length;i++){
+            Row row =  sheet.createRow(rowNum);  //鍒涘缓琛�
+            row.setHeightInPoints(20.0f);
+            row.createCell(3).setCellValue(titiles3[i]);
+            row.createCell(4).setCellValue(titiles4[i]);
+            rowNum++;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/service/SubTablePageInfoService.java b/src/main/java/com/whyc/service/SubTablePageInfoService.java
new file mode 100644
index 0000000..1298fcb
--- /dev/null
+++ b/src/main/java/com/whyc/service/SubTablePageInfoService.java
@@ -0,0 +1,290 @@
+package com.whyc.service;
+
+import com.whyc.dto.DalmDto;
+import com.whyc.mapper.CallBack;
+import com.whyc.pojo.db_alarm.DevalarmDataYear;
+import com.whyc.pojo.db_batt_testdata.BatttestdataId;
+import com.whyc.util.ThreadLocalUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+@Service
+public class SubTablePageInfoService {
+    @Autowired
+    private MybatisSqlExecuteService sqlExecuteService;
+    //鑾峰彇璁惧鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃繃绋�
+    public List<BatttestdataId> getTdataById(Integer devId, Integer testRecordCount) {
+        String sql="select  * from db_batt_testdata.tb_batttestdata_" +devId
+                +" where need_test=1 and test_record_count="+testRecordCount+" ";
+        sql+="  ORDER BY record_num asc ";
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                List<BatttestdataId> list=new ArrayList<>();
+                while (rs.next()){
+                    BatttestdataId tdata=new BatttestdataId();
+                    tdata.setNum(rs.getInt("num"));
+                    tdata.setDevId(rs.getInt("dev_id"));
+                    tdata.setBattIdx(rs.getInt("batt_idx"));
+                    tdata.setTestRecordCount(rs.getInt("test_record_count"));
+                    tdata.setTestType(rs.getInt("test_type"));
+                    tdata.setRecordNum(rs.getInt("record_num"));
+                    tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
+                    tdata.setRecordTime(rs.getTimestamp("record_time"));
+                    tdata.setTestTimelong(rs.getInt("test_timelong"));
+                    tdata.setGroupVol(rs.getDouble("group_vol"));
+                    tdata.setTestCurr(rs.getDouble("test_curr"));
+                    tdata.setTestCap(rs.getDouble("test_cap"));
+                    tdata.setMonNum(rs.getInt("mon_num"));
+                    tdata.setMonVol(rs.getDouble("mon_vol"));
+                    tdata.setMonTmp(rs.getDouble("mon_tmp"));
+                    tdata.setMonCurr(rs.getDouble("mon_curr"));
+                    tdata.setMonCap(rs.getDouble("mon_cap"));
+                    tdata.setMonWh(rs.getDouble("mon_wh"));
+                    tdata.setMonState(rs.getString("mon_state"));
+                    tdata.setMonFault(rs.getString("mon_fault"));
+                    tdata.setNeedTest(rs.getInt("need_test"));
+                    list.add(tdata);
+                }
+                return list;
+            }
+        });
+        return list;
+    }
+
+    //鑾峰彇璁惧鏌愭璁板綍璇︾粏鐨勫崟浣撴斁鐢佃繃绋�
+    public List<BatttestdataId> getTdataByIdWithListA200(Integer devId, Integer testRecordCount) {
+        String sql="select  * from db_batt_testdata.tb_batttestdata_" +devId
+                +" where need_test=1 and test_record_count="+testRecordCount+" ";
+        sql+="  ORDER BY record_num asc ";
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                List list=new ArrayList<>();
+                List<Float> monVols=null;
+                List<Integer> monNums=null;
+                BatttestdataId tdata=null;
+                int num=0;
+                try {
+                    while (rs.next()){
+                        int monNum=rs.getInt("mon_num");
+                        float monvol=rs.getFloat("mon_vol");
+                        int recordNum=rs.getInt("record_num");
+                        if(num!=recordNum){
+                            if(num!=0){
+                                tdata.setMonVols(monVols);
+                                tdata.setMonNums(monNums);
+                                list.add(tdata);
+                            }
+                            tdata=new BatttestdataId();
+                            monVols=new ArrayList<>();
+                            monNums=new ArrayList<>();
+                            tdata.setDevId(rs.getInt("dev_id"));
+                            tdata.setBattIdx(rs.getInt("batt_idx"));
+                            tdata.setTestRecordCount(rs.getInt("test_record_count"));
+                            tdata.setTestType(rs.getInt("test_type"));
+                            tdata.setRecordNum(recordNum);
+                            tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
+                            tdata.setRecordTime(rs.getTimestamp("record_time"));
+                            tdata.setTestTimelong(rs.getInt("test_timelong"));
+                            tdata.setGroupVol(rs.getDouble("group_vol"));
+                            tdata.setTestCurr(rs.getDouble("test_curr"));
+                            tdata.setTestCap(rs.getDouble("test_cap"));
+                            tdata.setNeedTest(rs.getInt("need_test"));
+                            tdata.setMaxTemp(rs.getFloat("max_temp"));
+                            tdata.setMinTemp(rs.getFloat("min_temp"));
+                            num=recordNum;
+                        }
+                        monVols.add(monvol);
+                        monNums.add(monNum);
+                    }
+                    tdata.setMonVols(monVols);
+                    tdata.setMonNums(monNums);
+                    list.add(tdata);
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+                return list;
+            }
+        });
+        return list;
+    }
+    //鏌ヨDevAlm鍘嗗彶鍛婅鏁伴噺
+    public int getCountForDevAlm(DalmDto dto) {
+        String sql="select  count(distinct num) as number from db_alarm." +dto.getTableName()
+                +" where 1=1 ";
+
+        if(dto.getStartTime()!=null){
+            sql+=" and alm_starttime  >='"+ ThreadLocalUtil.format(dto.getStartTime(),1)+"' ";
+        }
+        if(dto.getEndTime()!=null){
+            sql+=" and alm_endtime  <='"+ThreadLocalUtil.format(dto.getEndTime(),1)+"' ";
+        }
+        if(dto.getDevType()!=null){
+           sql+=" and  FLOOR(dev_id/100000000)="+dto.getDevType();
+        }
+        if(dto.getDevId()!=null){
+            sql+=" and  dev_id="+dto.getDevId();
+        }
+        if(dto.getAlmId()!=null){
+            sql+=" and alm_id="+dto.getAlmId();
+        }
+        sql+=" and dev_id in (" +
+                "            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr" +
+                "            where tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id" +
+                "           and uid="+dto.getUid()+
+                ")";
+        sql+="  order by alm_starttime desc ";
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                LinkedList<Object> temp = new LinkedList<>();
+                try {
+                    while (rs.next())
+                        temp.add(rs.getInt("number"));
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+                return temp;
+            }
+        });
+        int num =0;
+        if(list!=null){
+            num= (int) list.get(0);
+        }
+        return num;
+    }
+    //鏌ヨdevalm鍘嗗彶鍛婅
+    public List getListDevAlm(DalmDto dto){
+        String sql="select  * from db_alarm." +dto.getTableName()
+                +" where 1=1 ";
+
+        if(dto.getStartTime()!=null){
+            sql+=" and alm_starttime  >='"+ ThreadLocalUtil.format(dto.getStartTime(),1)+"' ";
+        }
+        if(dto.getEndTime()!=null){
+            sql+=" and alm_endtime  <='"+ThreadLocalUtil.format(dto.getEndTime(),1)+"' ";
+        }
+        if(dto.getDevType()!=null){
+            sql+=" and  FLOOR(dev_id/100000000)="+dto.getDevType();
+        }
+        if(dto.getDevId()!=null){
+            sql+=" and  dev_id="+dto.getDevId();
+        }
+        if(dto.getAlmId()!=null){
+            sql+=" and alm_id="+dto.getAlmId();
+        }
+        sql+=" and dev_id in (" +
+                "            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr" +
+                "           where tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id" +
+                "           and uid="+dto.getUid()+
+                ")";
+        sql+="  ORDER BY alm_starttime desc  limit "+dto.getLimitStart()+","+dto.getLimitEnd()+" ";
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                List<DevalarmDataYear> list=new ArrayList<>();
+                while (rs.next()){
+                    DevalarmDataYear dataYear=new DevalarmDataYear();
+                    dataYear.setNum(rs.getInt("num"));
+                    dataYear.setDevId(rs.getInt("dev_id"));
+                    dataYear.setAlmId(rs.getInt("alm_id"));
+                    dataYear.setAlmSignalId(rs.getInt("alm_signal_id"));
+                    dataYear.setAlmStarttime(rs.getTimestamp("alm_starttime"));
+                    dataYear.setAlmValue(rs.getFloat("alm_value"));
+                    dataYear.setAlmIsConfirmed(rs.getInt("alm_is_confirmed"));
+                    dataYear.setConfirmedUid(rs.getInt("confirmed_uid"));
+                    dataYear.setConfirmedTime(rs.getTimestamp("confirmed_time"));
+                    dataYear.setAlmEndtime(rs.getTimestamp("alm_endtime"));
+                    dataYear.setAlmClearedType(rs.getInt("alm_cleared_type"));
+                    list.add(dataYear);
+                }
+                return list;
+            }
+        });
+        return list;
+    }
+
+
+    public List<BatttestdataId> getTdataByIdWithListActm(Integer devId, Integer testRecordCount) {
+        String sql="select  * from db_batt_testdata.tb_batttestdata_" +devId
+                +" where need_test=1 and test_record_count="+testRecordCount+" ";
+        sql+="  ORDER BY record_num asc ";
+        List list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
+            @Override
+            public List getResults(ResultSet rs) throws SQLException {
+                List list=new ArrayList<>();
+                List<Float> monVols=null;
+                List<Float> monCurrs=null;
+                List<Float> monCaps=null;
+                List<Float> monWhs=null;
+                List<Integer> monNums=null;
+                BatttestdataId tdata=null;
+                int num=0;
+                try {
+                    while (rs.next()){
+                        int monNum=rs.getInt("mon_num");
+                        float monvol=rs.getFloat("mon_vol");
+                        float monCurr=rs.getFloat("mon_curr");
+                        float monCap=rs.getFloat("mon_cap");
+                        float monWh=rs.getFloat("mon_wh");
+                        int recordNum=rs.getInt("record_num");
+
+                        if(num!=recordNum){
+                            if(num!=0){
+                                tdata.setMonVols(monVols);
+                                tdata.setMonNums(monNums);
+                                tdata.setMonCurrs(monCurrs);
+                                tdata.setMonCaps(monCaps);
+                                tdata.setMonWhs(monWhs);
+                                list.add(tdata);
+                            }
+                            tdata=new BatttestdataId();
+                            monVols=new ArrayList<>();
+                            monNums=new ArrayList<>();
+                            monCurrs=new ArrayList<>();
+                            monCaps=new ArrayList<>();
+                            monWhs=new ArrayList<>();
+                            tdata.setDevId(rs.getInt("dev_id"));
+                            tdata.setBattIdx(rs.getInt("batt_idx"));
+                            tdata.setTestRecordCount(rs.getInt("test_record_count"));
+                            tdata.setTestType(rs.getInt("test_type"));
+                            tdata.setRecordNum(recordNum);
+                            tdata.setTestStarttime(rs.getTimestamp("test_starttime"));
+                            tdata.setRecordTime(rs.getTimestamp("record_time"));
+                            tdata.setTestTimelong(rs.getInt("test_timelong"));
+                            tdata.setGroupVol(rs.getDouble("group_vol"));
+                            tdata.setTestCurr(rs.getDouble("test_curr"));
+                            tdata.setTestCap(rs.getDouble("test_cap"));
+                            tdata.setNeedTest(rs.getInt("need_test"));
+                            tdata.setMonTmp(rs.getDouble("mon_tmp"));
+                            num=recordNum;
+                        }
+                        monVols.add(monvol);
+                        monNums.add(monNum);
+                        monCurrs.add(monCurr);
+                        monCaps.add(monCap);
+                        monWhs.add(monWh);
+                    }
+
+                    tdata.setMonVols(monVols);
+                    tdata.setMonNums(monNums);
+                    tdata.setMonCurrs(monCurrs);
+                    tdata.setMonCaps(monCaps);
+                    tdata.setMonWhs(monWhs);
+                    list.add(tdata);
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+                return list;
+            }
+        });
+        return list;
+    }
+}
diff --git a/src/main/java/com/whyc/service/UserInfService.java b/src/main/java/com/whyc/service/UserInfService.java
index dd026bc..53a2533 100644
--- a/src/main/java/com/whyc/service/UserInfService.java
+++ b/src/main/java/com/whyc/service/UserInfService.java
@@ -256,4 +256,13 @@
         }
         return model;
     }
+
+    //鏍规嵁uId鑾峰彇璁惧淇℃伅
+    public UserInf getUinfByUId(int uId){
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("uid",uId);
+        wrapper.last("limit 1");
+        UserInf uinf=mapper.selectOne(wrapper);
+        return uinf;
+    }
 }
diff --git a/src/main/java/com/whyc/service/WorkstateChangeeventService.java b/src/main/java/com/whyc/service/WorkstateChangeeventService.java
new file mode 100644
index 0000000..9eddda6
--- /dev/null
+++ b/src/main/java/com/whyc/service/WorkstateChangeeventService.java
@@ -0,0 +1,46 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.whyc.dto.Response;
+import com.whyc.mapper.WorkstateCfgMapper;
+import com.whyc.mapper.WorkstateChangeeventMapper;
+import com.whyc.pojo.db_lithium_ram_db.WorkstateCfg;
+import com.whyc.pojo.db_lithium_ram_db.WorkstateChangeevent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class WorkstateChangeeventService {
+    @Autowired(required = false)
+    private WorkstateChangeeventMapper mapper;
+
+    @Autowired(required = false)
+    private WorkstateCfgMapper cfgMapper;
+
+
+    //璇诲彇璁惧宸ヤ綔鐘舵�佺殑鍒囨崲杩囩▼
+    public Response getWorkEvent(int devId) {
+        QueryWrapper wrapper=new QueryWrapper();
+        wrapper.eq("dev_id",devId);
+        wrapper.orderByDesc("record_time");
+        wrapper.last("limit 100");
+        int devType=devId/100000000;
+        List<WorkstateChangeevent> list=mapper.selectList(wrapper);
+        for (WorkstateChangeevent event:list) {
+            QueryWrapper wrapper1=new QueryWrapper();
+            wrapper1.eq("dev_type",devType);
+            wrapper1.eq("last_work_state",event.getLastWorkState());
+            wrapper1.eq("now_work_state",event.getNowWorkState());
+            wrapper1.last("limit 1");
+            WorkstateCfg cfg=cfgMapper.selectOne(wrapper1);
+            if(cfg==null){
+                event.setEventStr("---");
+            }else{
+                event.setEventStr(cfg.getEventStr());
+            }
+        }
+        return new Response().setII(1,list!=null,list,"璇诲彇璁惧宸ヤ綔鐘舵�佺殑鍒囨崲杩囩▼");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/util/TestparamHttpUtil.java b/src/main/java/com/whyc/util/TestparamHttpUtil.java
new file mode 100644
index 0000000..3a14be9
--- /dev/null
+++ b/src/main/java/com/whyc/util/TestparamHttpUtil.java
@@ -0,0 +1,77 @@
+package com.whyc.util;
+
+import com.whyc.dto.ResultA200Dto;
+import com.whyc.dto.ResultActmDto;
+import org.springframework.http.*;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+public class TestparamHttpUtil {
+
+
+
+    //post璇锋眰浼犲叆form-data 鏍煎紡
+    public static Object postforform_dataA200( RestTemplate restTemplate,String url,  MultiValueMap<String, Object> paramMap){
+        HttpHeaders headers = new HttpHeaders();
+        HttpMethod method = HttpMethod.POST;
+        // 璁剧疆浠ヨ〃鍗曠殑鏂瑰紡鎻愪氦
+        headers.add("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
+        HttpEntity< MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(paramMap, headers);
+        String results= null;
+        try {
+            ResponseEntity<String> response = restTemplate.exchange(url, method, requestEntity,String.class );
+            results = response.getBody();
+        } catch (RestClientException  e) {
+            results=" {\n" +
+                    "      \"code\": \"205\",\n" +
+                    "      \"msg\": \"鎺ュ彛璋冪敤鍑洪敊\",\n" +
+                    "      \"data\": null,\n" +
+                    "      \"count\": 0\n" +
+                    "    }";
+        }
+        if(results==null){
+            results=" {\n" +
+                    "      \"code\": \"0\",\n" +
+                    "      \"msg\": \"鎺ュ彛璋冪敤鏃犺繑鍥瀄",\n" +
+                    "      \"data\": null,\n" +
+                    "      \"count\": 0\n" +
+                    "    }";
+        }
+        Object dto= ActionUtil.getGson().fromJson(results, ResultA200Dto.class);
+        return dto;
+    }
+
+    //post璇锋眰浼犲叆form-data 鏍煎紡
+    public static Object postforform_dataActm( RestTemplate restTemplate,String url,  MultiValueMap<String, Object> paramMap){
+        HttpHeaders headers = new HttpHeaders();
+        HttpMethod method = HttpMethod.POST;
+        // 璁剧疆浠ヨ〃鍗曠殑鏂瑰紡鎻愪氦
+        headers.add("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
+        HttpEntity< MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(paramMap, headers);
+        String results= null;
+        try {
+            ResponseEntity<String> response = restTemplate.exchange(url, method, requestEntity,String.class );
+            results = response.getBody();
+        } catch (RestClientException e) {
+            results=" {\n" +
+                    "      \"code\": \"205\",\n" +
+                    "      \"msg\": \"鎺ュ彛璋冪敤鍑洪敊\",\n" +
+                    "      \"data\": null,\n" +
+                    "      \"count\": 0\n" +
+                    "    }";
+        }
+        if(results==null){
+            results=" {\n" +
+                    "      \"code\": \"0\",\n" +
+                    "      \"msg\": \"鎺ュ彛璋冪敤鏃犺繑鍥瀄",\n" +
+                    "      \"data\": null,\n" +
+                    "      \"count\": 0\n" +
+                    "    }";
+        }
+        Object dto= ActionUtil.getGson().fromJson(results, ResultActmDto.class);
+        return dto;
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/webSocket/DevAlmPopUp.java b/src/main/java/com/whyc/webSocket/DevAlmPopUp.java
new file mode 100644
index 0000000..c8ee096
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevAlmPopUp.java
@@ -0,0 +1,74 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.DevalarmDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+
+/**
+ * 鍛婅寮圭獥
+ */
+@Component
+@ServerEndpoint(value = "/almPop",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevAlmPopUp{
+
+    private Session session;
+
+    private Thread thread;
+    private static DevalarmDataService almService;
+
+    private HttpSession httpSession;
+
+    @Autowired
+    public void setDevalarmDataService(DevalarmDataService almService) {
+        DevAlmPopUp.almService = almService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config){
+        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+        UserInf user = (UserInf) this.httpSession.getAttribute("user");
+        final int userId = user.getUid();
+        //final int userId = 101;
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    while (!currentThread().isInterrupted()) {
+                        Response res = almService.getDAlmPopUp(userId);
+                        session.getBasicRemote().sendObject(res);
+                        sleep(4000);
+                    }
+                } catch (Exception e) {
+                    this.interrupt();
+                }
+            }
+        };
+        thread.start();
+        this.thread = thread;
+    }
+    @OnClose
+    public void onClose(CloseReason closeReason) throws IOException {
+        System.err.println("closeReason = " + closeReason);
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+    @OnError
+    public void onError(Throwable error) throws IOException {
+        error.printStackTrace();
+        thread.isInterrupted();
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+}
diff --git a/src/main/java/com/whyc/webSocket/DevInfSocket.java b/src/main/java/com/whyc/webSocket/DevInfSocket.java
new file mode 100644
index 0000000..0b37f68
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevInfSocket.java
@@ -0,0 +1,109 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.DevInfDto;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.DevInfService;
+import com.whyc.util.ActionUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 璁惧瀹炴椂杩炴帴淇℃伅
+ */
+@Component
+@ServerEndpoint(value = "/dinfSocket",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevInfSocket {
+    private Session session;
+
+    private Thread thread;
+
+    private static DevInfService dinfService;
+
+    private HttpSession httpSession;
+
+    private volatile boolean runFlag = true;
+
+    private volatile Map<String, Thread> threadMap = new HashMap<>();
+
+    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
+
+    @Autowired
+    public void setDevInfService(DevInfService dinfService) {
+        DevInfSocket.dinfService = dinfService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config) {
+        this.session = session;
+        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+    }
+    @OnMessage
+    public void onMessage(Session session, String message) {
+        DevInfDto devInfDto = ActionUtil.getGson("yyyy-MM-dd").fromJson(message, DevInfDto.class);
+        UserInf user = (UserInf) this.httpSession.getAttribute("user");
+        final int userId = user.getUid();
+        //final int userId = 101;
+        thread = new Thread("Thread_DinfSocket") {
+            @Override
+            public void run() {
+                while (runFlag && !isInterrupted()) {
+                    Thread thread = currentThread();
+                    threadFlagMap.put(thread.getId(), true);
+                    try {
+                        Response res=dinfService.getAllInf(userId, devInfDto);
+                        if (session.isOpen()) {
+                            //鎺ㄩ�佷俊鎭�
+                            synchronized (session) {
+                                session.getBasicRemote().sendObject(res);
+                            }
+                            threadFlagMap.put(thread.getId(), false);
+                        }
+                        sleep(4000);
+                    } catch (Exception e) {
+                        interrupt();
+                    }
+                }
+            }
+        };
+        thread.start();
+        threadFlagMap.put(thread.getId(),true);
+        //鍋滄鑰佺殑socket绾跨▼
+        Thread threadBefore = threadMap.get(session.getId());
+        if(threadBefore !=null && threadBefore.isAlive()){
+            while (threadFlagMap.get(threadBefore.getId())){
+            }
+            threadBefore.interrupt();
+        }
+        //灏嗙嚎绋嬪瓨鍌�,渚夸簬璋冪敤瀹氫綅
+        threadMap.put(session.getId(), this.thread);
+    }
+
+
+    @OnClose
+    public void onClose(CloseReason closeReason){
+        System.err.println("closeReason = " + closeReason);
+        runFlag = false;
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+
+    @OnError
+    public void onError(Throwable error) {
+        error.printStackTrace();
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/webSocket/DevLineSocket.java b/src/main/java/com/whyc/webSocket/DevLineSocket.java
new file mode 100644
index 0000000..446ae87
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevLineSocket.java
@@ -0,0 +1,74 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.DevInfService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+
+/**
+ * 宸︿晶鍒楄〃
+ */
+@Component
+@ServerEndpoint(value = "/lineSocket",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevLineSocket{
+
+    private Session session;
+
+    private Thread thread;
+    private static DevInfService dinfService;
+
+    private HttpSession httpSession;
+
+    @Autowired
+    public void setDevInfService(DevInfService dinfService) {
+        DevLineSocket.dinfService = dinfService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config){
+        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+        UserInf user = (UserInf) this.httpSession.getAttribute("user");
+        final int userId = user.getUid();
+        //final int userId = 101;
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    while (!currentThread().isInterrupted()) {
+                        Response res = dinfService.getDevType(userId);
+                        session.getBasicRemote().sendObject(res);
+                        sleep(4000);
+                    }
+                } catch (Exception e) {
+                    this.interrupt();
+                }
+            }
+        };
+        thread.start();
+        this.thread = thread;
+    }
+    @OnClose
+    public void onClose(CloseReason closeReason) throws IOException {
+        System.err.println("closeReason = " + closeReason);
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+    @OnError
+    public void onError(Throwable error) throws IOException {
+        error.printStackTrace();
+        thread.isInterrupted();
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+}
diff --git a/src/main/java/com/whyc/webSocket/DevRtstateSocket.java b/src/main/java/com/whyc/webSocket/DevRtstateSocket.java
new file mode 100644
index 0000000..bb0e443
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevRtstateSocket.java
@@ -0,0 +1,155 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.Response;
+import com.whyc.dto.RtstateDto;
+import com.whyc.service.A200RealstateService;
+import com.whyc.service.ActmRealstateService;
+import com.whyc.service.BattRtdataService;
+import com.whyc.service.WorkstateChangeeventService;
+import com.whyc.util.ActionUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 璁惧瀹炴椂杩炴帴淇℃伅
+ */
+@Component
+@ServerEndpoint(value = "/rtstateSocket",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevRtstateSocket {
+    private Session session;
+
+    private Thread thread;
+
+    private static BattRtdataService rtdataService;
+
+    private static A200RealstateService a200Service;
+
+    private static ActmRealstateService actmService;
+
+    private static WorkstateChangeeventService eventService;
+
+
+    private volatile boolean runFlag = true;
+
+    private volatile Map<String, Thread> threadMap = new HashMap<>();
+
+    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
+
+    @Autowired
+    public void setBattRtdataService(BattRtdataService rtdataService) {
+        DevRtstateSocket.rtdataService = rtdataService;
+    }
+
+    @Autowired
+    public void setA200RealstateService(A200RealstateService a200Service) {
+        DevRtstateSocket.a200Service = a200Service;
+    }
+
+    @Autowired
+    public void setActmRealstateService(ActmRealstateService actmService) {
+        DevRtstateSocket.actmService = actmService;
+    }
+
+    @Autowired
+    public void setWorkstateChangeeventService(WorkstateChangeeventService eventService) {
+        DevRtstateSocket.eventService = eventService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session) {
+        this.session = session;
+    }
+    @OnMessage
+    public void onMessage(Session session, String message) {
+        RtstateDto dto= ActionUtil.getGson().fromJson(message,RtstateDto.class);
+        thread = new Thread("Thread_RtstateSocket") {
+            @Override
+            public void run() {
+                while (runFlag && !isInterrupted()) {
+                    Thread thread = currentThread();
+                    threadFlagMap.put(thread.getId(), true);
+                    Response res = new Response();
+                    try {
+                        switch (dto.getDevType()){
+                            case 1:res=getA200State(dto.getDevId());break;
+                            case 2:res=getActmState(dto.getDevId());break;
+                        }
+                        if (session.isOpen()) {
+                            //鎺ㄩ�佷俊鎭�
+                            synchronized (session) {
+                                session.getBasicRemote().sendObject(res);
+                            }
+                            threadFlagMap.put(thread.getId(), false);
+                        }
+                        sleep(4000);
+                    } catch (Exception e) {
+                        interrupt();
+                    }
+                }
+            }
+        };
+        thread.start();
+        threadFlagMap.put(thread.getId(),true);
+        //鍋滄鑰佺殑socket绾跨▼
+        Thread threadBefore = threadMap.get(session.getId());
+        if(threadBefore !=null && threadBefore.isAlive()){
+            while (threadFlagMap.get(threadBefore.getId())){
+            }
+            threadBefore.interrupt();
+        }
+        //灏嗙嚎绋嬪瓨鍌�,渚夸簬璋冪敤瀹氫綅
+        threadMap.put(session.getId(), this.thread);
+    }
+    //鍧囪 浠狝ctm瀹炴椂鏁版嵁
+    private Response getActmState(int devId) {
+        Map<String, Response> map = new HashMap<>();
+        Response resActmState=actmService.getActmState(devId);
+        Response rtdataState0=rtdataService.getActmRtdataState(devId,0);
+        Response rtdataState1=rtdataService.getActmRtdataState(devId,1);
+        Response event=eventService.getWorkEvent(devId);
+        map.put("resActmState",resActmState);
+        map.put("rtdataState0",rtdataState0);
+        map.put("rtdataState1",rtdataState1);
+        map.put("event",event);
+        return new Response().setII(1,true,map,"鍧囪 浠狝ctm瀹炴椂鏁版嵁");
+    }
+
+    //涓�浣撴満A200瀹炴椂鏁版嵁
+    private Response getA200State(int devId) {
+        Map<String, Response> map = new HashMap<>();
+        Response resA200State=a200Service.getA200State(devId);
+        Response rtdataState=rtdataService.getA200RtdataState(devId);
+        Response event=eventService.getWorkEvent(devId);
+        map.put("resA200State",resA200State);
+        map.put("rtdataState",rtdataState);
+        map.put("event",event);
+        return new Response().setII(1,true,map,"涓�浣撴満A200瀹炴椂鏁版嵁");
+    }
+
+
+    @OnClose
+    public void onClose(CloseReason closeReason){
+        System.err.println("closeReason = " + closeReason);
+        runFlag = false;
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+
+    @OnError
+    public void onError(Throwable error) {
+        error.printStackTrace();
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/whyc/webSocket/DevStaticSocket.java b/src/main/java/com/whyc/webSocket/DevStaticSocket.java
new file mode 100644
index 0000000..6ffc412
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevStaticSocket.java
@@ -0,0 +1,122 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.Response;
+import com.whyc.factory.ThreadPoolExecutorFactory;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.BatttestdataInfService;
+import com.whyc.service.DevInfService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 宸︿晶鍒楄〃
+ */
+@Component
+@ServerEndpoint(value = "/staticSocket",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevStaticSocket{
+
+    private Session session;
+
+    private Thread thread;
+
+    private static DevInfService dinfService;
+
+    private static BatttestdataInfService tinfService;
+
+
+    private HttpSession httpSession;
+
+    @Autowired
+    public void setDevInfService(DevInfService dinfService) {
+        DevStaticSocket.dinfService = dinfService;
+    }
+
+    @Autowired
+    public void setBatttestdataInfService(BatttestdataInfService tinfService) {
+        DevStaticSocket.tinfService = tinfService;
+    }
+
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config){
+        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+        UserInf user = (UserInf) this.httpSession.getAttribute("user");
+        final int userId = user.getUid();
+        //final int userId = 101;
+        Thread thread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    while (!currentThread().isInterrupted()) {
+                        Response res = getDevStatic(userId);
+                        session.getBasicRemote().sendObject(res);
+                        sleep(4000);
+                    }
+                } catch (Exception e) {
+                    this.interrupt();
+                }
+            }
+        };
+        thread.start();
+        this.thread = thread;
+    }
+    //鑾峰彇缁熻淇℃伅
+    private Response getDevStatic(int userId) {
+        Map<String,Object> map=new HashMap<>();
+        try {
+            ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor();
+            CountDownLatch latch = new CountDownLatch(3);
+            //鍏呮斁鐢典竴浣撴満娴嬭瘯缁熻/閿傜數鍧囪 浠祴璇曠粺璁�
+            poolExecutor.execute(() -> {
+                Map<String,Object> devTinfMap=tinfService.getDevTinfByYearMonth(userId);
+                map.put("devTinf",devTinfMap);
+                latch.countDown();
+            });
+            //璁惧鍒嗙被鎬绘暟缁熻/璁惧鐘舵�佺粺璁�/鍦板浘淇℃伅
+            poolExecutor.execute(() -> {
+                Map<String,Object> devSaticMap=dinfService.getDevStaticByType(userId);
+                map.put("devSatic",devSaticMap);
+                latch.countDown();
+            });
+            //杩戜竴鍛ㄧ數姹犳祴璇曡秼鍔跨粺璁�(浠庡綋鍓嶆椂闂村紑濮�)
+            poolExecutor.execute(() -> {
+                Map<String,Object> devTestByWeekMap=tinfService.getDevTinfByWeek(userId);
+                map.put("devTestByWeek",devTestByWeekMap);
+                latch.countDown();
+            });
+            latch.await(10, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return new Response().setII(1,true,map,"");
+    }
+
+    @OnClose
+    public void onClose(CloseReason closeReason) throws IOException {
+        System.err.println("closeReason = " + closeReason);
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+    @OnError
+    public void onError(Throwable error) throws IOException {
+        error.printStackTrace();
+        thread.isInterrupted();
+        if(session.isOpen()){
+            session.close();
+        }
+    }
+
+}
diff --git a/src/main/java/com/whyc/webSocket/DevalarmSocket.java b/src/main/java/com/whyc/webSocket/DevalarmSocket.java
new file mode 100644
index 0000000..1fe6238
--- /dev/null
+++ b/src/main/java/com/whyc/webSocket/DevalarmSocket.java
@@ -0,0 +1,109 @@
+package com.whyc.webSocket;
+
+import com.whyc.config.WebSocketConfig;
+import com.whyc.dto.DalmDto;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.UserInf;
+import com.whyc.service.DevalarmDataService;
+import com.whyc.util.ActionUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpSession;
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 璁惧瀹炴椂杩炴帴淇℃伅
+ */
+@Component
+@ServerEndpoint(value = "/dalmSocket",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class)
+public class DevalarmSocket {
+    private Session session;
+
+    private Thread thread;
+
+    private static DevalarmDataService dalmService;
+
+    private HttpSession httpSession;
+
+    private volatile boolean runFlag = true;
+
+    private volatile Map<String, Thread> threadMap = new HashMap<>();
+
+    private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>();
+
+    @Autowired
+    public void setDevalarmDataService(DevalarmDataService dalmService) {
+        DevalarmSocket.dalmService = dalmService;
+    }
+
+    @OnOpen
+    public void onOpen(Session session, EndpointConfig config) {
+        this.session = session;
+        this.httpSession = (HttpSession) config.getUserProperties().get("httpSession");
+    }
+    @OnMessage
+    public void onMessage(Session session, String message) {
+        DalmDto dto = ActionUtil.getGson("yyyy-MM-dd HH:mm:ss").fromJson(message, DalmDto.class);
+        UserInf user = (UserInf) this.httpSession.getAttribute("user");
+        final int userId = user.getUid();
+        //final int userId = 101;
+        thread = new Thread("Thread_DevalarmSocket") {
+            @Override
+            public void run() {
+                while (runFlag && !isInterrupted()) {
+                    Thread thread = currentThread();
+                    threadFlagMap.put(thread.getId(), true);
+                    try {
+                        Response res=dalmService.getDAlmInf(userId, dto);
+                        if (session.isOpen()) {
+                            //鎺ㄩ�佷俊鎭�
+                            synchronized (session) {
+                                session.getBasicRemote().sendObject(res);
+                            }
+                            threadFlagMap.put(thread.getId(), false);
+                        }
+                        sleep(4000);
+                    } catch (Exception e) {
+                        interrupt();
+                    }
+                }
+            }
+        };
+        thread.start();
+        threadFlagMap.put(thread.getId(),true);
+        //鍋滄鑰佺殑socket绾跨▼
+        Thread threadBefore = threadMap.get(session.getId());
+        if(threadBefore !=null && threadBefore.isAlive()){
+            while (threadFlagMap.get(threadBefore.getId())){
+            }
+            threadBefore.interrupt();
+        }
+        //灏嗙嚎绋嬪瓨鍌�,渚夸簬璋冪敤瀹氫綅
+        threadMap.put(session.getId(), this.thread);
+    }
+
+
+    @OnClose
+    public void onClose(CloseReason closeReason){
+        System.err.println("closeReason = " + closeReason);
+        runFlag = false;
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+
+    @OnError
+    public void onError(Throwable error) {
+        error.printStackTrace();
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        threadMap.remove(session.getId());
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/mapper/BaojigroupMapper.xml b/src/main/resources/mapper/BaojigroupMapper.xml
new file mode 100644
index 0000000..5051c17
--- /dev/null
+++ b/src/main/resources/mapper/BaojigroupMapper.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.BaojigroupMapper">
+
+    <select id="getMaxBaojiGroupId" resultType="java.lang.Integer">
+        select max(baoji_group_id) from db_user.tb_baojigroup
+        limit 1
+    </select>
+
+    <resultMap id="baojiList" type="baojigroup">
+        <id property="num" column="num"></id>
+        <result property="baojiGroupId" column="baoji_group_id"></result>
+        <result property="baojiGroupName" column="baoji_group_name"></result>
+        <collection property="usrList" javaType="java.util.ArrayList" ofType="com.whyc.pojo.db_user.UserInf" column="{baojiGroupId=baoji_group_id}"
+                    select="selectUsrList">
+        </collection>
+        <collection property="devList" javaType="java.util.ArrayList" ofType="com.whyc.pojo.db_lithium_ram_db.DevInf" column="{baojiGroupId=baoji_group_id}"
+                    select="selectDevList">
+        </collection>
+    </resultMap>
+
+    <select id="selectUsrList" resultType="userInf">
+        select uid,uname,udownload_role  from db_user.tb_user_inf
+        <where>
+            uid in (
+            SELECT distinct uid from db_user.tb_battgroup_usr
+            <where>
+                baoji_group_id=#{baojiGroupId}
+            </where>
+            )
+        </where>
+        order by uid asc
+    </select>
+
+    <select id="selectDevList" resultType="devInf">
+        select * from db_lithium_ram_db.tb_dev_inf
+        <where>
+            dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup
+            <where>
+                baoji_group_id=#{baojiGroupId}
+            </where>
+            )
+        </where>
+    </select>
+
+    <select id="getBaojiInfo" resultMap="baojiList">
+        select * from db_user.tb_baojigroup order by baoji_group_id asc
+    </select>
+    <select id="getUsrBaoji" resultType="com.whyc.pojo.db_user.Baojigroup">
+        select *  from db_user.tb_baojigroup
+        <where>
+            baoji_group_id in (
+            SELECT distinct baoji_group_id from db_user.tb_battgroup_usr
+            <where>
+                uid=#{uid}
+            </where>
+            )
+        </where>
+        order by baoji_group_id asc
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/BattgroupBaojigroupMapper.xml b/src/main/resources/mapper/BattgroupBaojigroupMapper.xml
new file mode 100644
index 0000000..6c59685
--- /dev/null
+++ b/src/main/resources/mapper/BattgroupBaojigroupMapper.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.BattgroupBaojigroupMapper">
+    <delete id="delDevInBaoji">
+        <foreach collection="list" item="item" separator=";" >
+            delete from db_user.tb_battgroup_baojigroup where baoji_group_id = #{item.baojiGroupId} and dev_id = #{item.devId}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/BattgroupUsrMapper.xml b/src/main/resources/mapper/BattgroupUsrMapper.xml
new file mode 100644
index 0000000..1d7ae26
--- /dev/null
+++ b/src/main/resources/mapper/BattgroupUsrMapper.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.BattgroupUsrMapper">
+
+    <delete id="delUsrInBaoji">
+        <foreach collection="list" item="item" separator=";" >
+            delete from db_user.tb_battgroup_usr where baoji_group_id = #{item.baojiGroupId} and uid = #{item.uid}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/BatttestdataIdMapper.xml b/src/main/resources/mapper/BatttestdataIdMapper.xml
new file mode 100644
index 0000000..f958f3a
--- /dev/null
+++ b/src/main/resources/mapper/BatttestdataIdMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.BatttestdataIdMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/BatttestdataInfMapper.xml b/src/main/resources/mapper/BatttestdataInfMapper.xml
new file mode 100644
index 0000000..e25365c
--- /dev/null
+++ b/src/main/resources/mapper/BatttestdataInfMapper.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.BatttestdataInfMapper">
+    <resultMap id="staticTinf" type="batttestdataInf">
+        <id property="num" column="num"></id>
+        <result property="devId" column="dev_id"></result>
+        <result property="testType" column="test_type"></result>
+        <result property="devType" column="dev_type"></result>
+    </resultMap>
+    <select id="getDevTinf" resultMap="staticTinf">
+        select num,dev_id,test_type,floor(dev_id/100000000) as dev_type from db_batt_testdata.tb_batttestdata_inf
+        <where>
+            dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <select id="getDevTinfByYear" resultMap="staticTinf">
+        select num,dev_id,test_type,floor(dev_id/100000000) as dev_type from db_batt_testdata.tb_batttestdata_inf
+        <where>
+            YEAR(test_starttime)=YEAR(NOW())
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <select id="getDevTinfByMonth" resultMap="staticTinf">
+        select num,dev_id,test_type,floor(dev_id/100000000) as dev_type from db_batt_testdata.tb_batttestdata_inf
+        <where>
+            DATE_FORMAT(test_starttime,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m')
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <resultMap id="staticTinfWeek" type="batttestdataInf">
+        <id property="num" column="num"></id>
+        <result property="devId" column="dev_id"></result>
+        <result property="testType" column="test_type"></result>
+        <result property="devType" column="dev_type"></result>
+        <result property="weekDay" column="week_day"></result>
+    </resultMap>
+    <select id="getDevTinfByWeek"  resultMap="staticTinfWeek">
+        select num,dev_id,test_type,floor(dev_id/100000000) as dev_type,DATE_FORMAT(test_starttime, '%Y-%m-%d') AS week_day
+        from db_batt_testdata.tb_batttestdata_inf
+        <where>
+            DATE_SUB(CURDATE(), INTERVAL 6 DAY) &lt;= DATE(test_starttime)
+            and floor(dev_id/100000000)=#{type}
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <select id="getTinfById" resultType="com.whyc.pojo.db_batt_testdata.BatttestdataInf">
+        select *
+        from db_batt_testdata.tb_batttestdata_inf
+        <where>
+        and test_type=#{type}
+        and dev_id=#{devId}
+        </where>
+        order by test_starttime desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/DevInfMapper.xml b/src/main/resources/mapper/DevInfMapper.xml
new file mode 100644
index 0000000..ef16f5b
--- /dev/null
+++ b/src/main/resources/mapper/DevInfMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.DevInfMapper">
+
+    <select id="getAllInf" resultType="com.whyc.pojo.db_lithium_ram_db.DevInf">
+        select * from db_lithium_ram_db.tb_dev_inf
+        <where>
+            dev_type=#{dto.devType}
+            <if test="dto.devOnline!=null">
+                and dev_online=#{dto.devOnline}
+            </if>
+            <if test="dto.startTime!=null">
+                and create_time>=#{dto.startTime}
+            </if>
+            <if test="dto.endTime!=null">
+                and create_time&lt;=#{dto.endTime}
+            </if>
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="dto.uid!=null">
+                    and uid=#{dto.uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <select id="getMaxDevId" resultType="java.lang.Integer">
+        select max(dev_id) from db_lithium_ram_db.tb_dev_inf
+        <where>
+            dev_type=#{devType}
+        </where>
+        limit 1
+    </select>
+    <select id="getLine" resultType="com.whyc.pojo.db_lithium_ram_db.DevInf">
+        select * from db_lithium_ram_db.tb_dev_inf
+        <where>
+         dev_id in (
+        SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+        <where>
+            tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+            <if test="uid!=null">
+                and uid=#{uid}
+            </if>
+        </where>
+        )
+        </where>
+    </select>
+
+    <select id="getDevType" resultType="com.whyc.pojo.db_lithium_ram_db.DevInf">
+        select * from db_lithium_ram_db.tb_dev_inf
+        <where>
+            dev_type=#{devType}
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+    <select id="getDevStaticByType" resultType="com.whyc.pojo.db_lithium_ram_db.DevInf">
+        select * from db_lithium_ram_db.tb_dev_inf
+        <where>
+            dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="uid!=null">
+                    and uid=#{uid}
+                </if>
+            </where>
+            )
+        </where>
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/DevalarmDataMapper.xml b/src/main/resources/mapper/DevalarmDataMapper.xml
new file mode 100644
index 0000000..5683978
--- /dev/null
+++ b/src/main/resources/mapper/DevalarmDataMapper.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.whyc.mapper.DevalarmDataMapper">
+    <resultMap type="com.whyc.pojo.db_alarm.DevalarmData" id="almDev">
+        <id column="num" property="num"/>
+        <result column="dev_id" property="devId"/>
+        <result column="alm_id" property="almId"/>
+        <result column="alm_signal_id" property="almSignalId"/>
+        <result column="alm_starttime" property="almStarttime"/>
+        <result column="alm_value" property="almValue"/>
+        <result column="alm_is_confirmed" property="almIsConfirmed"/>
+        <result column="confirmed_uid" property="confirmedUid"/>
+        <result column="confirmed_time" property="confirmedTime"/>
+        <result column="alm_endtime" property="almEndtime"/>
+        <result column="alm_cleared_type" property="almClearedType"/>
+        <!-- 瀹冩槸鐢ㄤ簬鎸囧畾浠庤〃鏂圭殑寮曠敤瀹炰綋灞炴�х殑 -->
+        <association property="devInf" javaType="devInf"
+                     select="selectDinf"
+                     column="dev_id">
+        </association>
+    </resultMap>
+
+    <select id="getDAlmInf" resultMap="almDev">
+        select * from db_alarm.tb_devalarm_data
+        <where>
+            <if test="dto.devId!=null">
+                and dev_id=#{dto.devId}
+            </if>
+            <if test="dto.devType!=null">
+                and  FLOOR(dev_id/100000000)=#{dto.devType}
+            </if>
+            <if test="dto.almId!=null">
+                and alm_id=#{dto.almId}
+            </if>
+            <if test="dto.startTime!=null">
+                and alm_starttime>=#{dto.startTime}
+            </if>
+            <if test="dto.endTime!=null">
+                and alm_starttime&lt;=#{dto.endTime}
+            </if>
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            <where>
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                <if test="dto.uid!=null">
+                    and uid=#{dto.uid}
+                </if>
+            </where>
+            )
+            order by alm_starttime desc
+        </where>
+    </select>
+    <select id="selectDinf" resultType="devInf" parameterType="int" >
+        select * from db_lithium_ram_db.tb_dev_inf where dev_id = #{dev_id}
+    </select>
+    <select id="getDAlmPopUp" resultMap="almDev">
+        select * from db_alarm.tb_devalarm_data
+        <where>
+            alm_is_confirmed=0
+            and dev_id in (
+            SELECT distinct dev_id from db_user.tb_battgroup_baojigroup,db_user.tb_battgroup_usr
+            where
+                tb_battgroup_baojigroup.baoji_group_id=tb_battgroup_usr.baoji_group_id
+                and uid=#{uid}
+            )
+        </where>
+        order by alm_starttime desc
+    </select>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1