2017-05-12 6 views
-7

인사말 사용자로부터 세부 정보를 얻어야하는 세부 정보에서 사용자는 모든 사용자 세부 정보의 유효성을 검사해야하며 다른 테이블로이 세부 정보의 유효성을 검사해야하며 날짜가 테이블에 삽입 일치하지 않지만 일치하지 않으면 아무 것도 삽입하지 마십시오.이 작업은 모든 사용자, 도메인에 대해 수행되어야합니다. 내가 제안 할 수 있습니다 완전하고 코드를보고하지 않은 세부 사항을 바탕으로사용자로부터 데이터를 검증하는 알고리즘 두 테이블 다음에 다른 테이블에 삽입

User{ 
String orderNumber 
String dealer 
Int UserKm 
String dateUser 
String adviser 
Vehicle vehicle 
String dateCreated 

Date appointmentDate //this date has to be validated with DateNext 
appointmentDate from Appointments domain of it doesn’t exit then you can 
insert on that table. 

} 
Appointments{ 
User user 
Date managementDate 
Date lasDataApointies 
DateNext appointmentDate 
Date NextdAteAppointment 
Date callDate 
String observations 
} 

def result = User.executeQuery("""select new map( 
mmt.id as id, mmt.orderNumber as orderNumber, mmt.dealer.dealer as 
dealer, mmt.UserKm as UserKm, mmt.dateUser as dateUser, mmt.adviser as 
adviser, mmt.technician as technician, mmt.vehicle.placa as vehicle, 
mmt.dateCreated as dateCreated, mmt.currenKm as currenKm) from User as 
mmt """) 

def result1=result.groupBy{it.vehicle} 

List detailsReslt=[] 

result1?.each { SlasDataApointing placa, listing -> 
def firsT = listing.first() 

int firstKM = firsT.UserKm 

def lasT = listing.last() 
def lasDataApoint = lasT.id 

int lastKM = lasT.UserKm 

int NextAppointmentKM = lastKM + 5000 

int dayBetweenLastAndNext = lastKM - NextAppointmentKM 

def tiDur = getDifference(firsT.dateUser,lasT.dateUser) 
int dayToInt = tiDur.days 

int restar = firstKM - lastKM 

int kmPerDay = restar.div(dayToInt) 
int nextMaintenaceDays = dayBetweenLastAndNext.div(kmPerDay) 

def nextAppointment = lasT.dateUser + nextMaintenaceDays    
detailsReslt<<[placa:placa, nextAppointment: 
nextAppointment, manageId:lasDataApoint, nextKmUser: NextAppointmentKM] 
     } 

detailsReslt?.each { 
Appointments addUserData = new Appointments() 
addUserData.User = User.findById(it.manageId) 
addUserData.managementDate = null 
addUserData.NextdAteAppointment = null 
addUserData.observations = null 
addUserData.callDate = it.nextAppointment 
addUserData.save(flush: true) 
} 

println "we now have ${detailsReslt}" 
} 
+0

당신이 구현하려고하는 논리를 이해하기는 어렵지만 grails 서비스 클래스를 작성하고 위에서 언급 한 엔티티를 조작하기위한 코드를 작성하는 것이 좋습니다. –

답변

1

: 단순히 사용자 목록을 조회하고 user.vehicle 같은 모든 속성을 확인할 수 있습니다 당신을지도 할 수있는 쿼리를 할 필요가 없습니다. 어떤 경우에도 각 행을 확인해야합니다.

  1. 모든 사용자 반복하는 2 서비스 메서드를 만들고 각 사용자에 대해 하나 GROUPBY {it.vehicle}는 명확하지 않지만 필요한 경우는 createCriteria 예측 "groupProperty"을 사용하여 수행 할 수 있습니다

    validateAppointment(User user){ 
        /* your validation logic */ 
        .... 
        if (validation term){ 
        Appointments addUserData = new Appointments() 
        ... 
        } 
    } 
    validateAppointments(){ 
        List users = User. list() 
        users.each{User user 
        validateAppointment(user) 
        } 
    } 
    
  2. 당신은 코드에서 어디에서나 validateAppointments에게 서비스를 트리거하거나 자동으로 필요에 따라 실행하도록 예약 된 작업을 만들 수 있습니다 에스.

  3. 사용자의 목록이 크고, 또한 효율성을 위해 당신이 대량 업데이 트를 할 수 있다면 - 그것에 대해 내 게시물을 살펴 걸릴 : https://medium.com/meni-lubetkin/grails-bulk-updates-4d749f24cba1

0

내가 서비스를 사용하여 사용자 정의 유효성 검사기를 만드는 제안을 , 다음과 같이 입력하십시오.

class User{ 

    def appointmentService 

    ...  
    Date appointmentDate 

    static constraints = { 
     appointmentDate validator: { val, obj -> 
      obj.appointmentService.isDateAppointmentValid(obj.appointmentDate) 
     } 
    } 

} 

그러나 검증은 생각보다 자주 실행될 수 있습니다. validate()save() 메소드에 의해 트리거됩니다 (user guide (v3.1.15)에서 설명). 따라서이 시나리오가 도메인의 áppointmentDate 유효성을 검사하는 가장 좋은 방법인지 확실하지 않으므로주의해야합니다.

희망 도움말.