Commit f4e905a2 authored by zhouleilei's avatar zhouleilei

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	signal-feign-service/src/main/resources/application-docker.properties
parents 139b9b1f 27636fc2
utc.service.url=http://37.12.182.29:32000/utc utc.service.url=http://173.0.0.1:32000/utc
utc.dt.service.url=http://37.12.182.29:39002/utc-dt utc.dt.service.url=http://173.0.0.1:39002/utc-dt
utc.hisense.service.url=http://37.12.182.29:39003/utc-hisense utc.hisense.service.url=http://173.0.0.1:39003/utc-hisense
control.url=http://37.12.182.29:32001/web control.url=http://173.0.0.1:32001/web
ehualu.url=http://173.0.0.1:30015
...@@ -47,6 +47,14 @@ ...@@ -47,6 +47,14 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
...@@ -120,6 +128,18 @@ ...@@ -120,6 +128,18 @@
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
</dependency> </dependency>
<!-- rabbitmq -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
<!-- ftp上传下载-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.7</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
...@@ -288,6 +308,97 @@ ...@@ -288,6 +308,97 @@
</executions> </executions>
</plugin> </plugin>
<!-- maven 打包方式-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<!--<version>2.6</version>-->
<executions>
<!--将启动脚本复制到指定目录-->
<execution>
<id>copy-bin</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.parent.basedir}/assembly/${project.name}/bin</outputDirectory>
<resources>
<resource>
<directory>src/main/resources/bin</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
<!--将配置文件复制到指定目录-->
<execution>
<id>copy-configs</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.parent.basedir}/assembly/${project.name}/resources
</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/bin/*</exclude>
</excludes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<!--将依赖jar包复制到lib目录-->
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.parent.basedir}/assembly/${project.name}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<!--指定生成jar包目录-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!--<classpathPrefix>lib/</classpathPrefix>-->
<classpathPrefix></classpathPrefix>
<mainClass> net.wanji.opt.SignalOptimizeApplication</mainClass>
</manifest>
<manifestEntries>
<Class-Path>../resources/</Class-Path>
</manifestEntries>
</archive>
<excludes>
<exclude>*.**</exclude>
<exclude>*/*.xml</exclude>
<!--<exclude>configs/**/**</exclude>-->
</excludes>
<outputDirectory>${project.parent.basedir}/assembly/${project.name}/lib</outputDirectory>
<classesDirectory>
</classesDirectory>
</configuration>
</plugin>
</plugins> </plugins>
</build> </build>
......
package net.wanji.opt.common;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
@EnableAutoConfiguration
public class RedisConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.database}")
private int database;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxTotal;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Value("${spring.redis.jedis.pool.max-wait}")
private long maxWaitMillis;
/**
* 获取Jedis连接工厂
* <p>用于创建Jedis对象</p>
* @return JedisPool
*/
@Bean
public JedisPool redisPoolFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setTestOnBorrow(false);
jedisPoolConfig.setTestOnReturn(false);
return new JedisPool(jedisPoolConfig, host, port,timeout, password, database);
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用 Jackson 作为序列化器
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
/**
* 选择redis作为默认缓存工具
* @param redisConnectionFactory
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
}
\ No newline at end of file
...@@ -2,13 +2,22 @@ package net.wanji.opt.common; ...@@ -2,13 +2,22 @@ package net.wanji.opt.common;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.DateStyle;
import net.wanji.opt.dto.CrossEventDTO; import net.wanji.opt.dto.CrossEventDTO;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit;
/** /**
* @description: redis工具类 * @description: redis工具类
...@@ -20,34 +29,11 @@ import java.util.Set; ...@@ -20,34 +29,11 @@ import java.util.Set;
@Slf4j @Slf4j
public class RedisUtils { public class RedisUtils {
@Resource
private RedisTemplate<String, Object> redis7Template;
/** /**
* 7号库获取最大 score zset 元素 * 注入redisTemplate
*/ */
public Object getMaxScoreElement(String redisKey) throws Exception { @Resource
try { private RedisTemplate<String, Object> redisTemplate;
ObjectMapper objectMapper = new ObjectMapper();
ZSetOperations<String, Object> zSetOps = redis7Template.opsForZSet();
Set<Object> result = zSetOps.reverseRange(redisKey, 0, -1);
if (result != null && !result.isEmpty()) {
for (Object o : result) {
CrossEventDTO dto = objectMapper.readValue(o.toString(), CrossEventDTO.class);
String msgType = dto.getMsgType();
if (msgType.startsWith("50")) {
return o;
}
}
}
log.error("redis获取数据key:{}, 获取value:{}", redisKey, result);
} catch (Exception e) {
//throw new RuntimeException(e);
}
return null;
}
/** /**
* @description: 判断是否存在Key * @description: 判断是否存在Key
...@@ -55,7 +41,7 @@ public class RedisUtils { ...@@ -55,7 +41,7 @@ public class RedisUtils {
* @return boolean true:有 false:无 * @return boolean true:有 false:无
*/ */
public boolean hasKey(String key) { public boolean hasKey(String key) {
return redis7Template.hasKey(key); return redisTemplate.hasKey(key);
} }
/** /**
...@@ -64,7 +50,38 @@ public class RedisUtils { ...@@ -64,7 +50,38 @@ public class RedisUtils {
* @param value 添加redis的value * @param value 添加redis的value
*/ */
public void set(String key, String value) { public void set(String key, String value) {
redis7Template.opsForValue().set(key, value); redisTemplate.opsForValue().set(key, value);
}
/**
* @description: 添加对象
* @param key redis的Key
* @param object 添加redis的value
*/
public void set(String key, Object object) {
redisTemplate.opsForValue().set(key, object);
}
/**
* @description: 添加带生命周期的对象
* @param key redis的Key
* @param object 添加redis的value
* @param seconds 失效时间
*/
public void setAndExpire(String key, Object object, int seconds) {
redisTemplate.opsForValue().set(key, object);
redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
}
/**
* @description: 添加带生命周期的对象
* @param key redis的Key
* @param value 添加redis的value
* @param seconds 失效时间
*/
public void setAndExpire(String key, String value, int seconds) {
redisTemplate.opsForValue().set(key, value);
redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
} }
/** /**
...@@ -73,6 +90,280 @@ public class RedisUtils { ...@@ -73,6 +90,280 @@ public class RedisUtils {
* @return Object 返回对象 * @return Object 返回对象
*/ */
public Object get(String key) { public Object get(String key) {
return redis7Template.opsForValue().get(key); return redisTemplate.opsForValue().get(key);
}
/**
* @description: 存入redis的hash
* @param key redis的Key
* @param field 字段值
* @param value 存入的值
*/
public void setHash(String key, String field, String value) {
redisTemplate.opsForHash().put(key, field, value);
}
/**
* @description: 存入redis的hash
* @param key redis的Key
* @param field 字段值
* @param value 存入的值
*/
public void setHash(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}
/**
* @description: 根据key和字段值获取内容值
* @param key redis的Key
* @param field 字段值
* @return String 返回字符串
*/
public String getHash(String key, String field) {
return (String)redisTemplate.opsForHash().get(key, field);
}
/**
* @description: 根据field删除值
* @param key redis的Key
* @param field 字段值
*/
public void delHashMap(String key, String field) {
redisTemplate.boundHashOps(key).delete(field);
}
/**
* @description: 存入hash集合
* @param key redis的Key
* @param hashmap 存入的Map集合
*/
public void setHashMap(String key, Map<String, Object> hashmap){
redisTemplate.opsForHash().putAll(key, hashmap);
}
/**
* @description: 取出hash集合
* @param key redis的Key
* @return Map<Object, Object> 返回Map集合
*/
public Map<Object, Object> getHashMap(String key) {
return redisTemplate.opsForHash().entries(key);
}
/**
* @description: 存入redis的Set
* @param key redis的Key
* @param object 对象
*/
public void setSet(String key,Object object){
redisTemplate.opsForSet().add(key, object);
}
/**
* @description: 获取redis的Set
* @param key redis的Key
* @return Set<Object> Set集合
*/
public Set<Object> getSet(String key){
return redisTemplate.opsForSet().members(key);
}
/**
* @discription: 查看值是否是set成员
* @param key set的key
* @param value set的成员
* @return 是否是set成员
*/
public Boolean isSetMember(String key, Object value) {
return redisTemplate.opsForSet().isMember(key, value);
}
/**
* @description:设置key的过期时间,endTime格式:yyyy-MM-dd hh:mm:ss
* @param key redis的Key
* @param endTime 结束时间
*/
public void setExpire(String key, Date endTime) {
long seconds = endTime.getTime() - System.currentTimeMillis();
redisTemplate.expire(key, (int) (seconds / 1000), TimeUnit.SECONDS);
}
/**
* @description: 设置key的过期时间
* @param key redis的Key
* @param time 过期时间(秒)
*/
public void setExpire(String key, int time) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
} }
/**
* <p>Discription:获取key的过期时间
* @param key redis的Key
* @return 过期时间(秒)
*/
public Long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* @description: 在redis消息队列队尾插入数据
* @param key redis的Key
* @param object 添加的对象
*/
public void tailPush(String key, Object object){
redisTemplate.opsForList().rightPush(key, object);
}
/**
* @description: 在redis消息队列对头插入数据
* @param key redis的Key
* @param object 添加的对象
*/
public void headPush(String key,Object object){
redisTemplate.opsForList().leftPush(key, object);
}
/**
* @description: 在redis消息队列队尾删除数据
* @param key redis的Key
* @return Object 删除的对象
*/
public Object tailPop(String key){
return redisTemplate.opsForList().rightPop(key);
}
/**
* @description: 在redis消息队列队头删除数据
* @param key redis的Key
* @return Object 删除的对象
*/
public Object headPop(String key){
return redisTemplate.opsForList().leftPop(key);
}
/**
* @description: 删除redis的值
* @param key redis的Key
*/
public void del(String key) {
if (hasKey(key)) {
redisTemplate.delete(key);
}
}
/**
* @description: 清理redis缓存
*/
public void flushDB(){
redisTemplate.getConnectionFactory().getConnection().flushDb();
}
/**
* @description: 根据类型生成版本号
* @param type 类型key区分
* @return 版本号
* @author wanji
* @date 2019/5/5 19:26
*/
/**
* 自增ID
* @param key 建
* @param liveTime 过期时间
* @return 自增结果
*/
public Long getIncr(String key, long liveTime) {
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
}
return increment;
}
/**
* 获取全部Redis的key
* @return
*/
public Set<String> keys() {
return redisTemplate.keys("*");
}
/**
* 获取key的类型
* @return
*/
public DataType keyType(String key) {
return redisTemplate.type(key);
}
/**
* 获取全局ID范围
*
* @param key 建
* @param increment ID范围
* @return
*/
public Long getGlobalIdRange(String key, long increment) {
ValueOperations<String, Object> ops = redisTemplate.opsForValue();
Long newIdRangeStart = ops.increment(key, increment);
// The range of IDs that are now reserved are from newIdRangeStart - increment + 1 to newIdRangeStart.
return newIdRangeStart - increment + 1;
}
/**
* 带过期时间存入 zset
* @param ttlInMillis 存活时间毫秒数
*/
public void addToSortedSetWithExpiry(String key, String value, long ttlInMillis) {
long score = new Date().getTime() + ttlInMillis;
redisTemplate.opsForZSet().add(key, value, score);
}
/**
* 获取某个 zset 所有元素
*
* @return
*/
public Set<Object> getZsetAll(String key) {
return redisTemplate.opsForZSet().range(key, 0, -1);
}
/**
* 按 score 范围获取 zset 元素
*
* @return
*/
public Set<Object> getZsetRange(String key, long start, long end) {
return redisTemplate.opsForZSet().rangeByScore(key, start, end);
}
/**
* 7号库获取最大 score zset 元素
*/
public Object getMaxScoreElement(String redisKey) throws Exception {
try {
ObjectMapper objectMapper = new ObjectMapper();
ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();
Set<Object> result = zSetOps.reverseRange(redisKey, 0, -1);
if (result != null && !result.isEmpty()) {
for (Object o : result) {
CrossEventDTO dto = objectMapper.readValue(o.toString(), CrossEventDTO.class);
String msgType = dto.getMsgType();
if (msgType.startsWith("50")) {
return o;
}
}
}
log.error("redis获取数据key:{}, 获取value:{}", redisKey, result);
} catch (Exception e) {
//throw new RuntimeException(e);
}
return null;
}
} }
package net.wanji.opt.controller.induce;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.framework.rest.Page;
import net.wanji.common.framework.rest.ValidationGroups;
import net.wanji.databus.dao.entity.GreenwaveInfoPO;
import net.wanji.databus.dao.mapper.GreenwaveInfoMapper;
import net.wanji.opt.dto.induce.GreenwaveDTO;
import net.wanji.opt.dto.induce.GreenwaveInducesDTO;
import net.wanji.opt.dto.induce.InduceDTO;
import net.wanji.opt.entity.DeviceInduces;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.service.DeviceInducesService;
import net.wanji.opt.service.induce.GreenwaveInducesHistService;
import net.wanji.opt.service.induce.GreenwaveInducesService;
import net.wanji.opt.service.induce.InduceTemplateService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* 绿波-诱导屏幕关系
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Api(value = "GreenwaveInducesController", description = "绿波-诱导屏幕关系")
@RestController
@RequestMapping("/greenwaveInduces")
@Slf4j
public class GreenwaveInducesController {
@Resource
private GreenwaveInducesService greenwaveInducesService;
@Resource
private InduceTemplateService induceTemplateService;
@Resource
private DeviceInducesService deviceInducesService;
@Resource
private GreenwaveInfoMapper greenwaveInfoMapper;
@Resource
private GreenwaveInducesHistService greenwaveInducesHistService;
/**
* 获取所有记录
*
* @return JsonViewObject
*/
@ApiOperation(value = "获取所有记录", notes = "获取所有记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/byAll", produces = MediaType.APPLICATION_JSON)
JsonViewObject getAll() {
JsonViewObject jsonView = JsonViewObject.newInstance();
long start = System.currentTimeMillis();
try {
// List<GreenwaveInduces> list = this.greenwaveInducesService.list();
List<InduceTemplate> induceTemplateList = induceTemplateService.list();
List<DeviceInduces> deviceInducesList = deviceInducesService.list();
List<GreenwaveInfoPO> greenwaveInfoPOList = greenwaveInfoMapper.selectAll();
List<InduceDTO> list = new ArrayList<>();
this.greenwaveInducesService.list().stream().forEach(o -> {
InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(o.getId());
induceDTO.setEquipCode(o.getEquipCode());
//获取关联设备信息
List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(x -> Objects.nonNull(x.getEquipCode()) && x.getEquipCode().equals(o.getEquipCode())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) {
induceDTO.setEquipName(deviceInduces.get(0).getEquipName());
induceDTO.setRidDir(deviceInduces.get(0).getRidDir());
induceDTO.setResolutionWidth(deviceInduces.get(0).getResolutionWidth());
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());
}
//获取上屏状态
induceDTO.setStatus(o.getStatus());
//获取关联绿波信息
List<GreenwaveDTO> greenwaveList = new ArrayList<>();
this.greenwaveInducesHistService.list().stream().filter(y ->Objects.nonNull(y.getGreenId()) && y.getGreenId().equals(o.getGreenId())).forEach(m -> {
GreenwaveDTO greenwaveDTO = new GreenwaveDTO();
greenwaveDTO.setGreenId(m.getGreenId());
//获取绿波基本信息
List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(greenwaveInfoByGreenId) && greenwaveInfoByGreenId.size() > 0) {
greenwaveDTO.setGreenName(greenwaveInfoByGreenId.get(0).getName());
greenwaveDTO.setDesignSpeed(greenwaveInfoByGreenId.get(0).getDesignSpeed());
}
greenwaveDTO.setStrategyId(m.getStrategyId());
greenwaveDTO.setStrategyName(m.getStrategyName());
greenwaveDTO.setDir(m.getDir());
greenwaveDTO.setControlOptTimes(m.getControlOptTimes());
greenwaveList.add(greenwaveDTO);
});
induceDTO.setGreenwaveList(greenwaveList);
//获取关联模板信息
induceDTO.setInduceTemplateList(induceTemplateList.stream().filter(z -> Objects.nonNull(z.getEquipCode()) && z.getEquipCode().equals(o.getEquipCode())).collect(Collectors.toList()));
list.add(induceDTO);
});
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonView;
}
/**
* 根据条件查询记录
*
* @param GreenwaveInduces 查询条件
* @return JsonViewObject
*/
@ApiOperation(value = "根据条件查询记录", notes = "根据条件查询记录", response = JsonViewObject.class, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/byCondition", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject getByWhere(@ApiParam(value = "查询条件", required = true) @RequestBody @Validated({ValidationGroups.Query.class}) GreenwaveInduces GreenwaveInduces){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String jsonStr = JSON.toJSONString(GreenwaveInduces);
try {
//参数校验过程中修改,兼容实现,restful入参不用map,便于进行参数逐个校验
Map params = JSONObject.parseObject(JSONObject.toJSONString(GreenwaveInduces), Map.class);
List<GreenwaveInduces> greenwaveInducesList = this.greenwaveInducesService.listByMap(params);
List<InduceTemplate> induceTemplateList = induceTemplateService.list();
List<DeviceInduces> deviceInducesList = deviceInducesService.list();
List<GreenwaveInfoPO> greenwaveInfoPOList = greenwaveInfoMapper.selectAll();
List<InduceDTO> list = new ArrayList<>();
greenwaveInducesList.stream().forEach(o -> {
InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(o.getId());
induceDTO.setEquipCode(o.getEquipCode());
//获取关联设备信息
List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(x -> Objects.nonNull(x.getEquipCode()) && x.getEquipCode().equals(o.getEquipCode())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) {
induceDTO.setEquipName(deviceInduces.get(0).getEquipName());
induceDTO.setRidDir(deviceInduces.get(0).getRidDir());
induceDTO.setResolutionWidth(deviceInduces.get(0).getResolutionWidth());
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());
}
//获取上屏状态
induceDTO.setStatus(o.getStatus());
//获取关联绿波信息
List<GreenwaveDTO> greenwaveList = new ArrayList<>();
this.greenwaveInducesHistService.list().stream().filter(y -> Objects.nonNull(y.getGreenId()) && y.getGreenId().equals(o.getGreenId())).forEach(m -> {
GreenwaveDTO greenwaveDTO = new GreenwaveDTO();
greenwaveDTO.setGreenId(m.getGreenId());
//获取绿波基本信息
List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(greenwaveInfoByGreenId) && greenwaveInfoByGreenId.size() > 0) {
greenwaveDTO.setGreenName(greenwaveInfoByGreenId.get(0).getName());
greenwaveDTO.setDesignSpeed(greenwaveInfoByGreenId.get(0).getDesignSpeed());
}
greenwaveDTO.setStrategyId(m.getStrategyId());
greenwaveDTO.setStrategyName(m.getStrategyName());
greenwaveDTO.setDir(m.getDir());
greenwaveDTO.setControlOptTimes(m.getControlOptTimes());
greenwaveList.add(greenwaveDTO);
});
induceDTO.setGreenwaveList(greenwaveList);
//获取关联模板信息
induceDTO.setInduceTemplateList(induceTemplateList.stream().filter(z -> Objects.nonNull(z.getEquipCode()) && z.getEquipCode().equals(o.getEquipCode())).collect(Collectors.toList()));
list.add(induceDTO);
});
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getByWhere error,jsonStr:{}", this.getClass().getSimpleName(), jsonStr, e);
}
return jsonView;
}
/**
* 根据id查询记录
*
* @param id
* @return JsonViewObject
*/
@ApiOperation(value = "根据id查询记录", notes = "根据id查询记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON)
JsonViewObject getById(@ApiParam(value = "记录的id", required = true, example = "1") @PathVariable("id") @NotBlank(message = "查询id不能为空") String id){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
GreenwaveInduces GreenwaveInduces = this.greenwaveInducesService.getById(id);
jsonView.success(GreenwaveInduces);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("AbstractRestServerImpl getById error, id:{}", id, e);
}
return jsonView;
}
/**
* 根据id删除
*
* @param ids
* @return JsonViewObject
*/
@ApiOperation(value = "根据多个id删除记录", notes = "根据多个id删除记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@ApiImplicitParams(value = {
@ApiImplicitParam(paramType = "query", name = "ids", dataType = "String", required = true, value = "多个记录id,用逗号分隔", example = "1,2")
})
@GetMapping(value = "/deleting", produces = MediaType.APPLICATION_JSON)
JsonViewObject deleteByIds(@QueryParam("ids") @NotBlank(message = "删除ids不能为空") String ids){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String[] idArray = ids.split(",");
try {
if (idArray.length > 0) {
for (String id : idArray) {
jsonView = this.greenwaveInducesService.removeByIds(Arrays.asList(ids.split(",")))?jsonView.success():jsonView.fail();;
}
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("DELETE_FAILED_MSG"));
log.error("AbstractRestServerImpl deleteByIds error, id:{}", ids, e);
}
return jsonView;
}
/**
* 新建记录
*
* @param GreenwaveInduces
* @return JsonViewObject
*/
@ApiOperation(value = "新建记录", notes = "新建记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/creating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject save(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Create.class}) GreenwaveInduces GreenwaveInduces){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (GreenwaveInduces != null) {
jsonView = this.greenwaveInducesService.saveOrUpdate(GreenwaveInduces)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
log.error("AbstractRestServerImpl save error, jsonStr:{}", JSON.toJSONString(GreenwaveInduces), e);
}
return jsonView;
}
/**
* 修改记录
*
* @param GreenwaveInduces
* @return
*/
@ApiOperation(value = "修改记录", notes = "修改记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/updating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject update(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Update.class}) GreenwaveInduces GreenwaveInduces){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (GreenwaveInduces != null) {
jsonView = this.greenwaveInducesService.saveOrUpdate(GreenwaveInduces)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("UPDATE_FAILED_MSG"));
log.error("AbstractRestServerImpl update error, jsonStr:{}", JSON.toJSONString(GreenwaveInduces), e);
}
return jsonView;
}
}
package net.wanji.opt.controller.induce;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.framework.rest.Page;
import net.wanji.common.framework.rest.ValidationGroups;
import net.wanji.databus.dao.entity.GreenwaveInfoPO;
import net.wanji.databus.dao.mapper.GreenwaveInfoMapper;
import net.wanji.opt.dto.induce.GreenwaveInducesDTO;
import net.wanji.opt.dto.induce.InduceDTO;
import net.wanji.opt.entity.DeviceInduces;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.entity.GreenwaveInducesHist;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.service.DeviceInducesService;
import net.wanji.opt.service.induce.GreenwaveInducesHistService;
import net.wanji.opt.service.induce.GreenwaveInducesService;
import net.wanji.opt.service.induce.InduceTemplateService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import static org.codehaus.groovy.runtime.DefaultGroovyMethods.collect;
/**
* <p>
* 绿波诱导下发状态信息
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Api(value = "GreenwaveInducesHistController", description = "绿波-绿波诱导下发状态信息")
@RestController
@RequestMapping("/greenwaveInducesHist")
@Slf4j
public class GreenwaveInducesHistController {
@Resource
private GreenwaveInducesHistService greenwaveInducesHistService;
@Resource
private GreenwaveInducesService greenwaveInducesService;
@Resource
private GreenwaveInfoMapper greenwaveInfoMapper;
@Resource
private InduceTemplateService induceTemplateService;
@Resource
private DeviceInducesService deviceInducesService;
/**
* 获取所有记录
*
* @return JsonViewObject
*/
@ApiOperation(value = "获取所有记录", notes = "获取所有记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/byAll", produces = MediaType.APPLICATION_JSON)
JsonViewObject getAll() {
JsonViewObject jsonView = JsonViewObject.newInstance();
long start = System.currentTimeMillis();
try {
List<GreenwaveInducesDTO> list = new ArrayList<>();
List<GreenwaveInfoPO> greenwaveInfoPOList = greenwaveInfoMapper.selectAll();
List<GreenwaveInduces> greenwaveInducesList = greenwaveInducesService.list();
List<InduceTemplate> induceTemplateList = induceTemplateService.list();
List<DeviceInduces> deviceInducesList = deviceInducesService.list();
this.greenwaveInducesHistService.list().stream().forEach(o -> {
GreenwaveInducesDTO greenwaveInducesDTO = new GreenwaveInducesDTO();
greenwaveInducesDTO.setGreenId(o.getGreenId());
greenwaveInducesDTO.setDir(o.getDir());
//这里从绿波表里获取基本信息
List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(greenwaveInfoByGreenId) && greenwaveInfoByGreenId.size() > 0) {
greenwaveInducesDTO.setGreenName(greenwaveInfoByGreenId.get(0).getName());
greenwaveInducesDTO.setDesignSpeed(greenwaveInfoByGreenId.get(0).getDesignSpeed());
}
greenwaveInducesDTO.setStatus(o.getStatus());
greenwaveInducesDTO.setStrategyId(o.getStrategyId());
greenwaveInducesDTO.setStrategyName(o.getStrategyName());
greenwaveInducesDTO.setMinSpeed(o.getMinSpeed());
greenwaveInducesDTO.setMinSpeed(o.getMaxSpeed());
greenwaveInducesDTO.setControlOptTimes(o.getControlOptTimes());
//获取诱导屏列表
List<InduceDTO> induceDTOList = new ArrayList<>();
greenwaveInducesList.stream().filter(x -> Objects.nonNull(x.getGreenId()) && x.getGreenId().equals(o.getGreenId())).forEach(n -> {
InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(n.getId());
induceDTO.setEquipCode(n.getEquipCode());
induceDTO.setStatus(o.getStatus());
//获取屏幕的设备信息
List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(m -> Objects.nonNull(m.getEquipCode()) && m.getEquipCode().equals(n.getEquipCode())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) {
induceDTO.setEquipName(deviceInduces.get(0).getEquipName());
induceDTO.setRidDir(deviceInduces.get(0).getRidDir());//
induceDTO.setResolutionWidth(deviceInduces.get(0).getResolutionWidth());//
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());//
}
//关联模板信息
induceDTO.setInduceTemplateList(induceTemplateList.stream().filter(x->Objects.nonNull(x.getEquipCode()) && x.getEquipCode().equals(n.getEquipCode())).collect(Collectors.toList()));
induceDTOList.add(induceDTO);
});
greenwaveInducesDTO.setInduceList(induceDTOList);
greenwaveInducesDTO.setEquipCount(induceDTOList.size());
list.add(greenwaveInducesDTO);
});
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonView;
}
/**
* 根据条件查询记录
*
* @param GreenwaveInducesHist 查询条件
* @return JsonViewObject
*/
@ApiOperation(value = "根据条件查询记录", notes = "根据条件查询记录", response = JsonViewObject.class, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/byCondition", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject getByWhere(@ApiParam(value = "查询条件", required = true) @RequestBody @Validated({ValidationGroups.Query.class}) GreenwaveInducesHist GreenwaveInducesHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String jsonStr = JSON.toJSONString(GreenwaveInducesHist);
try {
//参数校验过程中修改,兼容实现,restful入参不用map,便于进行参数逐个校验
Map params = JSONObject.parseObject(JSONObject.toJSONString(GreenwaveInducesHist), Map.class);
List<GreenwaveInducesDTO> list = new ArrayList<>();
List<GreenwaveInducesHist> greenwaveInducesHistList = this.greenwaveInducesHistService.listByMap(params);
List<GreenwaveInfoPO> greenwaveInfoPOList = greenwaveInfoMapper.selectAll();
List<GreenwaveInduces> greenwaveInducesList = greenwaveInducesService.list();
List<InduceTemplate> induceTemplateList = induceTemplateService.list();
List<DeviceInduces> deviceInducesList = deviceInducesService.list();
greenwaveInducesHistList.stream().forEach(o -> {
GreenwaveInducesDTO greenwaveInducesDTO = new GreenwaveInducesDTO();
greenwaveInducesDTO.setGreenId(o.getGreenId());
greenwaveInducesDTO.setDir(o.getDir());
//这里从绿波表里获取基本信息
List<GreenwaveInfoPO> greenwaveInfoByGreenId = greenwaveInfoPOList.stream().filter(n -> n.getId().equals(o.getGreenId())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(greenwaveInfoByGreenId) && greenwaveInfoByGreenId.size() > 0) {
greenwaveInducesDTO.setGreenName(greenwaveInfoByGreenId.get(0).getName());
greenwaveInducesDTO.setDesignSpeed(greenwaveInfoByGreenId.get(0).getDesignSpeed());
}
greenwaveInducesDTO.setStatus(o.getStatus());
greenwaveInducesDTO.setStrategyId(o.getStrategyId());
greenwaveInducesDTO.setStrategyName(o.getStrategyName());
greenwaveInducesDTO.setMinSpeed(o.getMinSpeed());
greenwaveInducesDTO.setMinSpeed(o.getMaxSpeed());
greenwaveInducesDTO.setControlOptTimes(o.getControlOptTimes());
//获取诱导屏列表
List<InduceDTO> induceDTOList = new ArrayList<>();
greenwaveInducesList.stream().filter(x -> Objects.nonNull(x.getGreenId()) && x.getGreenId().equals(o.getGreenId())).forEach(n -> {
InduceDTO induceDTO = new InduceDTO();
induceDTO.setId(n.getId());
induceDTO.setEquipCode(n.getEquipCode());
induceDTO.setStatus(o.getStatus());
//获取屏幕的设备信息
List<DeviceInduces> deviceInduces = deviceInducesList.stream().filter(m -> Objects.nonNull(m.getEquipCode()) && m.getEquipCode().equals(n.getEquipCode())).collect(Collectors.toList());// 过滤条件// 收集结果
if (Objects.nonNull(deviceInduces) && deviceInduces.size() > 0) {
induceDTO.setEquipName(deviceInduces.get(0).getEquipName());
induceDTO.setRidDir(deviceInduces.get(0).getRidDir());//
induceDTO.setResolutionWidth(deviceInduces.get(0).getResolutionWidth());//
induceDTO.setResolutionHeight(deviceInduces.get(0).getResolutionHeight());//
}
//关联模板信息
induceDTO.setInduceTemplateList(induceTemplateList.stream().filter(x -> Objects.nonNull(x.getEquipCode()) && x.getEquipCode().equals(n.getEquipCode())).collect(Collectors.toList()));
induceDTOList.add(induceDTO);
});
greenwaveInducesDTO.setInduceList(induceDTOList);
greenwaveInducesDTO.setEquipCount(induceDTOList.size());
list.add(greenwaveInducesDTO);
});
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getByWhere error,jsonStr:{}", this.getClass().getSimpleName(), jsonStr, e);
}
return jsonView;
}
/**
* 根据id查询记录
*
* @param id
* @return JsonViewObject
*/
@ApiOperation(value = "根据id查询记录", notes = "根据id查询记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON)
JsonViewObject getById(@ApiParam(value = "记录的id", required = true, example = "1") @PathVariable("id") @NotBlank(message = "查询id不能为空") String id){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
GreenwaveInducesHist GreenwaveInducesHist = this.greenwaveInducesHistService.getById(id);
jsonView.success(GreenwaveInducesHist);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("AbstractRestServerImpl getById error, id:{}", id, e);
}
return jsonView;
}
/**
* 根据id删除
*
* @param ids
* @return JsonViewObject
*/
@ApiOperation(value = "根据多个id删除记录", notes = "根据多个id删除记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@ApiImplicitParams(value = {
@ApiImplicitParam(paramType = "query", name = "ids", dataType = "String", required = true, value = "多个记录id,用逗号分隔", example = "1,2")
})
@GetMapping(value = "/deleting", produces = MediaType.APPLICATION_JSON)
JsonViewObject deleteByIds(@QueryParam("ids") @NotBlank(message = "删除ids不能为空") String ids){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String[] idArray = ids.split(",");
try {
if (idArray.length > 0) {
for (String id : idArray) {
jsonView = this.greenwaveInducesHistService.removeByIds(Arrays.asList(ids.split(",")))?jsonView.success():jsonView.fail();;
}
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("DELETE_FAILED_MSG"));
log.error("AbstractRestServerImpl deleteByIds error, id:{}", ids, e);
}
return jsonView;
}
/**
* 新建记录
*
* @param GreenwaveInducesHist
* @return JsonViewObject
*/
@ApiOperation(value = "新建记录", notes = "新建记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/creating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject save(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Create.class}) GreenwaveInducesHist GreenwaveInducesHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (GreenwaveInducesHist != null) {
jsonView = this.greenwaveInducesHistService.saveOrUpdate(GreenwaveInducesHist)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
log.error("AbstractRestServerImpl save error, jsonStr:{}", JSON.toJSONString(GreenwaveInducesHist), e);
}
return jsonView;
}
/**
* 修改记录
*
* @param GreenwaveInducesHist
* @return
*/
@ApiOperation(value = "修改记录", notes = "修改记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/updating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject update(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Update.class}) GreenwaveInducesHist GreenwaveInducesHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (GreenwaveInducesHist != null) {
jsonView = this.greenwaveInducesHistService.saveOrUpdate(GreenwaveInducesHist)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("UPDATE_FAILED_MSG"));
log.error("AbstractRestServerImpl update error, jsonStr:{}", JSON.toJSONString(GreenwaveInducesHist), e);
}
return jsonView;
}
}
package net.wanji.opt.controller.induce;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.framework.rest.Page;
import net.wanji.common.framework.rest.ValidationGroups;
import net.wanji.opt.dto.induce.InduceDTO;
import net.wanji.opt.entity.InduceHist;
import net.wanji.opt.service.induce.InduceHistService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* <p>
* 诱导屏-下发历史信息
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Api(value = "InduceHistController", description = "诱导屏-下发历史信息")
@RestController
@RequestMapping("/induceHist")
@Slf4j
public class InduceHistController {
@Resource
private InduceHistService induceHistService;
/**
* 获取所有诱导下发记录
*
* @return JsonViewObject
*/
@ApiOperation(value = "获取所有诱导下发记录", notes = "获取所有诱导下发记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/byAll", produces = MediaType.APPLICATION_JSON)
JsonViewObject getAll(){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try{
List<InduceHist> list=this.induceHistService.list();
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonView;
}
/**
* 根据条件查询记录
*
* @param InduceHist 查询条件
* @return JsonViewObject
*/
@ApiOperation(value = "根据条件查询记录", notes = "根据条件查询记录", response = JsonViewObject.class, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/byCondition", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject getByWhere(@ApiParam(value = "查询条件", required = true) @RequestBody @Validated({ValidationGroups.Query.class}) InduceHist InduceHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String jsonStr = JSON.toJSONString(InduceHist);
try {
//参数校验过程中修改,兼容实现,restful入参不用map,便于进行参数逐个校验
Map params = JSONObject.parseObject(JSONObject.toJSONString(InduceHist), Map.class);
List list = this.induceHistService.listByMap(params);
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getByWhere error,jsonStr:{}", this.getClass().getSimpleName(), jsonStr, e);
}
return jsonView;
}
/**
* 根据id查询记录
*
* @param id
* @return JsonViewObject
*/
@ApiOperation(value = "根据id查询记录", notes = "根据id查询记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON)
JsonViewObject getById(@ApiParam(value = "记录的id", required = true, example = "1") @PathVariable("id") @NotBlank(message = "查询id不能为空") String id){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
InduceHist InduceHist = this.induceHistService.getById(id);
jsonView.success(InduceHist);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("AbstractRestServerImpl getById error, id:{}", id, e);
}
return jsonView;
}
/**
* 根据id删除
*
* @param ids
* @return JsonViewObject
*/
@ApiOperation(value = "根据多个id删除记录", notes = "根据多个id删除记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@ApiImplicitParams(value = {
@ApiImplicitParam(paramType = "query", name = "ids", dataType = "String", required = true, value = "多个记录id,用逗号分隔", example = "1,2")
})
@GetMapping(value = "/deleting", produces = MediaType.APPLICATION_JSON)
JsonViewObject deleteByIds(@QueryParam("ids") @NotBlank(message = "删除ids不能为空") String ids){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String[] idArray = ids.split(",");
try {
if (idArray.length > 0) {
for (String id : idArray) {
jsonView = this.induceHistService.removeByIds(Arrays.asList(ids.split(",")))?jsonView.success():jsonView.fail();;
}
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("DELETE_FAILED_MSG"));
log.error("AbstractRestServerImpl deleteByIds error, id:{}", ids, e);
}
return jsonView;
}
/**
* 新建记录
*
* @param InduceHist
* @return JsonViewObject
*/
@ApiOperation(value = "新建记录", notes = "新建记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/creating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject save(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Create.class}) InduceHist InduceHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (InduceHist != null) {
jsonView = this.induceHistService.saveOrUpdate(InduceHist)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
log.error("AbstractRestServerImpl save error, jsonStr:{}", JSON.toJSONString(InduceHist), e);
}
return jsonView;
}
/**
* 修改记录
*
* @param InduceHist
* @return
*/
@ApiOperation(value = "修改记录", notes = "修改记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/updating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject update(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Update.class}) InduceHist InduceHist){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (InduceHist != null) {
jsonView = this.induceHistService.saveOrUpdate(InduceHist)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("UPDATE_FAILED_MSG"));
log.error("AbstractRestServerImpl update error, jsonStr:{}", JSON.toJSONString(InduceHist), e);
}
return jsonView;
}
}
package net.wanji.opt.controller.induce;
import freemarker.template.TemplateException;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.dto.induce.MessageParam;
import net.wanji.opt.service.induce.InduceSendService;
import net.wanji.opt.service.induce.InduceTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@Api(value = "InduceSendController", description = "诱导屏-下发消息接口(对接易华录)")
@RestController
@RequestMapping("/induce")
@Slf4j
public class InduceSendController {
@Autowired
private InduceSendService induceSendService;
@Autowired
private InduceTemplateService induceTemplateService;
@PostMapping("/send")
public JsonViewObject send(@RequestBody MessageParam param) {
JsonViewObject jsonView = JsonViewObject.newInstance();
try {
induceSendService.send(param);
return jsonView.success();
} catch (Exception e) {
log.info(e.getMessage());
return jsonView.fail("发送失败");
}
}
/**
* 获取ftp图片
*/
@GetMapping(value = "/file")
public ResponseEntity<byte[]> ftpFile(@RequestParam("fileId") Long fileId) {
// 根据 fileId 获取文件名
InduceTemplate pictureFile = this.induceTemplateService.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());
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() + "\""); // 设置文件名
// 返回响应
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));
}
}
}
package net.wanji.opt.controller.induce;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.framework.rest.Page;
import net.wanji.common.framework.rest.ValidationGroups;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.service.induce.InduceTemplateService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* <p>
* 诱导屏-发布模板
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Api(value = "InduceTemplateController", description = "诱导屏-发布模板")
@RestController
@RequestMapping("/induceTemplate")
@Slf4j
public class InduceTemplateController {
@Resource
private InduceTemplateService induceTemplateService;
/**
* 获取所有记录
*
* @return JsonViewObject
*/
@ApiOperation(value = "获取所有记录", notes = "获取所有记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/byAll", produces = MediaType.APPLICATION_JSON)
JsonViewObject getAll(){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
List<InduceTemplate> list = this.induceTemplateService.list();
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonView;
}
/**
* 根据条件查询记录
*
* @param InduceTemplate 查询条件
* @return JsonViewObject
*/
@ApiOperation(value = "根据条件查询记录", notes = "根据条件查询记录", response = JsonViewObject.class, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/byCondition", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject getByWhere(@ApiParam(value = "查询条件", required = true) @RequestBody @Validated({ValidationGroups.Query.class}) InduceTemplate InduceTemplate){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String jsonStr = JSON.toJSONString(InduceTemplate);
try {
//参数校验过程中修改,兼容实现,restful入参不用map,便于进行参数逐个校验
Map params = JSONObject.parseObject(JSONObject.toJSONString(InduceTemplate), Map.class);
List list = this.induceTemplateService.listByMap(params);
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getByWhere error,jsonStr:{}", this.getClass().getSimpleName(), jsonStr, e);
}
return jsonView;
}
/**
* 根据id查询记录
*
* @param id
* @return JsonViewObject
*/
@ApiOperation(value = "根据id查询记录", notes = "根据id查询记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON)
JsonViewObject getById(@ApiParam(value = "记录的id", required = true, example = "1") @PathVariable("id") @NotBlank(message = "查询id不能为空") String id){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
InduceTemplate InduceTemplate = this.induceTemplateService.getById(id);
jsonView.success(InduceTemplate);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("AbstractRestServerImpl getById error, id:{}", id, e);
}
return jsonView;
}
/**
* 根据id删除
*
* @param ids
* @return JsonViewObject
*/
@ApiOperation(value = "根据多个id删除记录", notes = "根据多个id删除记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON)
@ApiImplicitParams(value = {
@ApiImplicitParam(paramType = "query", name = "ids", dataType = "String", required = true, value = "多个记录id,用逗号分隔", example = "1,2")
})
@GetMapping(value = "/deleting", produces = MediaType.APPLICATION_JSON)
JsonViewObject deleteByIds(@QueryParam("ids") @NotBlank(message = "删除ids不能为空") String ids){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
String[] idArray = ids.split(",");
try {
if (idArray.length > 0) {
for (String id : idArray) {
jsonView = this.induceTemplateService.removeByIds(Arrays.asList(ids.split(",")))?jsonView.success():jsonView.fail();
}
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("DELETE_FAILED_MSG"));
log.error("AbstractRestServerImpl deleteByIds error, id:{}", ids, e);
}
return jsonView;
}
/**
* 新建记录
*
* @param InduceTemplate
* @return JsonViewObject
*/
@ApiOperation(value = "新建记录", notes = "新建记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/creating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject save(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Create.class}) InduceTemplate InduceTemplate){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (InduceTemplate != null) {
jsonView = this.induceTemplateService.saveOrUpdate(InduceTemplate)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
log.error("AbstractRestServerImpl save error, jsonStr:{}", JSON.toJSONString(InduceTemplate), e);
}
return jsonView;
}
/**
* 修改记录
*
* @param InduceTemplate
* @return
*/
@ApiOperation(value = "修改记录", notes = "修改记录", response = JsonViewObject.class, produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/updating", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
JsonViewObject update(@ApiParam(value = "记录的JSON格式字符串", required = true) @RequestBody @Validated({ValidationGroups.Update.class}) InduceTemplate InduceTemplate){
JsonViewObject jsonView = JsonViewObject.newInstance();
long start=System.currentTimeMillis();
try {
if (InduceTemplate != null) {
jsonView = this.induceTemplateService.saveOrUpdate(InduceTemplate)?jsonView.success():jsonView.fail();
}
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("UPDATE_FAILED_MSG"));
log.error("AbstractRestServerImpl update error, jsonStr:{}", JSON.toJSONString(InduceTemplate), e);
}
return jsonView;
}
}
package net.wanji.opt.dao.mapper;
import net.wanji.opt.entity.DeviceInduces;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 设备-交通诱导屏设备 Mapper 接口
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface DeviceInducesMapper extends BaseMapper<DeviceInduces> {
}
...@@ -3,9 +3,16 @@ package net.wanji.opt.dao.mapper; ...@@ -3,9 +3,16 @@ package net.wanji.opt.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity; import net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity;
import java.util.List;
/** /**
* @author duanruiming * @author duanruiming
* @date 2024/11/08 10:14 * @date 2024/11/08 10:14
*/ */
public interface StrategyPlanInfoMapper extends BaseMapper<StrategyPlanInfoEntity> { public interface StrategyPlanInfoMapper extends BaseMapper<StrategyPlanInfoEntity> {
List<StrategyPlanInfoEntity> selectByCrossId(String crossId);
List<StrategyPlanInfoEntity> selectAll();
} }
package net.wanji.opt.dao.mapper.induce;
import net.wanji.opt.entity.GreenwaveInducesHist;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 绿波诱导下发历史信息表 Mapper 接口
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface GreenwaveInducesHistMapper extends BaseMapper<GreenwaveInducesHist> {
//
//
// List<GreenwaveInducesHist> findByPage(Map<String, Object> map);
}
package net.wanji.opt.dao.mapper.induce;
import net.wanji.opt.entity.GreenwaveInduces;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 绿波-诱导屏幕关系表 Mapper 接口
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface GreenwaveInducesMapper extends BaseMapper<GreenwaveInduces> {
//
//
// List<GreenwaveInduces> findByPage(Map<String, Object> map);
}
package net.wanji.opt.dao.mapper.induce;
import net.wanji.opt.entity.InduceHist;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 诱导屏-发布模板 Mapper 接口
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface InduceHistMapper extends BaseMapper<InduceHist> {
//
// List<InduceHist> findByPage(Map<String, Object> map);
}
package net.wanji.opt.dao.mapper.induce;
import net.wanji.opt.entity.InduceTemplate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* 诱导屏-发布模板 Mapper 接口
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface InduceTemplateMapper extends BaseMapper<InduceTemplate> {
//
// List<InduceTemplate> findByPage(Map<String, Object> map);
}
package net.wanji.opt.dto.induce;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class GreenwaveDTO {
@ApiModelProperty(name = "绿波编号")
private Integer greenId;
@ApiModelProperty(name = "绿波干线名称")
private String greenName;
@ApiModelProperty(name = "设计速度")
private Double designSpeed;
@ApiModelProperty(name = "当前策略")
private Integer strategyId;
@ApiModelProperty(name = "策略名称")
private String strategyName;
@ApiModelProperty(name = "绿波方向:1 南向北 2 西向东 3 北向南 4 东向西")
private Integer dir;
@ApiModelProperty(name = "执行时段")
private String controlOptTimes;
}
package net.wanji.opt.dto.induce;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class GreenwaveInducesDTO {
@ApiModelProperty(name = "绿波编号")
private Integer greenId;
@ApiModelProperty(name = "绿波干线名称")
private String greenName;
@ApiModelProperty(name = "诱导屏数量")
private Integer equipCount;
@ApiModelProperty(name = "设计速度")
private Double designSpeed;
@ApiModelProperty(name = "发布状态")
private Integer status ;
@ApiModelProperty(name = "当前策略")
private Integer strategyId;
@ApiModelProperty(name = "策略名称")
private String strategyName;
@ApiModelProperty(name = "绿波方向:1 南向北 2 西向东 3 北向南 4 东向西")
private Integer dir;
@ApiModelProperty(name = "推荐最小速度")
private Double minSpeed;
@ApiModelProperty(name = "推荐最大速度")
private Double maxSpeed;
@ApiModelProperty(name = "执行时段")
private String controlOptTimes;
@ApiModelProperty(name = "诱导屏列表")
private List<InduceDTO> induceList;
}
package net.wanji.opt.dto.induce;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.wanji.opt.entity.InduceTemplate;
import java.math.BigDecimal;
import java.util.List;
@NoArgsConstructor
@Data
public class InduceDTO {
@ApiModelProperty(name = "诱导下发编号")
private Integer id;
@ApiModelProperty(name = "屏幕编号")
private String equipCode;
@ApiModelProperty(name = "设备名称")
private String equipName;
@ApiModelProperty(name = "方向")
private Integer ridDir;
@ApiModelProperty(name = "发布状态")
private Integer status ;
@ApiModelProperty(name = "屏幕分辨率宽度")
private BigDecimal resolutionWidth;
@ApiModelProperty(name = "屏幕分辨率高度")
private BigDecimal resolutionHeight;
@ApiModelProperty(name = "关联绿波信息")
private List<GreenwaveDTO> greenwaveList;
@ApiModelProperty(name = "关联模板信息")
private List<InduceTemplate> induceTemplateList;
}
package net.wanji.opt.dto.induce;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotBlank;
/**
* @Description
* @Author zjf
* @Date 2024/11/11
**/
@Data
public class MessageParam {
private Integer induceId;
private Integer greenId;
/**
* 1上屏 2下屏
*/
@NotBlank(message = "是否上传ftp标识必传")
private int flg;
/**
* sourceid
*/
@NotBlank(message = "sourceid标识必传")
private String sourceId;
/**
* 屏体ID 由现场提供
*/
@NotBlank(message = "屏体ID标识必传")
private String equipCode;
/**
* 文件
*/
// 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="";
@ApiModelProperty(value = "结束时间,格式 2024-11-07 00:00:00")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private String endTime="";
/**
* ftp地址
*/
private String ftpPath;
/**
* 节目类型 TFM 路况 TFMH 独占 TAM 交通事件
*/
private String type = "TFMH";
/**
* x,y,w,h 为屏上发布的位置 一般 x=0 y=0 w为屏宽 h为屏高
*/
private Integer x = 0;
private Integer y = 0;
@NotBlank(message = "屏体宽度必传")
private Integer resolutionWidth=0;
@NotBlank(message = "屏体高度必传")
private Integer resolutionHeight=0;
/**
* 节目顺序号 顺着往下排
*/
private Integer playorder = 0;
/**
* 为每一屏的停留时间
*/
private Integer duration = 10;
// 以下为追加最新字段
/**
* 图片id
*/
@NotBlank(message = "图片模板id必传")
private Long templateId=0L;
/**
* 文本内容
*/
@NotBlank(message = "生成的文本内容必传")
private String[] contents;
}
package net.wanji.opt.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 设备-交通诱导屏设备
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_device_induces")
public class DeviceInduces implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "oid", type = IdType.AUTO)
private Long oid;
/**
* 厂家设备编号
*/
@TableField("equip_code")
private String equipCode;
/**
* 设备名称
*/
@TableField("equip_name")
private String equipName;
/**
* 设备型号
*/
@TableField("equip_model")
private String equipModel;
/**
* 设备IP
*/
@TableField("equip_ip")
private String equipIp;
/**
* 设备点位地址描述
*/
@TableField("equip_addr")
private String equipAddr;
/**
* 设备图片地址
*/
@TableField("equip_img_url")
private String equipImgUrl;
/**
* 所在路口编号
*/
@TableField("cross_id")
private String crossId;
/**
* 诱导关联路段
*/
@TableField("rid")
private String rid;
/**
* 关联路段方向
*/
@TableField("rid_dir")
private Integer ridDir;
/**
* 功能类型(1.常规诱导屏、2.潮汐车道诱导屏、3.可变车道诱导屏)
*/
@TableField("function_type")
private String functionType;
/**
* 屏幕类型(1.点阵屏、2.光带屏、3.复合屏、4.全彩屏)
*/
@TableField("screen_type")
private String screenType;
/**
* 屏幕尺寸
*/
@TableField("screen_size")
private String screenSize;
/**
* 屏幕分辨率宽度
*/
@TableField("resolution_width")
private BigDecimal resolutionWidth;
/**
* 屏幕分辨率高度
*/
@TableField("resolution_height")
private BigDecimal resolutionHeight;
/**
* 位置坐标
*/
@TableField("wkt")
private String wkt;
/**
* 诱导发布次数
*/
@TableField("induce_publish_count")
private String inducePublishCount;
/**
* 安装高度
*/
@TableField("allow_word_num")
private Integer allowWordNum;
/**
* 安装位置
*/
@TableField("install_height")
private BigDecimal installHeight;
/**
* 设备朝向
*/
@TableField("equipment_direct")
private String equipmentDirect;
/**
* 诱导车流方向
*/
@TableField("traffic_direct")
private String trafficDirect;
/**
* 设备厂商
*/
@TableField("manufacturer")
private String manufacturer;
/**
* 行政区域代码
*/
@TableField("area_code")
private String areaCode;
/**
* 安装日期
*/
@TableField("install_time")
private String installTime;
/**
* 维保开始时间
*/
@TableField("maintenance_start_time")
private String maintenanceStartTime;
/**
* 维保到期时间
*/
@TableField("maintenance_expiration_time")
private String maintenanceExpirationTime;
/**
* 建设主体单位
*/
@TableField("main_construction_unit")
private String mainConstructionUnit;
/**
* 建设单位
*/
@TableField("build_unit")
private String buildUnit;
/**
* 建设单位负责人
*/
@TableField("build_unit_people")
private String buildUnitPeople;
/**
* 承建单位
*/
@TableField("contractor")
private String contractor;
/**
* 承建单位负责人
*/
@TableField("contractor_unit_people")
private String contractorUnitPeople;
/**
* 维护单位
*/
@TableField("maintenance_unit")
private String maintenanceUnit;
/**
* 维护单位负责人
*/
@TableField("maintenance_unit_people")
private String maintenanceUnitPeople;
/**
* 维护人员
*/
@TableField("maintenance_people")
private String maintenancePeople;
/**
* 维护人员联系方式
*/
@TableField("maintenance_people_telephone")
private String maintenancePeopleTelephone;
/**
* 设备状态 0:离线 1:在线
*/
@TableField("status")
private String status;
/**
* 是否显示
*/
@TableField("is_show")
private Boolean isShow;
}
package net.wanji.opt.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 绿波-诱导屏幕关系表
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_greenwave_induces")
public class GreenwaveInduces implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 绿波ID
*/
@TableField("green_id")
private Integer greenId;
/**
* 关联诱导屏幕设备编号
*/
@TableField("equip_code")
private String equipCode;
/**
* 路段走向:1 南向北 2 西向东 3 北向南 4 东向西
*/
@TableField("dir")
private Integer dir;
/**
* 诱导屏幕顺序号
*/
@TableField("sort")
private Integer sort;
/**
* 诱导下发编号(sourceId,下发的时候生成的UUID)
*/
@TableField("source_id")
private String sourceId;
/**
* 诱导下发计数
*/
@TableField("induces_count")
private Long inducesCount;
/**
* 0 未发布 1 已发布
*/
@TableField("status")
private Integer status;
/**
* 创建时间
*/
@TableField("gmt_create")
private Date gmtCreate;
/**
* 修改时间
*/
@TableField("gmt_modified")
private Date gmtModified;
}
package net.wanji.opt.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 绿波诱导下发历史信息表
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_greenwave_induces_hist")
public class GreenwaveInducesHist implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 绿波编号
*/
@TableField("green_id")
private Integer greenId;
/**
* 当前策略名称
*/
@TableField("strategy_name")
private String strategyName;
/**
* 绿波带下发时间
*/
@TableField("control_time")
private Date controlTime;
/**
* 执行策略 1单条 2垂直 3平行
*/
@TableField("type")
private Integer type;
/**
* 绿波方向:1 南向北 2 西向东 3 北向南 4 东向西
*/
@TableField("dir")
private Integer dir;
/**
* 绿波最大速度
*/
@TableField("max_speed")
private Double maxSpeed;
/**
* 绿波最小速度
*/
@TableField("min_speed")
private Double minSpeed;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime;
/**
* 修改时间
*/
@TableField("modify_time")
private Date modifyTime;
/**
* 执行策略编号
*/
@TableField("strategy_id")
private Integer strategyId;
/**
* 0 未发布 1 已发布
*/
@TableField("status")
private Integer status;
/**
* 执行时段
*/
@TableField("control_opt_times")
private String controlOptTimes;
/**
* 节目顺序号 顺着往下排
*/
@TableField("playorder")
private Integer playorder;
/**
* 为每一屏的停留时间
*/
@TableField("duration")
private Integer duration;
}
package net.wanji.opt.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
* 诱导屏-发布历史
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_induce_hist_log")
public class InduceHist implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 诱导屏编号
*/
@TableField("equip_code")
private String equipCode;
/**
* 诱导下发编号(sourceId,下发的时候生成的UUID)
*/
@TableField("source_id")
private String sourceId;
/**
* 绿波ID
*/
@TableField("green_id")
private Integer greenId;
/**
* 下发文件路径
*/
@TableField("file_path")
private String filePath;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime;
}
package net.wanji.opt.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.apache.ibatis.type.BlobTypeHandler;
/**
* <p>
* 诱导屏-发布模板
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("t_induce_template")
public class InduceTemplate implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 诱导屏编号
*/
@TableField("equip_code")
private String equipCode;
/**
* 模板名称
*/
@TableField("file_name")
private String fileName;
/**
* 模板路径
*/
@TableField("file_path")
private String filePath;
/**
* 模板内容
*/
@TableField(value = "file_content", typeHandler = BlobTypeHandler.class)
private byte[] fileContent;
/**
* 文字左上角X坐标
*/
@TableField("text_x")
private Integer textX;
/**
* 文字左上角Y坐标
*/
@TableField("text_y")
private Integer textY;
/**
* 文字大小
*/
@TableField("text_size")
private Integer textSize;
/**
* 0:横向生成、1:竖向生成
*/
@TableField("text_sign")
private Boolean textSign;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime;
/**
* 修改时间
*/
@TableField("gmt_modified")
private Date gmtModified;
}
...@@ -45,7 +45,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler { ...@@ -45,7 +45,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler {
private final HoloForeignDeviceMapper holoForeignDeviceMapper; private final HoloForeignDeviceMapper holoForeignDeviceMapper;
@Transactional @Transactional
@KafkaListener(topics = {"cross_real_time_lane_data"}) // @KafkaListener(topics = {"cross_real_time_lane_data"})
public void receiveCrossRealTimeLaneData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception { public void receiveCrossRealTimeLaneData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception {
try { try {
String crossRealTimeLaneData = String.valueOf(record.value()); String crossRealTimeLaneData = String.valueOf(record.value());
...@@ -81,7 +81,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler { ...@@ -81,7 +81,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler {
} }
@Transactional @Transactional
@KafkaListener(topics = {"cross_real_time_data"}) // @KafkaListener(topics = {"cross_real_time_data"})
public void receiveCrossRealTimeData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception { public void receiveCrossRealTimeData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception {
try { try {
String crossRealTimeData = String.valueOf(record.value()); String crossRealTimeData = String.valueOf(record.value());
...@@ -130,7 +130,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler { ...@@ -130,7 +130,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler {
} }
@Transactional @Transactional
@KafkaListener(topics = {"cross_real_time_dir_data"}) // @KafkaListener(topics = {"cross_real_time_dir_data"})
public void receiveCrossRealTimeDirData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception { public void receiveCrossRealTimeDirData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception {
try { try {
String crossRealTimeDirData = String.valueOf(record.value()); String crossRealTimeDirData = String.valueOf(record.value());
...@@ -155,7 +155,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler { ...@@ -155,7 +155,7 @@ public class ConsumerHandler implements KafkaListenerErrorHandler {
} }
@Transactional @Transactional
@KafkaListener(topics = {"cross_real_time_turn_data"}) // @KafkaListener(topics = {"cross_real_time_turn_data"})
public void receiveCrossRealTimeTurnData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception { public void receiveCrossRealTimeTurnData(ConsumerRecord<Object, Object> record, Acknowledgment acknowledgment) throws Exception {
try { try {
String crossRealTimeTurnData = String.valueOf(record.value()); String crossRealTimeTurnData = String.valueOf(record.value());
......
...@@ -18,7 +18,7 @@ public class StrategyGreenOptHistEntity { ...@@ -18,7 +18,7 @@ public class StrategyGreenOptHistEntity {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Integer id; private Integer id;
@TableField("green_id") @TableField("green_id")
private String greenId; private Integer greenId;
@TableField("length") @TableField("length")
private Double length; private Double length;
@TableField("cycle") @TableField("cycle")
......
package net.wanji.opt.service;
import net.wanji.opt.entity.DeviceInduces;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 设备-交通诱导屏设备 服务类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface DeviceInducesService extends IService<DeviceInduces> {
}
package net.wanji.opt.service.impl;
import net.wanji.opt.entity.DeviceInduces;
import net.wanji.opt.dao.mapper.DeviceInducesMapper;
import net.wanji.opt.service.DeviceInducesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 设备-交通诱导屏设备 服务实现类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Service
public class DeviceInducesServiceImpl extends ServiceImpl<DeviceInducesMapper, DeviceInduces> implements DeviceInducesService {
}
package net.wanji.opt.service.induce;
import net.wanji.opt.entity.GreenwaveInducesHist;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 绿波诱导下发历史信息表 服务类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface GreenwaveInducesHistService extends IService<GreenwaveInducesHist> {
}
package net.wanji.opt.service.induce;
import net.wanji.opt.entity.GreenwaveInduces;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 绿波-诱导屏幕关系表 服务类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface GreenwaveInducesService extends IService<GreenwaveInduces> {
}
package net.wanji.opt.service.induce;
import net.wanji.opt.entity.InduceHist;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 诱导屏-发布模板 服务类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface InduceHistService extends IService<InduceHist> {
}
package net.wanji.opt.service.induce;
import freemarker.template.TemplateException;
import net.wanji.opt.dto.induce.MessageParam;
import java.awt.image.BufferedImage;
import java.io.IOException;
public interface InduceSendService {
void send(MessageParam param) throws IOException, TemplateException;
String uploadFile(BufferedImage image,String directoryName, String fileName);
byte[] downloadImage(String remoteFile) throws IOException;
}
package net.wanji.opt.service.induce;
import net.wanji.opt.entity.InduceTemplate;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 诱导屏-发布模板 服务类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
public interface InduceTemplateService extends IService<InduceTemplate> {
}
package net.wanji.opt.service.induce.impl;
import net.wanji.opt.entity.GreenwaveInducesHist;
import net.wanji.opt.dao.mapper.induce.GreenwaveInducesHistMapper;
import net.wanji.opt.service.induce.GreenwaveInducesHistService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 绿波诱导下发历史信息表 服务实现类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Service
public class GreenwaveInducesHistServiceImpl extends ServiceImpl<GreenwaveInducesHistMapper, GreenwaveInducesHist> implements GreenwaveInducesHistService {
}
package net.wanji.opt.service.induce.impl;
import net.wanji.opt.entity.GreenwaveInduces;
import net.wanji.opt.dao.mapper.induce.GreenwaveInducesMapper;
import net.wanji.opt.service.induce.GreenwaveInducesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 绿波-诱导屏幕关系表 服务实现类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Service
public class GreenwaveInducesServiceImpl extends ServiceImpl<GreenwaveInducesMapper, GreenwaveInduces> implements GreenwaveInducesService {
}
package net.wanji.opt.service.induce.impl;
import net.wanji.opt.entity.InduceHist;
import net.wanji.opt.dao.mapper.induce.InduceHistMapper;
import net.wanji.opt.service.induce.InduceHistService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 诱导屏-发布模板 服务实现类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Service
public class InduceHistServiceImpl extends ServiceImpl<InduceHistMapper, InduceHist> implements InduceHistService {
}
package net.wanji.opt.service.induce.impl;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
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.*;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.UUID;
@Service
@Slf4j
public class InduceSendServiceImpl implements InduceSendService {
@Autowired
private InduceTemplateService induceTemplateService;
@Autowired
RabbitTemplate rabbitTemplate;
@Autowired
private InduceHistService induceHistService;
@Autowired
private GreenwaveInducesService greenwaveInducesService;
@Autowired
private Configuration freemarkerConfig;
@Value("${ftp.url}")
private String FTP_IP;
@Value("${ftp.username}")
private String FTP_USERNAME;
@Value("${ftp.password}")
private String FTP_PASSWORD;
@Value("${ftp.port}")
private Integer FTP_PORT;
@Value("${ftp.path}")
private String PATH;
@Value("${spring.rabbitmq.queue-name}")
private String queueName;
private FTPClient ftpClient;
@Override
public void send(MessageParam param) throws IOException, TemplateException {
//生成诱导屏推送sourceId
String messageId = UUID.randomUUID().toString().toLowerCase();
InduceHist induceHist=new InduceHist();
param.setSourceId(messageId);
induceHist.setSourceId(messageId);
GreenwaveInduces greenwaveinduces=greenwaveInducesService.getById(param.getInduceId());
// 读取图片模板参数
InduceTemplate induceTemplate = induceTemplateService.getById(param.getTemplateId());
// 获取图片字节数组
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()));
// 上传文件至ftp
if (param.getFlg() == 1) {
String dirName=LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String fileName=param.getEquipCode()+"_"+UUID.randomUUID().toString()+".bmp";
String filePath = uploadFile(image,dirName, fileName);
param.setFtpPath(filePath);
induceHist.setFilePath(PATH + dirName+"/"+fileName);
}
log.info("上传文件至ftp-filePath:{}", param.getFtpPath());
// //如果已发布,则调用下屏服务
// if(greenwaveinduces.getStatus()==1){
// param.setFlg(2);
// param.setSourceId(greenwaveinduces.getSourceId());
// // 推送mq消息
// String message = convertMessage(param.getFlg()==1?"induce_up.xml":"induce_down.xml",param);
// // 去掉所有转义字符(\n、\t、\b、等)
//// message = message.replaceAll("[\\n\\t\\r]", ""); // 可以根据需要添加更多字符
// // 可以去掉反斜杠
//// message = message.replace("\\", "");
// // 创建MessageProperties并设置内容类型
// MessageProperties messageProperties = new MessageProperties();
// messageProperties.setContentType("text/plain"); // 设置内容类型为text/plain
// // 创建Message并设置内容
// Message messageSend = new Message(message.getBytes(), messageProperties);
// rabbitTemplate.convertAndSend("",queueName, messageSend);
// }
// 推送mq消息
String message = convertMessage(param.getFlg()==1?"induce_up.xml":"induce_down.xml",param);
// 去掉所有转义字符(\n、\t、\b、等)
// message = message.replaceAll("[\\n\\t\\r]", ""); // 可以根据需要添加更多字符
// 可以去掉反斜杠
// message = message.replace("\\", "");
// 创建MessageProperties并设置内容类型
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);
//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;
try {
ftpClient = new FTPClient();
//优先设置编码格式,避免中文乱码
ftpClient.setAutodetectUTF8(true);
ftpClient.setControlEncoding(StandardCharsets.UTF_8.name());
ftpClient.setCharset(StandardCharsets.UTF_8);
//连接ftp和登录ftp服务器
ftpClient.connect(FTP_IP, FTP_PORT);
ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
log.info("ftp服务器连接成功");
//进入本地被动模式
ftpClient.enterLocalPassiveMode();
//将设置文件传输模式是二进制传输,可以保证传输的内容不会被改变
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
makeDir(ftpClient, PATH + directoryName);
log.info("ftp切换工作目录成功, 当前工作目录是:{}", ftpClient.printWorkingDirectory());
// 将BufferedImage转换为ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
baos.flush();
inputStream = new ByteArrayInputStream(baos.toByteArray());
//上传文件到ftp服务器上
boolean hasUploaded = ftpClient.storeFile(fileName, inputStream);
if (hasUploaded) {
log.info("{}文件上传成功", fileName);
return "ftp://" + FTP_USERNAME + ":" + FTP_PASSWORD +"@"+ FTP_IP + PATH + directoryName + "/" + fileName;
}
log.info("ftp服务器上传文件{}失败", fileName);
return null;
} catch (Exception e) {
log.error(e.getMessage());
return null;
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public byte[] downloadImage(String remoteFile) throws IOException {
// 远程文件路径
String filePath = remoteFile;
// 创建 FTP 客户端
FTPClient ftpClient = new FTPClient();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
// FTP 服务器地址
ftpClient.connect(FTP_IP, FTP_PORT);
// 用户名和密码
ftpClient.login(FTP_USERNAME, FTP_PASSWORD);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// 获取文件字节数组
InputStream inputStream = ftpClient.retrieveFileStream(filePath);
if (inputStream != null) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// 完成文件传输
ftpClient.completePendingCommand();
// 返回字节数组
return outputStream.toByteArray();
}
} finally {
outputStream.close();
ftpClient.logout();
ftpClient.disconnect();
}
return null; // 如果下载失败返回 null
}
private void makeDir(FTPClient ftp, String path) throws IOException {
String[] paths = path.trim().split("/");
for (String directory : paths) {
if (directory.length() > 0 && !ftp.changeWorkingDirectory(directory)) {
ftp.makeDirectory(directory);
ftp.changeWorkingDirectory(directory);
}
}
}
/**
* 在指定位置添加文字到图像
*
* @param image 图像对象
* @param text 要添加的文字
* @param x 文字的x坐标
* @param y 文字的y坐标
* @param size 字号
* @param isSign 横纵向
*/
public static void addTextToImage(BufferedImage image, String[] text, int x, int y, int size, boolean isSign) {
// 创建Graphics对象
Graphics g = image.getGraphics();
// 设置字体和颜色
g.setFont(new Font("Arial", Font.BOLD, size));
g.setColor(Color.green);
// 计算字体的高度,用于调整y坐标
FontMetrics metrics = g.getFontMetrics(g.getFont());
int textHeight = metrics.getHeight();
// 绘制位考虑文字的高度,防止文字被裁剪
y = (image.getHeight() - y) + (textHeight - metrics.getDescent());
if (isSign) { // 横向
// 在指定位置绘制文
g.drawString(text[0], x, y);
} else { // 纵向
// 字体高度的70%
int verticalSpacing = (int) (textHeight * 0.7);
// 逐个字符绘制文字
for (int i = 0; i < text.length; i++) {
if (i == 0) {
g.drawString(text[i], x, y);
} else {
g.drawString(text[i], x, y + (i * verticalSpacing));
}
}
}
// 释放资源
g.dispose();
}
/**
* 将JPG文件转换为BMP格式
*
* @param jpgFilePath 输入的JPG文件路径
* @param bmpFilePath 输出的BMP文件路径
* @throws IOException 转换失败时抛出异常
*/
public static void convertJpgToBmp(String jpgFilePath, String bmpFilePath) throws IOException {
// 读取JPG文件为BufferedImage
BufferedImage jpgImage = ImageIO.read(new File(jpgFilePath));
if (jpgImage == null) {
throw new IOException("无法读取JPG文件: " + jpgFilePath);
}
// 写入BMP文件
File bmpFile = new File(bmpFilePath);
if (ImageIO.write(jpgImage, "bmp", bmpFile)) {
System.out.println("JPG已成功转换为BMP: " + bmpFilePath);
} else {
throw new IOException("无法将JPG写入BMP文件!");
}
}
/**
* 组装mqtt消息
*
* @param dataModel 传输参数
* @param templateName 模板名称
* @return
*/
private String convertMessage(String templateName,Object dataModel) throws IOException, TemplateException {
Template template = freemarkerConfig.getTemplate(templateName);
StringWriter writer = new StringWriter();
template.process(dataModel, writer);
return writer.toString();
}
private String convertMessage(MessageParam param) {
int flg = param.getFlg();
String sourceid = param.getSourceId();
String vmsid = param.getEquipCode();
String type = param.getType();
if (flg == 1) {
Integer x = param.getX();
Integer y = param.getY();
Integer width = param.getResolutionWidth();
Integer height = param.getResolutionHeight();
Integer playorder = param.getPlayorder();
Integer duration = param.getDuration();
String ftpPath = param.getFtpPath();
String upMessage = "<?xml version=\"1.0\" encoding=\"GB2312\"?>\n" +
"<message System=\"ATMS\" Ver=\"1.0\">\n" +
"\t<systemtype>VMS</systemtype>\n" +
"\t<messagetype>CONTROL</messagetype>\n" +
"\t<sourceIP>"+sourceid+"</sourceIP>\n" +
"\t<targetIP></targetIP>\n" +
"\t<user></user>\n" +
"\t<password></password>\n" +
"\t<task>\n" +
"\t\t<tasktype>updatelistandfileEx</tasktype>\n" +
"\t\t\t<taskdetail>\n" +
"\t\t\t\t<ledid width=\""+width+"\" height=\""+height+"\">"+vmsid+"</ledid>\n" +
"\t\t\t\t<list type=\"composite\">\n" +
"\t\t\t\t\t<file playorder=\""+playorder+"\" duration=\""+duration+"\" starttime=\"2024-11-07 00:00:00\" endtime=\"2030-11-07 23:59:59\" backgroundcolor=\"#000000\" url=\"\">\n" +
"\t\t\t\t\t\t<area contenttype=\"imageFile\" x=\""+x+"\" y=\""+y+"\" w=\""+width+"\" h=\""+height+"\" entermode=\"0\" enterspeed=\"1\" exitmode=\"0\" exitspeed=\"0\">\n" +
"\t\t\t\t\t\t\t<imagefile filetype=\"bmp\" type=\"uri\">"+ftpPath+"</imagefile>\n" +
"\t\t\t\t\t\t</area>\n" +
"\t\t\t\t\t</file>\n" +
"\t\t\t\t</list>\n" +
"\t\t\t</taskdetail>\n" +
"\t\t<senderinfo>"+type+"</senderinfo>\n" +
"\t</task>\n" +
"</message>";
return upMessage;
} else {
String downMessage = "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n" +
"<message System=\"ATMS\" Ver=\"1.0\">\n" +
"<systemtype>VMS</systemtype>\n" +
"<messagetype>CONTROL</messagetype>\n" +
"<!--token-->\n" +
"<sourceIP>"+sourceid+"</sourceIP>\n" +
"<targetIP></targetIP>\n" +
"<user></user>\n" +
"<password></password>\n" +
"<task>\n" +
"<tasktype>deletelistandfile</tasktype>\n" +
"<taskdetail>\n" +
"<!--屏体ID 由现场提供-->\n" +
" <ledid>"+vmsid+"</ledid> \n" +
"</taskdetail>\n" +
"<!--节目类型 TFM 路况 TFMH 独占 TAM 交通事件-->\n" +
"<senderinfo>"+type+"</senderinfo>\n" +
"</task>\n" +
"</message>";
return downMessage;
}
}
}
package net.wanji.opt.service.induce.impl;
import net.wanji.opt.entity.InduceTemplate;
import net.wanji.opt.dao.mapper.induce.InduceTemplateMapper;
import net.wanji.opt.service.induce.InduceTemplateService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 诱导屏-发布模板 服务实现类
* </p>
*
* @author guoliang.dong
* @since 2024-11-22
*/
@Service
public class InduceTemplateServiceImpl extends ServiceImpl<InduceTemplateMapper, InduceTemplate> implements InduceTemplateService {
}
...@@ -5,19 +5,14 @@ import io.swagger.annotations.ApiOperation; ...@@ -5,19 +5,14 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.JacksonUtils; import net.wanji.opt.synthesis.service.impl.StrategyGreenBeltServiceImpl;
import net.wanji.opt.common.Constants;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.service.GreenBeltInfoService;
import net.wanji.opt.vo.GreenBeltChartVO; import net.wanji.opt.vo.GreenBeltChartVO;
import net.wanji.opt.vo.GreenBeltInfoVO; import net.wanji.opt.vo.GreenBeltInfoVO;
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;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.util.Date;
/** /**
* @author duanruiming * @author duanruiming
...@@ -30,43 +25,31 @@ import javax.ws.rs.core.MediaType; ...@@ -30,43 +25,31 @@ import javax.ws.rs.core.MediaType;
public class StrategyGreenBeltController { public class StrategyGreenBeltController {
@Resource @Resource
private RedisUtils redisUtils; private StrategyGreenBeltServiceImpl strategyGreenBeltService;
@Resource
private GreenBeltInfoService greenBeltInfoService;
@ApiOperation(value = "绿波时序图数据查询", notes = "绿波时序图数据查询", response = JsonViewObject.class, @ApiOperation(value = "绿波时序图数据查询", notes = "绿波时序图数据查询", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenBletData", @GetMapping(value = "/greenBletData")
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenBeltInfoVO.class), @ApiResponse(code = 200, message = "OK", response = GreenBeltInfoVO.class),
}) })
public JsonViewObject greenBletData(@RequestBody String greenId) throws Exception { public JsonViewObject greenBletData(String greenId) throws Exception {
//String key = Constants.GREEN_ID_OPT_KEY.concat(greenId);
// todo 测试 //Object obj = redisUtils.get(key);
GreenBeltInfoVO greenBeltInfoVO1 = greenBeltInfoService.convertData(null);
greenBeltInfoService.save(greenBeltInfoVO1);
String key = Constants.GREEN_ID_OPT_KEY.concat(greenId);
redisUtils.set(key, JacksonUtils.getInstance().writeValueAsString(greenBeltInfoVO1));
Object obj = redisUtils.get(key);
JsonViewObject jsonViewObject = JsonViewObject.newInstance(); JsonViewObject jsonViewObject = JsonViewObject.newInstance();
GreenBeltInfoVO greenBeltInfoVO = JacksonUtils.getInstance().readValue(String.valueOf(obj), GreenBeltInfoVO.class); //GreenBeltInfoVO greenBeltInfoVO = JacksonUtils.getInstance().readValue(String.valueOf(obj), GreenBeltInfoVO.class);
return jsonViewObject.success(greenBeltInfoVO); return jsonViewObject.success(null);
} }
@ApiOperation(value = "绿波时序图图形查询", notes = "绿波时序图图形查询", response = JsonViewObject.class, @ApiOperation(value = "绿波时序图图形查询", notes = "绿波时序图图形查询", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenBeltChart", @GetMapping(value = "/greenBeltChart")
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenBeltInfoVO.class), @ApiResponse(code = 200, message = "OK", response = GreenBeltInfoVO.class),
}) })
public JsonViewObject greenBeltChart(@RequestBody String greenId) throws Exception { public JsonViewObject greenBeltChart(Integer greenId, Date date) throws Exception {
String key = Constants.GREEN_ID_OPT_CHART_KEY.concat(greenId); GreenBeltChartVO greenBeltChartVO = strategyGreenBeltService.selectChart(greenId, date);
Object obj = redisUtils.get(key); return JsonViewObject.newInstance().success(greenBeltChartVO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
GreenBeltChartVO greenBeltChartVO = JacksonUtils.getInstance().readValue(String.valueOf(obj), GreenBeltChartVO.class);
return jsonViewObject.success(greenBeltChartVO);
} }
} }
package net.wanji.opt.synthesis.service;
import net.wanji.opt.vo.GreenBeltChartVO;
import java.util.Date;
/**
* @author duanruiming
* @date 2024/11/25 13:53
*/
public interface StrategyGreenBeltService {
GreenBeltChartVO selectChart(Integer greenId, Date queryDate);
}
package net.wanji.opt.synthesis.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.opt.dao.mapper.StrategyGreenOptHistMapper;
import net.wanji.opt.po.StrategyGreenOptHistEntity;
import net.wanji.opt.synthesis.service.StrategyGreenBeltService;
import net.wanji.opt.vo.GreenBeltChartVO;
import net.wanji.opt.vo.GreenBeltInfoVO;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2024/11/25 13:53
*/
@Service
@Slf4j
public class StrategyGreenBeltServiceImpl implements StrategyGreenBeltService {
@Resource
StrategyGreenOptHistMapper strategyGreenOptHistMapper;
@Override
public GreenBeltChartVO selectChart(Integer greenId, Date queryDate) {
try {
ObjectMapper mapper = JacksonUtils.getInstance();
QueryWrapper<StrategyGreenOptHistEntity> queryWrapper = new QueryWrapper<>();
String customOrderBy = "ABS(DATEDIFF(control_time, '" + queryDate + "'))";
queryWrapper.orderByAsc(true, customOrderBy);
queryWrapper.last("LIMIT 2");
List<StrategyGreenOptHistEntity> entities = strategyGreenOptHistMapper.selectList(queryWrapper);
if (!CollectionUtils.isEmpty(entities)) {
Map<String, List<StrategyGreenOptHistEntity>> controlTimeMap = entities.stream().collect(Collectors.groupingBy(StrategyGreenOptHistEntity::getControlTime));
// 判断下发是否是正向还是反向 相同时间两条,双向绿波
GreenBeltInfoVO greenBeltInfoVO = new GreenBeltInfoVO();
List<GreenBeltInfoVO.DirGreenDetail> dirGreenDetails = new ArrayList<>();
// 相同时间,双向绿波
if (controlTimeMap.size() == 1) {
setBeltInfo(mapper, entities, greenBeltInfoVO, dirGreenDetails);
} else {
entities.remove(entities.size() - 1);
setBeltInfo(mapper, entities, greenBeltInfoVO, dirGreenDetails);
}
greenBeltInfoVO.setDirGreenDetails(dirGreenDetails);
System.err.println(greenBeltInfoVO);
GreenBeltChartVO greenBeltChartVO = calGreenChart(greenBeltInfoVO);
return greenBeltChartVO;
}
} catch (Exception e) {
log.error("数据转化异常", e);
throw new RuntimeException(e);
}
return null;
}
private static void setBeltInfo(ObjectMapper mapper, List<StrategyGreenOptHistEntity> entities, GreenBeltInfoVO greenBeltInfoVO, List<GreenBeltInfoVO.DirGreenDetail> dirGreenDetails) throws JsonProcessingException {
for (StrategyGreenOptHistEntity entity : entities) {
greenBeltInfoVO.setGreenId(String.valueOf(entity.getGreenId()));
greenBeltInfoVO.setLength(entity.getLength());
greenBeltInfoVO.setCycle(entity.getCycle());
greenBeltInfoVO.setControlTime(entity.getControlTime());
greenBeltInfoVO.setControlDuration(entity.getControlDuration());
greenBeltInfoVO.setType(entity.getType());
greenBeltInfoVO.setDynamic(entity.getDynamic());
greenBeltInfoVO.setControlMethod(entity.getControlMethod());
GreenBeltInfoVO.DirGreenDetail dirGreenDetail = new GreenBeltInfoVO.DirGreenDetail();
dirGreenDetail.setDirType(entity.getDirType());
dirGreenDetail.setDir(entity.getDir());
dirGreenDetail.setMaxSpeed(entity.getMaxSpeed());
dirGreenDetail.setMinSpeed(entity.getMinSpeed());
dirGreenDetail.setGreenWidthTime(entity.getGreenWidthTime());
String crossGreenDetail = entity.getCrossGreenDetail();
List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetails = mapper.readValue(crossGreenDetail, new TypeReference<List<GreenBeltInfoVO.CrossGreenDetail>>() {});
dirGreenDetail.setCrossGreenDetailList(crossGreenDetails);
dirGreenDetails.add(dirGreenDetail);
}
}
private static GreenBeltChartVO calGreenChart(GreenBeltInfoVO greenBeltInfoVO) throws JsonProcessingException {
ObjectMapper mapper = JacksonUtils.getInstance();
Map<String, List<List<Double>>> crossRedTimesMap = new TreeMap<>();
Map<String, List<List<Double>>> backCrossRedTimesMap = new TreeMap<>();
Map<String, Double> crossGreenStartMap = new TreeMap<>();
Map<String, Double> backCrossGreenStartMap = new TreeMap<>();
Map<String, Double> distanceMap = new TreeMap<>();
// 处理绿波时序图数据
List<GreenBeltInfoVO.DirGreenDetail> dirGreenDetails = greenBeltInfoVO.getDirGreenDetails();
Double greenWidthTime = 0.0;
Double backGreenWidthTime = 0.0;
if (!CollectionUtils.isEmpty(dirGreenDetails)) {
Integer cycle = greenBeltInfoVO.getCycle();
for (GreenBeltInfoVO.DirGreenDetail dirGreenDetail : dirGreenDetails) {
Integer dirType = dirGreenDetail.getDirType();
if (dirType == 1) {
greenWidthTime = dirGreenDetail.getGreenWidthTime();
List<GreenBeltInfoVO.CrossGreenDetail> list = dirGreenDetail.getCrossGreenDetailList();
getaDouble(crossRedTimesMap, crossGreenStartMap, distanceMap, cycle, list);
}
if (dirType == 0) {
backGreenWidthTime = dirGreenDetail.getGreenWidthTime();
List<GreenBeltInfoVO.CrossGreenDetail> list = dirGreenDetail.getCrossGreenDetailList();
Collections.reverse(list);
getaDouble(backCrossRedTimesMap, backCrossGreenStartMap, distanceMap, cycle, list);
}
}
}
GreenBeltChartVO greenBeltChartVO = new GreenBeltChartVO();
greenBeltChartVO.setGreenWidthTime(greenWidthTime);
greenBeltChartVO.setBackGreenWidthTime(backGreenWidthTime);
greenBeltChartVO.setCrossRedTimesMap(mapper.writeValueAsString(crossRedTimesMap));
greenBeltChartVO.setBackCrossRedTimesMap(mapper.writeValueAsString(backCrossRedTimesMap));
greenBeltChartVO.setGreenStartMap(mapper.writeValueAsString(crossGreenStartMap));
greenBeltChartVO.setBackGreenStartMap(mapper.writeValueAsString(backCrossGreenStartMap));
greenBeltChartVO.setDistanceMap(mapper.writeValueAsString(distanceMap));
return greenBeltChartVO;
}
private static void getaDouble(Map<String, List<List<Double>>> crossRedTimesMap, Map<String, Double> crossGreenStartMap, Map<String, Double> distanceMap,
Integer cycle, List<GreenBeltInfoVO.CrossGreenDetail> crossGreenDetailList) {
if (!CollectionUtils.isEmpty(crossGreenDetailList)) {
// 所有行程时间
double totalTravel = crossGreenDetailList.stream().mapToDouble(GreenBeltInfoVO.CrossGreenDetail::getTravelTime).sum();
GreenBeltInfoVO.CrossGreenDetail firstCrossGreenDetail = crossGreenDetailList.get(0);
Double firstOffset = firstCrossGreenDetail.getOffset();
Double firstPhaseStartTime = firstCrossGreenDetail.getPhaseStartTime();
Double firstGreenStart = firstCrossGreenDetail.getGreenStartTime();
double cycleSum = Math.ceil((totalTravel + firstOffset + firstPhaseStartTime + firstGreenStart) / cycle);
Double crossGreenStartTime = firstOffset + firstPhaseStartTime + firstGreenStart;
for (GreenBeltInfoVO.CrossGreenDetail crossGreenDetail : crossGreenDetailList) {
List<List<Double>> redTimes = new ArrayList<>();
String crossId = crossGreenDetail.getCrossId();
Double offset = crossGreenDetail.getOffset();
Double phaseStartTime = crossGreenDetail.getPhaseStartTime();
Double travelTime = crossGreenDetail.getTravelTime();
Double distance = crossGreenDetail.getDistance();
// 相位结束时间大于周期,绿灯时时间补到周期开始位置
Double cycleD = Double.valueOf(cycle);
Double phaseEndTime = crossGreenDetail.getPhaseEndTime();
for (int i = 0; i < cycleSum; i++) {
// 周期 + 相位差
Double cycleIndex = i * cycleD;
Double phaseReverseStartTime = phaseEndTime.intValue() - cycleD;
// 最后结尾要将前面相位差时间补充为周期
Double endCycleExt = cycleD - offset;
Double offsetIndex = endCycleExt;
// 相位结束时间 > cycle, 周期相位差后面补充周期要添加绿灯
if (phaseReverseStartTime > 0) {
phaseReverseStartTime = Math.abs(phaseReverseStartTime);
// cycle内红灯
redTimes.add(Arrays.asList(cycleIndex + phaseReverseStartTime, cycleIndex + phaseStartTime));
redTimes.add(Arrays.asList(cycleIndex + phaseEndTime, cycleIndex + cycleD));
if (endCycleExt >= phaseStartTime) {
// endCycleExt内红灯
redTimes.add(Arrays.asList(cycleIndex + offset + phaseReverseStartTime, cycleIndex + offset + phaseStartTime));
// offset内红灯
redTimes.add(Arrays.asList(phaseReverseStartTime - offsetIndex, phaseStartTime - offsetIndex));
} else if (endCycleExt < phaseStartTime && phaseReverseStartTime > endCycleExt) {
// endCycleExt全绿灯
// offset全绿灯
} else if (phaseReverseStartTime <= endCycleExt) {
// endCycleExt内红灯
redTimes.add(Arrays.asList(cycleIndex + offset + phaseReverseStartTime, cycleIndex + offset + phaseStartTime));
// offset内红灯
redTimes.add(Arrays.asList(phaseEndTime - offsetIndex, offset));
}
} else {
// cycle内红灯
redTimes.add(Arrays.asList(cycleIndex + offset, cycleIndex + offset + phaseStartTime));
redTimes.add(Arrays.asList(cycleIndex + offset + phaseEndTime, cycleIndex + offset + cycleD));
if (endCycleExt >= phaseStartTime) {
// endCycleExt红灯
redTimes.add(Arrays.asList(cycleIndex + offset + cycleD, cycleIndex + offset + cycleD + phaseStartTime));
// offset红灯
redTimes.add(Arrays.asList(phaseEndTime - offsetIndex, offset));
} else {
// endCycleExt红灯
redTimes.add(Arrays.asList(cycleIndex + offset + cycleD, cycleIndex + offset + cycleD + endCycleExt));
// offset内红灯
redTimes.add(Arrays.asList(0.0, phaseStartTime - offsetIndex));
redTimes.add(Arrays.asList(phaseEndTime - offsetIndex, offset));
}
}
// 去重和排序
List<List<Double>> uniqueSortedRedTimes = redTimes.stream()
.distinct() // 去重
.sorted((list1, list2) -> {
// 按照列表第一个元素排序
return Double.compare(list1.get(0), list2.get(0));
})
.collect(Collectors.toList());
crossRedTimesMap.put(crossId, uniqueSortedRedTimes);
}
crossGreenStartMap.put(crossId, crossGreenStartTime);
crossGreenStartTime += travelTime;
distanceMap.put(crossId, distance);
}
}
}
}
package net.wanji.opt.vo; package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import net.wanji.common.utils.tool.JacksonUtils;
import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -16,12 +22,27 @@ import java.util.Map; ...@@ -16,12 +22,27 @@ import java.util.Map;
@ApiModel(value = "GreenBeltChartVO", description = "绿波时序图返回实体") @ApiModel(value = "GreenBeltChartVO", description = "绿波时序图返回实体")
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class GreenBeltChartVO { public class GreenBeltChartVO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("绿波路口红灯范围") @ApiModelProperty("绿波路口红灯范围")
Map<String, List<Double[]>> crossRedTimesMap; @JsonProperty("crossRedTimesMap")
String crossRedTimesMap;
@ApiModelProperty("反向绿波路口红灯范围")
@JsonProperty("backCrossRedTimesMap")
String backCrossRedTimesMap;
@ApiModelProperty("绿波路口绿波开始时间") @ApiModelProperty("绿波路口绿波开始时间")
Map<String, Double> greenStartMap; @JsonProperty("greenStartMap")
String greenStartMap;
@ApiModelProperty("反向绿波路口绿波开始时间")
String BackGreenStartMap;
@JsonProperty("distanceMap")
@ApiModelProperty("绿波路口距离下一个路口距离") @ApiModelProperty("绿波路口距离下一个路口距离")
Map<String, Double> distanceMap; String distanceMap;
@ApiModelProperty("绿波带宽") @ApiModelProperty("绿波带宽")
private Double greenWidthTime; private Double greenWidthTime;
@ApiModelProperty("反向绿波带宽")
private Double BackGreenWidthTime;
@JsonCreator
public GreenBeltChartVO(){
}
} }
...@@ -2,7 +2,7 @@ spring: ...@@ -2,7 +2,7 @@ spring:
cloud: cloud:
nacos: nacos:
config: config:
server-addr: 173.17.0.1:8848 server-addr: 37.12.182.29:8848
file-extension: yaml file-extension: yaml
group: signal group: signal
namespace: signal namespace: signal
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.DeviceInducesMapper">
</mapper>
...@@ -4,4 +4,12 @@ ...@@ -4,4 +4,12 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.StrategyPlanInfoMapper"> <mapper namespace="net.wanji.opt.dao.mapper.StrategyPlanInfoMapper">
<select id="selectByCrossId" resultType="net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity" parameterType="String" >
select * from t_strategy_plan_info where `cross_id`=#{crossId} and ( `status`=1 or `status` is null) and ((CURRENT_DATE &lt; `end_time` and CURRENT_DATE &gt; `start_time`) or `end_time` is null )
</select>
<select id="selectAll" resultType="net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity" >
select * from t_strategy_plan_info where ( `status`=1 or `status` is null) and ((CURRENT_DATE &lt; `end_time` and CURRENT_DATE &gt; `start_time`) or `end_time` is null )
</select>
</mapper> </mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.induce.GreenwaveInducesHistMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.induce.GreenwaveInducesMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.induce.InduceHistMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.induce.InduceTemplateMapper">
</mapper>
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<mapper namespace="net.wanji.opt.dao.mapper.trend.EventAlarmMapper"> <mapper namespace="net.wanji.opt.dao.mapper.trend.EventAlarmMapper">
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap type="net.wanji.opt.po.trend.EventAlarmPO" id="BaseResultMap"> <resultMap type="net.wanji.opt.po.trend.EventAlarmPO" id="EventAlarmBaseResultMap">
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="eventId" column="event_id"/> <result property="eventId" column="event_id"/>
<result property="eventDesc" column="event_desc"/> <result property="eventDesc" column="event_desc"/>
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<result property="gmtModified" column="gmt_modified"/> <result property="gmtModified" column="gmt_modified"/>
</resultMap> </resultMap>
<select id="selectByTodayTime" resultMap="BaseResultMap"> <select id="selectByTodayTime" resultMap="EventAlarmBaseResultMap" >
select select
id,event_id,event_desc,type,start_time,end_time,source,wkt,image_url,gmt_create,gmt_modified id,event_id,event_desc,type,start_time,end_time,source,wkt,image_url,gmt_create,gmt_modified
from t_event_data from t_event_data
......
<?xml version="1.0" encoding="gb2312"?>
<message System="ATMS" Ver="1.0">
<systemtype>VMS</systemtype>
<messagetype>CONTROL</messagetype>
<!--token-->
<sourceIP>${sourceid}</sourceIP>
<targetIP></targetIP>
<user></user>
<password></password>
<task>
<tasktype>deletelistandfile</tasktype>
<taskdetail>
<!--屏体ID 由现场提供-->
<ledid>${vmsid}</ledid>
</taskdetail>
<!--节目类型 TFM 路况 TFMH 独占 TAM 交通事件-->
<senderinfo>${type}</senderinfo>
</task>
</message>
\ No newline at end of file
<?xml version="1.0" encoding="GB2312"?>
<message System="ATMS" Ver="1.0">
<systemtype>VMS</systemtype>
<messagetype>CONTROL</messagetype>
<sourceIP>${sourceId}</sourceIP>
<targetIP></targetIP>
<user></user>
<password></password>
<task>
<tasktype>updatelistandfileEx</tasktype>
<taskdetail>
<ledid width="${resolutionWidth}" height="${resolutionHeight}">${equipCode}</ledid>
<list type="composite">
<file playorder="${playorder}" duration="${duration}" starttime="${startTime}" endtime="${endTime}" backgroundcolor="#000000" url="">
<area contenttype="imageFile" x="${x}" y="${y}" w="${resolutionWidth}" h="${resolutionHeight}" entermode="0" enterspeed="1" exitmode="0" exitspeed="0">
<imagefile filetype="bmp" type="uri">${ftpPath}</imagefile>
</area>
</file>
</list>
</taskdetail>
<senderinfo>${type}</senderinfo>
</task>
</message>
\ No newline at end of file
...@@ -9,7 +9,8 @@ public class BasicEnum { ...@@ -9,7 +9,8 @@ public class BasicEnum {
public enum ManufacturerEnum { public enum ManufacturerEnum {
HK("海康", "HK"), HK("海康", "HK"),
DT("东土", "DT"), DT("东土", "DT"),
HISENSE("海信", "HISENSE"); HISENSE("海信", "HISENSE"),
EHULU("易华录", "EHUALU");
private String nick; private String nick;
private String code; private String code;
......
...@@ -81,6 +81,9 @@ public class SignalStatusController { ...@@ -81,6 +81,9 @@ public class SignalStatusController {
List<LightsStatusVO2> listResult = new ArrayList<>(lightsStatusVOList.size()); List<LightsStatusVO2> listResult = new ArrayList<>(lightsStatusVOList.size());
for (LightsStatusVO lightsStatusVO : lightsStatusVOList) { for (LightsStatusVO lightsStatusVO : lightsStatusVOList) {
if (Objects.isNull(lightsStatusVO)) {
continue;
}
Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown(); Integer cyclePhaseCountDown = lightsStatusVO.getCyclePhaseCountDown();
LightsStatusVO2 lightsStatusVO2 = new LightsStatusVO2(); LightsStatusVO2 lightsStatusVO2 = new LightsStatusVO2();
BeanUtils.copyProperties(lightsStatusVO, lightsStatusVO2); BeanUtils.copyProperties(lightsStatusVO, lightsStatusVO2);
......
...@@ -22,4 +22,10 @@ public interface GreenwaveCrossMapper { ...@@ -22,4 +22,10 @@ public interface GreenwaveCrossMapper {
List<GreenwaveCrossPO> selectAll(); List<GreenwaveCrossPO> selectAll();
List<GreenwaveCrossPOExt> selectAllWidthAndSpeed(); List<GreenwaveCrossPOExt> selectAllWidthAndSpeed();
/**
* 获取所有绿波路口
* @return
*/
List<GreenwaveCrossPOExt> selectAllGreeenCross();
} }
...@@ -59,5 +59,13 @@ ...@@ -59,5 +59,13 @@
ORDER BY t2.start_time ORDER BY t2.start_time
</select> </select>
<select id="selectAllGreeenCross" resultType="net.wanji.databus.dao.entity.GreenwaveCrossPOExt">
SELECT t1.id as greenwaveCrossId, t1.green_id, t1.cross_id, t1.design_speed,
t4.name as greenwaveName
FROM t_greenwave_cross t1
JOIN t_greenwave_info t4
WHERE t1.green_id = t4.id
</select>
</mapper> </mapper>
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