线路客流,单站客流

main
王宇航 2026-08-27 16:20:08 +08:00
parent 912037fd6d
commit e0ce16d820
6 changed files with 396 additions and 4 deletions

View File

@ -5,9 +5,12 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.jeeplus.aop.logging.annotation.ApiLog;
import net.juntech.modules.ysdp.domain.YsOperateManager;
import net.juntech.modules.ysdp.domain.YsYunyingMax;
import net.juntech.modules.ysdp.service.YsOperateManagerService;
import net.juntech.modules.ysdp.service.YsYunyingMaxService;
import net.juntech.modules.ysdp.service.YsYunyingService;
import net.juntech.modules.ysdp.service.dto.YsYunyingDTO;
import net.juntech.modules.ysdp.service.dto.YsYunyingMaxDTO;
import net.juntech.modules.ysdp.utils.Constant;
import net.juntech.modules.ysdp.utils.JSONUtil;
import net.sf.json.JSONArray;
@ -19,7 +22,10 @@ import jakarta.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@Tag(name = "客运页面API接口")
@ -33,6 +39,20 @@ public class TrafficApiController extends BaseApiController {
@Autowired
private YsOperateManagerService ysOperateManagerService;
@Autowired
private YsYunyingMaxService ysYunyingMaxService;
/**
* 线
*/
private static final List<String> TARGET_LINES = Arrays.asList("03", "04", "07", "15");
private static final String[] LINE_YUNYING_EXCLUDE_FIELDS = new String[]{
"id", "remarks", "createBy", "createDate", "updateBy", "updateDate",
"delFlag", "tenantId", "createTime", "createById", "updateTime",
"updateById", "updateByIdId", "createByIdId", "lineId", "tenantDTO"
};
private static final String[] STATION_RANK_EXCLUDE_FIELDS = new String[]{
"id", "remarks", "createBy", "createDate", "updateBy", "updateDate",
"delFlag", "tenantId", "createTime", "createById", "updateTime",
@ -44,8 +64,8 @@ public class TrafficApiController extends BaseApiController {
* TOP10
* 线lineId
*/
@ApiLog("获取进出站客流排名TOP10")
@Operation(summary = "获取进出站客流排名TOP10")
@ApiLog("1、排名获取进出站客流排名TOP10")
@Operation(summary = "1、排名获取进出站客流排名TOP10")
@PostMapping("getInOutStationRank/v1")
public ResponseEntity<JSONObject> getInOutStationRank(HttpServletRequest request) {
if (!checkRequest(request)) {
@ -76,8 +96,8 @@ public class TrafficApiController extends BaseApiController {
* TOP10
* 线lineId
*/
@ApiLog("获取换乘站客流排名TOP10")
@Operation(summary = "获取换乘站客流排名TOP10")
@ApiLog("1、排名获取换乘站客流排名TOP10")
@Operation(summary = "1、排名获取换乘站客流排名TOP10")
@PostMapping("getTransferStationRank/v1")
public ResponseEntity<JSONObject> getTransferStationRank(HttpServletRequest request) {
if (!checkRequest(request)) {
@ -104,6 +124,213 @@ public class TrafficApiController extends BaseApiController {
return okJsonResponse(resultArray, cacheKey);
}
/**
* 线
* 34715线
*/
@ApiLog("2、线路客流板块获取线路客流信息")
@Operation(summary = "2、线路客流板块获取线路客流信息")
@PostMapping("getLinePassengerFlow/v1")
public ResponseEntity<JSONObject> getLinePassengerFlow(HttpServletRequest request) {
if (!checkRequest(request)) {
return checkResult;
}
String cacheKey = Constant.API_CACHE_NAME_TRAFFIC_LINE_FLOW;
JSONArray resultArray = new JSONArray();
try {
// 缓存读取
if (useCache(cacheKey, request)) {
return okJsonResponse(redisUtils.getJSONArray(cacheKey), cacheKey);
}
// 获取日期
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String today = now.format(formatter);
String compareDay = resolveCompareDay();
// 查询数据
List<YsYunyingMaxDTO> todayList = ysYunyingService.getYunyingList(today);
List<YsYunyingMaxDTO> compareList = ysYunyingService.getYunyingList(compareDay);
List<YsYunyingMax> maxList = ysYunyingMaxService.getYunyinglist();
// 空值保护
todayList = Optional.ofNullable(todayList).orElse(Collections.emptyList());
compareList = Optional.ofNullable(compareList).orElse(Collections.emptyList());
maxList = Optional.ofNullable(maxList).orElse(Collections.emptyList());
// 按线路聚合3、4、7、15号线
for (String lineId : TARGET_LINES) {
// 获取今天的完整对象包含所有时间段字段time1~time10 + totalSum
YsYunyingMaxDTO todayData = todayList.stream()
.filter(dto -> lineId.equals(dto.getLineId()))
.findFirst()
.orElse(new YsYunyingMaxDTO());
YsYunyingMaxDTO compareData = compareList.stream()
.filter(dto -> lineId.equals(dto.getLineId()))
.findFirst()
.orElse(new YsYunyingMaxDTO());
YsYunyingMax maxData = maxList.stream()
.filter(dto -> lineId.equals(dto.getLineId()))
.findFirst()
.orElse(new YsYunyingMax());
// 组装结果
JSONObject result = new JSONObject();
result.put("line", lineId);
result.put("todayDate", today);
result.put("compareDate", compareDay);
result.put("today", todayData);
result.put("compareDay", compareData);
result.put("maxDay", maxData);
resultArray.add(result);
}
// 过滤不需要的字段
resultArray = JSONUtil.getJsonArrayFormList(resultArray, LINE_YUNYING_EXCLUDE_FIELDS);
} catch (Exception ex) {
return badJsonResponse("获取线路客流信息异常", ex);
}
return okJsonResponse(resultArray, cacheKey);
}
/**
* 线
*/
@ApiLog("3、单站获取所有线路列表")
@Operation(summary = "3、单站获取所有线路列表")
@PostMapping("getLineList/v1")
public ResponseEntity<JSONObject> getLineList(HttpServletRequest request) {
if (!checkRequest(request)) {
return checkResult;
}
String cacheKey = Constant.API_CACHE_NAME_TRAFFIC_LINE_LIST;
JSONArray resultArray = new JSONArray();
try {
if (useCache(cacheKey, request)) {
resultArray = redisUtils.getJSONArray(cacheKey);
} else {
List<YsYunyingDTO> lines = ysYunyingService.getLineList();
String[] excludesFields = new String[]{
"remarks", "createBy", "createDate", "updateBy", "updateDate",
"delFlag", "tenantId", "createTime", "createById", "updateTime",
"updateById", "updateByIdId", "createByIdId", "tenantDTO",
"stationId", "stationName", "total", "compareTotal", "sortNo",
"fileName", "pullNum", "departureNum", "endTime", "begTime", "crosslines"
};
resultArray = JSONUtil.getJsonArrayFormList(lines, excludesFields);
}
} catch (Exception ex) {
return badJsonResponse("获取线路列表异常", ex);
}
return okJsonResponse(resultArray, cacheKey);
}
/**
* 线线
*/
@ApiLog("3、单站根据线路获取车站列表")
@Operation(summary = "3、单站根据线路获取车站列表")
@PostMapping("getStationsByLine/v1")
public ResponseEntity<JSONObject> getStationsByLine(
@RequestParam(value = "lineId", required = false, defaultValue = "") String lineId,
HttpServletRequest request) {
if (!checkRequest(request)) {
return checkResult;
}
if (lineId == null || lineId.trim().isEmpty()) {
return badJsonResponse("参数lineId不能为空");
}
String cacheKey = Constant.API_CACHE_NAME_TRAFFIC_STATIONS_BY_LINE + lineId;
JSONArray resultArray = new JSONArray();
try {
if (useCache(cacheKey, request)) {
resultArray = redisUtils.getJSONArray(cacheKey);
} else {
List<YsYunyingDTO> stations = ysYunyingService.getStationsByLine(lineId);
String[] excludesFields = new String[]{
"id", "remarks", "createBy", "createDate", "updateBy", "updateDate",
"delFlag", "tenantId", "createTime", "createById", "updateTime",
"updateById", "updateByIdId", "createByIdId", "fileName", "pullNum",
"tenantDTO", "departureNum", "endTime", "begTime", "total", "compareTotal", "sortNo", "name"
};
resultArray = JSONUtil.getJsonArrayFormList(stations, excludesFields);
}
} catch (Exception ex) {
return badJsonResponse("获取线路车站列表异常", ex);
}
return okJsonResponse(resultArray, cacheKey);
}
/**
* + +
*/
@ApiLog("3、单站获取车站客流详情")
@Operation(summary = "3、单站获取车站客流详情")
@PostMapping("getStationPassengerFlow/v1")
public ResponseEntity<JSONObject> getStationPassengerFlow(
@RequestParam(value = "stationId", required = false, defaultValue = "") String stationId,
HttpServletRequest request) {
if (!checkRequest(request)) {
return checkResult;
}
if (stationId == null || stationId.trim().isEmpty()) {
return badJsonResponse("参数stationId不能为空");
}
String cacheKey = Constant.API_CACHE_NAME_TRAFFIC_STATION_FLOW + stationId;
JSONObject resultObj = new JSONObject();
try {
if (useCache(cacheKey, request)) {
resultObj = redisUtils.getJSON(cacheKey);
} else {
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String compareDay = resolveCompareDay();
// 进出站客流(今日 + 对比日)
YsYunyingMaxDTO inOutToday = Optional.ofNullable(
ysYunyingService.getStationInOutFlow(stationId, today))
.orElse(new YsYunyingMaxDTO());
YsYunyingMaxDTO inOutCompare = Optional.ofNullable(
ysYunyingService.getStationInOutFlow(stationId, compareDay))
.orElse(new YsYunyingMaxDTO());
// 换乘客流(同名车站在其他线路,今日 + 对比日)
YsYunyingMaxDTO transferToday = Optional.ofNullable(
ysYunyingService.getStationTransferFlow(stationId, today))
.orElse(new YsYunyingMaxDTO());
YsYunyingMaxDTO transferCompare = Optional.ofNullable(
ysYunyingService.getStationTransferFlow(stationId, compareDay))
.orElse(new YsYunyingMaxDTO());
resultObj.put("stationId", stationId);
resultObj.put("todayDate", today);
resultObj.put("compareDate", compareDay);
JSONObject inOut = new JSONObject();
inOut.put("today", inOutToday);
inOut.put("compareDay", inOutCompare);
resultObj.put("inOut", inOut);
JSONObject transfer = new JSONObject();
transfer.put("today", transferToday);
transfer.put("compareDay", transferCompare);
resultObj.put("transfer", transfer);
}
} catch (Exception ex) {
return badJsonResponse("获取车站客流详情异常", ex);
}
return okJsonResponse(resultObj, cacheKey);
}
/**
*
*/

View File

@ -59,6 +59,39 @@ public interface YsYunyingMapper extends BaseMapper<YsYunying> {
*/
public List<YsYunyingDTO> getTransferStationMaxList(String date);
/**
* 线ysdp
* ys_yunying 线DISTINCT line_id
* getStationMaxList 使
* @return 线 lineId
*/
public List<YsYunyingDTO> getLineList();
/**
* 线
* @param lineId 线 "03"
* @return 线
*/
public List<YsYunyingDTO> getStationsByLine(@Param("lineId") String lineId);
/**
*
* @param stationId
* @param date yyyy-MM-dd
* @return time1~time10
*/
public YsYunyingMaxDTO getStationInOutFlow(@Param("stationId") String stationId,
@Param("date") String date);
/**
* 线
* @param stationId
* @param date yyyy-MM-dd
* @return time1~time10
*/
public YsYunyingMaxDTO getStationTransferFlow(@Param("stationId") String stationId,
@Param("date") String date);
public String getStationCompareValue(String compareDay, String stationId);
public YsInterfaceDTO getInterface(String type);

View File

@ -294,6 +294,78 @@
LIMIT 10
</select>
<select id="getLineList" resultType="net.juntech.modules.ysdp.service.dto.YsYunyingDTO">
SELECT
id as id,
line_id AS lineId,
`name` AS `name`
FROM ys_line
WHERE (del_flag IS NULL OR del_flag != '1')
AND (`enable` IS NULL OR `enable` = '1')
ORDER BY sort ASC, line_id ASC
</select>
<select id="getStationsByLine" resultType="net.juntech.modules.ysdp.service.dto.YsYunyingDTO">
SELECT
station_id AS stationId,
TRIM(`name`) AS stationName,
line_id AS lineId,
crosslines AS crosslines
FROM ys_station
WHERE line_id = #{lineId}
AND (del_flag IS NULL OR del_flag != '1')
AND (`enable` IS NULL OR `enable` = '1')
ORDER BY sort ASC, station_id ASC
</select>
<select id="getStationInOutFlow" resultType="net.juntech.modules.ysdp.service.dto.YsYunyingMaxDTO">
SELECT
#{stationId} AS lineId,
SUM(CASE WHEN HOUR(end_time) = 5 THEN pull_num + departure_num ELSE 0 END) AS time1,
SUM(CASE WHEN HOUR(end_time) BETWEEN 6 AND 7 THEN pull_num + departure_num ELSE 0 END) AS time2,
SUM(CASE WHEN HOUR(end_time) BETWEEN 8 AND 9 THEN pull_num + departure_num ELSE 0 END) AS time3,
SUM(CASE WHEN HOUR(end_time) BETWEEN 10 AND 11 THEN pull_num + departure_num ELSE 0 END) AS time4,
SUM(CASE WHEN HOUR(end_time) BETWEEN 12 AND 13 THEN pull_num + departure_num ELSE 0 END) AS time5,
SUM(CASE WHEN HOUR(end_time) BETWEEN 14 AND 15 THEN pull_num + departure_num ELSE 0 END) AS time6,
SUM(CASE WHEN HOUR(end_time) BETWEEN 16 AND 17 THEN pull_num + departure_num ELSE 0 END) AS time7,
SUM(CASE WHEN HOUR(end_time) BETWEEN 18 AND 19 THEN pull_num + departure_num ELSE 0 END) AS time8,
SUM(CASE WHEN HOUR(end_time) BETWEEN 20 AND 21 THEN pull_num + departure_num ELSE 0 END) AS time9,
SUM(CASE WHEN HOUR(end_time) BETWEEN 22 AND 23 THEN pull_num + departure_num ELSE 0 END) AS time10,
SUM(pull_num + departure_num) AS totalSum
FROM ys_yunying
WHERE station_id = #{stationId}
AND end_time &gt;= #{date}
AND end_time &lt; DATE_ADD(#{date}, INTERVAL 1 DAY)
AND HOUR(end_time) &gt;= 5
</select>
<select id="getStationTransferFlow" resultType="net.juntech.modules.ysdp.service.dto.YsYunyingMaxDTO">
SELECT
#{stationId} AS lineId,
SUM(CASE WHEN HOUR(end_time) = 5 THEN pull_num + departure_num ELSE 0 END) AS time1,
SUM(CASE WHEN HOUR(end_time) BETWEEN 6 AND 7 THEN pull_num + departure_num ELSE 0 END) AS time2,
SUM(CASE WHEN HOUR(end_time) BETWEEN 8 AND 9 THEN pull_num + departure_num ELSE 0 END) AS time3,
SUM(CASE WHEN HOUR(end_time) BETWEEN 10 AND 11 THEN pull_num + departure_num ELSE 0 END) AS time4,
SUM(CASE WHEN HOUR(end_time) BETWEEN 12 AND 13 THEN pull_num + departure_num ELSE 0 END) AS time5,
SUM(CASE WHEN HOUR(end_time) BETWEEN 14 AND 15 THEN pull_num + departure_num ELSE 0 END) AS time6,
SUM(CASE WHEN HOUR(end_time) BETWEEN 16 AND 17 THEN pull_num + departure_num ELSE 0 END) AS time7,
SUM(CASE WHEN HOUR(end_time) BETWEEN 18 AND 19 THEN pull_num + departure_num ELSE 0 END) AS time8,
SUM(CASE WHEN HOUR(end_time) BETWEEN 20 AND 21 THEN pull_num + departure_num ELSE 0 END) AS time9,
SUM(CASE WHEN HOUR(end_time) BETWEEN 22 AND 23 THEN pull_num + departure_num ELSE 0 END) AS time10,
SUM(pull_num + departure_num) AS totalSum
FROM ys_yunying
WHERE station_id != #{stationId}
AND station_id IN (
SELECT station_id FROM ys_station
WHERE TRIM(`name`) = (
SELECT TRIM(`name`) FROM ys_station WHERE station_id = #{stationId} LIMIT 1
)
)
AND end_time &gt;= #{date}
AND end_time &lt; DATE_ADD(#{date}, INTERVAL 1 DAY)
AND HOUR(end_time) &gt;= 5
</select>
<select id="getStationCompareValue" resultType="String">
SELECT
CAST((SUM(a.pull_num) + SUM(a.departure_num)) / 10000 AS DECIMAL(10,2)) AS total

View File

@ -83,6 +83,35 @@ public class YsYunyingService extends ServiceImpl<YsYunyingMapper, YsYunying> {
return ysYunyingMapper.getTransferStationMaxList(date);
}
/**
* 线ysdp
* DISTINCT ys_yunying.line_id
*/
public List<YsYunyingDTO> getLineList() {
return ysYunyingMapper.getLineList();
}
/**
* 线
*/
public List<YsYunyingDTO> getStationsByLine(String lineId) {
return ysYunyingMapper.getStationsByLine(lineId);
}
/**
*
*/
public YsYunyingMaxDTO getStationInOutFlow(String stationId, String date) {
return ysYunyingMapper.getStationInOutFlow(stationId, date);
}
/**
* 线
*/
public YsYunyingMaxDTO getStationTransferFlow(String stationId, String date) {
return ysYunyingMapper.getStationTransferFlow(stationId, date);
}
public String getStationCompareValue(String compareDay, String stationId) {
return ysYunyingMapper.getStationCompareValue(compareDay,stationId);
}

View File

@ -23,6 +23,7 @@ public class YsYunyingDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
/**
* 线
*/
@ -74,4 +75,14 @@ public class YsYunyingDTO extends BaseDTO {
private String sortNo;
private String compareTotal;
/**
* 线
*/
private String name;
/**
* 线 "1,3,15"
*/
private String crosslines;
}

View File

@ -56,4 +56,24 @@ Constant {
*/
public static final String API_CACHE_NAME_TRAFFIC_TRANSFER_RANK = "api_traffic_transferStationRankV1_";
/**
* -线
*/
public static final String API_CACHE_NAME_TRAFFIC_LINE_FLOW = "api_traffic_linePassengerFlowV1_";
/**
* -线
*/
public static final String API_CACHE_NAME_TRAFFIC_STATIONS_BY_LINE = "api_traffic_stationsByLineV1_";
/**
* -
*/
public static final String API_CACHE_NAME_TRAFFIC_STATION_FLOW = "api_traffic_stationFlowV1_";
/**
* -线
*/
public static final String API_CACHE_NAME_TRAFFIC_LINE_LIST = "api_traffic_lineListV1_";
}