Groovy程式碼優化-多條記錄合成
阿新 • • 發佈:2018-12-04
最近有一個需求,分享活動領取詳情的顯示,由於領取記錄中狀態為‘支出’的記錄都是由領取狀態為‘已入賬’轉化過來的,所以需要將這種狀態的記錄虛化成兩條記錄,一條是‘已入賬’的狀態,另一條則是‘支出’的狀態,另外,對於同一天的狀態為‘支出’的資料進行整合,捏造成一條資料,然後再按照時間排序,而時間則是當狀態為‘支出’的時候按兌現時間,否則按照產生資料的時間。
感覺這種設計思路是有問題的,不然也不用這樣反覆折騰資料,所以如果有人有比較好的思路,歡迎提供。。。
現在提供我自己寫的比較冗長的程式碼
public List makeTotalDetailList(User user) {
List <DailyInsuranceOffer> dailyInsuranceOffers = diOfferRepo.findByUser(user)
dailyInsuranceOffers.findAll {
it.status.id == DailyInsuranceOfferStatus.Enum.USED_ID
}.collect {
DailyInsuranceOffer offerTemp = new DailyInsuranceOffer()
BeanUtil.copyPropertiesIgnore(it, offerTemp, 'cashTime' , 'updateTime', 'id');
offerTemp.setStatus(new DailyInsuranceOfferStatus(id: 1l))
dailyInsuranceOffers.add(offerTemp)
}
List<DailyInsuranceOffer> tmpDailyInsuranceOffer = new ArrayList<>()
Set cashTmp = new TreeSet()
cashTmp = dailyInsuranceOffers. findAll {
it.status?.id == DailyInsuranceOfferStatus.Enum.USED_ID
}.cashTime
cashTmp.each { ci ->
Double tmpAmount = 0.0
DailyInsuranceOffer tmpOffer = new DailyInsuranceOffer()
dailyInsuranceOffers.each { di ->
if (ci == di.cashTime && di.status.id == DailyInsuranceOfferStatus.Enum.USED_ID) {
tmpAmount += di.amount
}
}
tmpOffer.setStatus(new DailyInsuranceOfferStatus(id: 2l)).setAuto(null).setAmount(tmpAmount).setCreateTime(ci)
tmpDailyInsuranceOffer.add(tmpOffer)
}
dailyInsuranceOffers.findAll { it.status.id == DailyInsuranceOfferStatus.Enum.NOT_USE_ID }.each {
tmpDailyInsuranceOffer.add(it)
}
tmpDailyInsuranceOffer
Collections.sort(tmpDailyInsuranceOffer)
tmpDailyInsuranceOffer
}
由於不太會用 groovy ,寫成這個鳥樣,也不知道怎麼動手重構,所以就產生了老大完全的重構程式碼,雖然思路一樣。。。
public List offerDetails(User user) {
diOfferRepo.findByUser(user).collect { offer ->
if (NOT_USE_ID == offer.status.id) {
offer
} else {
[
offer,
new DailyInsuranceOffer().with {
BeanUtil.copyPropertiesIgnore(offer, it, 'cashTime', 'updateTime', 'id');
it.setStatus(RuntimeUtil.isDevEnv() ? new DailyInsuranceOfferStatus(id: 1l) : NOT_USE)
}
]
}
}
.flatten()
.groupBy { it.cashTime }
.collect { it.key ? it.value.sum() : it.value }
.flatten()
.collect { offerObj ->
offerObj.properties.findAll { ['amount', 'status', 'rewardDays', 'auto'].contains(it.key) }.with {
it.time = offerObj.sortValue()
it.licensePlateNo = it.auto?.licensePlateNo
it.remove('auto')
it
}
}
.sort { a, b -> b.time <=> a.time }
}
簡直就是整容前以及整容後的區別。。。無力吐槽。。。實在簡單易懂。。。不得不佩服groovy的簡單方便的原則。。。