Browse Source

灵州站定时任务合并当天已执行任务报告,并优化

master
wangguangyuan 4 weeks ago
parent
commit
0673b912a3
6 changed files with 188 additions and 45 deletions
  1. +1
    -1
      inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java
  2. +126
    -14
      inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java
  3. +19
    -18
      inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java
  4. +2
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/task/service/IPatrolTaskService.java
  5. +28
    -3
      inspect-main/inspect-main-task/src/main/java/com/inspect/task/service/impl/PatrolTaskServiceImpl.java
  6. +12
    -9
      inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolTaskMapper.xml

+ 1
- 1
inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/IPatrolResultService.java View File

@ -84,7 +84,7 @@ public interface IPatrolResultService {
List<Long> saveReport(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum); List<Long> saveReport(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum);
List<Long> saveReportLingzhou(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum);
List<Long> saveReportLingzhou_v2(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList);
List<Long> saveReportShaoxing(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum); List<Long> saveReportShaoxing(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum);


+ 126
- 14
inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java View File

@ -347,7 +347,7 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
} }
@Transactional @Transactional
public List<Long> saveReportLingzhou(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum) {
public List<Long> saveReportLingzhou_v1(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
List<Long> reportIds = new ArrayList<>(); List<Long> reportIds = new ArrayList<>();
// String mainId = String.valueOf(resultMain.getLineId()); // String mainId = String.valueOf(resultMain.getLineId());
@ -357,7 +357,7 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
resultMain.setFileStatus("1"); resultMain.setFileStatus("1");
this.patrolTaskResultMainMapper.updatePatrolTaskResultMain(resultMain); this.patrolTaskResultMainMapper.updatePatrolTaskResultMain(resultMain);
this.patrolResultMapper.updatePatrolResultByMainId(String.valueOf(lineId)); this.patrolResultMapper.updatePatrolResultByMainId(String.valueOf(lineId));
reportIds.addAll(saveReportDataLingzhou(resultList, resultMain, lineIds, aiQxNum, csQxNum));
reportIds.addAll(saveReportDataLingzhou_v1(resultList, resultMain, lineIds, aiQxNum, csQxNum));
} }
PrintUtil.useTime("获取所有报告id", startTime); PrintUtil.useTime("获取所有报告id", startTime);
@ -366,6 +366,118 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
// return saveReportData(resultList, resultMain, lineIds); // return saveReportData(resultList, resultMain, lineIds);
} }
@Transactional
public List<Long> saveReportLingzhou_v2(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList) {
long startTime = System.currentTimeMillis();
List<Long> reportIds = new ArrayList<>();
if (resultList.isEmpty()) {
log.error("EMPTY REPORT DATA");
return reportIds;
}
String AiNum = statisticsAnalyseNumLingZhou(lineIds);
List<String> taskNames = resultList.stream().map(PatrolResult::getTaskName).distinct().collect(Collectors.toList());
List<String> taskPatrolledIds = resultList.stream().map(PatrolResult::getTaskPatrolledId).distinct().collect(Collectors.toList());
String taskName = StringUtils.join(taskNames, ",");
List<PatrolTaskStatus> taskStatuses = this.patrolTaskStatusMapper.selectPatrolTaskStatusListByTaskPatrolledIds(taskPatrolledIds);
if (taskStatuses.isEmpty()) {
log.error("LACKING STATUS: " + resultMain.getLineId());
}
List<Date> startTimes = taskStatuses.stream().map(PatrolTaskStatus::getStartTime).sorted().collect(Collectors.toList());
List<String> endTimes = taskStatuses.stream().map(PatrolTaskStatus::getEndTime).sorted().collect(Collectors.toList());
Map<String, String> stationMap = patrolResultMapper.selectBasedataStation();
String stationName = stationMap.get("station_name");
String stationType = stationMap.get("station_type");
String voltLevel = stationMap.get("volt_level");
AjaxResult ajaxResult = feignBasedataAreaService.evnList();
List<JSONObject> jsonObjects = JSONObject.parseArray(JSON.toJSONString(ajaxResult.get("data")), JSONObject.class);
log.debug("EVN LIST: " + jsonObjects);
List<String> envoList = new ArrayList<>();
for (JSONObject jsonObject : jsonObjects) {
String typeName = jsonObject.getString("typeName");
String valueUnit = jsonObject.getString("valueUnit");
if (StringUtils.isEmpty(valueUnit) || StringUtils.isEmpty(typeName)) {
continue;
}
envoList.add(typeName + ":" + valueUnit);
}
Map<String, PatrolResultRef> keyPatrolResultRef = new HashMap<>();
List<PatrolResultRef> patrolResultRefs = patrolResultMapper.selectResultRefByLineIds(lineIds, "0");
List<PatrolResultRef> patrolResultRefsFilter = patrolResultMapper.selectResultRefByLineIds(lineIds, "1");
for (PatrolResultRef AIRef : patrolResultRefs) {
keyPatrolResultRef.put(AIRef.getDeviceId() + "_" + AIRef.getAlgType(), AIRef);
}
for (PatrolResultRef filterRef : patrolResultRefsFilter) {
keyPatrolResultRef.putIfAbsent(filterRef.getDeviceId() + "_" + filterRef.getAlgType(), filterRef);
}
patrolResultRefs = new ArrayList<>(keyPatrolResultRef.values());
// 每个任务生成一份报告
for (Long lineId : lineIds) {
resultMain.setLineId(lineId);
resultMain.setCheckTime(new Date());
resultMain.setFileStatus("1");
this.patrolTaskResultMainMapper.updatePatrolTaskResultMain(resultMain);
this.patrolResultMapper.updatePatrolResultByMainId(String.valueOf(lineId));
startTime = System.currentTimeMillis();
String mainId = String.valueOf(resultMain.getLineId());
String[] nums = new String[]{AiNum};
PatrolResult patrolResult = resultList.stream().filter(item -> mainId.equals(item.getMainId())).findFirst().orElse(null);
assert patrolResult != null;
String taskCode = patrolResult.getTaskCode();
String taskPatrolId = patrolResult.getTaskPatrolledId();
if (StringUtils.isEmpty(taskPatrolId)) {
throw new ServiceException("LACK PLAN ID: " + mainId);
} else {
if (taskStatuses.isEmpty()) {
throw new ServiceException("LACKING STATUS: " + mainId);
} else {
// PatrolTaskStatus taskStatus = taskStatuses.stream().filter(item -> taskPatrolId.equals(item.getTaskPatrolledId())).findFirst().orElse(null);
List<PatrolTask> list = patrolTaskMapper.selectPatrolTaskList(PatrolTask.builder().taskCode(taskCode).build());
if (list.isEmpty()) {
throw new ServiceException("TASK PLAN LOST: " + taskCode);
} else {
PatrolTask task = list.get(0);
for (int i = 0; i < nums.length; i++) {
InspectionReport report = new InspectionReport();
// resetReport(report, nums[i], mainId, task, taskStatus);
report.setPatrolStatistics(nums[i]);
report.setInspectionDate(new Date());
report.setTaskResultId(mainId);
report.setInspectionStartTime(startTimes.get(0));
report.setInspectionEndTime(DateUtils.parseDate(endTimes.get(endTimes.size() - 1)));
report.setTaskId(String.valueOf(task.getTaskId()));
report.setEnvInfo(StringUtils.join(envoList, ","));
report.setTaskPatrolledId(taskPatrolId);
report.setInspectionTaskName(taskName);
report.setDescription(resultMain.getTaskResult());
report.setCheckPerson(resultMain.getCheckPerson());
report.setCheckTime(resultMain.getCheckTime());
report.setStationName(stationName);
report.setVoltLevel(StringUtils.isEmpty(voltLevel) ? voltage : voltLevel);
report.setFilter(String.valueOf(i));
report.setStationType(stationType);
inspectionReportMapper.insertInspectionReport(report);
PrintUtil.useTime("NEW TASK REPORT", startTime); // 12s
batchInsertReportData(String.valueOf(report.getLineId()), lineIds, String.valueOf(i), patrolResultRefs);
PrintUtil.useTime("BATCH INSERT DETAIL", startTime); // 13s
log.info("[ARCHIVE] reportId: {}", report.getLineId());
reportIds.add(report.getLineId());
}
}
}
}
}
PrintUtil.useTime("获取所有报告id", startTime);
return reportIds;
}
@Transactional @Transactional
public List<Long> saveReportShaoxing(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum) { public List<Long> saveReportShaoxing(PatrolTaskResultMain resultMain, List<Long> lineIds, Long currentLineId, List<PatrolResult> resultList, int aiQxNum, int csQxNum) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
@ -585,7 +697,7 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
} }
} }
public List<Long> saveReportDataLingzhou(List<PatrolResult> resultList, PatrolTaskResultMain resultMain, List<Long> lineIds, int aiQxNum, int csQxNum) {
public List<Long> saveReportDataLingzhou_v1(List<PatrolResult> resultList, PatrolTaskResultMain resultMain, List<Long> lineIds, int aiQxNum, int csQxNum) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
String mainId = String.valueOf(resultMain.getLineId()); String mainId = String.valueOf(resultMain.getLineId());
// String analyseNum = statisticsAnalyseNum(lineIds, resultList.size()); // String analyseNum = statisticsAnalyseNum(lineIds, resultList.size());
@ -1189,18 +1301,18 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
int totalNum = keyToAnalysisMap.size(); int totalNum = keyToAnalysisMap.size();
log.info("lineIds:{},statisticsAnalyseNum analyses:{}", lineIds, analysesAI);
for (ResultAnalysis analyse : keyToAnalysisMap.values()) {
String resultType = analyse.getResultType();
if (resultType.equals("0")) {
++confirmNum;
} else if (resultType.equals("1")) {
++okNum;
} else if (resultType.equals("2")) {
++failNum;
}
}
if ("0".equals(exportReportFlag)) { if ("0".equals(exportReportFlag)) {
for (ResultAnalysis analyse : keyToAnalysisMap.values()) {
String resultType = analyse.getResultType();
if (resultType.equals("0")) {
++confirmNum;
} else if (resultType.equals("1")) {
++okNum;
} else if (resultType.equals("2")) {
++failNum;
}
}
return String.format(messageUtils.get("缺陷点位:%d个。"), confirmNum); return String.format(messageUtils.get("缺陷点位:%d个。"), confirmNum);
} else { } else {
// return String.format(messageUtils.get("本次任务巡视总点位:%d个,已检点位:%d个,未检点位:0个,正常点位:%d个,异常点位:%d个,缺陷点位:%d个。"), totalNum, totalNum, okNum, failNum, confirmNum); // return String.format(messageUtils.get("本次任务巡视总点位:%d个,已检点位:%d个,未检点位:0个,正常点位:%d个,异常点位:%d个,缺陷点位:%d个。"), totalNum, totalNum, okNum, failNum, confirmNum);


+ 19
- 18
inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java View File

@ -45,6 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
@ -363,31 +364,31 @@ public class PatrolTaskResultMainController extends BaseController {
logger.error("[归档]失败, 数据采集中..."); logger.error("[归档]失败, 数据采集中...");
return AjaxResult.error("数据采集中请稍后...."); return AjaxResult.error("数据采集中请稍后....");
} }
startTime = System.currentTimeMillis();
ResultAnalysis resultAnalysis = new ResultAnalysis();
int csQxNum = 0, aiQxNum = 0;
List<String> taskPatrolledIds = resultList.stream().map(PatrolResult::getTaskPatrolledId).distinct().collect(Collectors.toList());
for (String taskPatrolledId : taskPatrolledIds) {
resultAnalysis.setTaskPatrolledId(taskPatrolledId);
ResultAnalysis ras = patrolResultService.selectTaskAbnormalData(resultAnalysis);
csQxNum += ras.getCsQxNum();
aiQxNum += ras.getAiQxNum();
}
// startTime = System.currentTimeMillis();
// ResultAnalysis resultAnalysis = new ResultAnalysis();
// int csQxNum = 0, aiQxNum = 0;
// List<String> taskPatrolledIds = resultList.stream().map(PatrolResult::getTaskPatrolledId).distinct().collect(Collectors.toList());
// for (String taskPatrolledId : taskPatrolledIds) {
// resultAnalysis.setTaskPatrolledId(taskPatrolledId);
// ResultAnalysis ras = patrolResultService.selectTaskAbnormalData(resultAnalysis);
// csQxNum += ras.getCsQxNum();
// aiQxNum += ras.getAiQxNum();
// }
if ("0".equals(exportReportFlag) && 0 == aiQxNum && 0 == csQxNum) {
logger.error("[归档]没有缺陷数据, 无需归档!");
return AjaxResult.error("没有缺陷数据, 无需归档!");
}
// if ("0".equals(exportReportFlag) && 0 == aiQxNum && 0 == csQxNum) {
// logger.error("[归档]没有缺陷数据, 无需归档!");
// return AjaxResult.error("没有缺陷数据, 无需归档!");
// }
PrintUtil.useTime("查询统计缺陷数据", startTime);
// PrintUtil.useTime("查询统计缺陷数据", startTime);
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
// 使用CompletableFuture异步执行saveReport // 使用CompletableFuture异步执行saveReport
int finalAiQxNum = aiQxNum;
int finalCsQxNum = csQxNum;
// int finalAiQxNum = aiQxNum;
// int finalCsQxNum = csQxNum;
List<Long> finalLineIds = lineIds; List<Long> finalLineIds = lineIds;
CompletableFuture<List<Long>> saveReportFuture = CompletableFuture.supplyAsync(() -> { CompletableFuture<List<Long>> saveReportFuture = CompletableFuture.supplyAsync(() -> {
logger.info("[ARCHIVE] Start saving reports"); logger.info("[ARCHIVE] Start saving reports");
return patrolResultService.saveReportLingzhou(resultMain, finalLineIds, lineId, resultList, finalAiQxNum, finalCsQxNum);
return patrolResultService.saveReportLingzhou_v2(resultMain, finalLineIds, lineId, resultList);
}, executor).exceptionally(ex -> { }, executor).exceptionally(ex -> {
logger.error("Report saving failed", ex); logger.error("Report saving failed", ex);
return Collections.emptyList(); return Collections.emptyList();


+ 2
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/task/service/IPatrolTaskService.java View File

@ -54,4 +54,6 @@ public interface IPatrolTaskService {
void correctionAlgorithm(PatrolData patrolData); void correctionAlgorithm(PatrolData patrolData);
void executeAsync(PatrolTaskStatus taskStatus); void executeAsync(PatrolTaskStatus taskStatus);
void executeTask();
} }

+ 28
- 3
inspect-main/inspect-main-task/src/main/java/com/inspect/task/service/impl/PatrolTaskServiceImpl.java View File

@ -27,9 +27,12 @@ import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@EnableScheduling
@Service @Service
public class PatrolTaskServiceImpl implements IPatrolTaskService { public class PatrolTaskServiceImpl implements IPatrolTaskService {
@ -246,7 +249,7 @@ public class PatrolTaskServiceImpl implements IPatrolTaskService {
return; return;
} }
Set<String> patrolTaskCodes = patrolAreaTasks.stream().map(PatrolTask::getTaskCode).collect(Collectors.toSet()); Set<String> patrolTaskCodes = patrolAreaTasks.stream().map(PatrolTask::getTaskCode).collect(Collectors.toSet());
log.debug("异步执行任务报告合并,区域: {} 下的任务编码集合: {}", taskAreaName, patrolTaskCodes);
log.info("异步执行任务报告合并,区域: {} 下的任务编码集合: {}", taskAreaName, patrolTaskCodes);
// patrolTaskStatus patrolTaskResultMain 关联查询区域任务执行状态已完成并且未归档的数量是否和区域任务总数相等相等则归档该区域的任务 // patrolTaskStatus patrolTaskResultMain 关联查询区域任务执行状态已完成并且未归档的数量是否和区域任务总数相等相等则归档该区域的任务
@ -254,7 +257,7 @@ public class PatrolTaskServiceImpl implements IPatrolTaskService {
List<JSONObject> jsonObjects = patrolTaskMapper.selectPatrolTaskStatus(patrolTaskCodes); List<JSONObject> jsonObjects = patrolTaskMapper.selectPatrolTaskStatus(patrolTaskCodes);
log.debug("异步执行任务报告合并,区域: {} 下的已完成任务集合: {}", taskAreaName, jsonObjects); log.debug("异步执行任务报告合并,区域: {} 下的已完成任务集合: {}", taskAreaName, jsonObjects);
Set<String> taskCodeStatus = jsonObjects.stream().map(jsonObject -> jsonObject.getString("taskCode")).collect(Collectors.toSet()); Set<String> taskCodeStatus = jsonObjects.stream().map(jsonObject -> jsonObject.getString("taskCode")).collect(Collectors.toSet());
log.debug("异步执行任务报告合并,区域: {} 下的任务编码集合: {}", taskAreaName, taskCodeStatus);
log.info("异步执行任务报告合并,区域: {} 下的任务编码集合: {}", taskAreaName, taskCodeStatus);
// 如果patrolTaskCodes 都在taskCodeStatus中则归档该区域的任务 // 如果patrolTaskCodes 都在taskCodeStatus中则归档该区域的任务
if (!taskCodeStatus.containsAll(patrolTaskCodes)) { if (!taskCodeStatus.containsAll(patrolTaskCodes)) {
@ -265,8 +268,30 @@ public class PatrolTaskServiceImpl implements IPatrolTaskService {
PatrolTaskResultMain patrolTaskResultMain = new PatrolTaskResultMain(); PatrolTaskResultMain patrolTaskResultMain = new PatrolTaskResultMain();
patrolTaskResultMain.setLineIds(lineIds); patrolTaskResultMain.setLineIds(lineIds);
patrolTaskResultMain.setCheckPerson("admin"); patrolTaskResultMain.setCheckPerson("admin");
patrolTaskResultMainController.updateInfo_lingzhou(patrolTaskResultMain);
// patrolTaskResultMainController.updateInfo_lingzhou(patrolTaskResultMain);
PrintUtil.useTime("异步执行任务报告合并,区域: " + taskAreaName + " 下的任务归档完成", startTime); PrintUtil.useTime("异步执行任务报告合并,区域: " + taskAreaName + " 下的任务归档完成", startTime);
} }
// 定时任务归档每天18:30执行
@Scheduled(cron = "0 30 18 * * ?")
public void executeTask() {
String stationNo = patrolTaskMapper.selectStationNo();
if (!"lingzhouzhiliu".equals(stationNo)) {
return;
}
log.info("=============================定时任务归档开始=============================================");
List<JSONObject> jsonObjects = patrolTaskMapper.selectPatrolTaskStatus(new HashSet<>());
List<Long> lineIds = jsonObjects.stream().map(jsonObject -> jsonObject.getLong("lineId")).distinct().collect(Collectors.toList());
log.info("定时任务归档,已完成任务集合guidang lineIds: {}", lineIds);
PatrolTaskResultMain patrolTaskResultMain = new PatrolTaskResultMain();
patrolTaskResultMain.setLineIds(lineIds);
patrolTaskResultMain.setCheckPerson("admin");
try {
patrolTaskResultMainController.updateInfo_lingzhou(patrolTaskResultMain);
} catch (Exception e) {
log.error("定时任务归档异常", e);
}
log.info("=============================定时任务归档结束=============================================");
}
} }

+ 12
- 9
inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolTaskMapper.xml View File

@ -358,20 +358,23 @@
<select id="selectPatrolTaskStatus" resultType="com.alibaba.fastjson.JSONObject"> <select id="selectPatrolTaskStatus" resultType="com.alibaba.fastjson.JSONObject">
select select
s.task_code as taskCode,
s.task_state as taskState,
s.task_patrolled_id as taskPatrolledId,
ptrm.file_status as fileStatus,
ptrm.task_code as taskCode,
ptrm.line_id as lineId
s.task_code as taskCode,
s.task_state as taskState,
s.task_patrolled_id as taskPatrolledId,
ptrm.file_status as fileStatus,
ptrm.line_id as lineId
from from
patrol_task_status s left join patrol_task_result_main ptrm on s.task_code = ptrm.task_code and s.task_patrolled_id = ptrm.task_patrolled_id
patrol_task_status s left join patrol_task_result_main ptrm on s.task_code = ptrm.task_code and
s.task_patrolled_id = ptrm.task_patrolled_id
where where
s.task_state = '1' and ptrm.file_status = '0' and date_format(s.create_time,'%Y%m%d') = date_format(current_date,'%Y%m%d') and
s.task_code in
s.task_state = '1' and ptrm.file_status = '0' and date_format(s.create_time,'%Y%m%d') =
date_format(current_date,'%Y%m%d')
<if test="taskCodes != null and taskCodes.size() > 0">
and s.task_code in
<foreach item="taskCode" collection="taskCodes" open="(" separator="," close=")"> <foreach item="taskCode" collection="taskCodes" open="(" separator="," close=")">
#{taskCode} #{taskCode}
</foreach> </foreach>
</if>
</select> </select>
<select id="selectStationNo" resultType="java.lang.String"> <select id="selectStationNo" resultType="java.lang.String">


Loading…
Cancel
Save