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的简单方便的原则。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值