라벨링 어제 완료된 건 검수할당 스케줄링 + 라벨 저장 시 실시간 할당 추가
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
package com.kamco.cd.kamcoback.postgres.core;
|
||||
|
||||
import com.kamco.cd.kamcoback.postgres.repository.scheduler.TrainingDataReviewJobRepository;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class TrainingDataReviewJobCoreService {
|
||||
|
||||
private final TrainingDataReviewJobRepository trainingDataReviewJobRepository;
|
||||
|
||||
public List<Tasks> findCompletedYesterdayUnassigned() {
|
||||
return trainingDataReviewJobRepository.findCompletedYesterdayUnassigned();
|
||||
}
|
||||
|
||||
public void assignReviewer(UUID assignmentUid, String reviewerId) {
|
||||
trainingDataReviewJobRepository.assignReviewer(assignmentUid, reviewerId);
|
||||
}
|
||||
|
||||
public void assignReviewerBatch(List<UUID> assignmentUids, String reviewerId) {
|
||||
trainingDataReviewJobRepository.assignReviewerBatch(assignmentUids, reviewerId);
|
||||
}
|
||||
|
||||
public Tasks findAssignmentTask(String assignmentUid) {
|
||||
return trainingDataReviewJobRepository.findAssignmentTask(assignmentUid);
|
||||
}
|
||||
|
||||
public List<InspectorPendingDto> findInspectorPendingByRound(Long analUid) {
|
||||
return trainingDataReviewJobRepository.findInspectorPendingByRound(analUid);
|
||||
}
|
||||
|
||||
public void lockInspectors(Long analUid, List<String> reviewerIds) {
|
||||
trainingDataReviewJobRepository.lockInspectors(analUid, reviewerIds);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.kamco.cd.kamcoback.postgres.repository.scheduler;
|
||||
|
||||
import com.kamco.cd.kamcoback.postgres.entity.LabelingInspectorEntity;
|
||||
import jakarta.persistence.LockModeType;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Lock;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
|
||||
public interface TrainingDataReviewJobRepository
|
||||
extends JpaRepository<LabelingInspectorEntity, UUID>, TrainingDataReviewJobRepositoryCustom {
|
||||
|
||||
@Lock(LockModeType.PESSIMISTIC_WRITE)
|
||||
@Query(
|
||||
"""
|
||||
select r
|
||||
from LabelingInspectorEntity r
|
||||
where r.analUid = :analUid
|
||||
and r.inspectorUid in :inspectorUids
|
||||
""")
|
||||
List<LabelingInspectorEntity> lockInspectors(Long analUid, List<String> inspectorUids);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.kamco.cd.kamcoback.postgres.repository.scheduler;
|
||||
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface TrainingDataReviewJobRepositoryCustom {
|
||||
|
||||
List<Tasks> findCompletedYesterdayUnassigned();
|
||||
|
||||
List<InspectorPendingDto> findInspectorPendingByRound(Long analUid);
|
||||
|
||||
void assignReviewer(UUID assignmentUid, String reviewerId);
|
||||
|
||||
void assignReviewerBatch(List<UUID> assignmentUids, String reviewerId);
|
||||
|
||||
Tasks findAssignmentTask(String assignmentUid);
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
package com.kamco.cd.kamcoback.postgres.repository.scheduler;
|
||||
|
||||
import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.labelingAssignmentEntity;
|
||||
import static com.kamco.cd.kamcoback.postgres.entity.QLabelingInspectorEntity.labelingInspectorEntity;
|
||||
|
||||
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.InspectState;
|
||||
import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelState;
|
||||
import com.kamco.cd.kamcoback.postgres.entity.LabelingAssignmentEntity;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.InspectorPendingDto;
|
||||
import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.Tasks;
|
||||
import com.querydsl.core.types.Projections;
|
||||
import com.querydsl.core.types.dsl.BooleanExpression;
|
||||
import com.querydsl.core.types.dsl.Expressions;
|
||||
import com.querydsl.core.types.dsl.StringExpression;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
|
||||
|
||||
public class TrainingDataReviewJobRepositoryImpl extends QuerydslRepositorySupport
|
||||
implements TrainingDataReviewJobRepositoryCustom {
|
||||
|
||||
private final JPAQueryFactory queryFactory;
|
||||
private final StringExpression NULL_STRING = Expressions.stringTemplate("cast(null as text)");
|
||||
|
||||
public TrainingDataReviewJobRepositoryImpl(JPAQueryFactory queryFactory) {
|
||||
super(LabelingAssignmentEntity.class);
|
||||
this.queryFactory = queryFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Tasks> findCompletedYesterdayUnassigned() {
|
||||
ZoneId zone = ZoneId.of("Asia/Seoul");
|
||||
ZonedDateTime todayStart = ZonedDateTime.now(zone).toLocalDate().atStartOfDay(zone);
|
||||
ZonedDateTime yesterdayStart = todayStart.minusDays(1);
|
||||
|
||||
BooleanExpression isYesterday =
|
||||
labelingAssignmentEntity
|
||||
.workStatDttm
|
||||
.goe(yesterdayStart)
|
||||
.and(labelingAssignmentEntity.workStatDttm.lt(todayStart));
|
||||
|
||||
return queryFactory
|
||||
.select(
|
||||
Projections.constructor(
|
||||
Tasks.class,
|
||||
labelingAssignmentEntity.assignmentUid,
|
||||
labelingAssignmentEntity.inferenceGeomUid,
|
||||
labelingAssignmentEntity.analUid))
|
||||
.from(labelingAssignmentEntity)
|
||||
.where(
|
||||
labelingAssignmentEntity.workState.in(LabelState.SKIP.getId(), LabelState.DONE.getId()),
|
||||
labelingAssignmentEntity.inspectorUid.isNull(),
|
||||
isYesterday)
|
||||
.orderBy(
|
||||
labelingAssignmentEntity.analUid.asc(),
|
||||
labelingAssignmentEntity.assignGroupId.asc(),
|
||||
labelingAssignmentEntity.inferenceGeomUid.asc())
|
||||
.fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 해당 회차에 라벨링 할당받은 검수자별 완료 건수 count(), 완료한 게 적은 순으로 해야 일이 한 사람에게 몰리지 않음
|
||||
*
|
||||
* @param analUid
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<InspectorPendingDto> findInspectorPendingByRound(Long analUid) {
|
||||
return queryFactory
|
||||
.select(
|
||||
Projections.constructor(
|
||||
InspectorPendingDto.class,
|
||||
labelingInspectorEntity.inspectorUid,
|
||||
labelingAssignmentEntity.assignmentUid.count()))
|
||||
.from(labelingInspectorEntity)
|
||||
.leftJoin(labelingAssignmentEntity)
|
||||
.on(
|
||||
labelingInspectorEntity.inspectorUid.eq(labelingAssignmentEntity.inspectorUid),
|
||||
labelingAssignmentEntity.inspectState.in(
|
||||
InspectState.EXCEPT.getId(), InspectState.COMPLETE.getId()))
|
||||
.where(labelingInspectorEntity.analUid.eq(analUid))
|
||||
.groupBy(labelingInspectorEntity.inspectorUid)
|
||||
.orderBy(labelingAssignmentEntity.assignmentUid.count().asc())
|
||||
.fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* 실시간 분배용 1건 update
|
||||
*
|
||||
* @param assignmentUid
|
||||
* @param reviewerId
|
||||
*/
|
||||
@Override
|
||||
public void assignReviewer(UUID assignmentUid, String reviewerId) {
|
||||
queryFactory
|
||||
.update(labelingAssignmentEntity)
|
||||
.set(labelingAssignmentEntity.inspectorUid, reviewerId)
|
||||
.set(labelingAssignmentEntity.inspectState, InspectState.UNCONFIRM.getId())
|
||||
.where(labelingAssignmentEntity.assignmentUid.eq(assignmentUid))
|
||||
.execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* 배치용 여러 건 update
|
||||
*
|
||||
* @param assignmentUids
|
||||
* @param reviewerId
|
||||
*/
|
||||
@Override
|
||||
public void assignReviewerBatch(List<UUID> assignmentUids, String reviewerId) {
|
||||
queryFactory
|
||||
.update(labelingAssignmentEntity)
|
||||
.set(labelingAssignmentEntity.inspectorUid, reviewerId)
|
||||
.set(labelingAssignmentEntity.inspectState, InspectState.UNCONFIRM.getId())
|
||||
.where(labelingAssignmentEntity.assignmentUid.in(assignmentUids))
|
||||
.execute();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tasks findAssignmentTask(String assignmentUid) {
|
||||
return queryFactory
|
||||
.select(
|
||||
Projections.constructor(
|
||||
Tasks.class,
|
||||
labelingAssignmentEntity.assignmentUid,
|
||||
labelingAssignmentEntity.inferenceGeomUid,
|
||||
labelingAssignmentEntity.analUid))
|
||||
.from(labelingAssignmentEntity)
|
||||
.where(labelingAssignmentEntity.assignmentUid.eq(UUID.fromString(assignmentUid)))
|
||||
.fetchOne();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user