2017-05-12 23 views
-7

挨拶ユーザから詳細を取得する必要があります。その詳細はユーザが確認しなければなりません。テーブルにマッチしてはいけませんが、マッチしない場合は何も挿入しないでください。これはすべてのユーザー、ドメインに対して実行する必要があります。私が提案することができ、完全な、コードを見ていない内容に基づいてユーザからのデータを検証して2つのテーブルを作成し、別のテーブルに挿入するアルゴリズム

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のようなすべてのプロパティを確認することができますをマッピングするためのクエリを実行する必要はありません。いずれの場合も、各行を確認する必要があります。 GROUPBY {it.vehicle}が明確ではないですが、必要な場合は、「groupProperty」

  1. は、すべてのユーザーとユーザーごとに1つの反復のための2サービスメソッドのいずれかを作成しますのcreateCriteriaの投影を使用してそれを行うことができます。

    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サービスをトリガーするか、スケジュールされたジョブを作成することができますs。

  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`を検証する最良の方法であるかどうかは分かりませんので、注意する必要があります。

このヘルプが必要です。

関連する問題