Просмотр исходного кода

修改模拟程序,存储从文件转为sqlite3

klzhangweiya 2 лет назад
Родитель
Сommit
274069a57f

BIN
VB_DSM_V2.1/mock/mock_data.db


+ 19 - 3
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/pom.xml

@@ -74,11 +74,27 @@
 <!--            <version>2.7.1</version>-->
 <!--            <scope>compile</scope>-->
 <!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba.csp</groupId>-->
+<!--            <artifactId>sentinel-core</artifactId>-->
+<!--            <version>1.8.6</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-data-jpa</artifactId>-->
+<!--        </dependency>-->
+        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
         <dependency>
-            <groupId>com.alibaba.csp</groupId>
-            <artifactId>sentinel-core</artifactId>
-            <version>1.8.6</version>
+            <groupId>org.xerial</groupId>
+            <artifactId>sqlite-jdbc</artifactId>
+            <version>3.42.0.0</version>
         </dependency>
+        <!-- jdbc -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
     </dependencies>
 <!--    <dependencyManagement>-->
 <!--        <dependencies>-->

+ 42 - 42
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/server/TcpSocketClient.java

@@ -18,47 +18,47 @@ import java.util.Scanner;
 @Slf4j
 public class TcpSocketClient {
 
-//    @Getter
-//    private Bootstrap bootstrap;
-//    @Getter
-//    private Channel channel;
-//
-//    @Value("${vbdsm.socket.client.port}")
-//    private int port;
-//    @Value("${vbdsm.socket.client.bindIp}")
-//    private String host;
-//
-//    public void connect(){
-//        EventLoopGroup group = new NioEventLoopGroup();
-//        this.bootstrap = new Bootstrap();
-//        bootstrap.group(group).channel(NioSocketChannel.class)
-//                .option(ChannelOption.TCP_NODELAY, true)
-//                .handler(new ChannelInitializer<SocketChannel>() {
-//                    @Override
-//                    protected void initChannel(SocketChannel ch) throws Exception {
-////                        ch.pipeline().addLast("decoder",new DealMsg()); //设置自定义解码器
-////                        ch.pipeline().addLast("encoder",new MsgEncode()); //设置自定义编码器
-//                        ch.pipeline().addLast(new TcpClientHandler());//设置客户端网络IO处理器
-//                    }
-//                });
-//        //连接服务器 同步等待成功
-//        ChannelFuture f = bootstrap.connect(new InetSocketAddress(host, port));
-//        //同步等待客户端通道关闭
-//        try {
-//            this.channel = f.sync().channel();
-//        } catch (InterruptedException e) {
-//            throw new RuntimeException(e);
-//        }
-//        //释放线程组资源
-//        //group.shutdownGracefully();
-//    }
-//
-//    public void sendMsg(String msg){
-//        try {
-//            this.channel.writeAndFlush(msg);
-//        } catch (Exception e) {
-//            throw new RuntimeException(e);
-//        }
-//    }
+    @Getter
+    private Bootstrap bootstrap;
+    @Getter
+    private Channel channel;
+
+    @Value("${vbdsm.socket.client.port}")
+    private int port;
+    @Value("${vbdsm.socket.client.bindIp}")
+    private String host;
+
+    public void connect(){
+        EventLoopGroup group = new NioEventLoopGroup();
+        this.bootstrap = new Bootstrap();
+        bootstrap.group(group).channel(NioSocketChannel.class)
+                .option(ChannelOption.TCP_NODELAY, true)
+                .handler(new ChannelInitializer<SocketChannel>() {
+                    @Override
+                    protected void initChannel(SocketChannel ch) throws Exception {
+//                        ch.pipeline().addLast("decoder",new DealMsg()); //设置自定义解码器
+//                        ch.pipeline().addLast("encoder",new MsgEncode()); //设置自定义编码器
+                        ch.pipeline().addLast(new TcpClientHandler());//设置客户端网络IO处理器
+                    }
+                });
+        //连接服务器 同步等待成功
+        ChannelFuture f = bootstrap.connect(new InetSocketAddress(host, port));
+        //同步等待客户端通道关闭
+        try {
+            this.channel = f.sync().channel();
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+        //释放线程组资源
+        //group.shutdownGracefully();
+    }
+
+    public void sendMsg(String msg){
+        try {
+            this.channel.writeAndFlush(msg);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
 
 }

+ 46 - 28
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/MockUploadWsService.java

@@ -6,12 +6,9 @@ import cn.vbdsm.hj212.modbus.config.WsProperties;
 import cn.vbdsm.hj212.modbus.utils.AESUtil;
 import cn.vbdsm.hj212.modbus.utils.RandomHelper;
 import cn.vbdsm.hj212.modbus.utils.WsClientUtil;
-import cn.vbdsm.hj212.modbus.ws.data.MockMonitor;
-import cn.vbdsm.hj212.modbus.ws.data.RandomHarmonic;
-import cn.vbdsm.hj212.modbus.ws.data.RandomPower;
-import cn.vbdsm.hj212.modbus.ws.data.TerminalData;
+import cn.vbdsm.hj212.modbus.ws.data.*;
 
-import com.alibaba.csp.sentinel.annotation.SentinelResource;
+//import com.alibaba.csp.sentinel.annotation.SentinelResource;
 import com.alibaba.fastjson2.JSON;
 import lombok.extern.slf4j.Slf4j;
 import lombok.var;
@@ -20,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Component;
 
 
@@ -39,6 +37,10 @@ public class MockUploadWsService {
     @Autowired
     private MockMonitor mockMonitor;
 
+    @Autowired
+    private TerminalDataDao terminalDataDao;
+
+
 //    @Autowired
 //    private ResourceLoader resourceLoader;
 
@@ -56,7 +58,7 @@ public class MockUploadWsService {
 //            }
 //        }
 //    }
-    @SentinelResource("uploadBlockHandler")
+    //@SentinelResource("uploadBlockHandler")
     public void loadTerminals(){
         String terminals = mockMonitor.getTerminals();
         String[] coms = terminals.split("&");
@@ -65,6 +67,9 @@ public class MockUploadWsService {
             String[] ts = cts[1].split(",");
             for(String t : ts){
                 TerminalData td = getTerminal(cts[0],t);
+                if(td==null){
+                    continue;
+                }
                 RandomPower power = new RandomPower();
                 setEngine(power,td);
                 try {
@@ -80,35 +85,44 @@ public class MockUploadWsService {
 
 
     private TerminalData getTerminal(String companyId,String terminalId){
-        String filePath = StrUtil.format("./mock/{}@{}.json",companyId,terminalId);
-        //Resource fileResource =resourceLoader.getResource(filePath);
-        File file = null;
-        try {
-            file = new File(filePath);
-            if(file.exists()){
-                FileReader fr = new FileReader(file);
-                String ts = fr.readString();
-                return JSON.parseObject(ts, TerminalData.class);
-            }
-        } catch (Exception e) {
-            log.error("{}文件不存在",filePath);
-        }
-        return new TerminalData(terminalId,companyId);
+//        String filePath = StrUtil.format("./mock/{}@{}.json",companyId,terminalId);
+//        //Resource fileResource =resourceLoader.getResource(filePath);
+//        File file = null;
+//        try {
+//            file = new File(filePath);
+//            if(file.exists()){
+//                FileReader fr = new FileReader(file);
+//                String ts = fr.readString();
+//                return JSON.parseObject(ts, TerminalData.class);
+//            }
+//        } catch (Exception e) {
+//            log.error("{}文件不存在",filePath);
+//        }
+//        return new TerminalData(terminalId,companyId);
+       return terminalDataDao.getCurDayTerminalData(companyId,terminalId,true);
+
     }
     private void setEngine(RandomPower power, TerminalData td){
         var dp = RandomHelper.getRandom(22000,3000,100);
         var de = RandomHelper.getRandom(6600,600,100);
-        var pe = td.getCurDayTotalP().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalP().add(dp);
-        var qe = td.getCurDayTotalE().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalE().add(de);
+//        var pe = td.getCurDayTotalP().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalP().add(dp);
+//        var qe = td.getCurDayTotalE().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalE().add(de);
+        var pe = td.getDayTotal_p().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_p().add(dp);
+        var qe = td.getDayTotal_e().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_e().add(de);
         var ps = td.getTotal_p().add(dp);
         var qs = td.getTotal_e().add(de);
         power.setEngine(pe,qe,ps,qs);
-        td.SetDayTotalP(pe.equals(new BigDecimal(0))?new BigDecimal("0.01"):pe)
-                .SetTotalP(ps)
-                .SetDayTotalE(qe.equals(new BigDecimal(0))?new BigDecimal("0.01"):qe)
-                .SetTotalE(qs);
-
-        td.saveFileInfo();
+//        td.SetDayTotalP(pe.equals(new BigDecimal(0))?new BigDecimal("0.01"):pe)
+//                .SetTotalP(ps)
+//                .SetDayTotalE(qe.equals(new BigDecimal(0))?new BigDecimal("0.01"):qe)
+//                .SetTotalE(qs);
+//
+//        td.saveFileInfo();
+        td.setTotal_p(ps);
+        td.setTotal_e(qs);
+        td.setDayTotal_p(pe);
+        td.setDayTotal_e(qe);
+        terminalDataDao.updateOrInsertTerminalData(td);
     }
 
 
@@ -169,6 +183,7 @@ public class MockUploadWsService {
             for (String url : urls) {
                 String result = WsClientUtil.callWebSV(url, wsProperties.getMethod(), content);
                 log.info("地址:{},企业编号:{},设备号信息:{},上传结果:{}",url,td.getCompanyId(),terminalId,result);
+                //log.info("地址:{},企业编号:{},设备号信息:{}",url,td.getCompanyId(),terminalId);
             }
         } catch (Exception e) {
             log.error("数据上报异常:" + e.getMessage() + "\nKEY:" + wsProperties.getKey() + "\nCONTENT:" + content);
@@ -204,4 +219,7 @@ public class MockUploadWsService {
         DataListBuilder.buildDataList(type,map,null,ht,randomHarmonic);
         return map;
     }
+
+
+
 }

+ 77 - 68
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/TerminalData.java

@@ -4,6 +4,7 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +26,7 @@ import java.util.concurrent.TransferQueue;
 
 @Data
 @Slf4j
+@AllArgsConstructor
 public class TerminalData {
 
 
@@ -41,81 +43,88 @@ public class TerminalData {
 
     private String companyId;
 
-    private Map<String, BigDecimal> dayTotal_p = new HashMap<>();
+    private Integer uploadDate;
 
-    private Map<String,BigDecimal> dayTotal_e = new HashMap<>();
+//    private Map<String, BigDecimal> dayTotal_p = new HashMap<>();
+//
+//    private Map<String,BigDecimal> dayTotal_e = new HashMap<>();
 
     private BigDecimal total_p = new BigDecimal(0);
 
     private BigDecimal total_e = new BigDecimal(0);
 
-    @JsonIgnore
-    private String key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+    private BigDecimal dayTotal_p = new BigDecimal(0);
 
-    public BigDecimal getCurDayTotalP(){
-        if(this.dayTotal_p.containsKey(this.key)){
-            return this.dayTotal_p.get(this.key);
-        }
-        return new BigDecimal(0);
-    }
-    public BigDecimal getCurDayTotalE(){
-        if(this.dayTotal_e.containsKey(this.key)){
-            return this.dayTotal_e.get(this.key);
-        }
-        return new BigDecimal(0);
-    }
-
-    public TerminalData SetDayTotalP(BigDecimal d){
-//        if(this.dayTotal_p.containsKey(key)){
-//            dayTotal_p.remove(key);
-//        }
-//        dayTotal_p.put(key,d);
-        dayTotal_p.compute(key,(k,v)->d);
-        return this;
-    }
-    public TerminalData SetTotalP(BigDecimal d)
-    {
-        total_p = d;
-        return this;
-    }
-    public TerminalData SetDayTotalE(BigDecimal d){
-        dayTotal_e.compute(key, (k,v)-> d);
-        return this;
-    }
-    public TerminalData SetTotalE(BigDecimal d)
-    {
-        total_e = d;
-        return this;
-    }
+    private BigDecimal dayTotal_e = new BigDecimal(0);
 
 
-    public void saveFileInfo()  {
-        String fileName = StrUtil.format("{}@{}.json",companyId,terminalId);
-        FileWriter fw = null;
-        try {
-            //String resourcePath = classPathResource.getURL().toString().substring(6);
-            File saveDir = new File("./mock");
-            if (!saveDir.exists()) {
-                boolean mkdir = saveDir.mkdir();
-            }
-            File file = new File(saveDir.getAbsoluteFile()+ "/" + fileName);
-            if(!file.exists()){
-                boolean newFile = file.createNewFile();
-            }
-            fw = new FileWriter(file);
-            String content = JSON.toJSONString(this);
-            fw.write(content);
-        } catch (IOException e) {
-            log.error("{}@{}.json文件保存失败!",companyId,terminalId);
-        }finally {
-            if(fw != null){
-                try {
-                    fw.flush();
-                    fw.close();
-                } catch (IOException e) {
-                    log.error("{}@{}.json文件保存失败!error:{}",companyId,terminalId,e.getMessage());
-                }
-        }
-      }
-    }
+//    @JsonIgnore
+//    private String key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+//
+//    public BigDecimal getCurDayTotalP(){
+//        if(this.dayTotal_p.containsKey(this.key)){
+//            return this.dayTotal_p.get(this.key);
+//        }
+//        return new BigDecimal(0);
+//    }
+//    public BigDecimal getCurDayTotalE(){
+//        if(this.dayTotal_e.containsKey(this.key)){
+//            return this.dayTotal_e.get(this.key);
+//        }
+//        return new BigDecimal(0);
+//    }
+//
+//    public TerminalData SetDayTotalP(BigDecimal d){
+////        if(this.dayTotal_p.containsKey(key)){
+////            dayTotal_p.remove(key);
+////        }
+////        dayTotal_p.put(key,d);
+//        dayTotal_p.compute(key,(k,v)->d);
+//        return this;
+//    }
+//    public TerminalData SetTotalP(BigDecimal d)
+//    {
+//        total_p = d;
+//        return this;
+//    }
+//    public TerminalData SetDayTotalE(BigDecimal d){
+//        dayTotal_e.compute(key, (k,v)-> d);
+//        return this;
+//    }
+//    public TerminalData SetTotalE(BigDecimal d)
+//    {
+//        total_e = d;
+//        return this;
+//    }
+//
+//
+//    public void saveFileInfo()  {
+//        String fileName = StrUtil.format("{}@{}.json",companyId,terminalId);
+//        FileWriter fw = null;
+//        try {
+//            //String resourcePath = classPathResource.getURL().toString().substring(6);
+//            File saveDir = new File("./mock");
+//            if (!saveDir.exists()) {
+//                boolean mkdir = saveDir.mkdir();
+//            }
+//            File file = new File(saveDir.getAbsoluteFile()+ "/" + fileName);
+//            if(!file.exists()){
+//                boolean newFile = file.createNewFile();
+//            }
+//            fw = new FileWriter(file);
+//            String content = JSON.toJSONString(this);
+//            fw.write(content);
+//        } catch (IOException e) {
+//            log.error("{}@{}.json文件保存失败!",companyId,terminalId);
+//        }finally {
+//            if(fw != null){
+//                try {
+//                    fw.flush();
+//                    fw.close();
+//                } catch (IOException e) {
+//                    log.error("{}@{}.json文件保存失败!error:{}",companyId,terminalId,e.getMessage());
+//                }
+//        }
+//      }
+//    }
 }

+ 80 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/TerminalDataDao.java

@@ -0,0 +1,80 @@
+package cn.vbdsm.hj212.modbus.ws.data;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSON;
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Slf4j
+@Repository
+public class TerminalDataDao {
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public TerminalData getCurDayTerminalData(String companyId,String terminalId,boolean forceNotNull){
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
+        LocalDate localDate = LocalDate.now();
+        Integer now = NumberUtil.parseInt(localDate.format(df));
+        TerminalData terminalData = null;
+        try{
+            terminalData = jdbcTemplate.queryForObject("select * from t_terminal_data where companyId = ? " +
+                            "and terminalId = ? and uploadDate = ?",
+                    new BeanPropertyRowMapper<TerminalData>(TerminalData.class), new Object[]{companyId, terminalId, now});
+            return terminalData;
+        }catch (Exception e){
+            if(forceNotNull){
+                return getInitEntity(companyId,terminalId,now);
+            }
+            return terminalData;
+        }
+
+
+    }
+
+    //如果查询不到当日记录,查询之前上传的记录,获取之前的总有功,无功,重新创建一个当日的对象,
+    // 如果之前的记录也没有,就全部为0
+    private TerminalData getInitEntity(String companyId,String terminalId,Integer now){
+        try{
+            TerminalData terminalData = jdbcTemplate.queryForObject("select * from t_terminal_data where companyId = ? " +
+                            "and terminalId = ? and uploadDate < ? order by uploadDate desc limit 1",
+                    new BeanPropertyRowMapper<TerminalData>(TerminalData.class), new Object[]{companyId, terminalId, now});
+            if (terminalData != null) {
+                return new TerminalData(terminalId,companyId, now
+                        , terminalData.getTotal_p(),terminalData.getTotal_e(), BigDecimal.ZERO, BigDecimal.ZERO);
+            }
+        }catch (Exception e){
+           log.error("查询结果为0,返回数值为0的对象!" + e.getMessage());
+        }
+        return  new TerminalData(terminalId,companyId, now
+                , BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
+    }
+
+
+    public void updateOrInsertTerminalData(TerminalData td){
+        try {
+            TerminalData curDayTerminalData = getCurDayTerminalData(td.getCompanyId(), td.getTerminalId(),false);
+            if(curDayTerminalData!=null){
+                jdbcTemplate.update("update t_terminal_data set dayTotal_p = ?, dayTotal_e = ?, total_p = ?, total_e = ? where companyId = ? and terminalId = ? and uploadDate = ?",
+                        td.getDayTotal_p(),td.getDayTotal_e(),td.getTotal_p(),td.getTotal_e(), td.getCompanyId(), td.getTerminalId(), td.getUploadDate());
+            }else{
+                jdbcTemplate.update("insert into t_terminal_data(companyId,terminalId,uploadDate,dayTotal_p,dayTotal_e,total_p,total_e) values(?,?,?,?,?,?,?)",
+                        td.getCompanyId(), td.getTerminalId(), td.getUploadDate(), td.getDayTotal_p(),td.getDayTotal_e(),td.getTotal_p(),td.getTotal_e());
+            }
+        }catch (Exception err){
+            log.error(err.getMessage());
+        }
+
+
+    }
+
+}

+ 6 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/application.yml

@@ -18,5 +18,11 @@ vbdsm:
         key: WOSHI123456MIYAO
     monitor:
         terminals: 3@YC0001,YC0002&7@YD001_01,YD001_02&9@YD002_01,YD002_02&10@YD003_01
+spring:
+    datasource:
+        driver-class-name: org.sqlite.JDBC
+        url: jdbc:sqlite:./mock/mock_data.db
+        username:
+        password: