但是这500条可能有2条,3条或者100条失败,我想把失败的账单都找到
时间: 2024-04-19 12:24:56 浏览: 12
非常抱歉之前的回答没有完全理解你的需求。如果你想找到每个批次中失败的账单,可以使用以下修改后的代码:
```java
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;
public class BillLockAlgorithm {
private static final int[] BATCH_SIZES = {100, 50, 10, 1};
public void lockBills(List<Bill> billList, int syncSettlementLockBillSize) {
List<List<Bill>> batchBillList = Lists.partition(billList, syncSettlementLockBillSize);
for (List<Bill> bills : batchBillList) {
try {
billTagApplyService.lockOrUnlockBill(bills, req.getProjectId(), true, LockTypeEnum.LOCK_TYPE_ENUM_16.getCode(), propertyUser, true);
} catch (Exception e) {
// 锁定失败,记录失败的账单
List<Bill> failedBills = findFailedBills(bills);
recordFailedBills(failedBills);
}
}
}
private List<Bill> findFailedBills(List<Bill> bills) {
List<Bill> failedBills = new ArrayList<>();
for (int batchSize : BATCH_SIZES) {
List<List<Bill>> batchBillList = Lists.partition(bills, batchSize);
for (List<Bill> batch : batchBillList) {
try {
billTagApplyService.lockOrUnlockBill(batch, req.getProjectId(), true, LockTypeEnum.LOCK_TYPE_ENUM_16.getCode(), propertyUser, true);
} catch (Exception e) {
// 锁定失败,将失败的账单添加到列表中
failedBills.addAll(batch);
}
}
if (failedBills.isEmpty()) {
break; // 如果没有失败的账单,则不再继续尝试其他批次大小
}
}
return failedBills;
}
private void recordFailedBills(List<Bill> bills) {
// 记录失败的账单逻辑
}
}
```
在 `findFailedBills` 方法中,我们首先创建一个空的 `failedBills` 列表来存储失败的账单。然后,我们按照不同的批次大小尝试锁定账单,如果锁定失败,则将失败的账单添加到 `failedBills` 列表中。在尝试每个批次大小之前,我们检查 `failedBills` 列表是否为空,如果已经找到了所有的失败账单,则跳出循环,不再继续尝试其他批次大小。
希望这次能够满足你的需求。记得根据你的实际情况进行适当的调整和错误处理。