Merge branch 'feat/dev_251201' of https://10.100.0.10:3210/dabeeo/kamco-dabeeo-backoffice into feat/dev_251201

This commit is contained in:
2026-01-05 13:36:36 +09:00
7 changed files with 389 additions and 96 deletions

View File

@@ -1,8 +1,13 @@
package com.kamco.cd.kamcoback.postgres.core;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.ChangeDetectYear;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMng;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMngDetail;
import com.kamco.cd.kamcoback.postgres.repository.label.LabelWorkRepository;
import com.kamco.cd.kamcoback.postgres.repository.members.MembersRepository;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
@@ -12,8 +17,40 @@ import org.springframework.stereotype.Service;
public class LabelWorkCoreService {
private final LabelWorkRepository labelWorkRepository;
private final MembersRepository membersRepository;
/**
* 변화탐지 년도 셀렉트박스 조회
*
* @return
*/
public List<ChangeDetectYear> getChangeDetectYear() {
return labelWorkRepository.findChangeDetectYearList().stream()
.map(
e ->
new ChangeDetectYear(
e.getCompareYyyy() + "-" + e.getTargetYyyy(),
e.getCompareYyyy() + "-" + e.getTargetYyyy()))
.toList();
}
/**
* 라벨링작업 관리 목록 조회
*
* @param searchReq
* @return
*/
public Page<LabelWorkMng> labelWorkMngList(LabelWorkDto.LabelWorkMngSearchReq searchReq) {
return labelWorkRepository.labelWorkMngList(searchReq);
}
/**
* 작업배정 정보 조회
*
* @param uuid
* @return
*/
public LabelWorkMngDetail findLabelWorkMngDetail(UUID uuid) {
return labelWorkRepository.findLabelWorkMngDetail(uuid);
}
}

View File

@@ -36,20 +36,29 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC
String sql =
"""
INSERT INTO tb_map_sheet_anal_inference (
compare_yyyy,
target_yyyy,
stage,
anal_title,
detecting_cnt
)
SELECT
r.input1 AS compare_yyyy,
r.input2 AS target_yyyy,
r.stage,
CONCAT(r.stage ,'_', r.input1 ,'_', r.input2) AS anal_title,
count(*)
FROM inference_results r
GROUP BY r.stage, r.input1, r.input2;
stage,
compare_yyyy,
target_yyyy,
anal_title,
detecting_cnt,
created_dttm,
updated_dttm
)
SELECT
r.stage,
r.input1 AS compare_yyyy,
r.input2 AS target_yyyy,
CONCAT(r.stage, '_', r.input1, '_', r.input2) AS anal_title,
COUNT(*) AS detecting_cnt,
now(),
now()
FROM inference_results r
GROUP BY r.stage, r.input1, r.input2
ON CONFLICT (stage, compare_yyyy, target_yyyy)
DO UPDATE SET
detecting_cnt = EXCLUDED.detecting_cnt,
anal_title = EXCLUDED.anal_title,
updated_dttm = now()
""";
return em.createNativeQuery(sql).executeUpdate();
@@ -69,30 +78,42 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC
String sql =
"""
INSERT INTO tb_map_sheet_anal_data_inference (
anal_uid,
stage,
compare_yyyy,
target_yyyy,
map_sheet_num,
created_dttm,
updated_dttm,
detecting_cnt,
file_created_yn,
detecting_cnt
created_dttm,
updated_dttm
)
SELECT
ai.id AS anal_uid,
r.stage,
r.input1 AS compare_yyyy,
r.input2 AS target_yyyy,
r.map_id AS map_sheet_num,
now() AS created_dttm,
now() AS updated_dttm,
false AS file_created_yn,
count(*) AS detecting_cnt
COUNT(*) AS detecting_cnt,
false AS file_created_yn,
now(),
now()
FROM inference_results r
GROUP BY r.stage, r.input1, r.input2, r.map_id
JOIN tb_map_sheet_anal_inference ai
ON ai.stage = r.stage
AND ai.compare_yyyy = r.input1
AND ai.target_yyyy = r.input2
GROUP BY
ai.id,
r.stage,
r.input1,
r.input2,
r.map_id
ON CONFLICT (stage, compare_yyyy, target_yyyy, map_sheet_num)
DO UPDATE SET
updated_dttm = now(),
detecting_cnt = EXCLUDED.detecting_cnt
anal_uid = EXCLUDED.anal_uid,
detecting_cnt = EXCLUDED.detecting_cnt,
updated_dttm = now()
""";
return em.createNativeQuery(sql).executeUpdate();
@@ -111,46 +132,70 @@ public class InferenceResultRepositoryImpl implements InferenceResultRepositoryC
String sql =
"""
INSERT INTO tb_map_sheet_anal_data_inference_geom (
uuid, stage, cd_prob, compare_yyyy, target_yyyy, map_sheet_num,
class_before_cd, class_before_prob, class_after_cd, class_after_prob,
geom, area, data_uid, created_dttm, updated_dttm,
file_created_yn
INSERT INTO tb_map_sheet_anal_data_inference_geom (
uuid,
stage,
cd_prob,
compare_yyyy,
target_yyyy,
map_sheet_num,
class_before_cd,
class_before_prob,
class_after_cd,
class_after_prob,
geom,
area,
data_uid,
file_created_yn,
created_dttm,
updated_dttm
)
SELECT
x.uuid, x.stage, x.cd_prob, x.compare_yyyy, x.target_yyyy, x.map_sheet_num,
x.class_before_cd, x.class_before_prob, x.class_after_cd, x.class_after_prob,
x.geom, x.area, x.data_uid, x.created_dttm, x.updated_dttm,
false AS file_created_yn
x.uuid,
x.stage,
x.cd_prob,
x.compare_yyyy,
x.target_yyyy,
x.map_sheet_num,
x.class_before_cd,
x.class_before_prob,
x.class_after_cd,
x.class_after_prob,
x.geom,
x.area,
x.data_uid,
false,
x.created_dttm,
x.updated_dttm
FROM (
SELECT DISTINCT ON (r.uuid)
r.uuid,
r.stage,
r.cd_prob,
r.input1 AS compare_yyyy,
r.input2 AS target_yyyy,
r.map_id AS map_sheet_num,
r.before_class AS class_before_cd,
r.before_probability AS class_before_prob,
r.after_class AS class_after_cd,
r.after_probability AS class_after_prob,
CASE
WHEN r.geometry IS NULL THEN NULL
WHEN left(r.geometry, 2) = '01'
THEN ST_SetSRID(ST_GeomFromWKB(decode(r.geometry, 'hex')), 5186)
ELSE ST_GeomFromText(r.geometry, 5186)
END AS geom,
r.area,
di.data_uid,
r.created_dttm,
r.updated_dttm
FROM inference_results r
JOIN tb_map_sheet_anal_data_inference di
ON di.stage = r.stage
AND di.compare_yyyy = r.input1
AND di.target_yyyy = r.input2
AND di.map_sheet_num = r.map_id
ORDER BY r.uuid, r.updated_dttm DESC NULLS LAST, r.uid DESC
SELECT DISTINCT ON (r.uuid)
r.uuid,
r.stage,
r.cd_prob,
r.input1 AS compare_yyyy,
r.input2 AS target_yyyy,
r.map_id AS map_sheet_num,
r.before_class AS class_before_cd,
r.before_probability AS class_before_prob,
r.after_class AS class_after_cd,
r.after_probability AS class_after_prob,
CASE
WHEN r.geometry IS NULL THEN NULL
WHEN LEFT(r.geometry, 2) = '01'
THEN ST_SetSRID(ST_GeomFromWKB(decode(r.geometry, 'hex')), 5186)
ELSE ST_GeomFromText(r.geometry, 5186)
END AS geom,
r.area,
di.data_uid,
r.created_dttm,
r.updated_dttm
FROM inference_results r
JOIN tb_map_sheet_anal_data_inference di
ON di.stage = r.stage
AND di.compare_yyyy = r.input1
AND di.target_yyyy = r.input2
AND di.map_sheet_num = r.map_id
ORDER BY r.uuid, r.updated_dttm DESC NULLS LAST, r.uid DESC
) x
ON CONFLICT (uuid)
DO UPDATE SET

View File

@@ -2,9 +2,17 @@ package com.kamco.cd.kamcoback.postgres.repository.label;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMng;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMngDetail;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity;
import java.util.List;
import java.util.UUID;
import org.springframework.data.domain.Page;
public interface LabelWorkRepositoryCustom {
List<MapSheetAnalInferenceEntity> findChangeDetectYearList();
public Page<LabelWorkMng> labelWorkMngList(LabelWorkDto.LabelWorkMngSearchReq searchReq);
LabelWorkMngDetail findLabelWorkMngDetail(UUID uuid);
}

View File

@@ -1,22 +1,29 @@
package com.kamco.cd.kamcoback.postgres.repository.label;
import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.labelingAssignmentEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceEntity.mapSheetAnalDataInferenceEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity.mapSheetAnalDataInferenceGeomEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMng;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto.LabelWorkMngDetail;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalDataGeomEntity;
import com.kamco.cd.kamcoback.postgres.entity.MapSheetAnalInferenceEntity;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberExpression;
import com.querydsl.core.types.dsl.StringExpression;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
@@ -39,20 +46,59 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
this.queryFactory = queryFactory;
}
/**
* 변화탐지 년도 셀렉트박스 조회
*
* @return
*/
@Override
public List<MapSheetAnalInferenceEntity> findChangeDetectYearList() {
return queryFactory
.selectFrom(mapSheetAnalInferenceEntity)
.where(
mapSheetAnalInferenceEntity.id.in(
JPAExpressions.select(mapSheetAnalInferenceEntity.id.min())
.from(mapSheetAnalInferenceEntity)
.groupBy(
mapSheetAnalInferenceEntity.compareYyyy,
mapSheetAnalInferenceEntity.targetYyyy)))
.orderBy(
mapSheetAnalInferenceEntity.compareYyyy.asc(),
mapSheetAnalInferenceEntity.targetYyyy.asc())
.fetch();
}
/**
* 라벨링 작업관리 목록 조회
*
* @param searchReq
* @return
*/
@Override
public Page<LabelWorkMng> labelWorkMngList(LabelWorkDto.LabelWorkMngSearchReq searchReq) {
Pageable pageable = PageRequest.of(searchReq.getPage(), searchReq.getSize());
BooleanBuilder whereBuilder = new BooleanBuilder();
BooleanBuilder whereSubDataBuilder = new BooleanBuilder();
BooleanBuilder whereSubBuilder = new BooleanBuilder();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
if (StringUtils.isNotBlank(searchReq.getDetectYear())) {
String[] years = searchReq.getDetectYear().split("-");
if (searchReq.getDetectYyyy() != null) {
whereBuilder.and(mapSheetAnalDataInferenceEntity.targetYyyy.eq(searchReq.getDetectYyyy()));
if (years.length == 2) {
Integer compareYear = Integer.valueOf(years[0]);
Integer targetYear = Integer.valueOf(years[1]);
whereBuilder.and(
mapSheetAnalDataInferenceEntity
.compareYyyy
.eq(compareYear)
.and(mapSheetAnalDataInferenceEntity.targetYyyy.eq(targetYear)));
}
}
// mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id)
whereSubDataBuilder.and(
mapSheetAnalInferenceEntity.id.eq(mapSheetAnalDataInferenceEntity.analUid));
whereSubBuilder.and(
mapSheetAnalDataInferenceGeomEntity.dataUid.eq(mapSheetAnalDataInferenceEntity.id));
@@ -61,15 +107,10 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
&& !searchReq.getStrtDttm().isEmpty()
&& searchReq.getEndDttm() != null
&& !searchReq.getEndDttm().isEmpty()) {
// whereSubBuilder.and(mapSheetAnalDataInferenceGeomEntity.labelStateDttm.isNotNull());
whereSubBuilder.and(
Expressions.stringTemplate(
"to_char({0}, 'YYYYMMDD')", mapSheetAnalDataInferenceGeomEntity.labelStateDttm)
.between(searchReq.getStrtDttm(), searchReq.getEndDttm()));
// whereBuilder.and(mapSheetAnalDataInferenceGeomEntity.labelStateDttm.min().isNotNull());
}
List<LabelWorkMng> foundContent =
@@ -77,9 +118,10 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
.select(
Projections.constructor(
LabelWorkMng.class,
mapSheetAnalDataInferenceEntity.compareYyyy,
mapSheetAnalDataInferenceEntity.targetYyyy,
mapSheetAnalDataInferenceEntity.stage,
mapSheetAnalInferenceEntity.uuid,
mapSheetAnalInferenceEntity.compareYyyy,
mapSheetAnalInferenceEntity.targetYyyy,
mapSheetAnalInferenceEntity.stage,
mapSheetAnalDataInferenceEntity.createdDttm.min(),
mapSheetAnalDataInferenceGeomEntity.dataUid.count(),
mapSheetAnalDataInferenceGeomEntity.dataUid.count(),
@@ -99,17 +141,21 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
.otherwise(0L)
.sum(),
mapSheetAnalDataInferenceGeomEntity.labelStateDttm.min()))
.from(mapSheetAnalDataInferenceEntity)
.from(mapSheetAnalInferenceEntity)
.innerJoin(mapSheetAnalDataInferenceEntity)
.on(whereSubDataBuilder)
.innerJoin(mapSheetAnalDataInferenceGeomEntity)
.on(whereSubBuilder)
.where(whereBuilder)
.groupBy(
mapSheetAnalDataInferenceEntity.compareYyyy,
mapSheetAnalDataInferenceEntity.targetYyyy,
mapSheetAnalDataInferenceEntity.stage)
mapSheetAnalInferenceEntity.uuid,
mapSheetAnalInferenceEntity.compareYyyy,
mapSheetAnalInferenceEntity.targetYyyy,
mapSheetAnalInferenceEntity.stage)
.orderBy(
mapSheetAnalDataInferenceEntity.targetYyyy.desc(),
mapSheetAnalDataInferenceEntity.stage.desc())
mapSheetAnalInferenceEntity.targetYyyy.desc(),
mapSheetAnalInferenceEntity.compareYyyy.desc(),
mapSheetAnalInferenceEntity.stage.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
@@ -131,8 +177,62 @@ public class LabelWorkRepositoryImpl extends QuerydslRepositorySupport
*/
Long countQuery = foundContent.stream().count();
Long total =
queryFactory
.select(mapSheetAnalInferenceEntity.uuid.countDistinct())
.from(mapSheetAnalInferenceEntity)
.innerJoin(mapSheetAnalDataInferenceEntity)
.on(whereSubDataBuilder)
.innerJoin(mapSheetAnalDataInferenceGeomEntity)
.on(whereSubBuilder)
.where(whereBuilder)
.fetchOne();
return new PageImpl<>(foundContent, pageable, countQuery);
return new PageImpl<>(foundContent, pageable, total);
}
/**
* 작업배정 상세조회
*
* @param uuid
* @return
*/
@Override
public LabelWorkMngDetail findLabelWorkMngDetail(UUID uuid) {
NumberExpression<Long> labelTotCnt = mapSheetAnalDataInferenceGeomEntity.geoUid.count();
NumberExpression<Long> labelerCnt = labelingAssignmentEntity.workerUid.count();
NumberExpression<Long> reviewerCnt = labelingAssignmentEntity.inspectorUid.count();
return queryFactory
.select(
Projections.constructor(
LabelWorkMngDetail.class,
mapSheetAnalInferenceEntity
.compareYyyy
.stringValue()
.concat("-")
.concat(mapSheetAnalInferenceEntity.targetYyyy.stringValue()),
mapSheetAnalInferenceEntity.stage,
mapSheetAnalInferenceEntity.createdDttm,
labelTotCnt,
labelerCnt,
reviewerCnt))
.from(mapSheetAnalInferenceEntity)
.leftJoin(mapSheetAnalDataInferenceEntity)
.on(mapSheetAnalInferenceEntity.id.eq(mapSheetAnalDataInferenceEntity.analUid))
.leftJoin(mapSheetAnalDataInferenceGeomEntity)
.on(mapSheetAnalDataInferenceEntity.id.eq(mapSheetAnalDataInferenceGeomEntity.dataUid))
.leftJoin(labelingAssignmentEntity)
.on(
mapSheetAnalDataInferenceGeomEntity.geoUid.eq(
labelingAssignmentEntity.inferenceGeomUid))
.where(mapSheetAnalInferenceEntity.uuid.eq(uuid))
.groupBy(
mapSheetAnalInferenceEntity.compareYyyy,
mapSheetAnalInferenceEntity.targetYyyy,
mapSheetAnalInferenceEntity.stage,
mapSheetAnalInferenceEntity.createdDttm)
.fetchOne();
}
}