Authored by LUOXC

fixbug

package com.yohoufo.dal.order.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Builder;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InviteSettlementItem {
/**
... ...
... ... @@ -61,12 +61,13 @@ public class InviteSettlementUtils {
* @return
*/
public static Pair<BigDecimal, List<InviteSettlementItem>> calculateSettleAmountOfType2(LocalDateTime inviteTime, LocalDateTime settleTime, List<InviteSettlementItem> items) {
// 被邀请当月月初开始计算
// 被邀请当月月初开始计算,eg:20190101
LocalDateTime calculateStartTime = LocalDateTime.of(LocalDate.of(inviteTime.getYear(), inviteTime.getMonth(), 1), LocalTime.MIN);
// 一个月后eg:20190201
LocalDateTime afterOneMonth = calculateStartTime.plusMonths(1);
LocalDateTime afterFiveMonth = calculateStartTime.plusMonths(5);
// 四个月后eg:20190501
LocalDateTime afterFourMonth = calculateStartTime.plusMonths(4);
// 被邀请来年元旦
LocalDateTime calculateFinalEndTime = LocalDateTime.of(LocalDate.of(inviteTime.getYear() + 1, 1, 1), LocalTime.MIN);
... ... @@ -79,50 +80,50 @@ public class InviteSettlementUtils {
if (settleTime.isBefore(afterOneMonth)) {
return Pair.of(BigDecimal.ZERO, items);
}
// 五个月内
else if (settleTime.isBefore(afterFiveMonth)) {
// 四个月内
else if (settleTime.isBefore(afterFourMonth)) {
return Pair.of(
calculateInOneMountTotalSettleAmountOfType2(items, afterOneMonth),
items.stream().filter(item -> iaAfterOrEqual.test(item, afterOneMonth)).collect(Collectors.toList())
);
}
// 个月后
// 个月后
else {
// 五个月后没有超过最终结算时间
if (afterFiveMonth.isBefore(calculateFinalEndTime)) {
// 四个月后没有超过最终结算时间
if (afterFourMonth.isBefore(calculateFinalEndTime)) {
// 最终结算时间前
if (settleTime.isBefore(calculateFinalEndTime)) {
return Pair.of(
calculateInOneMountTotalSettleAmountOfType2(items, afterOneMonth)
.add(calculateInFiveMountTotalSettleAmountOfType2(items, afterOneMonth, afterFiveMonth, iaAfterOrEqual)),
items.stream().filter(item -> iaAfterOrEqual.test(item, afterFiveMonth)).collect(Collectors.toList())
.add(calculateInFourMountTotalSettleAmountOfType2(items, afterOneMonth, afterFourMonth, iaAfterOrEqual)),
items.stream().filter(item -> iaAfterOrEqual.test(item, afterFourMonth)).collect(Collectors.toList())
);
}
// 最终结算时间后
else {
return Pair.of(
calculateInOneMountTotalSettleAmountOfType2(items, afterOneMonth)
.add(calculateInFiveMountTotalSettleAmountOfType2(items, afterOneMonth, afterFiveMonth, iaAfterOrEqual))
.add(calculateOutFiveMountTotalSettleAmountOfType2(items, afterFiveMonth, calculateFinalEndTime, iaAfterOrEqual)),
.add(calculateInFourMountTotalSettleAmountOfType2(items, afterOneMonth, afterFourMonth, iaAfterOrEqual))
.add(calculateOutFourMountTotalSettleAmountOfType2(items, afterFourMonth, calculateFinalEndTime, iaAfterOrEqual)),
items.stream().filter(item -> iaAfterOrEqual.test(item, calculateFinalEndTime)).collect(Collectors.toList())
);
}
}
// 个月后已经超过了最终结算时间
// 个月后已经超过了最终结算时间
else {
return Pair.of(
calculateInOneMountTotalSettleAmountOfType2(items, afterOneMonth)
.add(calculateInFiveMountTotalSettleAmountOfType2(items, afterOneMonth, calculateFinalEndTime, iaAfterOrEqual)),
.add(calculateInFourMountTotalSettleAmountOfType2(items, afterOneMonth, calculateFinalEndTime, iaAfterOrEqual)),
items.stream().filter(item -> iaAfterOrEqual.test(item, calculateFinalEndTime)).collect(Collectors.toList())
);
}
}
}
private static BigDecimal calculateOutFiveMountTotalSettleAmountOfType2(List<InviteSettlementItem> items, LocalDateTime afterFiveMonth, LocalDateTime calculateEndTime, BiPredicate<InviteSettlementItem, LocalDateTime> iaAfterOrEqual) {
private static BigDecimal calculateOutFourMountTotalSettleAmountOfType2(List<InviteSettlementItem> items, LocalDateTime afterFourMonth, LocalDateTime calculateEndTime, BiPredicate<InviteSettlementItem, LocalDateTime> iaAfterOrEqual) {
BigDecimal outFiveMonthTotalSettleAmount;
BigDecimal outFiveMonthTotalOrderAmount = items.stream()
.filter(item -> iaAfterOrEqual.test(item, afterFiveMonth))
.filter(item -> iaAfterOrEqual.test(item, afterFourMonth))
.filter(item -> newLocalDateTimeOfEpochSecond(item.getCreateTime()).isBefore(calculateEndTime))
.map(InviteSettlementItem::getOrderAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
... ... @@ -138,7 +139,7 @@ public class InviteSettlementUtils {
return outFiveMonthTotalSettleAmount;
}
private static BigDecimal calculateInFiveMountTotalSettleAmountOfType2(List<InviteSettlementItem> items, LocalDateTime afterOneMonth, LocalDateTime calculateEndTime, BiPredicate<InviteSettlementItem, LocalDateTime> iaAfterOrEqual) {
private static BigDecimal calculateInFourMountTotalSettleAmountOfType2(List<InviteSettlementItem> items, LocalDateTime afterOneMonth, LocalDateTime calculateEndTime, BiPredicate<InviteSettlementItem, LocalDateTime> iaAfterOrEqual) {
BigDecimal inFiveMonthTotalSettleAmount;
BigDecimal inFiveMonthTotalOrderAmount = items.stream()
.filter(item -> iaAfterOrEqual.test(item, afterOneMonth))
... ...
package com.yohoufo.order.utils;
import com.google.common.collect.Lists;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.Assert;
import org.junit.Test;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import static java.math.BigDecimal.ROUND_HALF_UP;
public class InviteSettlementUtilsTest {
@Test
public void calculateSettleAmountOfType2_3_180_300() {
LocalDateTime inviteTime = LocalDateTime.of(2019, 1, 26, 1, 2, 1);
LocalDateTime settleTime = LocalDateTime.of(2020, 1, 1, 0, 0, 0);
List<InviteSettlementItem> items = Lists.newArrayList(
// 2019-05-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(500000)).createTime(1559010719).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1559010719).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1559010719).build(),
// 2019-06-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
// 2019-07-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(999)).createTime(1564281119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(4000)).createTime(1564281119).build(),
// 2019-12-31 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(2490000)).createTime(1577759519).build()
);
Pair<BigDecimal, List<InviteSettlementItem>> settleResult = InviteSettlementUtils.calculateSettleAmountOfType2(inviteTime, settleTime, items);
assertBigDecimalEquals(settleResult.getLeft(), BigDecimal.valueOf(29999.99));
Assert.assertEquals(settleResult.getRight().size(), 0);
}
@Test
public void calculateSettleAmountOfType2_1() {
LocalDateTime inviteTime = LocalDateTime.of(2019, 1, 26, 1, 2, 1);
LocalDateTime settleTime = LocalDateTime.of(2019, 2, 1, 0, 0, 0);
List<InviteSettlementItem> items = Lists.newArrayList(
// 2019-05-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(500000)).createTime(1559010719).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1559010719).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1559010719).build(),
// 2019-06-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(1000)).createTime(1561689119).build(),
// 2019-07-28 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(999)).createTime(1564281119).build(),
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(4000)).createTime(1564281119).build(),
// 2019-12-31 10:31:59
InviteSettlementItem.builder().orderAmount(BigDecimal.valueOf(2490000)).createTime(1577759519).build()
);
Pair<BigDecimal, List<InviteSettlementItem>> settleResult = InviteSettlementUtils.calculateSettleAmountOfType2(inviteTime, settleTime, items);
assertBigDecimalEquals(settleResult.getLeft(), BigDecimal.valueOf(0));
Assert.assertEquals(settleResult.getRight().size(), items.size());
}
private void assertBigDecimalEquals(BigDecimal expected, BigDecimal actual) {
Assert.assertEquals(expected.setScale(2, ROUND_HALF_UP), actual.setScale(2, ROUND_HALF_UP));
}
}
\ No newline at end of file
... ...