Merge branch 'feat/infer_dev_260107' of https://kamco.gitea.gs.dabeeo.com/dabeeo/kamco-dabeeo-backoffice into feat/infer_dev_260107

This commit is contained in:
Moon
2026-01-22 12:35:26 +09:00
12 changed files with 165 additions and 46 deletions

View File

@@ -0,0 +1,26 @@
package com.kamco.cd.kamcoback.common.enums;
import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose;
import com.kamco.cd.kamcoback.common.utils.enums.EnumType;
import lombok.AllArgsConstructor;
import lombok.Getter;
@CodeExpose
@Getter
@AllArgsConstructor
public enum ImageryFitStatus implements EnumType {
FIT("적합"),
UNFIT("부적합");
private final String desc;
@Override
public String getId() {
return name();
}
@Override
public String getText() {
return desc;
}
}

View File

@@ -305,6 +305,8 @@ public class InferenceDetailDto {
Long mapSheetNum;
String mapSheetName;
String subUid;
String pnu;
String passYn;
// @JsonIgnore String gemoStr;
// @JsonIgnore String geomCenterStr;
@@ -323,7 +325,9 @@ public class InferenceDetailDto {
Double classAfterProb,
Long mapSheetNum,
String mapSheetName,
String subUid) {
String subUid,
String pnu,
String passYn) {
this.uuid = uuid;
this.uid = uid;
this.compareYyyy = compareYyyy;
@@ -338,20 +342,8 @@ public class InferenceDetailDto {
this.mapSheetNum = mapSheetNum;
this.mapSheetName = mapSheetName;
this.subUid = subUid;
// this.gemoStr = gemoStr;
// this.geomCenterStr = geomCenterStr;
//
// ObjectMapper mapper = new ObjectMapper();
// JsonNode geomJson;
// JsonNode geomCenterJson;
// try {
// geomJson = mapper.readTree(gemoStr);
// geomCenterJson = mapper.readTree(geomCenterStr);
// } catch (JsonProcessingException e) {
// throw new RuntimeException(e);
// }
// this.gemo = geomJson;
// this.geomCenter = geomCenterJson;
this.pnu = pnu;
this.passYn = passYn;
}
}

View File

@@ -178,6 +178,12 @@ public class InferenceResultDto {
@Schema(description = "uid")
private String uid;
@Schema(description = "uid 앞 8자리")
@JsonProperty("subUid")
public String subUid() {
return this.uid.substring(0, 8).toUpperCase();
}
@Schema(description = "상태명")
@JsonProperty("statusName")
public String statusName() {

View File

@@ -62,6 +62,10 @@ public class LabelWorkDto {
private Long inspectorRemainCnt;
private ZonedDateTime projectCloseDttm;
private String resultUid;
private String subUid;
private UUID learnUuid;
@JsonProperty("detectYear")
public String getDetectYear() {
if (compareYyyy == null || targetYyyy == null) {

View File

@@ -151,7 +151,7 @@ public class MapSheetAnalDataInferenceGeomEntity {
private ZonedDateTime fileCreatedDttm;
@Column(name = "pass_yn")
private Boolean passYn;
private String passYn;
@Column(name = "pass_yn_dttm")
private ZonedDateTime passYnDttm;

View File

@@ -0,0 +1,50 @@
package com.kamco.cd.kamcoback.postgres.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.OffsetDateTime;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@Getter
@Setter
@Entity
@Table(name = "tb_pnu")
public class PnuEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_pnu_id_gen")
@SequenceGenerator(name = "tb_pnu_id_gen", sequenceName = "tb_pnu_uid", allocationSize = 1)
@Column(name = "id", nullable = false)
private Long id;
@NotNull
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "geo_uid", nullable = false)
private MapSheetAnalDataInferenceGeomEntity geo;
@Size(max = 19)
@Column(name = "pnu", length = 19)
private String pnu;
@Column(name = "created_dttm")
private OffsetDateTime createdDttm;
@Column(name = "created_uid")
private Long createdUid;
@ColumnDefault("false")
@Column(name = "del_yn")
private Boolean delYn;
}

View File

@@ -1,8 +1,10 @@
package com.kamco.cd.kamcoback.postgres.repository.Inference;
import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx50kEntity.mapInkx50kEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapInkx5kEntity.mapInkx5kEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearn5kEntity.mapSheetLearn5kEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
import static com.querydsl.jpa.JPAExpressions.select;
import com.kamco.cd.kamcoback.scheduler.dto.JobStatusDto;
import com.querydsl.core.BooleanBuilder;
@@ -10,7 +12,6 @@ import com.querydsl.core.types.dsl.BooleanPath;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.NumberPath;
import com.querydsl.core.types.dsl.StringPath;
import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import java.util.UUID;
@@ -55,7 +56,7 @@ public class MapSheetLearn5kRepositoryImpl implements MapSheetLearn5kRepositoryC
}
var learnIdSubQuery =
JPAExpressions.select(mapSheetLearnEntity.id)
select(mapSheetLearnEntity.id)
.from(mapSheetLearnEntity)
.where(mapSheetLearnEntity.uuid.eq(uuid));
@@ -102,7 +103,7 @@ public class MapSheetLearn5kRepositoryImpl implements MapSheetLearn5kRepositoryC
}
var learnIdSubQuery =
JPAExpressions.select(mapSheetLearnEntity.id)
select(mapSheetLearnEntity.id)
.from(mapSheetLearnEntity)
.where(mapSheetLearnEntity.uuid.eq(uuid));
@@ -201,24 +202,30 @@ public class MapSheetLearn5kRepositoryImpl implements MapSheetLearn5kRepositoryC
.fetch();
}
/**
* 추론 진행 도엽 목록
*
* @param uuid uuid
* @return
*/
@Override
public List<String> getInferenceRunMapId(UUID uuid) {
return queryFactory
.select(mapInkx5kEntity.mapidNm)
.from(mapSheetLearnEntity)
.innerJoin(mapSheetLearn5kEntity)
.on(mapSheetLearn5kEntity.learn.id.eq(mapSheetLearnEntity.id))
.innerJoin(mapInkx5kEntity)
.on(
Expressions.booleanTemplate(
"function('regexp_match', {0}, '^[0-9]+$') is not null",
mapInkx5kEntity.mapidcdNo)
.and(
mapSheetLearn5kEntity.mapSheetNum.eq(
Expressions.numberTemplate(
Long.class, "cast({0} as long)", mapInkx5kEntity.mapidcdNo))))
.where(mapSheetLearnEntity.uuid.eq(uuid))
.groupBy(mapInkx5kEntity.mapidNm)
.select(mapInkx50kEntity.mapidNm.concat(mapInkx50kEntity.mapidcdNo))
.from(mapInkx50kEntity)
.join(mapInkx5kEntity)
.on(mapInkx5kEntity.mapInkx50k.fid.eq(mapInkx50kEntity.fid))
.where(
mapInkx5kEntity.mapidcdNo.in(
select(
Expressions.stringTemplate(
"CAST({0} AS text)", mapSheetLearn5kEntity.mapSheetNum))
.from(mapSheetLearnEntity)
.join(mapSheetLearn5kEntity)
.on(mapSheetLearn5kEntity.learn.id.eq(mapSheetLearnEntity.id))
.where(mapSheetLearnEntity.uuid.eq(uuid))))
.groupBy(mapInkx50kEntity.mapidcdNo, mapInkx50kEntity.mapidNm)
.orderBy(mapInkx50kEntity.mapidNm.asc())
.fetch();
}
}

View File

@@ -7,6 +7,7 @@ import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceG
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalSttcEntity.mapSheetAnalSttcEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QPnuEntity.pnuEntity;
import static com.kamco.cd.kamcoback.postgres.entity.QSystemMetricEntity.systemMetricEntity;
import com.kamco.cd.kamcoback.common.exception.CustomApiException;
@@ -28,6 +29,8 @@ import com.querydsl.core.types.dsl.BooleanExpression;
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 java.time.OffsetDateTime;
import java.util.List;
@@ -415,6 +418,13 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
NumberExpression<Long> inkxNoAsLong =
Expressions.numberTemplate(Long.class, "cast({0} as long)", mapInkx5kEntity.mapidcdNo);
StringExpression pnu =
Expressions.stringTemplate(
"coalesce(({0}), '')",
JPAExpressions.select(Expressions.stringTemplate("string_agg({0}, ',')", pnuEntity.pnu))
.from(pnuEntity)
.where(pnuEntity.geo.geoUid.eq(mapSheetAnalDataInferenceGeomEntity.geoUid)));
// 4) content
List<Geom> content =
queryFactory
@@ -434,7 +444,9 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto
mapInkx5kEntity.mapidNm,
Expressions.stringTemplate(
"substring({0} from 1 for 8)",
mapSheetAnalDataInferenceGeomEntity.resultUid)))
mapSheetAnalDataInferenceGeomEntity.resultUid),
pnu,
Expressions.nullExpression(String.class)))
.from(mapSheetAnalInferenceEntity)
.join(mapSheetAnalDataInferenceEntity)
.on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id))

View File

@@ -381,8 +381,11 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
mapSheetAnalDataInferenceGeomEntity.compareYyyy.eq(analEntity.getCompareYyyy()),
mapSheetAnalDataInferenceGeomEntity.targetYyyy.eq(analEntity.getTargetYyyy()),
mapSheetAnalDataInferenceGeomEntity.stage.eq(analEntity.getStage()),
mapSheetAnalDataInferenceGeomEntity.pnu.gt(0L),
mapSheetAnalDataInferenceGeomEntity.passYn.isFalse())
mapSheetAnalDataInferenceGeomEntity.pnu.isNotNull()
// mapSheetAnalDataInferenceGeomEntity.pnu.gt(0L)
// mapSheetAnalDataInferenceGeomEntity.passYn.isFalse() //TODO:
// 추후 라벨링 대상 조건 수정하기
)
.fetchOne();
}
@@ -552,8 +555,11 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
mapSheetAnalDataInferenceGeomEntity.dataUid))
.where(
mapSheetAnalInferenceEntity.uuid.eq(targetUuid),
mapSheetAnalDataInferenceGeomEntity.pnu.gt(0L),
mapSheetAnalDataInferenceGeomEntity.passYn.isFalse())
mapSheetAnalDataInferenceGeomEntity.pnu.isNotNull()
// mapSheetAnalDataInferenceGeomEntity.pnu.gt(0L),
// mapSheetAnalDataInferenceGeomEntity.passYn.isFalse() //TODO: 추후 라벨링
// 대상 조건 수정하기
)
.fetchOne();
}
@@ -734,8 +740,11 @@ public class LabelAllocateRepositoryImpl implements LabelAllocateRepositoryCusto
mapSheetAnalInferenceEntity.targetYyyy.eq(
mapSheetAnalDataInferenceGeomEntity.targetYyyy),
mapSheetAnalInferenceEntity.stage.eq(mapSheetAnalDataInferenceGeomEntity.stage),
mapSheetAnalDataInferenceGeomEntity.pnu.gt(0),
mapSheetAnalDataInferenceGeomEntity.passYn.isFalse())
mapSheetAnalDataInferenceGeomEntity.pnu.isNotNull()
// mapSheetAnalDataInferenceGeomEntity.pnu.gt(0),
// mapSheetAnalDataInferenceGeomEntity.passYn.isFalse() //TODO: 추후 라벨링 대상 조건
// 수정하기
)
.where(mapSheetAnalInferenceEntity.id.eq(analEntity.getId()))
.groupBy(
mapSheetAnalInferenceEntity.analTitle,

View File

@@ -1,5 +1,7 @@
package com.kamco.cd.kamcoback.postgres.repository.label;
import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity;
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.InspectState;
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelState;
import com.kamco.cd.kamcoback.label.dto.LabelWorkDto;
@@ -141,7 +143,10 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom {
.and(
mapSheetAnalDataInferenceGeomEntity.pnu
.isNotNull()) // TODO: 이노팸 연동 후 0 이상이라고 해야할 듯
.and(mapSheetAnalDataInferenceGeomEntity.passYn.eq(Boolean.FALSE)))
//
// .and(mapSheetAnalDataInferenceGeomEntity.passYn.eq(Boolean.FALSE)) //TODO: 추후
// 라벨링 대상 조건 수정하기
)
.then(1L)
.otherwise(0L)
.sum();
@@ -225,12 +230,18 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom {
new CaseBuilder()
.when(mapSheetAnalInferenceEntity.inspectionClosedYn.eq("Y"))
.then(mapSheetAnalInferenceEntity.updatedDttm)
.otherwise((ZonedDateTime) null)))
.otherwise((ZonedDateTime) null),
mapSheetLearnEntity.uid,
Expressions.stringTemplate(
"substring({0} from 1 for 8)", mapSheetLearnEntity.uid),
mapSheetLearnEntity.uuid))
.from(mapSheetAnalInferenceEntity)
.innerJoin(mapSheetAnalDataInferenceEntity)
.on(whereSubDataBuilder)
.innerJoin(mapSheetAnalDataInferenceGeomEntity)
.on(whereSubBuilder)
.leftJoin(mapSheetLearnEntity)
.on(mapSheetAnalInferenceEntity.learnId.eq(mapSheetLearnEntity.id))
.where(whereBuilder)
.groupBy(
mapSheetAnalInferenceEntity.uuid,
@@ -239,7 +250,9 @@ public class LabelWorkRepositoryImpl implements LabelWorkRepositoryCustom {
mapSheetAnalInferenceEntity.stage,
mapSheetAnalInferenceEntity.createdDttm,
mapSheetAnalInferenceEntity.analState,
mapSheetAnalInferenceEntity.id)
mapSheetAnalInferenceEntity.id,
mapSheetLearnEntity.uid,
mapSheetLearnEntity.uuid)
.orderBy(
mapSheetAnalInferenceEntity.targetYyyy.desc(),
mapSheetAnalInferenceEntity.compareYyyy.desc(),

View File

@@ -591,7 +591,7 @@ public class TrainingDataLabelRepositoryImpl extends QuerydslRepositorySupport
.afterCogUrl(afterCogUrl)
.mapBox(mapBbox)
.learnGeometries(learnDataList) // learnGeometry -> learnGeometries
.labelState(assignment.toDto().getWorkState())
.workState(assignment.toDto().getWorkState())
.build();
} catch (Exception e) {

View File

@@ -328,7 +328,7 @@ public class TrainingDataLabelDto {
private List<LearnDataGeometry> learnGeometries;
@Schema(description = "라벨 상태")
private String labelState;
private String workState;
}
@Schema(name = "ChangeDetectionInfo", description = "변화탐지정보")