From 3da521b9e0a86dd9cc0bb28b2dfa0e7084ffc00f Mon Sep 17 00:00:00 2001
From: whycxzp <perryhsu@163.com>
Date: 星期四, 20 五月 2021 17:21:12 +0800
Subject: [PATCH] 更新试验接口

---
 src/main/java/com/whyc/service/ExperimentService.java       |  149 +++++++++++++++++++++---
 src/main/java/com/whyc/pojo/Experiment.java                 |    2 
 src/main/java/com/whyc/controller/ExperimentController.java |   29 ++++
 src/main/java/com/whyc/ws/DeviceWebSocket.java              |    2 
 src/main/java/com/whyc/mapper/ExperimentPointMapper.java    |    5 
 src/main/java/com/whyc/ws/ExperimentSocket.java             |  146 ++++++++++++++++++++++++
 6 files changed, 308 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/whyc/controller/ExperimentController.java b/src/main/java/com/whyc/controller/ExperimentController.java
index cf30f9b..b50c568 100644
--- a/src/main/java/com/whyc/controller/ExperimentController.java
+++ b/src/main/java/com/whyc/controller/ExperimentController.java
@@ -21,6 +21,12 @@
     @Autowired
     private ExperimentService service;
 
+    @GetMapping("exist")
+    @ApiOperation(value = "鏌ヨ鏄惁褰撳墠鏈夎瘯楠�",notes = "濡傛灉鏈�,code=1,杩斿洖璇曢獙鐨勫熀纭�鏁版嵁;濡傛灉娌℃湁,code=-1")
+    public Response exist(){
+        return service.exist();
+    }
+
     @GetMapping("experimentId")
     @ApiOperation(value = "鏌ヨ褰撳墠璇曢獙缂栧彿",notes = "浼犲叆鐨則ype閫夋嫨鍏朵竴:" +
             "缁曠粍:rz,\n" +
@@ -57,7 +63,30 @@
         return service.checkPrecondition(type);
     }
 
+    /**
+     * 寮�濮嬭瘯楠�,璇锋眰鎺ュ彛1,鑾峰彇璇曢獙娴嬭瘯鐐�
+     */
+    @GetMapping("point")
+    @ApiOperation(value = "鏌ヨ娴嬭瘯鐐瑰垪琛�")
+    public Response getPoint(@RequestParam String experimentId){
+        return service.getPoint(experimentId);
+    }
 
+    /**
+     * 寮�濮嬭瘯楠�,妫�鏌ヤ腑缃潯浠�
+     * @return
+     */
+    @GetMapping("checkPreconditionStep1")
+    @ApiOperation(value = "姝ラ1,妫�鏌ュ崌娓╂儏鍐�")
+    public Response checkPreconditionStep1(@RequestParam String experimentId){
+        return service.checkPreconditionStep1(experimentId);
+    }
+
+    @PostMapping("startExperimentPoint")
+    @ApiOperation(value = "鍚姩娴嬭瘯鐐�")
+    public Response StartExperimentPoint(@RequestBody ExperimentPoint point){
+        return service.startExperimentPoint(point);
+    }
 
     /*======History======*/
 
diff --git a/src/main/java/com/whyc/mapper/ExperimentPointMapper.java b/src/main/java/com/whyc/mapper/ExperimentPointMapper.java
index 540785f..9adfd56 100644
--- a/src/main/java/com/whyc/mapper/ExperimentPointMapper.java
+++ b/src/main/java/com/whyc/mapper/ExperimentPointMapper.java
@@ -1,6 +1,11 @@
 package com.whyc.mapper;
 
 import com.whyc.pojo.ExperimentPoint;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Date;
 
 public interface ExperimentPointMapper extends CustomMapper<ExperimentPoint>{
+    @Update("update `db_3.5mw_web`.tb_experiment_point set end_time = #{date} where id = #{id}")
+    Integer updateEndTime(Integer id, Date date);
 }
diff --git a/src/main/java/com/whyc/pojo/Experiment.java b/src/main/java/com/whyc/pojo/Experiment.java
index 999a181..e0b1ba4 100644
--- a/src/main/java/com/whyc/pojo/Experiment.java
+++ b/src/main/java/com/whyc/pojo/Experiment.java
@@ -47,7 +47,7 @@
     @ApiModelProperty("鍒涘缓鏃堕棿")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
     private Date createTime;
-    @ApiModelProperty("鐘舵��:0-鍙栨秷,1-杩涜涓�,2-瀹屾垚")
+    @ApiModelProperty("鐘舵��:-1-鍙栨秷,0-鏈紑濮�,1-杩涜涓�,2-瀹屾垚")
     private Integer status;
     @ApiModelProperty("鍩虹鏁版嵁")
     @TableField(exist = false)
diff --git a/src/main/java/com/whyc/service/ExperimentService.java b/src/main/java/com/whyc/service/ExperimentService.java
index 6380c93..8b18163 100644
--- a/src/main/java/com/whyc/service/ExperimentService.java
+++ b/src/main/java/com/whyc/service/ExperimentService.java
@@ -4,7 +4,6 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.whyc.constant.ExperimentType;
 import com.whyc.dto.ExperimentConditionDTO;
 import com.whyc.dto.Response;
 import com.whyc.mapper.*;
@@ -18,8 +17,13 @@
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+
+import static java.lang.Thread.sleep;
 
 @Service
 public class ExperimentService {
@@ -34,6 +38,17 @@
     private ExperimentPreconditionMapper preconditionMapper;
     @Resource
     private CommonMapper commonMapper;
+
+    public Response exist() {
+        QueryWrapper<Experiment> wrapper = Wrappers.query();
+        wrapper.eq("status",1);
+        List<Experiment> experiments = mapper.selectList(wrapper);
+        //涓嶅瓨鍦ㄨ瘯楠�
+        if (experiments.isEmpty()){
+            return new Response().set(-1,"鏆傛棤璇曢獙");
+        }
+        return new Response().set(1,experiments);
+    }
 
     /**
      * 缁曠粍:rz,
@@ -80,8 +95,8 @@
     public Response addKZ(Experiment experiment) {
         //鎻掑叆experiment鏁版嵁
         experiment.setCreateTime(new Date());
-        //鏂板鍒濆鍖栫姸鎬佷负1,姝e湪杩涜
-        experiment.setStatus(1);
+        //鏂板鍒濆鍖栫姸鎬佷负0鏈紑濮�,姝e湪杩涜
+        experiment.setStatus(0);
         mapper.insert(experiment);
 
         //鎻掑叆experiment_base_data鏁版嵁
@@ -97,32 +112,13 @@
         return new Response().setMsg(1,"鏂板鎴愬姛");
     }
 
-    /*======History======*/
-
-    public Response<PageInfo<Experiment>> getPage(Integer pageNum, Integer pageSize, ExperimentConditionDTO condition) {
-        PageHelper.startPage(pageNum,pageSize);
-        List<Experiment> experimentList = mapper.getPage(condition);
-        //鏌ヨ缁撴灉鐨刣uration鏄垎閽�,杞崲涓� x鏃秞鍒嗘牸寮�
-        experimentList.stream().forEach(experiment -> {
-            int duration = Integer.parseInt(experiment.getDuration());
-            //鑾峰彇鏃�
-            int hour = duration/60;
-            //鑾峰彇鍒�
-            int minute = duration%60;
-            experiment.setDuration(hour+"灏忔椂"+minute+"鍒�");
-        });
-
-        PageInfo<Experiment> pageInfo = new PageInfo<>(experimentList);
-        return new Response<PageInfo<Experiment>>().set(1,pageInfo);
-    }
-
     /**
      * 妫�鏌ュ墠缃潯浠�
      * @param type
      * @return
      */
     public Response checkPrecondition(String type) {
-         AtomicReference<Integer> code = new AtomicReference<>(1);
+        AtomicReference<Integer> code = new AtomicReference<>(1);
         //2绉嶆柟寮�
         //m1
         QueryWrapper<ExperimentPrecondition> wrapper = Wrappers.query();
@@ -145,4 +141,111 @@
         });
         return new Response().set(code.get(),preconditions);
     }
+
+    /**
+     * 妫�鏌ヤ腑缃潯浠�-褰撳墠鍔熺巼鍜屽綋鍓嶅畾瀛愭俯搴�,濡傛灉绗﹀悎鏍囧噯,杩斿洖褰撳墠鍊�
+     */
+    public Response checkPreconditionStep1(String type){
+        QueryWrapper<ExperimentPrecondition> wrapper = Wrappers.query();
+        wrapper.eq("type",type+"_1");
+        List<ExperimentPrecondition> preconditions = preconditionMapper.selectList(wrapper);
+
+        //鑾峰彇鍒版潯浠舵暟閲�
+        int conditionNum = preconditions.size();
+        AtomicReference<Integer> passNum = new AtomicReference(0);
+        while (conditionNum!=passNum.get()) {
+            //閲嶇疆涓�0
+            passNum.set(0);
+            preconditions.stream().forEach(precondition -> {
+                //鑾峰彇瀵瑰簲鐨勫��
+                Object preconditionActualValue = commonMapper.getPreconditionStatus(precondition);
+                //閲囩敤娴偣杩涜鏁板�煎姣�
+                Float actualValue = (Float) preconditionActualValue;
+                Float defaultValue = Float.parseFloat(precondition.getValue());
+
+                if (defaultValue.equals(actualValue)) {
+                    //鏉′欢杈炬垚,杈炬垚鏁颁笂+1
+                    passNum.set(passNum.get()+1);
+                    //璁板綍褰撳墠鍊�
+                    precondition.setActualValue(actualValue.toString());
+                }
+            });
+        }
+        return new Response().set(1,preconditions);
+    }
+
+    /**
+     * 寮�濮嬭瘯楠�,鏇存柊 璇曢獙鐘舵�佸拰鍚姩璇曢獙鏃堕棿
+     */
+    public Response updateStatus(String experimentId){
+        Experiment<Object, Object> experiment = new Experiment<>();
+        experiment.setId(experimentId);
+        experiment.setStatus(1);
+        experiment.setStartTime(new Date());
+        mapper.updateById(experiment);
+        return new Response().set(1,"鐘舵�佹洿鏂版垚鍔�");
+    }
+
+    /**
+     * 鑾峰彇娴嬭瘯鐐�
+     */
+    public Response<List<ExperimentPoint>> getPoint(String experimentId){
+        QueryWrapper<ExperimentPoint> wrapper = Wrappers.query();
+        wrapper.eq("experiment_id",experimentId);
+        List<ExperimentPoint> experimentPoints = pointMapper.selectList(wrapper);
+        return new Response<List<ExperimentPoint>>().set(1,experimentPoints);
+    }
+
+    /**
+     * 鏇存柊娴嬭瘯鐐圭殑寮�濮嬫椂闂村拰鐘舵��
+     */
+    public Response updatePointStatus(ExperimentPoint experimentPoint){
+        pointMapper.update(experimentPoint,null);
+        return new Response().set(1,"鐘舵�佹洿鏂版垚鍔�");
+    }
+
+    /**
+     * 鍚姩娴嬭瘯鐐�,骞跺湪娴嬭瘯鏃堕暱杩囧悗,杩斿洖娴嬭瘯缁撴灉
+     * @return
+     */
+    public Response startExperimentPoint(ExperimentPoint point){
+        //鏇存柊娴嬭瘯鏃堕棿鍜屾祴璇曠偣鐘舵��
+        point.setStartTime(new Date());
+        point.setStatus(1);
+        pointMapper.update(point,null);
+        //绛夊緟duration鏃堕棿
+        Integer duration = point.getDuration();
+        Integer durationSecond = duration*60;
+        try {
+            sleep(durationSecond);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        pointMapper.updateEndTime(point.getId(),new Date());
+        //杩斿洖杩欐鏃堕棿鐨勬祴璇曠粨鏋�
+        Map<String,String> resMap = new HashMap<>();
+        int value = (int) (100 + Math.random() * 10);
+        resMap.put("骞冲潎鍔熺巼",value+"kW");
+        return new Response().set(1,resMap);
+    }
+
+    /*======History======*/
+
+    public Response<PageInfo<Experiment>> getPage(Integer pageNum, Integer pageSize, ExperimentConditionDTO condition) {
+        PageHelper.startPage(pageNum,pageSize);
+        List<Experiment> experimentList = mapper.getPage(condition);
+        //鏌ヨ缁撴灉鐨刣uration鏄垎閽�,杞崲涓� x鏃秞鍒嗘牸寮�
+        experimentList.stream().forEach(experiment -> {
+            int duration = Integer.parseInt(experiment.getDuration());
+            //鑾峰彇鏃�
+            int hour = duration/60;
+            //鑾峰彇鍒�
+            int minute = duration%60;
+            experiment.setDuration(hour+"灏忔椂"+minute+"鍒�");
+        });
+
+        PageInfo<Experiment> pageInfo = new PageInfo<>(experimentList);
+        return new Response<PageInfo<Experiment>>().set(1,pageInfo);
+    }
+
 }
diff --git a/src/main/java/com/whyc/ws/DeviceWebSocket.java b/src/main/java/com/whyc/ws/DeviceWebSocket.java
index 894172a..475eee5 100644
--- a/src/main/java/com/whyc/ws/DeviceWebSocket.java
+++ b/src/main/java/com/whyc/ws/DeviceWebSocket.java
@@ -32,7 +32,7 @@
 
     @OnOpen
     public void onOpen(Session session) {
-        log.warn("socket浼氳瘽寮�鍚簡:{}",session);
+        log.warn("DeviceWebSocket浼氳瘽寮�鍚簡:{}",session);
         this.session = session;
         //this.deviceId = deviceId;
         if(session!=null) {
diff --git a/src/main/java/com/whyc/ws/ExperimentSocket.java b/src/main/java/com/whyc/ws/ExperimentSocket.java
new file mode 100644
index 0000000..db26523
--- /dev/null
+++ b/src/main/java/com/whyc/ws/ExperimentSocket.java
@@ -0,0 +1,146 @@
+package com.whyc.ws;
+
+import com.whyc.dto.Response;
+import com.whyc.pojo.ExperimentPoint;
+import com.whyc.service.DeviceService;
+import com.whyc.service.ExperimentService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+import static java.lang.Thread.sleep;
+
+@ServerEndpoint(value = "/experiment/{experimentId}", encoders = WebSocketEncoder.class)
+@Component
+@Api(tags = "璁惧ws")
+@Slf4j
+public class ExperimentSocket {
+
+    private Session session;
+
+    private volatile Thread thread;
+
+    private static ExperimentService service;
+
+    @Autowired
+    public void setService(ExperimentService service) {
+        this.service = service;
+    }
+
+    /**
+     * 鐐瑰嚮寮�濮嬭瘯楠�,寮�鍚痺ebSocket,浼犲叆璇曢獙id,鏇存柊璇曢獙鐘舵��
+     *
+     * @param session
+     * @param experimentId
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("experimentId") String experimentId) {
+        log.warn("ExperimentSocket浼氳瘽寮�鍚簡:{}", session);
+        this.session = session;
+        if (session.isOpen()) {
+            //session.getBasicRemote().sendObject(service.updateStatus(experimentId));
+            service.updateStatus(experimentId);
+            sendMessage(experimentId);
+
+        }
+    }
+
+    @OnMessage
+    public void onMessage(String message) {
+        try {
+            this.sendMessage(message);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鍔ㄦ�佽繑鍥炴楠ゅ拰鎵ц淇℃伅
+     * @param experimentId
+     */
+    private void sendMessage(String experimentId) {
+        String type = experimentId.split("_")[0].toLowerCase();
+        try {
+            //妫�鏌ユ楠�1,灞炰簬姝e紡瀹為獙鍓嶇殑鐜绋冲畾鎬ф牎楠�
+            session.getBasicRemote().sendObject(service.checkPreconditionStep1(type));
+
+            //姝e紡娴嬭瘯鐐圭殑鏁版嵁杩斿洖
+            //1.杩斿洖鏁翠綋璇曢獙鐐�
+            Response pointResponse = service.getPoint(experimentId);
+            List<ExperimentPoint> experimentPoints = (List<ExperimentPoint>) pointResponse.getData();
+            experimentPoints.stream().forEach(experimentPoint -> {
+                //鍚姩绗竴涓祴璇曠偣,杩斿洖鏁翠綋鐘舵��
+                experimentPoint.setStatus(1);
+                experimentPoint.setStartTime(new Date());
+                service.updatePointStatus(experimentPoint);
+                try {
+                    session.getBasicRemote().sendObject(experimentPoints);
+                } catch (IOException | EncodeException e) {
+                    e.printStackTrace();
+                }
+                try {
+                    //绛夊緟涓�涓祴璇曟椂闂�
+                    sleep(experimentPoint.getDuration());
+                    //鏇存柊绗竴涓祴璇曠偣鐨勬儏鍐�,鑾峰彇鏁翠釜鏃堕棿鐨勬儏鍐�
+
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+
+            });
+
+        } catch (IOException | EncodeException e) {
+            e.printStackTrace();
+        }
+        if(session!=null) {
+            thread = new Thread("Thread_device") {
+                public void run() {
+                    while (!thread.isInterrupted()) {
+
+                        if (session.isOpen()) {
+                            //session.getBasicRemote().sendObject(service.getStatus());
+                            try {
+                                session.getBasicRemote().sendObject("yeah!");
+                            } catch (IOException | EncodeException e) {
+                                e.printStackTrace();
+                            }
+                        }
+                        try {
+                            sleep(1000);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+
+                    }
+                }
+            };
+            thread.start();
+        }
+    }
+
+    @OnClose
+    public void onClose() {
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+        log.warn("webSocket浼氳瘽鍏抽棴浜�:{}", session);
+
+    }
+
+    @OnError
+    public void onError(Throwable error) {
+        error.printStackTrace();
+        if (thread != null && thread.isAlive()) {
+            thread.interrupt();
+        }
+    }
+
+}

--
Gitblit v1.9.1