package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.*; import com.whyc.pojo.Experiment; import com.whyc.pojo.ExperimentBaseDataKZ; import com.whyc.pojo.ExperimentPoint; import com.whyc.pojo.ExperimentPrecondition; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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 { @Resource private ExperimentMapper mapper; @Resource private ExperimentBaseDataKZMapper kzMapper; @Resource private ExperimentPointMapper pointMapper; @Resource private ExperimentPreconditionMapper preconditionMapper; @Resource private CommonMapper commonMapper; public Response exist() { QueryWrapper wrapper = Wrappers.query(); wrapper.eq("status",1); List experiments = mapper.selectList(wrapper); //不存在试验 if (experiments.isEmpty()){ return new Response().set(-1,"暂无试验"); } Experiment experiment = experiments.get(0); String url = null; if (experiment.getId().toLowerCase().contains(ExperimentType.KZ.getValue())){ url = "noLoadTest"; } else if(experiment.getId().toLowerCase().contains(ExperimentType.FZ.getValue())){ url = "loadTest"; } else if(experiment.getId().toLowerCase().contains(ExperimentType.RZ.getValue())){ url = "windingTest"; }else{ url ="不存在呀"; } return new Response().set(1,url); } /** * 绕组:rz, * 空载:kz, * 负载:fz, * 升温:sw, * 超速:cs, * 空载反电动势:kzfdds, * 振动:zd, * 耐压:ny, * 转动惯量:zdgl * @param type * @return */ public Response getExperimentId(String type) { String id = null; //查询当前试验类型的最大编号 QueryWrapper wrapper = Wrappers.query(); Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); String nowFormat = dateFormat.format(now); String idLike = type.toUpperCase()+"_"+nowFormat; wrapper.select("id").likeRight("id",idLike).orderByDesc("id").last(" limit 1"); Experiment experiment = mapper.selectOne(wrapper); if(experiment!=null) { int idPrefixLength = idLike.length(); String idSuffixStr = experiment.getId().substring(idPrefixLength); Integer idSuffix = Integer.parseInt(idSuffixStr)+1; //前面填充0的位数 int zeroCount = idSuffixStr.length()-idSuffix.toString().length(); StringBuilder zeroStr = new StringBuilder(); for (int i = 0; i < zeroCount; i++) { zeroStr.append("0"); } id = idLike+zeroStr+idSuffix; }else{ id = idLike+"001"; } return new Response().set(1,id); } @Transactional public Response addKZFZ(Experiment experiment) { //插入experiment数据 experiment.setCreateTime(new Date()); //新增初始化状态为0未开始,正在进行 experiment.setStatus(0); mapper.insert(experiment); //插入experiment_base_data数据 kzMapper.insert((ExperimentBaseDataKZ) experiment.getBaseData()); //插入experiment_point数据 List points = (List) experiment.getPoint(); points.stream().forEach(p->p.setStatus(0)); pointMapper.insertBatchSomeColumn(points); //TODO 插入紧急停止数据 return new Response().setMsg(1,"新增成功"); } /** * 检查前置条件 * @param type * @return */ public Response checkPrecondition(String type) { AtomicReference code = new AtomicReference<>(1); //2种方式 //m1 QueryWrapper wrapper = Wrappers.query(); wrapper.eq("type",type); List preconditions = preconditionMapper.selectList(wrapper); preconditions.stream().forEach(precondition->{ //获取对应的值 /*ExperimentPrecondition preconditionStatus = commonMapper.getPreconditionStatus(precondition); precondition.setActualValue(preconditionStatus.getActualValue()); precondition.setStatus(preconditionStatus.getStatus());*/ Object preconditionActualValue = commonMapper.getPreconditionStatus(precondition); String preconditionActualValueStr = preconditionActualValue.toString(); if(precondition.getValue().equals(preconditionActualValueStr)){ precondition.setStatus(1); }else{ precondition.setStatus(0); code.set(-1); } precondition.setActualValue(preconditionActualValueStr); }); return new Response().set(code.get(),preconditions); } /** * 检查中置条件-当前功率和当前定子温度,如果符合标准,返回当前值 */ public Response checkPreconditionStep1(String type){ QueryWrapper wrapper = Wrappers.query(); wrapper.eq("type",type+"_1"); List preconditions = preconditionMapper.selectList(wrapper); //获取到条件数量 int conditionNum = preconditions.size(); AtomicReference 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()); } }); } //演示需要 try { sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return new Response().set(1,preconditions); } /** * 开始试验,更新 试验状态和启动试验时间 */ public Response updateStatus(String experimentId){ Experiment experiment = new Experiment<>(); experiment.setId(experimentId); experiment.setStatus(1); experiment.setStartTime(new Date()); mapper.updateById(experiment); return new Response().set(1,"状态更新成功"); } /** * 获取测试点 */ public Response> getPoint(String experimentId){ QueryWrapper wrapper = Wrappers.query(); wrapper.eq("experiment_id",experimentId); List experimentPoints = pointMapper.selectList(wrapper); return new Response>().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); //演示需要,使用5s sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } pointMapper.updateEndTime(point.getId(),new Date()); //返回这段时间的测试结果 Map resMap = new HashMap<>(); int value = (int) (100 + Math.random() * 10); resMap.put("平均功率",value+"kW"); return new Response().set(1,resMap); } /*======History======*/ public Response> getPage(Integer pageNum, Integer pageSize, ExperimentConditionDTO condition) { PageHelper.startPage(pageNum,pageSize); List experimentList = mapper.getPage(condition); //查询结果的duration是分钟,转换为 x时x分格式 experimentList.stream().forEach(experiment -> { int duration = Integer.parseInt(experiment.getDuration()); //获取时 int hour = duration/60; //获取分 int minute = duration%60; experiment.setDuration(hour+"小时"+minute+"分"); }); PageInfo pageInfo = new PageInfo<>(experimentList); return new Response>().set(1,pageInfo); } }