Commit e49e3869 authored by 喻训浩's avatar 喻训浩

fix: modbus采集及设备状态运行时间保存实现

parent b5755d43
...@@ -8,10 +8,7 @@ import net.vtstar.user.search.controller.vo.SearchVo; ...@@ -8,10 +8,7 @@ import net.vtstar.user.search.controller.vo.SearchVo;
import net.vtstar.utils.domain.Return; import net.vtstar.utils.domain.Return;
import net.vtstar.zhongtong.avi.equipment.service.RunRecordService; import net.vtstar.zhongtong.avi.equipment.service.RunRecordService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @Author: xiadongwei * @Author: xiadongwei
...@@ -51,4 +48,10 @@ public class RunRecordController { ...@@ -51,4 +48,10 @@ public class RunRecordController {
public Return pageListFault(@RequestBody SearchVo pageFilter) { public Return pageListFault(@RequestBody SearchVo pageFilter) {
return Return.success(new PageInfo<>(runRecordService.findPageFault(pageFilter.toJSONObject()))); return Return.success(new PageInfo<>(runRecordService.findPageFault(pageFilter.toJSONObject())));
} }
@GetMapping("/test")
public Return test(){
runRecordService.test();
return Return.success();
}
} }
...@@ -9,6 +9,7 @@ import net.vtstar.user.search.Search; ...@@ -9,6 +9,7 @@ import net.vtstar.user.search.Search;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
...@@ -34,8 +35,7 @@ public class RuntimeRecord { ...@@ -34,8 +35,7 @@ public class RuntimeRecord {
private Long machineId; private Long machineId;
@ApiModelProperty(notes = "设备编号") @ApiModelProperty(notes = "设备编号")
@JoinColumn(tableName = EquipInfo.class, name = "equipCode") @JoinColumn(tableName = EquipInfo.class, name = "equip_code")
@Search
private String equipCode; private String equipCode;
@ApiModelProperty(notes = "设备名称") @ApiModelProperty(notes = "设备名称")
...@@ -45,11 +45,11 @@ public class RuntimeRecord { ...@@ -45,11 +45,11 @@ public class RuntimeRecord {
@ApiModelProperty(notes = "当前运行时间") @ApiModelProperty(notes = "当前运行时间")
@Column(name = "current_runtime") @Column(name = "current_runtime")
private Long currentRuntime; private BigDecimal currentRuntime;
@ApiModelProperty(notes = "累计运行时间") @ApiModelProperty(notes = "累计运行时间")
@Column(name = "total_runtime") @Column(name = "total_runtime")
private Long totalRuntime; private BigDecimal totalRuntime;
@ApiModelProperty(notes = "创建时间") @ApiModelProperty(notes = "创建时间")
@Column(name = "create_time") @Column(name = "create_time")
......
package net.vtstar.zhongtong.avi.equipment.job;
import lombok.extern.slf4j.Slf4j;
import net.vtstar.scada.base.equipmgt.domain.Enum.EquipStatusEnum;
import net.vtstar.scada.base.equipmgt.service.EquipDataService;
import net.vtstar.scada.base.gather.domain.EquipmentData;
import net.vtstar.scada.base.redis.service.SimpleRedisService;
import net.vtstar.scada.base.redis.util.EquipDataUtil;
import net.vtstar.user.mybatis.provider.Operation;
import net.vtstar.user.mybatis.provider.WhereFilter;
import net.vtstar.zhongtong.avi.equipment.domain.EquipInfo;
import net.vtstar.zhongtong.avi.equipment.domain.RuntimeRecord;
import net.vtstar.zhongtong.avi.equipment.mapper.BasicInfoMapper;
import net.vtstar.zhongtong.avi.equipment.mapper.RuntimeRecordMapper;
import net.vtstar.zhongtong.avi.equipment.service.RunRecordService;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@Slf4j
@Component
@DisallowConcurrentExecution
public class CleanAndStatisticsJob extends QuartzJobBean {
@Resource(name = "redisTemplate")
private RedisTemplate redisTemplate;
@Autowired
private EquipDataService equipDataService;
@Autowired
private SimpleRedisService simpleRedisService;
@Autowired
private RunRecordService runRecordService;
@Autowired
private RuntimeRecordMapper runtimeRecordMapper;
@Autowired
private BasicInfoMapper basicInfoMapper;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.info("_______________________________________________________________");
log.info("开始清洗设备状态数据...");
Set<String> keys = redisTemplate.keys(EquipDataUtil.getStatusKey("*"));
if (CollectionUtils.isEmpty(keys)) {
return;
}
log.info("开始清洗设备状态数据 key.size: {}", keys.size());
for (String key : keys) {
List<EquipmentData> dataList = (List<EquipmentData>) simpleRedisService.getListDelDefaultSize(key);
if (CollectionUtils.isEmpty(dataList)) {
continue;
}
equipDataService.updateLastStatus(dataList.get(dataList.size() - 1));
String equipCode = dataList.get(0).getEquipCode();
EquipmentData last = equipDataService.getLast(equipCode);
final EquipmentData first = last;
int index = 1;
long totalRuntime = 0;
for (int i = 0; i < dataList.size(); i++) {
if (last == null) {
last = dataList.get(0);
continue;
}
if (last.getBeginTime() == null || last.getEquipStatus() == null) {
redisTemplate.delete(key);
break;
}
EquipmentData d = dataList.get(i);
last.setEndTime(d.getBeginTime());
if (d.getEquipStatus() != last.getEquipStatus()) {
if (index == 1) {
equipDataService.update(last);
} else {
// 保存
equipDataService.save(last);
}
//计算累计运行时间
if (last.getEquipStatus().equals(EquipStatusEnum.RUN)) {
long runtime = last.getEndTime().getTime() - last.getBeginTime().getTime();
totalRuntime += runtime;
}
last = d;
index++;
}
}
if (first != null && first.getBeginTime().equals(last.getBeginTime())) {
equipDataService.update(last);
} else {
equipDataService.save(last);
}
RuntimeRecord lastRecord = runRecordService.getLastByCode(equipCode);
RuntimeRecord runtimeRecord = new RuntimeRecord();
runtimeRecord.setCreateTime(new Date());
BigDecimal hours = new BigDecimal(totalRuntime).divide(new BigDecimal(3600000), 4, BigDecimal.ROUND_HALF_UP);
runtimeRecord.setCurrentRuntime(hours);
BigDecimal total = BigDecimal.ZERO;
if (null != lastRecord) {
total = lastRecord.getTotalRuntime();
}
runtimeRecord.setTotalRuntime(total.add(hours));
List<EquipInfo> list = basicInfoMapper.findList(new WhereFilter() {{
addFilter(EquipInfo.class, "equip_code", Operation.EQUAL, equipCode);
}}, EquipInfo.class);
EquipInfo eqp = list.get(0);
runtimeRecord.setMachineId(eqp.getId());
runtimeRecord.setWorkshopCode(eqp.getWorkshopCode());
List<RuntimeRecord> records = new ArrayList<>();
records.add(runtimeRecord);
runtimeRecordMapper.insertLists(records);
}
}
}
package net.vtstar.zhongtong.avi.equipment.job;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class StateDataSaveJob {
}
...@@ -3,6 +3,9 @@ package net.vtstar.zhongtong.avi.equipment.mapper; ...@@ -3,6 +3,9 @@ package net.vtstar.zhongtong.avi.equipment.mapper;
import net.vtstar.user.mybatis.BaseMapper; import net.vtstar.user.mybatis.BaseMapper;
import net.vtstar.zhongtong.avi.equipment.domain.RuntimeRecord; import net.vtstar.zhongtong.avi.equipment.domain.RuntimeRecord;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* @Author: xiadongwei * @Author: xiadongwei
...@@ -10,4 +13,6 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -10,4 +13,6 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface RuntimeRecordMapper extends BaseMapper<RuntimeRecord> { public interface RuntimeRecordMapper extends BaseMapper<RuntimeRecord> {
void insertLists(@Param("records") List<RuntimeRecord> records);
} }
...@@ -3,15 +3,23 @@ package net.vtstar.zhongtong.avi.equipment.service; ...@@ -3,15 +3,23 @@ package net.vtstar.zhongtong.avi.equipment.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.vtstar.user.domain.Dict;
import net.vtstar.user.mybatis.BaseMapper;
import net.vtstar.user.mybatis.provider.Operation;
import net.vtstar.user.mybatis.provider.OrderBy; import net.vtstar.user.mybatis.provider.OrderBy;
import net.vtstar.user.mybatis.provider.WhereFilter; import net.vtstar.user.mybatis.provider.WhereFilter;
import net.vtstar.user.search.service.SearchService; import net.vtstar.user.search.service.SearchService;
import net.vtstar.zhongtong.avi.equipment.domain.*; import net.vtstar.zhongtong.avi.equipment.domain.*;
import net.vtstar.zhongtong.avi.equipment.mapper.BasicInfoMapper;
import net.vtstar.zhongtong.avi.equipment.mapper.FaultRecordMapper; import net.vtstar.zhongtong.avi.equipment.mapper.FaultRecordMapper;
import net.vtstar.zhongtong.avi.equipment.mapper.RuntimeRecordMapper; import net.vtstar.zhongtong.avi.equipment.mapper.RuntimeRecordMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -30,6 +38,10 @@ public class RunRecordService { ...@@ -30,6 +38,10 @@ public class RunRecordService {
@Autowired @Autowired
private SearchService searchService; private SearchService searchService;
@Autowired
private BasicInfoMapper basicInfoMapper;
/** /**
* 分页查询运行时间 * 分页查询运行时间
*/ */
...@@ -51,4 +63,28 @@ public class RunRecordService { ...@@ -51,4 +63,28 @@ public class RunRecordService {
addOrderBy(PaintshopStation.class, "sequence", OrderBy.ASC); addOrderBy(PaintshopStation.class, "sequence", OrderBy.ASC);
}}), PaintshopStation.class); }}), PaintshopStation.class);
} }
/**
* 根据设备编码查询上一条运行时间记录
*/
public RuntimeRecord getLastByCode(String eqpCode) {
List<RuntimeRecord> list = runtimeRecordMapper.findList(new WhereFilter() {{
addJoin(RuntimeRecord.class, "machine_id", EquipInfo.class, "id");
addFilter(EquipInfo.class, "equip_code", Operation.EQUAL, eqpCode);
addOrderBy(RuntimeRecord.class, "create_time", OrderBy.DESC);
setRows(0);
setOffset(1);
}}, RuntimeRecord.class);
if (CollectionUtils.isEmpty(list)) {
return null;
} else {
return list.get(0);
}
}
public void test() {
RuntimeRecord runtimeRecord = new RuntimeRecord();
runtimeRecord.setWorkshopCode("23232");
}
} }
...@@ -39,7 +39,7 @@ public class MybatisMySQLConfig { ...@@ -39,7 +39,7 @@ public class MybatisMySQLConfig {
public SqlSessionFactory sqlSessionFactoryMySQL() throws Exception { public SqlSessionFactory sqlSessionFactoryMySQL() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource); factoryBean.setDataSource(dataSource);
//factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml")); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"));
return factoryBean.getObject(); return factoryBean.getObject();
} }
......
package net.vtstar.zhongtong.avi.global.config; package net.vtstar.zhongtong.avi.global.config;
import net.vtstar.scada.base.quartz.properties.QuartzProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration @Configuration
@EnableScheduling @EnableConfigurationProperties(QuartzProperties.class)
public class SchedulingConfig { public class QuartzConfig {
} }
package net.vtstar.zhongtong.avi.global.web.domain.enums; package net.vtstar.zhongtong.avi.global.web.domain.enums;
import io.swagger.annotations.ApiModel;
@ApiModel("前端数据类型")
public enum FieldType { public enum FieldType {
/**
* 字符串
*/
STRING, STRING,
/**
* 数值
*/
NUMBER, NUMBER,
/**
* 时间戳
*/
DATETIME, DATETIME,
/**
* 枚举
*/
ENUMS; ENUMS;
} }
...@@ -5,7 +5,6 @@ import net.vtstar.scada.base.equipmgt.domain.Enum.EquipStatusEnum; ...@@ -5,7 +5,6 @@ import net.vtstar.scada.base.equipmgt.domain.Enum.EquipStatusEnum;
import net.vtstar.scada.base.gather.domain.EquipmentData; import net.vtstar.scada.base.gather.domain.EquipmentData;
import net.vtstar.scada.base.gather.job.GatherJob; import net.vtstar.scada.base.gather.job.GatherJob;
import net.vtstar.zhongtong.avi.stamping.domain.LaserCuttingMachine; import net.vtstar.zhongtong.avi.stamping.domain.LaserCuttingMachine;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -15,7 +14,6 @@ import org.springframework.stereotype.Component; ...@@ -15,7 +14,6 @@ import org.springframework.stereotype.Component;
*/ */
@Slf4j @Slf4j
@Component @Component
@DisallowConcurrentExecution
public class LaserCuttingMachineJob extends GatherJob { public class LaserCuttingMachineJob extends GatherJob {
private static final String NAME = "3D_LASER_CUTTING"; private static final String NAME = "3D_LASER_CUTTING";
...@@ -41,6 +39,9 @@ public class LaserCuttingMachineJob extends GatherJob { ...@@ -41,6 +39,9 @@ public class LaserCuttingMachineJob extends GatherJob {
case 1: case 1:
equipmentData.setEquipStatus(EquipStatusEnum.RUN); equipmentData.setEquipStatus(EquipStatusEnum.RUN);
break; break;
case 2:
equipmentData.setEquipStatus(EquipStatusEnum.ALARM);
break;
default: default:
return false; return false;
} }
......
spring.profiles.include=mybatis,quartz,swagger,security spring.profiles.include=mybatis,quartz,swagger,security
# Mysql # Mysql
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://10.100.172.135:3306/zhongtong_dev?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
#spring.datasource.username=zhongtongdev
#spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zhongtong_dev?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.url=jdbc:mysql://localhost:3306/zhongtong_dev?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root spring.datasource.username=root
......
# scheduler(Quartz) # scheduler(Quartz)
spring.quartz.job-store-type=jdbc spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=ALWAYS spring.quartz.jdbc.initialize-schema=always
spring.quartz.jdbc.comment-prefix=-- spring.quartz.jdbc.comment-prefix=#
spring.quartz.startupDelay=2s spring.quartz.startupDelay=2s
spring.quartz.auto-startup=true #spring.quartz.auto-startup=true
spring.quartz.properties.org.quartz.scheduler.instanceName=myScheduler-scada spring.quartz.properties.org.quartz.scheduler.instanceName=myScheduler-scada
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.isClustered=true
...@@ -24,4 +24,16 @@ quartz.job.taskInfos[0].jobName=net.vtstar.zhongtong.avi.stamping.job.LaserCutti ...@@ -24,4 +24,16 @@ quartz.job.taskInfos[0].jobName=net.vtstar.zhongtong.avi.stamping.job.LaserCutti
quartz.job.taskInfos[0].jobGroup=LaserCuttingMachineJob quartz.job.taskInfos[0].jobGroup=LaserCuttingMachineJob
quartz.job.taskInfos[0].jobDescription=\u5C01\u88C5\u7EBF\u9884\u710A\u673A\u6570\u636E\u91C7\u96C6job quartz.job.taskInfos[0].jobDescription=\u5C01\u88C5\u7EBF\u9884\u710A\u673A\u6570\u636E\u91C7\u96C6job
quartz.job.taskInfos[0].cronExpression=0/10 * * * * ? quartz.job.taskInfos[0].cronExpression=0/10 * * * * ?
quartz.job.taskInfos[0].start=true quartz.job.taskInfos[0].start=false
\ No newline at end of file
quartz.job.taskInfos[1].jobName=net.vtstar.zhongtong.avi.equipment.job.CleanAndStatisticsJob
quartz.job.taskInfos[1].jobGroup=CleanAndStatisticsJob
quartz.job.taskInfos[1].jobDescription=\u6E05\u6D17\u8BBE\u5907\u72B6\u6001Job
quartz.job.taskInfos[1].cronExpression=0 0 0 * * ?
quartz.job.taskInfos[1].start=false
#quartz.job.taskInfos[2].jobName=net.vtstar.scada.base.equipmgt.job.CleanEquipStatusJob
#quartz.job.taskInfos[2].jobGroup=CleanEquipStatusJob
#quartz.job.taskInfos[2].jobDescription=\u6E05\u6D17\u8BBE\u5907\u72B6\u6001Job
#quartz.job.taskInfos[2].cronExpression=0/20 * * * * ?
#quartz.job.taskInfos[2].start=true
\ No newline at end of file
...@@ -2,4 +2,26 @@ ...@@ -2,4 +2,26 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="net.vtstar.zhongtong.avi.equipment.mapper.RuntimeRecordMapper"> <mapper namespace="net.vtstar.zhongtong.avi.equipment.mapper.RuntimeRecordMapper">
<insert id="insertLists" parameterType="java.util.List">
insert into
machine_runtime_record
(
workshop_code,
machine_id,
current_runtime,
total_runtime,
create_time
)
values
<foreach collection="records" item="record" separator="," index="index">
(
#{record.workshopCode},
#{record.machineId},
#{record.currentRuntime},
#{record.totalRuntime},
#{record.createTime}
)
</foreach>
</insert>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment