1. 程式人生 > >Groovy程式碼優化-多條記錄合成

Groovy程式碼優化-多條記錄合成

最近有一個需求,分享活動領取詳情的顯示,由於領取記錄中狀態為‘支出’的記錄都是由領取狀態為‘已入賬’轉化過來的,所以需要將這種狀態的記錄虛化成兩條記錄,一條是‘已入賬’的狀態,另一條則是‘支出’的狀態,另外,對於同一天的狀態為‘支出’的資料進行整合,捏造成一條資料,然後再按照時間排序,而時間則是當狀態為‘支出’的時候按兌現時間,否則按照產生資料的時間。

感覺這種設計思路是有問題的,不然也不用這樣反覆折騰資料,所以如果有人有比較好的思路,歡迎提供。。。

現在提供我自己寫的比較冗長的程式碼

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的簡單方便的原則。。。