Browse Source

缺陷记录,缺陷记录新建任务,导出的报告数据按点位创建时间

master
WangGuangYuan 2 weeks ago
parent
commit
912fd96925
11 changed files with 171 additions and 26 deletions
  1. +1
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java
  2. +101
    -14
      inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java
  3. +3
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java
  4. +21
    -4
      inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/service/impl/PatrolResultServiceImpl.java
  5. +1
    -1
      inspect-main/inspect-main-task/src/main/java/com/inspect/resultmain/controller/PatrolTaskResultMainController.java
  6. +9
    -0
      inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java
  7. +7
    -5
      inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml
  8. +11
    -0
      inspect-metadata/src/main/java/com/inspect/metadata/area/domain/BaseDataArea.java
  9. +9
    -0
      inspect-metadata/src/main/java/com/inspect/metadata/montdatamqhandle/vo/Coord.java
  10. +5
    -0
      inspect-metadata/src/main/java/com/inspect/metadata/prodevmnt/service/impl/BasedataDeviceServiceImpl.java
  11. +3
    -2
      inspect-metadata/src/main/resources/mapper/montdata/BasedataMontPatDevPatRouteMapper.xml

+ 1
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/analysis/controller/ResultAnalysisController.java View File

@ -737,6 +737,7 @@ public class ResultAnalysisController extends BaseController {
patrolData.setResStatus(value.stream().map(item -> item.getResStatus() != null ? item.getResStatus() : "").distinct().findFirst().orElse("")); patrolData.setResStatus(value.stream().map(item -> item.getResStatus() != null ? item.getResStatus() : "").distinct().findFirst().orElse(""));
patrolData.setSuggestion(value.stream().map(item -> item.getSuggestion() != null ? item.getSuggestion() : "").distinct().findFirst().orElse("")); patrolData.setSuggestion(value.stream().map(item -> item.getSuggestion() != null ? item.getSuggestion() : "").distinct().findFirst().orElse(""));
patrolData.setWarnStatus(value.stream().map(item -> item.getWarnStatus() != null ? item.getWarnStatus() : "").distinct().findFirst().orElse("")); patrolData.setWarnStatus(value.stream().map(item -> item.getWarnStatus() != null ? item.getWarnStatus() : "").distinct().findFirst().orElse(""));
patrolData.setTaskName(value.stream().map(item -> item.getTaskName() != null ? item.getTaskName() : "").distinct().findFirst().orElse(""));
resultList.add(patrolData); resultList.add(patrolData);
}); });


+ 101
- 14
inspect-main/inspect-main-task/src/main/java/com/inspect/bigmodel/service/impl/BigModelResultServiceImpl.java View File

@ -1,37 +1,124 @@
package com.inspect.bigmodel.service.impl; package com.inspect.bigmodel.service.impl;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.inspect.analysis.domain.AnalyseLog;
import com.inspect.analysis.domain.ResultAnalysis;
import com.inspect.analysis.service.IResultAnalysisService;
import com.inspect.base.core.utils.HttpClientUtils; import com.inspect.base.core.utils.HttpClientUtils;
import com.inspect.base.core.utils.StringUtils;
import com.inspect.base.redis.service.RedisService;
import com.inspect.bigmodel.service.IBigModelResultService; import com.inspect.bigmodel.service.IBigModelResultService;
import com.inspect.partrolresult.domain.PatrolResult;
import com.inspect.partrolresult.service.IPatrolResultService;
import com.inspect.task.domain.PatrolData;
import com.inspect.task.service.IPatrolTaskService; import com.inspect.task.service.IPatrolTaskService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class BigModelResultServiceImpl implements IBigModelResultService { public class BigModelResultServiceImpl implements IBigModelResultService {
private final Logger log = LoggerFactory.getLogger(BigModelResultServiceImpl.class); private final Logger log = LoggerFactory.getLogger(BigModelResultServiceImpl.class);
@Autowired @Autowired
private IPatrolTaskService patrolTaskService; private IPatrolTaskService patrolTaskService;
@Autowired
private IResultAnalysisService resultAnalysisService;
@Autowired
private IPatrolResultService patrolResultService;
@Autowired
private RedisService redisService;
@Override @Override
public JSONObject getBigModelResult() { public JSONObject getBigModelResult() {
String analyseFilter = patrolTaskService.selectConfigByKey("ANALYSE_FILTER_URL");
log.info("-----调用大模型结果接口地址,url:{}", analyseFilter + "/bigModel/record/latest");
String resultStr = null;
try {
resultStr = HttpClientUtils.get(analyseFilter + "/bigModel/record/latest", "");
} catch (Exception e) {
log.error("调用大模型结果接口,返回数据异常,exception:{}", e.getMessage());
// String analyseFilter = patrolTaskService.selectConfigByKey("ANALYSE_FILTER_URL");
// log.info("-----调用大模型结果接口地址,url:{}", analyseFilter + "/bigModel/record/latest");
// String resultStr = null;
// try {
// resultStr = HttpClientUtils.get(analyseFilter + "/bigModel/record/latest", "");
// } catch (Exception e) {
// log.error("调用大模型结果接口,返回数据异常,exception:{}", e.getMessage());
// }
// log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr);
// JSONObject result = JSONObject.parseObject(resultStr);
// if (result != null && "200".equals(result.getString("code"))) {
// return result.getJSONObject("data");
// } else {
// log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr);
// return result;
// }
JSONObject jsonObject = new JSONObject();
// ResultAnalysis resultAnalysis = new ResultAnalysis();
// resultAnalysis.setFilter("0");
// ResultAnalysis bigModelResult = resultAnalysisService.getLatestResult(resultAnalysis);
// if (bigModelResult == null) {
// return jsonObject;
// }
// resultAnalysis.setFilter("1");
// resultAnalysis.setAlgType(bigModelResult.getAlgType());
// resultAnalysis.setObjectId(bigModelResult.getObjectId());
// resultAnalysis.setTaskPatrolId(bigModelResult.getTaskPatrolId());
// ResultAnalysis filterResult = resultAnalysisService.getLatestResult(resultAnalysis);
// AnalyseLog analyseLog = new AnalyseLog("","1",bigModelResult.getTaskPatrolId(),"0","", bigModelResult.getObjectId(), "");
// AnalyseLog analyseLog = new AnalyseLog("","","","","", "", "");
// analyseLog = resultAnalysisService.getAnalyseLog(analyseLog);
if (!redisService.hasKey("patrol_infer")) {
return jsonObject;
}
Object patrol_infer = redisService.getCacheObject("patrol_infer");
JSONObject result = JSONObject.parseObject(patrol_infer.toString());
// 原图路径
String original_image_path = result.getString("original_image_path");
// 大模型分析图片路径
String model_image_url = result.getString("model_image_url");
if (StringUtils.isNotEmpty(original_image_path) && !original_image_path.startsWith("/")) {
original_image_path = "/" + original_image_path;
} }
log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr);
JSONObject result = JSONObject.parseObject(resultStr);
if (result != null && "200".equals(result.getString("code"))) {
return result.getJSONObject("data");
} else {
log.error("调用大模型结果接口,返回数据,resultStr:{}", resultStr);
return result;
if (StringUtils.isNotEmpty(model_image_url) && !model_image_url.startsWith("/")) {
model_image_url = "/" + model_image_url;
} }
// 重点区域分割图片路径
jsonObject.put("keyZonePicture", original_image_path);
// 特征点对比图片路径
jsonObject.put("featureComparePictureA", original_image_path);
// 特征点对比图片B路径
jsonObject.put("featureComparePictureB", original_image_path);
// 多模态大模型图片路径
jsonObject.put("bigModelPicture", model_image_url);
// 多模态大模型图片返回说明
jsonObject.put("bigModelDesc", result.getString("model_analysis"));
// 多模态大模型图片问题
jsonObject.put("bigModelProblem", result.getString("prompt"));
// 日志信息
jsonObject.put("logInfo", "日志:" + result.toJSONString());
String object_id = result.getString("object_id");
if (!redisService.hasKey("patrol_infer:" + object_id)) {
return jsonObject;
}
Object filterCacheObject = redisService.getCacheObject("patrol_infer:" + object_id);
JSONObject filterResultJson = JSONObject.parseObject(filterCacheObject.toString());
String roi_dots = filterResultJson.getString("roi_dots");
String roi_result = filterResultJson.getString("roi_result");
if (StringUtils.isNotEmpty(roi_dots) && !roi_dots.startsWith("/")) {
roi_dots = "/" + roi_dots;
}
if (StringUtils.isNotEmpty(roi_result) && !roi_result.startsWith("/")) {
roi_result = "/" + roi_result;
}
// 特征点对比图片路径
jsonObject.put("featureComparePictureA", roi_dots);
// 特征点对比图片B路径
jsonObject.put("featureComparePictureB", roi_result);
return jsonObject;
} }
} }

+ 3
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/partrolresult/domain/BasePointAreaInfo.java View File

@ -3,6 +3,7 @@ package com.inspect.partrolresult.domain;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
import java.util.Objects; import java.util.Objects;
@Setter @Setter
@ -17,6 +18,8 @@ public class BasePointAreaInfo {
private String areaName; private String areaName;
private String channelId; private String channelId;
private String eqpBookId; private String eqpBookId;
/** 点位创建时间 basedata_patrolpoint.create_time,用于报告数据按点位创建时间降序排序 */
private Date createTime;
@Override @Override
public boolean equals(Object object) { public boolean equals(Object object) {


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

@ -716,6 +716,17 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
patrolResultRefs = processedRefs; patrolResultRefs = processedRefs;
startTime = PrintUtil.useTime("导出报告:全部数据处理", startTime); startTime = PrintUtil.useTime("导出报告:全部数据处理", startTime);
} }
// 导出的报告数据按点位创建时间(basedata_patrolpoint.create_time)降序排序:
// 报告明细行序 = 下方 batchInsertReportData_shaoxing 遍历写入顺序,故在落库前对结果集做一次内存排序即可。
// 点位创建时间复用已查询的 basePointAreaInfoList,无需额外SQL/ORDER BY,避免大表关联排序带来的性能开销。
Map<String, Date> pointCreateTimeMap = basePointAreaInfoList.stream()
.filter(item -> item != null && item.getDeviceId() != null && item.getCreateTime() != null)
.collect(Collectors.toMap(BasePointAreaInfo::getDeviceId, BasePointAreaInfo::getCreateTime, (a, b) -> a));
if (patrolResultRefs.size() > 1) {
patrolResultRefs.sort(Comparator.comparing(
(PatrolResultRef ref) -> pointCreateTimeMap.get(ref.getDeviceId()),
Comparator.nullsLast(Comparator.reverseOrder())));
}
long okNum = 0L; long okNum = 0L;
long failNum = 0L; long failNum = 0L;
long defectNum = 0L; long defectNum = 0L;
@ -1282,6 +1293,10 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
public void batchInsertReportData_shaoxing(String reportId, List<PatrolResultRef> patrolResultRefs, List<BasePointAreaInfo> basePointAreaInfoList, List<Long> lineIds) { public void batchInsertReportData_shaoxing(String reportId, List<PatrolResultRef> patrolResultRefs, List<BasePointAreaInfo> basePointAreaInfoList, List<Long> lineIds) {
Map<Long, Map<String, Long>> taskCounterMap = new HashMap<>(); Map<Long, Map<String, Long>> taskCounterMap = new HashMap<>();
// 设备id,区域map
Map<String, BasePointAreaInfo> basePointAreaInfoByDeviceId = basePointAreaInfoList.stream()
.filter(item -> item != null && item.getDeviceId() != null)
.collect(Collectors.toMap(BasePointAreaInfo::getDeviceId, item -> item, (a, b) -> a));
// 为每个任务初始化计数器 // 为每个任务初始化计数器
for (Long item : lineIds) { for (Long item : lineIds) {
@ -1307,14 +1322,13 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
String resultTaskName = patrolResultRef.getTaskName(); String resultTaskName = patrolResultRef.getTaskName();
String taskPatrolledId = patrolResultRef.getTaskPatrolledId(); String taskPatrolledId = patrolResultRef.getTaskPatrolledId();
Long mainId = patrolResultRef.getMainId(); Long mainId = patrolResultRef.getMainId();
BasePointAreaInfo basePointAreaInfo;
try {
basePointAreaInfo = basePointAreaInfoList.stream().filter((item) -> item != null && patrolResultRef.getDeviceId().equals(item.getDeviceId())).findFirst().get();
} catch (Exception e) {
BasePointAreaInfo basePointAreaInfo = basePointAreaInfoByDeviceId.get(patrolResultRef.getDeviceId());
if (basePointAreaInfo == null) {
log.error("[REPORT DETAIL] The point lacking belonging area: {}", patrolResultRef.getDeviceId()); log.error("[REPORT DETAIL] The point lacking belonging area: {}", patrolResultRef.getDeviceId());
basePointAreaInfo = new BasePointAreaInfo(); basePointAreaInfo = new BasePointAreaInfo();
} }
InspectionReportData reportData = new InspectionReportData(); InspectionReportData reportData = new InspectionReportData();
reportData.setReportId(reportId); reportData.setReportId(reportId);
reportData.setArea(basePointAreaInfo.getAreaName()); reportData.setArea(basePointAreaInfo.getAreaName());
@ -2246,6 +2260,9 @@ public class PatrolResultServiceImpl implements IPatrolResultService {
merged.setThreshold(filterResult.getThreshold()); merged.setThreshold(filterResult.getThreshold());
merged.setAlgName(filterResult.getAlgName()); merged.setAlgName(filterResult.getAlgName());
merged.setResultType(resultType); merged.setResultType(resultType);
// 随便取,反正是同个任务
merged.setMainId(filterResult.getMainId());
merged.setTaskName(filterResult.getTaskName());
return merged; return merged;
} }


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

@ -1627,7 +1627,7 @@ public class PatrolTaskResultMainController extends BaseController {
} }
}); });
} catch (Exception e) {
} catch (Throwable e) {
logger.error("生成巡视文件异常:{}", e); logger.error("生成巡视文件异常:{}", e);
closeResources(sxssfWorkbook, wordDocument, tempFiles); closeResources(sxssfWorkbook, wordDocument, tempFiles);
} }


+ 9
- 0
inspect-main/inspect-main-task/src/main/java/com/inspect/task/domain/PatrolData.java View File

@ -87,6 +87,15 @@ public class PatrolData implements Comparable<PatrolData> {
private String taskPatrolId; private String taskPatrolId;
private String taskName;
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String warnStatus(String ws) { public String warnStatus(String ws) {
byte var3 = -1; byte var3 = -1;


+ 7
- 5
inspect-main/inspect-main-task/src/main/resources/mapper/task/PatrolResultMapper.xml View File

@ -370,7 +370,7 @@
b.res_status, b.res_status,
d.device_name, d.device_name,
e.area_name, e.area_name,
d.area_id,
e.area_id,
b.alg_type, b.alg_type,
b.objectId, b.objectId,
b.suggestion, b.suggestion,
@ -383,8 +383,8 @@
and a.task_patrolled_id = b.task_patrol_id and a.task_patrolled_id = b.task_patrol_id
and a.device_id = b.objectId and a.device_id = b.objectId
left join basedata_patrolpoint c on a.device_id = c.patrol_point_id left join basedata_patrolpoint c on a.device_id = c.patrol_point_id
left join basedata_device d on c.device_id = d.device_id
left join basedata_area e on e.area_id = d.area_id
left join basedata_device d on c.relation_device_id = d.device_id
left join basedata_area e on e.area_id = c.relation_area_id
<where> <where>
<choose> <choose>
@ -400,10 +400,10 @@
</when> </when>
</choose> </choose>
and b.result_type = '0' and b.result_type = '0'
and b.point_status = '4' or b.point_status = '5'
and (b.point_status = '4' or b.point_status = '5')
<if test="filter != null and filter != ''">and b.filter = #{filter}</if> <if test="filter != null and filter != ''">and b.filter = #{filter}</if>
<if test="algType != null and algType != ''">and b.alg_type = #{algType}</if> <if test="algType != null and algType != ''">and b.alg_type = #{algType}</if>
<if test="areaId != null and areaId != ''">and d.area_id = #{areaId}</if>
<if test="areaId != null and areaId != ''">and e.area_id = #{areaId}</if>
<if test="deviceId != null and deviceId != ''">and d.device_id = #{deviceId}</if> <if test="deviceId != null and deviceId != ''">and d.device_id = #{deviceId}</if>
<if test="pointId != null and pointId != ''">and a.device_id = #{pointId}</if> <if test="pointId != null and pointId != ''">and a.device_id = #{pointId}</if>
<if test="taskCode != null and taskCode != ''">and a.task_code = #{taskCode}</if> <if test="taskCode != null and taskCode != ''">and a.task_code = #{taskCode}</if>
@ -824,6 +824,7 @@
<result property="mainName" column="main_name"/> <result property="mainName" column="main_name"/>
<result property="jgName" column="jg_name"/> <result property="jgName" column="jg_name"/>
<result property="areaName" column="area_name"/> <result property="areaName" column="area_name"/>
<result property="createTime" column="create_time"/>
</resultMap> </resultMap>
<select id="selectBaseInfoByMainId" parameterType="String" resultMap="BasePointAreaInfo"> <select id="selectBaseInfoByMainId" parameterType="String" resultMap="BasePointAreaInfo">
select f.device_id, select f.device_id,
@ -847,6 +848,7 @@
f.device_id, f.device_id,
a.patrol_point_id, a.patrol_point_id,
a.patrol_point_name, a.patrol_point_name,
a.create_time,
b.device_name, b.device_name,
c.device_name as main_name, c.device_name as main_name,
d.area_name as jg_name, d.area_name as jg_name,


+ 11
- 0
inspect-metadata/src/main/java/com/inspect/metadata/area/domain/BaseDataArea.java View File

@ -69,6 +69,17 @@ public class BaseDataArea extends BaseEntity {
// 是否过滤未配置预置位的点位 // 是否过滤未配置预置位的点位
private Boolean filterByPreset; private Boolean filterByPreset;
// 点位id
private List<Long> patrolPointIdsList;
public List<Long> getPatrolPointIdsList() {
return patrolPointIdsList;
}
public void setPatrolPointIdsList(List<Long> patrolPointIdsList) {
this.patrolPointIdsList = patrolPointIdsList;
}
public Boolean getFilterByPreset() { public Boolean getFilterByPreset() {
return filterByPreset; return filterByPreset;
} }


+ 9
- 0
inspect-metadata/src/main/java/com/inspect/metadata/montdatamqhandle/vo/Coord.java View File

@ -8,6 +8,7 @@ public class Coord {
private String x; private String x;
private String y; private String y;
private String coordinatePixel; private String coordinatePixel;
private String coordGeography;
public Date getTime() { public Date getTime() {
return this.time; return this.time;
@ -48,4 +49,12 @@ public class Coord {
public void setCoordinatePixel(String coordinatePixel) { public void setCoordinatePixel(String coordinatePixel) {
this.coordinatePixel = coordinatePixel; this.coordinatePixel = coordinatePixel;
} }
public String getCoordGeography() {
return coordGeography;
}
public void setCoordGeography(String coordGeography) {
this.coordGeography = coordGeography;
}
} }

+ 5
- 0
inspect-metadata/src/main/java/com/inspect/metadata/prodevmnt/service/impl/BasedataDeviceServiceImpl.java View File

@ -534,6 +534,11 @@ public class BasedataDeviceServiceImpl implements IBasedataDeviceService {
patrolPoints = basedataPatrolPointMapper.selectBasedataPatrolPointRelationListByDeviceIds(new ArrayList<>(deviceIds)); patrolPoints = basedataPatrolPointMapper.selectBasedataPatrolPointRelationListByDeviceIds(new ArrayList<>(deviceIds));
} }
// 缺陷记录直接选择缺陷点位添加方案,逻辑根据传过来的点位id进行筛选
if (baseDataArea != null && baseDataArea.getPatrolPointIdsList() != null && !baseDataArea.getPatrolPointIdsList().isEmpty()) {
List<Long> patrolPointIdsList = baseDataArea.getPatrolPointIdsList().stream().distinct().collect(Collectors.toList());
patrolPoints = patrolPoints.stream().filter(item -> patrolPointIdsList.contains(item.getPatrolPointId())).collect(Collectors.toList());
}
List<BasedataAlgSubtype> basedataAlgSubtypes = basedataAlgSubtypeMapper.selectBasedataAlgSubtypeList(new BasedataAlgSubtype()); List<BasedataAlgSubtype> basedataAlgSubtypes = basedataAlgSubtypeMapper.selectBasedataAlgSubtypeList(new BasedataAlgSubtype());
logger.info("[META] basedataAlgSubtypes cnt: {}", basedataAlgSubtypes.size()); logger.info("[META] basedataAlgSubtypes cnt: {}", basedataAlgSubtypes.size());


+ 3
- 2
inspect-metadata/src/main/resources/mapper/montdata/BasedataMontPatDevPatRouteMapper.xml View File

@ -121,12 +121,13 @@
<result property="x" column="x"/> <result property="x" column="x"/>
<result property="patrolDeviceCode" column="patrol_device_code"/> <result property="patrolDeviceCode" column="patrol_device_code"/>
<result property="coordinatePixel" column="coord_pixel"/> <result property="coordinatePixel" column="coord_pixel"/>
<result property="coordGeography" column="coord_geography"/>
<result property="time" column="time"/> <result property="time" column="time"/>
</resultMap> </resultMap>
<select id="getCoordList" parameterType="String" resultMap="CoordResult"> <select id="getCoordList" parameterType="String" resultMap="CoordResult">
SELECT SELECT
time, patrol_device_code, coord_pixel, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y
time, patrol_device_code, coord_pixel, coord_geography, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y
FROM FROM
basedata_mont_patdevcoord basedata_mont_patdevcoord
WHERE WHERE
@ -146,7 +147,7 @@
<select id="getRouteList" parameterType="String" resultMap="CoordResult"> <select id="getRouteList" parameterType="String" resultMap="CoordResult">
SELECT SELECT
time, patrol_device_code, coord_pixel, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y
time, patrol_device_code, coord_pixel, coord_geography, SUBSTRING_INDEX( coord_pixel, ',', 1 ) x, SUBSTRING_INDEX( SUBSTRING_INDEX( coord_pixel, ',', 2 ), ',', - 1 ) y
FROM FROM
basedata_mont_patdevpatroute basedata_mont_patdevpatroute
WHERE WHERE


Loading…
Cancel
Save