Commit eeed6c73 authored by 董国亮's avatar 董国亮

修订绿波下发接口

parent 72909caa
#!/bin/bash
jarName="signal-control-service-1.0.0.jar"
jarName="signal-control-service-0.2.1.jar"
NR=$(ps -ef | grep "${jarName}" | grep -v grep | wc -l)
if [ ${NR} != 0 ]
......@@ -16,4 +16,4 @@ sleep 2
echo "重启Java程序进程..."
nohup java -Xms2048m -Xmx2048m -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/javaApp/heapdump.hprof -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15115 -Djava.rmi.server.hostname=10.100.1.87 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false signal-control-service-1.0.0.jar --spring.profiles.active=dev >/dev/null 2>&1 &
nohup java -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/javaApp/heapdump.hprof -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15115 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../lib/$jarName --spring.profiles.active=docker >/dev/null 2>&1 &
\ No newline at end of file
......@@ -14,18 +14,24 @@ import java.util.Collections;
public class MybatisPlusGenerator {
private static final String PROJECT_PATH = System.getProperty("user.dir");
private static final String OUTPUT_DIR = "signal-control-service/src/main/java";
private static final String AUTHOR = "wj";
private static final String URL = "jdbc:mysql://106.120.201.126:14726/t_signal_control?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&useSSL=false&useCursorFetch=true";
private static final String OUTPUT_DIR = "signal-optimize-service/src/main/java";
private static final String AUTHOR = "guoliang.dong";
private static final String URL = "jdbc:mysql://106.120.201.126:14726/wjdit_ecosystem_db_v1.0.0?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&useSSL=false&useCursorFetch=true";
private static final String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
private static final String USERNAME = "root";
private static final String PASSWORD = "Wanji300552";
private static final String[] TABLES = {
"t_base_area_info"
"t_device_induces"
};
/**
* t_greenwave_induces
* t_greenwave_induces_hist
* t_induce_hist
* t_induce_template
*/
private static final String TEMPLATE_PATH = "/templates/mapper.xml.ftl";
private static final String MAPPER_PATH = "signal-control-service/src/main/resources/mapper/";
private static final String PARENT = "net.wanji.web";
private static final String MAPPER_PATH = "signal-optimize-service/src/main/resources/mapper/";
private static final String PARENT = "net.wanji.opt";
public static void main(String[] args) {
......
......@@ -90,6 +90,7 @@ public class GreenwaveInducesController {
induceDTO.setRidDir(deviceInduces.get(0).getRidDir());
induceDTO.setResolutionWidth(deviceInduces.get(0).getResolutionWidth());
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());
induceDTO.setWkt(deviceInduces.get(0).getWkt());
}
//获取上屏状态
induceDTO.setStatus(o.getStatus());
......
package net.wanji.opt.controller.induce;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import freemarker.template.TemplateException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.Constants;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.entity.InduceHist;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.dto.induce.MessageParam;
import net.wanji.opt.service.induce.GreenwaveInducesService;
import net.wanji.opt.service.induce.InduceHistService;
import net.wanji.opt.service.induce.InduceSendService;
import net.wanji.opt.service.induce.InduceTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -15,8 +23,11 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;
@Api(value = "InduceSendController", description = "诱导屏-下发消息接口(对接易华录)")
@RestController
......@@ -27,10 +38,16 @@ public class InduceSendController {
@Autowired
private InduceSendService induceSendService;
@Autowired
private InduceHistService induceHistService;
@Autowired
private InduceTemplateService induceTemplateService;
@Autowired
private GreenwaveInducesService greenwaveInducesService;
@ApiOperation(value = "发送诱导信息", notes = "发送诱导信息", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@PostMapping("/send")
public JsonViewObject send(@RequestBody MessageParam param) {
JsonViewObject jsonView = JsonViewObject.newInstance();
......@@ -39,30 +56,98 @@ public class InduceSendController {
return jsonView.success();
} catch (Exception e) {
log.info(e.getMessage());
return jsonView.fail("发送失败");
return jsonView.fail("发送诱导信息失败");
}
}
@ApiOperation(value = "按绿波带编号批量发送诱导信息", notes = "按绿波带编号批量发送诱导信息", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@PostMapping("/batchSend")
public JsonViewObject batchSend(@RequestBody MessageParam param) {
JsonViewObject jsonView = JsonViewObject.newInstance();
try {
//查询绿波带信息,关联绿波路口,根据绿波路口查询关联诱导屏下发
LambdaQueryWrapper<GreenwaveInduces> greenwaveInducesQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesQueryWrapper.eq(GreenwaveInduces::getGreenId, param.getGreenId());
List<GreenwaveInduces> greenwaveInducesList=greenwaveInducesService.list(greenwaveInducesQueryWrapper);
for(GreenwaveInduces greenwaveInduces:greenwaveInducesList)
{
LambdaQueryWrapper<InduceTemplate> induceTemplateQueryWrapper = new LambdaQueryWrapper<>();
induceTemplateQueryWrapper.eq(InduceTemplate::getEquipCode, greenwaveInduces.getEquipCode());
List<InduceTemplate> induceTemplateList=induceTemplateService.list(induceTemplateQueryWrapper);
for(InduceTemplate induceTemplate:induceTemplateList) {
param.setTemplateId(induceTemplate.getId());
param.setInduceId(greenwaveInduces.getId());
param.setEquipCode(greenwaveInduces.getEquipCode());
param.setPlayorder(induceTemplateList.size());
param.setDuration(greenwaveInduces.getDuration());
param.setStartTime(DateUtil.format(new Date(), Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND));
param.setEndTime(DateUtil.format(System.currentTimeMillis() + 1000 * 30, Constants.DATE_FORMAT.E_DATE_FORMAT_SECOND));
induceSendService.send(param);
}
}
return jsonView.success();
} catch (Exception e) {
log.info(e.getMessage());
return jsonView.fail("批量发布诱导信息失败");
}
}
/**
* 获取诱导发布图片
*/
@ApiOperation(value = "根据设备编号获取诱导发布图片", notes = "根据设备编号获取诱导发布图片")
@GetMapping(value = "/fileCode")
public ResponseEntity<byte[]> ftpFileByCode(@RequestParam("equipCode") String equipCode) {
// 根据 equipCode 获取文件名
LambdaQueryWrapper<InduceHist> InduceHistQueryWrapper = new LambdaQueryWrapper<>();
InduceHistQueryWrapper.eq(InduceHist::getEquipCode, equipCode);
InduceHistQueryWrapper.orderByDesc(InduceHist::getCreateTime);
InduceHist pictureFile = this.induceHistService.getOne(InduceHistQueryWrapper,false);
if (pictureFile == null) {
return ResponseEntity.status(HttpStatus.OK)
.body("无效的文件ID".getBytes(StandardCharsets.UTF_8));
}
try {
// 获取ftp服务器图片
byte[] imageBytes = this.induceSendService.downloadImage(pictureFile.getFilePath());
if (imageBytes != null && imageBytes.length > 0) {
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "image/jpeg"); // 图片类型
headers.set("Content-Length", String.valueOf(imageBytes.length)); // 设置内容长度
headers.set("Content-Disposition", "inline; filename=\"" + pictureFile.getSourceId() + ".bmp\""); // 设置文件名
// 返回响应
return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
} else {
return ResponseEntity.status(HttpStatus.OK)
.body("未查询到对应文件".getBytes(StandardCharsets.UTF_8));
}
} catch (IOException e) {
log.error("ftp文件下载失败: ", e.getMessage());
return ResponseEntity.status(HttpStatus.OK)
.body("程序查询错误请联系管理员".getBytes(StandardCharsets.UTF_8));
}
}
/**
* 获取ftp图片
*/
@GetMapping(value = "/file")
public ResponseEntity<byte[]> ftpFile(@RequestParam("fileId") Long fileId) {
// 根据 fileId 获取文件名
InduceTemplate pictureFile = this.induceTemplateService.getById(fileId);
InduceHist pictureFile = this.induceHistService.getById(fileId);
if (pictureFile == null) {
return ResponseEntity.status(HttpStatus.OK)
.body("无效的文件ID".getBytes(StandardCharsets.UTF_8));
}
try {
// 获取ftp服务器图片
byte[] imageBytes = this.induceSendService.downloadImage(pictureFile.getFileName());
byte[] imageBytes = this.induceSendService.downloadImage(pictureFile.getFilePath());
if (imageBytes != null && imageBytes.length > 0) {
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "image/jpeg"); // 图片类型
headers.set("Content-Length", String.valueOf(imageBytes.length)); // 设置内容长度
headers.set("Content-Disposition", "inline; filename=\"" + pictureFile.getFileName() + "\""); // 设置文件名
headers.set("Content-Disposition", "inline; filename=\"" + pictureFile.getSourceId() + ".bmp\""); // 设置文件名
// 返回响应
return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK);
} else {
......
......@@ -3,10 +3,15 @@ package net.wanji.opt.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.opt.po.StrategyGreenOptHistEntity;
import java.util.List;
/**
* @author duanruiming
* @date 2024/11/19 18:02
* @description 神思推送绿波时序图信息
*/
public interface StrategyGreenOptHistMapper extends BaseMapper<StrategyGreenOptHistEntity> {
List<StrategyGreenOptHistEntity> selectByGreenId(String greenId);
}
package net.wanji.opt.dao.mapper.trend;
//import com.baomidou.dynamic.datasource.annotation.DS;
import net.wanji.opt.po.trend.EventAlarmPO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
//import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Repository
//@Repository
//@DS("webService")
public interface EventAlarmMapper {
List<EventAlarmPO> selectByTodayTime(@Param("todayTime") Date todayTime);
}
\ No newline at end of file
......@@ -33,6 +33,8 @@ public class InduceDTO {
@ApiModelProperty(name = "屏幕分辨率高度")
private BigDecimal resolutionHeight;
@ApiModelProperty(name = "设备坐标")
private String wkt;
@ApiModelProperty(name = "关联绿波信息")
private List<GreenwaveDTO> greenwaveList;
......
......@@ -39,7 +39,7 @@ public class MessageParam {
// private MultipartFile file;
@ApiModelProperty(value = "开始时间,格式 2024-11-07 00:00:00")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private String starTtime="";
private String startTime="";
@ApiModelProperty(value = "结束时间,格式 2024-11-07 00:00:00")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
......
......@@ -76,6 +76,18 @@ public class GreenwaveInduces implements Serializable {
@TableField("status")
private Integer status;
/**
* 节目顺序号 顺着往下排
*/
@TableField("playorder")
private Integer playorder;
/**
* 为每一屏的停留时间
*/
@TableField("duration")
private Integer duration;
/**
* 创建时间
*/
......
......@@ -105,17 +105,7 @@ public class GreenwaveInducesHist implements Serializable {
@TableField("control_opt_times")
private String controlOptTimes;
/**
* 节目顺序号 顺着往下排
*/
@TableField("playorder")
private Integer playorder;
/**
* 为每一屏的停留时间
*/
@TableField("duration")
private Integer duration;
}
package net.wanji.opt.po.trend;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.data.annotation.Id;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_event_data")
@ApiModel(value = "EventAlarmPO", description = "交通事件表")
public class EventAlarmPO {
/** 主键 */
@Id
......
package net.wanji.opt.service.induce.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.entity.DeviceInduces;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.entity.InduceHist;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.dto.induce.MessageParam;
import net.wanji.opt.service.DeviceInducesService;
import net.wanji.opt.service.induce.*;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
......@@ -44,6 +47,9 @@ public class InduceSendServiceImpl implements InduceSendService {
@Autowired
private GreenwaveInducesService greenwaveInducesService;
@Autowired
private DeviceInducesService deviceInducesService;
@Autowired
private Configuration freemarkerConfig;
......@@ -78,16 +84,22 @@ public class InduceSendServiceImpl implements InduceSendService {
GreenwaveInduces greenwaveinduces=greenwaveInducesService.getById(param.getInduceId());
// 读取图片模板参数
InduceTemplate induceTemplate = induceTemplateService.getById(param.getTemplateId());
if(param.getFlg()==1) {
LambdaQueryWrapper<DeviceInduces> deviceQueryWrapper = new LambdaQueryWrapper<>();
deviceQueryWrapper.eq(DeviceInduces::getEquipCode, induceTemplate.getEquipCode());
DeviceInduces deviceInduces = deviceInducesService.getOne(deviceQueryWrapper);
param.setResolutionWidth(deviceInduces.getResolutionWidth().intValue());
param.setResolutionHeight(deviceInduces.getResolutionHeight().intValue());
}
// 获取图片字节数组
byte[] imageBytes = induceTemplate.getFileContent();
if (imageBytes != null || imageBytes.length > 0) {
// 将字节数组转换为字节对象
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
// 修改图像中文字
addTextToImage(image, param.getContents(), induceTemplate.getTextX(), induceTemplate.getTextY(), induceTemplate.getTextSize(), induceTemplate.getTextSign());
// 测试阶段保存图片到本地
//ImageIO.write(image, "bmp", new File("/Users/shen/Desktop/" + pictureFile.getFileName()));
//ImageIO.write(image, "bmp", new File("D:\\tmp\\" + induceTemplate.getFileName()));
// 上传文件至ftp
if (param.getFlg() == 1) {
String dirName=LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
......@@ -95,6 +107,7 @@ public class InduceSendServiceImpl implements InduceSendService {
String filePath = uploadFile(image,dirName, fileName);
param.setFtpPath(filePath);
induceHist.setFilePath(PATH + dirName+"/"+fileName);
greenwaveinduces.setSourceId(PATH + dirName+"/"+fileName);
}
log.info("上传文件至ftp-filePath:{}", param.getFtpPath());
// //如果已发布,则调用下屏服务
......@@ -121,25 +134,23 @@ public class InduceSendServiceImpl implements InduceSendService {
// 可以去掉反斜杠
// message = message.replace("\\", "");
// 创建MessageProperties并设置内容类型
MessageProperties messageProperties = new MessageProperties();
messageProperties.setContentType("text/plain"); // 设置内容类型为text/plain
// MessageProperties messageProperties = new MessageProperties();
// messageProperties.setContentType("text/plain"); // 设置内容类型为text/plain
// 创建Message并设置内容
Message messageSend = new Message(message.getBytes(), messageProperties);
rabbitTemplate.convertAndSend("",queueName, messageSend);
log.info("mqtt发送信息-topic:{},queueName:{},message:{}", queueName, messageSend);
// Message messageSend = new Message(message.getBytes(), messageProperties);
//rabbitTemplate.convertAndSend("",queueName, message);
log.info("mqtt发送信息-topic:{},queueName:{},message:{}", queueName, message);
//1、增加下发记录log 2、计数 3、标记已发布状体
induceHist.setEquipCode(induceTemplate.getEquipCode());
induceHist.setGreenId(param.getGreenId());
induceHistService.save(induceHist);
//保存旅游诱导状态信息
//保存诱导状态信息
greenwaveinduces.setInducesCount(Objects.isNull(greenwaveinduces.getInducesCount()) ? 0 : greenwaveinduces.getInducesCount()+1);
greenwaveinduces.setStatus(1);
greenwaveinduces.setSourceId(messageId);
greenwaveInducesService.saveOrUpdate(greenwaveinduces);
}
}
@Override
public String uploadFile(BufferedImage image,String directoryName, String fileName) {
ByteArrayInputStream inputStream = null;
......
package net.wanji.opt.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.databus.dao.entity.GreenwaveCrossPOExt;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import net.wanji.databus.dao.mapper.GreenwaveInfoMapper;
import net.wanji.opt.dao.mapper.StrategyDailyPlanInfoMapper;
import net.wanji.opt.dao.mapper.StrategyGreenOptHistMapper;
import net.wanji.opt.dao.mapper.StrategyPlanInfoMapper;
import net.wanji.opt.dto.induce.MessageParam;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.entity.GreenwaveInducesHist;
import net.wanji.opt.po.StrategyGreenOptHistEntity;
import net.wanji.databus.dao.entity.GreenwaveInfoPO;
import net.wanji.opt.service.induce.GreenwaveInducesHistService;
import net.wanji.opt.service.induce.GreenwaveInducesService;
import net.wanji.opt.service.induce.InduceSendService;
import net.wanji.opt.synthesis.pojo.StrategyControlDetailList;
import net.wanji.opt.synthesis.pojo.StrategyDailyPlanInfoEntity;
import net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity;
import net.wanji.opt.vo.GreenBeltInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
/**
* @author guoliang.dong
* @date 2024/11/21 19:18
* @desc 诱导信息下发监测
*/
@RequiredArgsConstructor
@Component
@Slf4j
public class InducesMonitorTask {
@Autowired
private final GreenwaveInfoMapper greenwaveInfoMapper;
@Autowired
private final GreenwaveCrossMapper greenwaveCrossMapper;
@Autowired
private final StrategyPlanInfoMapper strategyPlanInfoMapper;
@Autowired
private final StrategyDailyPlanInfoMapper strategyDailyPlanInfoMapper;
@Autowired
private StrategyGreenOptHistMapper strategyGreenOptHistMapper;
@Autowired
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
@Autowired
private final GreenwaveInducesHistService greenwaveInducesHistService;
@Autowired
private final GreenwaveInducesService greenwaveInducesService;
@Autowired
private InduceSendService induceSendService;
/**
* #绿波调度计划扫描周期
* 5 分钟 300000
*/
//@Scheduled(fixedRate = 30000)
public void refresh() throws Exception {
long start = System.currentTimeMillis();
AtomicLong synCount = new AtomicLong();
try {
log.info("每5分钟刷新绿波优化下发数据...................");
// List<GreenwaveInfoPO> greenwaveInfoPOList=greenwaveInfoMapper.selectAll();
// for(GreenwaveInfoPO greenwaveInfoPO :greenwaveInfoPOList) {
//1、查询所有绿波带路口信息,获取路口下的绿波策略计划
List<GreenwaveCrossPOExt> greenwaveCrossList = greenwaveCrossMapper.selectAllGreeenCross();
greenwaveCrossList.stream().forEach(o -> {
//System.out.println("绿波路口--->"+o.getGreenwaveName()+"=="+o.getCrossId());
AtomicBoolean flag = new AtomicBoolean(false);//是否已发布优化
//创建路口策略列表
List<StrategyPlanInfoEntity> strategyPlanInfoEntityList = strategyPlanInfoMapper.selectByCrossId(o.getCrossId());
//strategyPlanInfoEntityList.stream().filter(x->Objects.nonNull(x.getCrossId()) && x.getCrossId().equals(o.getCrossId()) ).forEach(x->
for (StrategyPlanInfoEntity strategyPlanInfoEntity : strategyPlanInfoEntityList) {
//System.out.println("策略计划--->"+x.getCrossId()+"=="+x.getPlanDetails());
//2、检查绿波时段,判断是否在绿波时段内,如果不在,则判断是否执行过上屏操作,如果执行过,则调用下屏服务(此出屏幕自动处理,无需逻辑)
//[{"dailyPlanId":1,"weeks":[1,2,3,4,5]}]
List<StrategyControlDetailList.ExecutePlan.PlanDetail> planDetails = new ArrayList<>();
try {
planDetails = JacksonUtils.getInstance().readValue(strategyPlanInfoEntity.getPlanDetails(), new TypeReference<List<StrategyControlDetailList.ExecutePlan.PlanDetail>>() {
});
} catch (JsonProcessingException e) {
log.error("策略周计划详情转换失败:" + strategyPlanInfoEntity.getPlanId() + "---" + e.getMessage());
}
//处理日计划的时间拼合处理
if (!CollectionUtils.isEmpty(planDetails)) {
for (StrategyControlDetailList.ExecutePlan.PlanDetail planDetail : planDetails) {
Integer dailyPlanId = planDetail.getDailyPlanId();
List<Integer> weeks = planDetail.getWeeks();
//获取当前周几,判断是否在时间范围内
if (weeks.contains(LocalDate.now().getDayOfWeek().getValue())) {
LambdaQueryWrapper<StrategyDailyPlanInfoEntity> dailyPlanQueryWrapper = new LambdaQueryWrapper<>();
dailyPlanQueryWrapper.eq(StrategyDailyPlanInfoEntity::getCrossId, strategyPlanInfoEntity.getCrossId());
dailyPlanQueryWrapper.eq(StrategyDailyPlanInfoEntity::getDailyPlanId, dailyPlanId);
List<StrategyDailyPlanInfoEntity> dailyPlanInfoEntities = strategyDailyPlanInfoMapper.selectList(dailyPlanQueryWrapper);
dailyPlanInfoEntities.stream().forEach(p -> {
System.out.println("plan detail->" + p.getDailyPlanDetails());
List<StrategyControlDetailList.DailyPlan.DailyPlanDetail> dailyPlanDetails = new ArrayList<>();
try {
dailyPlanDetails = JacksonUtils.getInstance().readValue(p.getDailyPlanDetails(), new TypeReference<List<StrategyControlDetailList.DailyPlan.DailyPlanDetail>>() {
});
} catch (JsonProcessingException e) {
log.error("策略日计划详情转换失败:" + p.getDailyPlanId() + "---" + e.getMessage());
}
for (StrategyControlDetailList.DailyPlan.DailyPlanDetail dailyPlanDetail : dailyPlanDetails) {
//[{"strategy":1,"times":["00:00","20:00"]},{"strategy":2,"times":["20:00","23:59"]}]
if (!CollectionUtils.isEmpty(dailyPlanDetail.getTimes())) {
LocalTime startTime = LocalTime.parse(dailyPlanDetail.getTimes().get(0));
LocalTime endTime = LocalTime.parse(dailyPlanDetail.getTimes().get(1));
// 判断当前时间是否在范围内
if (LocalTime.now().isAfter(startTime) && LocalTime.now().isBefore(endTime)) {
System.out.println("当前时间在范围内: " + LocalTime.now());
//3、如果在绿波时段内,未上屏,则获取固定配时绿波信息
//4、获取优化绿波方案,如果不存在,则执行固定绿波方案
List<StrategyGreenOptHistEntity> strategyGreenOptHistEntitiesList = strategyGreenOptHistMapper.selectByGreenId(String.valueOf(o.getGreenId())).stream().distinct().collect(Collectors.toList());
if (Objects.nonNull(strategyGreenOptHistEntitiesList)) {
for (StrategyGreenOptHistEntity greenOptHistEntity : strategyGreenOptHistEntitiesList) {
LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, o.getGreenId());
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getDir, getDir(greenOptHistEntity.getDir()));
GreenwaveInducesHist greenwaveInducesHist = greenwaveInducesHistService.getOne(greenwaveInducesHistQueryWrapper);
if (Objects.isNull(greenwaveInducesHist)) {
greenwaveInducesHist = new GreenwaveInducesHist();
greenwaveInducesHist.setCreateTime(new Date());
greenwaveInducesHist.setGreenId(o.getGreenId());
greenwaveInducesHist.setDir(getDir(greenOptHistEntity.getDir()));
}
greenwaveInducesHist.setStrategyId(strategyPlanInfoEntity.getPlanId());
greenwaveInducesHist.setStrategyName(o.getGreenwaveName());//当前策略名称
greenwaveInducesHist.setControlOptTimes(greenOptHistEntity.getControlTime());//执行时段
greenwaveInducesHist.setType(strategyPlanInfoEntity.getType());// 执行策略
greenwaveInducesHist.setMinSpeed(greenOptHistEntity.getMinSpeed());
greenwaveInducesHist.setMaxSpeed(greenOptHistEntity.getMaxSpeed());
greenwaveInducesHist.setDir(greenOptHistEntity.getDirType());
//5、获取绿波信息,调用上屏服务;发布互联网诱导方案
flag.set(true);
//[{"crossId":"13MOD0B5SI0","phaseStartTime":32.0,"phaseEndTime":122.0,"greenStartTime":35.0,"speed":"39.71","offset":208.0,"travelTime":57.0,"distance":"628.81"},{"crossId":"13MQJ0B5SI0","phaseStartTime":43.0,"phaseEndTime":158.0,"greenStartTime":0.0,"speed":"35.54","offset":69.0,"travelTime":42.0,"distance":"414.62"},{"crossId":"13MS20B5SI0","phaseStartTime":32.0,"phaseEndTime":142.0,"greenStartTime":8.0,"speed":"22.72","offset":114.0,"travelTime":116.0,"distance":"732.00"},{"crossId":"13MUK0B5SH0","phaseStartTime":0.0,"phaseEndTime":135.0,"greenStartTime":0.0,"speed":"42.33","offset":50.0,"travelTime":45.0,"distance":"529.16"},{"crossId":"13N0F0B5SH0","phaseStartTime":25.0,"phaseEndTime":156.0,"greenStartTime":70.0,"speed":"40.67","offset":0.0,"travelTime":40.0,"distance":"451.89"},{"crossId":"13N200B5SH0","phaseStartTime":23.0,"phaseEndTime":150.0,"greenStartTime":0.0,"speed":"-1.00","offset":112.0,"travelTime":-1.0,"distance":"-1.00"}]
List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetailList = new ArrayList<>();
try {
crossGreenDetailList = JacksonUtils.getInstance().readValue(greenOptHistEntity.getCrossGreenDetail(), new TypeReference<List<GreenBeltInfoVO.CrossGreenDetail>>() {
});
} catch (JsonProcessingException e) {
log.error("绿波详情转换失败:" + greenOptHistEntity.getGreenId() + "---" + e.getMessage());
}
greenwaveInducesHist.setStatus(1);
greenwaveInducesHistService.saveOrUpdate(greenwaveInducesHist);
synCount.getAndIncrement();
log.info("同步绿波状态信息成功->" + o.getPlanName());
}
}
}
}
}
});
}
}
}
}
//如果没有绿波方案则调用下屏服务
if (!flag.get()) {
LambdaQueryWrapper<GreenwaveInducesHist> greenwaveInducesHistQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesHistQueryWrapper.eq(GreenwaveInducesHist::getGreenId, o.getGreenId());
List<GreenwaveInducesHist> greenwaveInducesHistList = greenwaveInducesHistService.list(greenwaveInducesHistQueryWrapper);
greenwaveInducesHistList.stream().forEach(n -> {
//调用下屏
try {
if (n.getStatus() == 1) {
MessageParam messageParam = new MessageParam();
messageParam.setFlg(2);
LambdaQueryWrapper<GreenwaveInduces> greenwaveInducesQueryWrapper = new LambdaQueryWrapper<>();
greenwaveInducesQueryWrapper.eq(GreenwaveInduces::getGreenId, o.getGreenId());
List<GreenwaveInduces> greenwaveInducesList = greenwaveInducesService.list(greenwaveInducesQueryWrapper);
greenwaveInducesList.stream().forEach(v -> {
messageParam.setEquipCode(v.getEquipCode());
messageParam.setSourceId(v.getSourceId());
messageParam.setType("TFMH");
//induceSendService.send(messageParam);//临时屏蔽此处功能,因为上屏的时候可以设置生效时间
log.info("发送下屏信息成功.");
});
}
} catch (Exception e) {
log.error("发送下屏信息失败");
}
//保存绿波状态
n.setStatus(0);
//greenwaveInducesHistService.saveOrUpdate(n);
log.info("同步绿波状态信息(下屏)->" + o.getPlanName());
synCount.getAndIncrement();
});
}
});
//}
} catch (Exception e) {
throw new Exception("每5分钟刷新绿波下发状态失败", e);
} finally {
log.info("当前运行同步绿波下发状态数据,耗时:{}ms,共同步{}条数据。", System.currentTimeMillis() - start, synCount);
}
}
/**
* 根据角度获取方向
* @param dirType
* 路段走向:1 南向北
* 2 西向东
* 3 北向南
* 4 东向西
* @return
*/
private Integer getDir(String dirType) {
if (dirType=="e2w") { //东
return 4;
} else if (dirType=="s2n") {//南
return 1;
} else if (dirType=="w2e") {//西
return 2;
} else if (dirType=="n2s") {//北
return 3;
}
return null;
}
public static void main(String []args){
// 获取当前时间
LocalTime now = LocalTime.now();
List<String> timesList=new ArrayList();
timesList.add("00:00");
timesList.add("23:59");
// 定义时间范围
LocalTime startTime = LocalTime.parse(timesList.get(0));
LocalTime endTime = LocalTime.parse(timesList.get(1));
// 判断当前时间是否在范围内
if (now.isAfter(startTime) && now.isBefore(endTime)) {
System.out.println("当前时间在范围内: " + now);
} else if (now.equals(startTime) || now.equals(endTime)) {
System.out.println("当前时间恰好在范围边界: " + now);
} else {
System.out.println("当前时间不在范围内: " + now);
}
}
}
#!/bin/bash
jarName="signal-control-service-0.2.1.jar"
NR=$(ps -ef | grep "${jarName}" | grep -v grep | wc -l)
if [ ${NR} != 0 ]
then
ps -ef | grep -v grep | grep "${jarName}" |
while read u p o
do
echo "结束Java程序进程..."
kill -9 $p
done
fi
sleep 2
echo "重启Java程序进程..."
nohup java -Xms2048m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/javaApp/heapdump.hprof -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=15115 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../lib/$jarName --spring.profiles.active=docker >/dev/null 2>&1 &
\ No newline at end of file
......@@ -3,7 +3,7 @@
<systemtype>VMS</systemtype>
<messagetype>CONTROL</messagetype>
<!--token-->
<sourceIP>${sourceid}</sourceIP>
<sourceIP>${sourceId}</sourceIP>
<targetIP></targetIP>
<user></user>
<password></password>
......@@ -11,7 +11,7 @@
<tasktype>deletelistandfile</tasktype>
<taskdetail>
<!--屏体ID 由现场提供-->
<ledid>${vmsid}</ledid>
<ledid>${equipCode}</ledid>
</taskdetail>
<!--节目类型 TFM 路况 TFMH 独占 TAM 交通事件-->
<senderinfo>${type}</senderinfo>
......
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