最近有一个需求,分享活动领取详情的显示,由于领取记录中状态为‘支出’的记录都是由领取状态为‘已入账’转化过来的,所以需要将这种状态的记录虚化成两条记录,一条是‘已入账’的状态,另一条则是‘支出’的状态,另外,对于同一天的状态为‘支出’的数据进行整合,捏造成一条数据,然后再按照时间排序,而时间则是当状态为‘支出’的时候按兑现时间,否则按照产生数据的时间。
感觉这种设计思路是有问题的,不然也不用这样反复折腾数据,所以如果有人有比较好的思路,欢迎提供。。。
现在提供我自己写的比较冗长的代码
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的简单方便的原则。。。