| | |
| | | import com.whyc.pojo.ExperimentBaseDataKZ; |
| | | import com.whyc.pojo.ExperimentPoint; |
| | | import com.whyc.pojo.ExperimentPrecondition; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | |
| | | import static java.lang.Thread.sleep; |
| | | |
| | | @Service |
| | | @Slf4j |
| | | public class ExperimentService { |
| | | |
| | | @Resource |
| | |
| | | |
| | | /** |
| | | * 启动测试点,并在测试时长过后,返回测试结果 |
| | | * 测试点的结束,结束分两种情况: |
| | | * 情况一:经过预定的测试时长,停止 |
| | | * 情况二:更新了数据库的某个字段,代码循环判断这个字段,如果为2则停止实验并返回结果 |
| | | * @return |
| | | */ |
| | | public Response startExperimentPoint(ExperimentPoint point){ |
| | |
| | | //等待duration时间 |
| | | Integer duration = point.getDuration(); |
| | | Integer durationSecond = duration*60; |
| | | try { |
| | | final boolean[] threadStatus = {true}; |
| | | //采用线程的原因是非线程sleep后无法执行手动结束条件判断代码 |
| | | Thread t = new Thread(){ |
| | | @Override |
| | | public void run() { |
| | | try { |
| | | sleep(10000); |
| | | threadStatus[0] = false; |
| | | } catch (InterruptedException e) { |
| | | interrupt(); |
| | | log.warn("t1线程被打断"); |
| | | //e.printStackTrace(); |
| | | } |
| | | }; |
| | | }; |
| | | t.start(); |
| | | |
| | | boolean statusFlag =true; |
| | | //手动停止和测试点预设时间,1个条件成立就终止测试 |
| | | while(statusFlag && threadStatus[0]){ |
| | | //查询测试点状态是否被打断 |
| | | QueryWrapper<ExperimentPoint> wrapper = Wrappers.query(); |
| | | wrapper.select("status").eq("id",point.getId()); |
| | | ExperimentPoint currentPoint = pointMapper.selectOne(wrapper); |
| | | if(currentPoint.getStatus()==3){ |
| | | statusFlag = false; |
| | | } |
| | | } |
| | | log.warn("测试点结束"); |
| | | if (t.isAlive()) { |
| | | t.interrupt(); |
| | | } |
| | | |
| | | /*try { |
| | | //sleep(durationSecond); |
| | | //演示需要,使用5s |
| | | sleep(5000); |
| | | |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | }*/ |
| | | pointMapper.updateEndTime(point.getId(),new Date()); |
| | | //返回这段时间的测试结果 |
| | | //TODO 这段时间内的数据,需要进行动态计算 |
| | | Map<String,String> resMap = new HashMap<>(); |
| | | int value = (int) (100 + Math.random() * 10); |
| | | resMap.put("平均功率",value+"kW"); |
| | | setExperimentState(point.getExperimentId(),1); |
| | | return new Response().set(1,resMap); |
| | | } |
| | | |
| | | public void setExperimentState(String id,int status){ |
| | | Experiment experiment = mapper.selectById(id); |
| | | experiment.setStatus(status); |
| | | mapper.updateById(experiment); |
| | | } |
| | | |
| | | public Response finishExperiment(String experimentId) { |
| | | mapper.updateStatusAndTime(experimentId,2,"end_time",new Date()); |
| | | return new Response().setMsg(1,"状态更新成功"); |
| | | } |
| | | |
| | | public Response finishExperimentPoint(Integer id) { |
| | | ExperimentPoint point = new ExperimentPoint(); |
| | | point.setId(id); |
| | | //中断信号 |
| | | point.setStatus(3); |
| | | pointMapper.updateById(point); |
| | | return new Response().setMsg(1,"测试点中断信号更新成功"); |
| | | } |
| | | |
| | | public Response setPrecondition(Integer id) { |
| | | switch (id){ |
| | | case 1:{ |
| | | commonMapper.setPrecondition("`db_3.5mw_motor`.tb_central_monitor_sys_rt","10001","switch_close","0"); |
| | | } |
| | | case 2:{ |
| | | |
| | | } |
| | | case 3:{ |
| | | |
| | | } |
| | | case 4:{ |
| | | |
| | | } |
| | | case 5:{ |
| | | |
| | | } |
| | | case 6:{ |
| | | |
| | | } |
| | | case 7:{ |
| | | |
| | | } |
| | | } |
| | | return new Response().setMsg(1,"设置完成"); |
| | | } |
| | | |
| | | /*======History======*/ |
| | | |
| | | public Response<PageInfo<Experiment>> getPage(Integer pageNum, Integer pageSize, ExperimentConditionDTO condition) { |