余额控制
# 一、方案,通过保存监听实现
```java
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.epoch.customproject.bill.service;
import com.epoch.bdp.bill.model.event.BillBeforeSaveEvent;
import com.epoch.bdp.bill.model.exception.BillDataRuntimeException;
import com.epoch.bdp.bill.model.vo.billdata.BillData;
import com.epoch.bdp.bill.model.vo.billdata.IBillAreaData;
import com.epoch.bdp.bill.model.vo.billdata.IBillRowData;
import com.epoch.bdp.bill.model.vo.billdata.IBillValueObject;
import com.epoch.bdp.bill.util.BillDataUtils;
import com.epoch.bdp.businessobject.model.enums.bodefine.BOColumnDataTypeEnum;
import com.epoch.bdp.util.model.vo.AmountValueVO;
import com.epoch.bdp.util.model.vo.RelationBOValueVO;
import com.epoch.customproject.cctv.service.BillMainAreaService;
import java.math.BigDecimal;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class BillDataBeforeSaveEventListener implements ApplicationListener<BillBeforeSaveEvent> {
@Autowired
private BillMainAreaService BillMainAreaService;
public BillDataBeforeSaveEventListener() {
}
public void onApplicationEvent(BillBeforeSaveEvent event) {
BillData billData = event.getSource();
String billCode = billData.getBillCode();
String billTypeCode = billCode.substring(0, 4);
IBillAreaData mainAreaData = billData.getAreaData();
if (mainAreaData != null && CollectionUtils.isNotEmpty(mainAreaData.getRowDataList()) && billTypeCode.equals("HTFK")) {
IBillRowData mainRowData = (IBillRowData)mainAreaData.getRowDataList().get(0);
IBillValueObject amountValue = mainRowData.getData("SUM_AMOUNT");
IBillValueObject htAmountValue = mainRowData.getData("FHT_DEF_002");
IBillValueObject htSumAmountValue = mainRowData.getData("FHTBH_DEF_001");
AmountValueVO amount = (AmountValueVO)BillDataUtils.convertBillValue(amountValue, BOColumnDataTypeEnum.MONEY);
AmountValueVO htAmount = (AmountValueVO)BillDataUtils.convertBillValue(htAmountValue, BOColumnDataTypeEnum.MONEY);
RelationBOValueVO htSumAmount = (RelationBOValueVO)BillDataUtils.convertBillValue(htSumAmountValue, BOColumnDataTypeEnum.RELATION_BO);
String boDataId = htSumAmount.getBoDataId();
BigDecimal sumUseAmount = this.getSumAmount(boDataId);
if (amount.getAmount().compareTo(htAmount.getAmount().subtract(sumUseAmount)) > 0) {
throw new BillDataRuntimeException("付款金额不能大于合同剩余金额!");
}
}
}
private BigDecimal getSumAmount(String id) {
return this.BillMainAreaService.getSunAmount(id);
}
}
```