Commit 30095e49 authored by hanbing's avatar hanbing

方案管理-灯组配置-保存灯组设置和车道配置

parent 14353b66
......@@ -19,7 +19,7 @@ import javax.ws.rs.core.MediaType;
* @author Kent HAN
* @date 2022/12/20 10:14
*/
@Api(value = "CrossConfigController", description = "方案管理-路口配置")
@Api(value = "CrossConfigController", description = "方案管理-路口配置、灯组配置")
@RequestMapping("/crossConfig")
@RestController
public class CrossConfigController {
......@@ -31,7 +31,7 @@ public class CrossConfigController {
this.crossConfigService = crossConfigService;
}
@ApiOperation(value = "保存渠化配置", notes = "保存渠化配置", response = JsonViewObject.class,
@ApiOperation(value = "保存渠化配置/灯组设置、车道配置", notes = "保存渠化配置/灯组设置、车道配置", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/saveLaneInfo",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
......@@ -45,7 +45,7 @@ public class CrossConfigController {
return jsonViewObject.success();
}
@ApiOperation(value = "渠化配置列表", notes = "渠化配置列表", response = JsonViewObject.class,
@ApiOperation(value = "渠化配置/灯组设置、车道配置列表", notes = "渠化配置/灯组设置、车道配置列表", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/listLaneInfo",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
......
package net.wanji.web.controller.scheme;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
......@@ -19,7 +18,7 @@ import javax.ws.rs.core.MediaType;
* @author Kent HAN
* @date 2022/12/20 10:14
*/
@Api(value = "LightsConfigController", description = "方案管理-灯组配置")
// @Api(value = "LightsConfigController", description = "方案管理-灯组配置")
@RequestMapping("/lightsConfig")
@RestController
public class LightsConfigController {
......
......@@ -9,14 +9,17 @@ import java.util.List;
@NoArgsConstructor
@Data
public class DirListElement {
/**
* dir : 1
* laneList : [{"direction":1,"name":"01","laneType":1}]
*/
@ApiModelProperty(value = "车道进口方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北", required = true)
private Integer dir;
@ApiModelProperty(value = "是否有行人过街:0否;1是", required = true)
private Integer isPersonCross;
private List<LaneListElement> laneList;
@ApiModelProperty(value = "一次过街:oneCross, 出口二次过街:twiceCrossOut 进口二次过街:twiceCrossIn", required = true)
private String personCrossType;
@ApiModelProperty(value = "一次过街灯组代码", required = true)
private String oneCross;
@ApiModelProperty(value = "出口二次过街灯组代码", required = true)
private String twiceCrossOut;
@ApiModelProperty(value = "进口二次过街灯组代码", required = true)
private String twiceCrossIn;
}
\ No newline at end of file
......@@ -7,15 +7,12 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class LaneListElement {
/**
* direction : 1
* name : 01
* laneType : 1
*/
@ApiModelProperty(value = "0无方向 箭头 1:直行2:左转,3:右转,4:掉头,5:左直,6:右直,7:左转掉头,8:左直掉头, 9:左直右, 10:左右转 11:左弯 12:右弯", required = true)
private Integer direction;
@ApiModelProperty(value = "车道代码", required = true)
private String name;
@ApiModelProperty(value = "1机动车;2非机动车;3公交专用;4可变;5潮汐", required = true)
private Integer laneType;
@ApiModelProperty(value = "灯组代码", required = true)
private String ledNum;
}
\ No newline at end of file
package net.wanji.web.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/1/3 14:12
*/
@NoArgsConstructor
@Data
public class LedConfigListElement {
@ApiModelProperty(value = "灯组代码", required = true)
private String code;
@ApiModelProperty(value = "灯组类型 1机动车;2非机动车;3公交专用;4行人", required = true)
private Integer type;
@ApiModelProperty(value = "信号灯类型: 1:圆饼灯,2: 非机动车灯,3: 左转灯,4: 直行灯,5: 右转灯,6: 掉头灯,7: 公交专用灯,8: 行人灯", required = true)
private Integer signalType;
@ApiModelProperty(value = "灯组位置:1北;2东北;3东;4东南;5南;6西南;7西;8西北;11北一次过街;121北出口二次过街;122北进口二次过街", required = true)
private Integer address;
@ApiModelProperty(value = "灯组序号", required = true)
private Integer order;
}
......@@ -13,12 +13,8 @@ import java.util.List;
@NoArgsConstructor
@Data
public class SaveLaneInfoDTO {
/**
* crossId : c7e7b1f352dd4acab4a60088eb391cca
* dirList : [{"dir":1,"laneList":[{"direction":1,"name":"01","laneType":1}]}]
*/
@ApiModelProperty(value = "路口ID,如:c7e7b1f352dd4acab4a60088eb391cca", required = true)
private String crossId;
private List<LedConfigListElement> ledConfigList;
private List<DirListElement> dirList;
}
package net.wanji.web.mapper.scheme;
import io.lettuce.core.dynamic.annotation.Param;
import net.wanji.web.po.scheme.CrossLaneLightsPO;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -12,4 +13,8 @@ import java.util.List;
@Repository
public interface CrossLaneLightsMapper {
void deleteByLaneIds(@Param("laneIds") List<String> laneIds);
void deleteByCrossId(@Param("crossId") String crossId);
void insertBatch(@Param("entities") List<CrossLaneLightsPO> entities);
}
package net.wanji.web.mapper.scheme;
import io.lettuce.core.dynamic.annotation.Param;
import net.wanji.web.po.scheme.CrossLightsPO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 灯组基础信息;(t_base_cross_lights)表数据库访问层
* @author : hanbing
* @date : 2023-1-3
*/
@Repository
public interface CrossLightsMapper {
void deleteByCrossId(@Param("crossId") String crossId);
void insertBatch(@Param("entities") List<CrossLightsPO> entities);
CrossLightsPO selectByCrossIdAndLedNum(@Param("crossId") String crossId, @Param("ledNum") String ledNum);
}
package net.wanji.web.mapper.scheme;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.stereotype.Repository;
/**
* 相位灯组关系;(t_base_cross_phase_lights)表数据库访问层
* @author : hanbing
* @date : 2023-1-3
*/
public interface PhaseLightsMapper {
@Repository
public interface CrossPhaseLightsMapper {
void deleteByCrossId(@Param("crossId") String crossId);
}
......@@ -19,4 +19,8 @@ public interface LaneInfoMapper {
void insertBatch(@Param("entities") List<LaneInfoPO> laneInfoPOListForInsert);
List<LaneInfoPO> selectBycrossId(@Param("crossId") String crossId);
LaneInfoPO selectByCrossIdDirCode(@Param("crossId") String crossId,
@Param("dir") Integer dir,
@Param("code") String code);
}
......@@ -10,7 +10,7 @@ import java.util.Date;
* @date 2023/1/3 9:51
*/
@Data
public class PhaseLightsPO {
public class CrossPhaseLightsPO {
/** 主键 */
@ApiModelProperty(name = "主键",notes = "")
private Integer id ;
......
......@@ -3,17 +3,23 @@ package net.wanji.web.service.scheme.impl;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.web.dto.DirListElement;
import net.wanji.web.dto.LaneListElement;
import net.wanji.web.dto.LedConfigListElement;
import net.wanji.web.dto.SaveLaneInfoDTO;
import net.wanji.web.mapper.scheme.CrossDirInfoMapper;
import net.wanji.web.mapper.scheme.CrossLaneLightsMapper;
import net.wanji.web.mapper.scheme.CrossLightsMapper;
import net.wanji.web.mapper.scheme.CrossPhaseLightsMapper;
import net.wanji.web.mapper.scheme.LaneInfoMapper;
import net.wanji.web.mapper.scheme.LaneSegmentMapper;
import net.wanji.web.po.scheme.CrossDirInfoPO;
import net.wanji.web.po.scheme.CrossLaneLightsPO;
import net.wanji.web.po.scheme.CrossLightsPO;
import net.wanji.web.po.scheme.LaneInfoPO;
import net.wanji.web.service.scheme.CrossConfigService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -28,16 +34,137 @@ public class CrossConfigServiceImpl implements CrossConfigService {
private final LaneInfoMapper laneInfoMapper;
private final CrossLaneLightsMapper crossLaneLightsMapper;
private final LaneSegmentMapper laneSegmentMapper;
private final CrossLightsMapper crossLightsMapper;
// 灯组位置与放行方向对应关系
private static final Map<String, Integer> ADDRESS_DIR_MAP = new HashMap<>(8);
static {
ADDRESS_DIR_MAP.put("1", 5);
ADDRESS_DIR_MAP.put("2", 6);
ADDRESS_DIR_MAP.put("3", 7);
ADDRESS_DIR_MAP.put("4", 8);
ADDRESS_DIR_MAP.put("5", 1);
ADDRESS_DIR_MAP.put("6", 2);
ADDRESS_DIR_MAP.put("7", 3);
ADDRESS_DIR_MAP.put("8", 4);
}
private final CrossPhaseLightsMapper crossPhaseLightsMapper;
public CrossConfigServiceImpl(CrossDirInfoMapper crossDirInfoMapper, LaneInfoMapper laneInfoMapper, CrossLaneLightsMapper crossLaneLightsMapper, LaneSegmentMapper laneSegmentMapper) {
public CrossConfigServiceImpl(CrossDirInfoMapper crossDirInfoMapper, LaneInfoMapper laneInfoMapper, CrossLaneLightsMapper crossLaneLightsMapper, LaneSegmentMapper laneSegmentMapper, CrossLightsMapper crossLightsMapper, CrossPhaseLightsMapper crossPhaseLightsMapper) {
this.crossDirInfoMapper = crossDirInfoMapper;
this.laneInfoMapper = laneInfoMapper;
this.crossLaneLightsMapper = crossLaneLightsMapper;
this.laneSegmentMapper = laneSegmentMapper;
this.crossLightsMapper = crossLightsMapper;
this.crossPhaseLightsMapper = crossPhaseLightsMapper;
}
@Override
public void saveLaneInfo(SaveLaneInfoDTO saveLaneInfoDTO) {
List<LedConfigListElement> ledConfigList = saveLaneInfoDTO.getLedConfigList();
if (ledConfigList == null || ledConfigList.size() == 0) {
// 保存渠化数据
handleLaneData(saveLaneInfoDTO);
} else {
// 保存灯组设置
handleLightsData(saveLaneInfoDTO, ledConfigList);
// 保存车道配置(灯组-车道关系表)
handleLaneConfig(saveLaneInfoDTO);
}
}
private void handleLaneConfig(SaveLaneInfoDTO saveLaneInfoDTO) {
String crossId = saveLaneInfoDTO.getCrossId();
List<DirListElement> dirList = saveLaneInfoDTO.getDirList();
List<CrossLaneLightsPO> crossLaneLightsPOList = new ArrayList<>();
for (DirListElement dirListElement : dirList) {
List<LaneListElement> laneList = dirListElement.getLaneList();
Integer dir = dirListElement.getDir();
for (LaneListElement laneListElement : laneList) {
// 根据路口ID、方向、车道代码获取车道ID
String code = laneListElement.getName(); // 车道代码
LaneInfoPO laneInfoPO = laneInfoMapper.selectByCrossIdDirCode(crossId, dir, code);
String laneId = laneInfoPO.getId();
CrossLaneLightsPO crossLaneLightsPO = new CrossLaneLightsPO();
// 根据路口ID和灯组代码获取灯组ID
String ledNum = laneListElement.getLedNum();
CrossLightsPO crossLightsPO = crossLightsMapper.selectByCrossIdAndLedNum(crossId, ledNum);
Integer lightsId = crossLightsPO.getId();
crossLaneLightsPO.setLightsId(lightsId);
crossLaneLightsPO.setLaneId(laneId);
crossLaneLightsPO.setCrossId(crossId);
crossLaneLightsPOList.add(crossLaneLightsPO);
}
}
crossLaneLightsMapper.deleteByCrossId(crossId);
crossPhaseLightsMapper.deleteByCrossId(crossId);
crossLaneLightsMapper.insertBatch(crossLaneLightsPOList);
}
private void handleLightsData(SaveLaneInfoDTO saveLaneInfoDTO, List<LedConfigListElement> ledConfigList) {
String crossId = saveLaneInfoDTO.getCrossId();
List<CrossLightsPO> crossLightsPOList = new ArrayList<>();
for (LedConfigListElement ledConfigListElement : ledConfigList) {
CrossLightsPO crossLightsPO = new CrossLightsPO();
crossLightsPO.setLightsNo(ledConfigListElement.getCode());
// 灯组类型
setType(ledConfigListElement, crossLightsPO);
// 灯组放行方向
Integer address = ledConfigListElement.getAddress();
String addressStr = address.toString();
String addressFirstLetter = addressStr.substring(0, 1);
Integer dir = ADDRESS_DIR_MAP.get(addressFirstLetter);
crossLightsPO.setDir(dir);
crossLightsPO.setSort(ledConfigListElement.getOrder());
crossLightsPO.setCrossId(crossId);
crossLightsPOList.add(crossLightsPO);
}
crossLightsMapper.deleteByCrossId(crossId);
crossLightsMapper.insertBatch(crossLightsPOList);
}
private static void setType(LedConfigListElement ledConfigListElement, CrossLightsPO crossLightsPO) {
Integer type = ledConfigListElement.getType();
Integer signalType = ledConfigListElement.getSignalType();
Integer address = ledConfigListElement.getAddress();
if (type == 1) { // 机动车灯
if (signalType == 1) {
// 圆饼灯
crossLightsPO.setType(1);
} else if (signalType == 3) {
// 左转灯
crossLightsPO.setType(2);
} else if (signalType == 4) {
// 直行灯
crossLightsPO.setType(3);
} else if (signalType == 5) {
// 右转灯
crossLightsPO.setType(4);
} else if (signalType == 6) {
// 掉头灯
crossLightsPO.setType(5);
}
} else if (type == 2) { // 非机动车灯
if (signalType == 2) {
crossLightsPO.setType(2);
}
} else if (type == 3) { // 公交专用
if (signalType == 7) {
crossLightsPO.setType(30);
}
} else if (type == 4) { // 行人
if (address >= 10 && address <= 99) { // 两位数为一次过街
crossLightsPO.setType(20);
} else if (address >= 100 && address % 10 == 1) { // 三位数为二次过街,个位是1表示出口
crossLightsPO.setType(22);
} else if (address >= 100 && address % 10 == 2) { // 三位数为二次过街,个位是2表示入口
crossLightsPO.setType(21);
}
}
}
private void handleLaneData(SaveLaneInfoDTO saveLaneInfoDTO) {
String crossId = saveLaneInfoDTO.getCrossId();
List<DirListElement> dirList = saveLaneInfoDTO.getDirList();
for (DirListElement dirListElement : dirList) {
......@@ -138,7 +265,7 @@ public class CrossConfigServiceImpl implements CrossConfigService {
String substring = name.substring(name.length() - 1);// 1
String s = 1 + substring;
int sort = Integer.parseInt(s);
laneInfoPO.setId(crossId + "_" + dirListElement.getDir() + "_" + sort);
laneInfoPO.setId(crossId + "_" + dirListElement.getDir() + "_" + 2 + "_" + sort); // 信控车道类型都是进口车道
laneInfoPO.setCode(name);
laneInfoPO.setSort(sort);
laneInfoPO.setDir(dir);
......
......@@ -39,7 +39,7 @@ jasypt:
iv-generator-classname: org.jasypt.iv.NoIvGenerator
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
mapper-locations: classpath:mapper/*.xml,classpath:mapper/*/*.xml
typeAliasesPackage: net.wanji.web.entity
check-config-location: true
configuration:
......
......@@ -12,6 +12,14 @@
<result property="gmtModified" column="gmt_modified"/>
</resultMap>
<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into t_base_cross_lane_lights(lights_id,lane_id,cross_id)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.lightsId},#{entity.laneId},#{entity.crossId})
</foreach>
</insert>
<delete id="deleteByLaneIds">
delete from t_base_cross_lane_lights
where lane_id in
......@@ -20,5 +28,10 @@
</foreach>
</delete>
<delete id="deleteByCrossId">
delete from t_base_cross_lane_lights
where cross_id = #{crossId}
</delete>
</mapper>
......@@ -14,5 +14,25 @@
<result property="gmtModified" column="gmt_modified"/>
</resultMap>
<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into t_base_cross_lights(lights_no,type,dir,sort,cross_id)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.lightsNo},#{entity.type},#{entity.dir},#{entity.sort},#{entity.crossId})
</foreach>
</insert>
<delete id="deleteByCrossId">
delete from t_base_cross_lights
where cross_id = #{crossId}
</delete>
<select id="selectByCrossIdAndLedNum" resultMap="BaseResultMap">
select
id,lights_no,type,dir,sort,cross_id,gmt_create,gmt_modified
from t_base_cross_lights
where cross_id = #{crossId} and lights_no = #{ledNum}
</select>
</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.web.mapper.scheme.PhaseLightsMapper">
<mapper namespace="net.wanji.web.mapper.scheme.CrossPhaseLightsMapper">
<!-- 通用查询映射结果 -->
<resultMap type="net.wanji.web.po.scheme.PhaseLightsPO" id="BaseResultMap">
<resultMap type="net.wanji.web.po.scheme.CrossPhaseLightsPO" id="BaseResultMap">
<result property="id" column="id"/>
<result property="lightsId" column="lights_id"/>
<result property="phaseId" column="phase_id"/>
......@@ -12,5 +12,10 @@
<result property="gmtModified" column="gmt_modified"/>
</resultMap>
<delete id="deleteByCrossId">
delete from t_base_cross_phase_lights
where cross_id = #{crossId}
</delete>
</mapper>
......@@ -46,4 +46,11 @@
where cross_id = #{crossId}
</select>
<select id="selectByCrossIdDirCode" resultMap="BaseResultMap">
select
id,code,sort,type,dir,turn,category,cross_id,rid,length,width,gmt_create,gmt_modified
from t_base_lane_info
where cross_id = #{crossId} and dir = #{dir} and code = #{code}
</select>
</mapper>
......@@ -33,7 +33,7 @@ server:
dir: logs
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
mapper-locations: classpath:mapper/*.xml,classpath:mapper/*/*.xml
typeAliasesPackage: net.wanji.utc.entity
check-config-location: true
configuration:
......
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