余额控制

# 一、方案,通过保存监听实现 ```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); } } ```