我有一个检票口页面,它将发布交易。它吸收净值并计算佣金和税金。更改一个值时,将使用控制器类来更新其他值。我已经开始工作了,但是我觉得控制器的设计不是最好的,因为它有不同的更新方法,这取决于它是总交易还是净交易。
我的最初想法是要有一个nettController和grossController,它们都从controller继承并使用工厂来选择正确的。由于使用@SpringBean,我无法在检票口上使用它。
public class PostUnderwriterTransactionPanel extends AbstractPolicyCurrentAdhocTransactionPanel<PostUnderwriterTransactionContext>{
@SpringBean
public PostUnderwriterTransactionPanelController controller;
@Override
protected void onInitialize() {
super.onInitialize();
transactionDetails.add(grossAmountQuestion = createNettAmountTextField(GROSS_AMOUNT_ID, GROSS_AMOUNT_KEY));
transactionDetails.add(nettAmountQuestion = createNettAmountTextField(NETT_AMOUNT_ID, NETT_AMOUNT_KEY));
transactionDetails.add(nettAmountIncTax = createCurrencyTextField(NETT_INC_TAX_ID, NETT_INC_TAX_KEY));
transactionDetails.add(commissionAmount = createCurrencyTextField(COMMISSION_AMOUNT_ID, COMMISSION_AMOUNT_KEY));
transactionDetails.add(commissionRate = createPercentageTextField(COMMISSION_RATE_ID, COMMISSION_RATE_KEY));
transactionDetails.add(taxAmount = createCurrencyTextField(TAX_AMOUNT_ID, TAX_AMOUNT_KEY));
transactionDetails.add(taxRate = createPercentageTextField(TAX_RATE_ID, TAX_RATE_KEY));
transactionDetails.add(totalAmount = createInfoPanel(TOTAL_AMOUNT_ID, TOTAL_AMOUNT_KEY));
checkOverride(commissionAmount, commissionRate, OVERRIDE_INSURER_COMMISSION.getCode());
checkOverride(taxAmount, taxRate, OVERRIDE_TAX.getCode());
add(content);
addEffectiveDateOnUpdate();
getModelObject().getTransactionPosting().setAmount(0L);
controller.setParameterValues(getModelObject());
if(getModelObject().isNetRated()){
grossAmountQuestion.setVisible(false);
}else{
nettAmountQuestion.setVisible(false);
nettAmountIncTax.setVisible(false);
}
}
public void checkOverride(TextField<Float> amount, TextField<Float> rate, String code){
if(!controller.getOverrideAllowed(code, getPscm())){
amount.setEnabled(false);
rate.setEnabled(false);
}
}
private void redrawValues(AjaxRequestTarget target){
if(getModelObject().isNetRated()) {
target.add(nettAmountQuestion, nettAmountIncTax, commissionAmount, commissionRate, taxAmount, taxRate, totalAmount, newPolicyBalance);
}
else{
target.add(grossAmountQuestion, commissionAmount, commissionRate, taxAmount, taxRate, totalAmount, newPolicyBalance);
}
}
private void callControllerUpdate(String type){
if(getModelObject().isNetRated()) {
switch (type) {
case NETT_AMOUNT_ID:
controller.updateNettAmount(getModelObject());
break;
case NETT_INC_TAX_ID:
controller.updateNettIncTax(getModelObject());
break;
case COMMISSION_AMOUNT_ID:
controller.updateCommissionAmount(getModelObject());
break;
case COMMISSION_RATE_ID:
controller.updateCommissionRate(getModelObject());
break;
case TAX_AMOUNT_ID:
controller.updateTaxAmount(getModelObject());
break;
case TAX_RATE_ID:
controller.updateTaxRateFromTextBox(getModelObject());
break;
}
}else{
switch (type) {
case GROSS_AMOUNT_ID:
controller.updateGrossAmount(getModelObject());
break;
case COMMISSION_AMOUNT_ID:
controller.updateGrossCommissionAmount(getModelObject());
break;
case COMMISSION_RATE_ID:
controller.updateGrossCommissionRate(getModelObject());
break;
case TAX_AMOUNT_ID:
controller.updateGrossTaxAmount(getModelObject());
break;
case TAX_RATE_ID:
controller.updateGrossTaxRate(getModelObject());
break;
}
}
}
}
@Component
public class PostUnderwriterTransactionPanelController extends AdhocTransactionViewControllerImpl {
@Autowired
private NettRatedCalculator nettRatedCalculator;
public void updateNettAmount(PostUnderwriterTransactionContext context){
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getParameterTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(context.getCommissionFlatCharge(), context.getNettAmount(), context.getParameterCommissionRate()));
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
context.setTaxRate(context.getParameterTaxRate());
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getParameterTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateCommissionAmount(PostUnderwriterTransactionContext context){
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
updateCommission(context);
}
public void updateCommissionRate(PostUnderwriterTransactionContext context){
float equivalentCommission = nettRatedCalculator.calculateEquivalentRate(context.getCommissionRate());
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(0L, context.getNettAmount(), equivalentCommission));
updateCommission(context);
}
private void updateCommission(PostUnderwriterTransactionContext context){
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxAmount(PostUnderwriterTransactionContext context){
context.setTaxRate(nettRatedCalculator.calculateTaxRate(context.getTaxAmount(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxRateFromTextBox(PostUnderwriterTransactionContext context) {
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateTaxRateFromSystemParameter(PostUnderwriterTransactionContext context) {
context.setTaxRate(getTaxRateParameter(context.getPscm(), context));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setNettAmountIncTax(nettRatedCalculator.calculateNettIncTax(context.getNettAmount(), context.getTaxRate()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateNettIncTax(PostUnderwriterTransactionContext context){
context.setNettAmount(nettRatedCalculator.calculateNettAmount(context.getNettAmountIncTax(), context.getParameterTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmount(context.getCommissionFlatCharge(), context.getNettAmount(), context.getParameterCommissionRate()));
context.setCommissionRate(nettRatedCalculator.calculateCommissionRate(context.getCommissionAmount(), context.getNettAmount()));
context.setTaxAmount(nettRatedCalculator.calculateTaxAmount(context.getParameterTaxRate(), context.getNettAmount(), context.getCommissionAmount()));
context.setTaxRate(context.getParameterTaxRate());
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getNettAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossAmount(PostUnderwriterTransactionContext context) {
context.setTaxRate(context.getParameterTaxRate());
context.setTaxAmount(nettRatedCalculator.calculateTaxFromGross(context.getGrossAmount(), context.getTaxRate()));
context.setCommissionRate(context.getParameterCommissionRate());
context.setCommissionAmount(nettRatedCalculator.calculateCommissionGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossCommissionAmount(PostUnderwriterTransactionContext context){
context.setCommissionRate(nettRatedCalculator.calculateCommissionRateGross(context.getCommissionAmount(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossCommissionRate(PostUnderwriterTransactionContext context){
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossTaxAmount(PostUnderwriterTransactionContext context){
context.setTaxRate(nettRatedCalculator.calculateTaxRateGross(context.getTaxAmount(), context.getGrossAmount()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
public void updateGrossTaxRate(PostUnderwriterTransactionContext context){
context.setTaxAmount(nettRatedCalculator.calculateTaxAmountFromTaxRateGross(context.getGrossAmount(), context.getTaxRate()));
context.setCommissionAmount(nettRatedCalculator.calculateCommissionAmountGross(context.getCommissionRate(), context.getGrossAmount(), context.getTaxAmount()));
context.setTotalAmount(nettRatedCalculator.calculateTotalAmount(context.getGrossAmount(), context.getCommissionAmount(), context.getTaxAmount()));
}
}
我对检票口还很陌生,但我已经做好了。我认为代码可能会更好。有什么想法可以改善设计吗?
如果要重构由两个不同组件组成的控制器,则对页面执行相同操作可能会有所帮助。例如,您可以创建两个不同的页面,一个用于净值,一个用于总额。您甚至可以使用两个不同的路径(例如/ net和/ gross)安装它们。因此,您可以将正确的控制器注入相应的页面并避免使用[]
if(getModelObject()。isNetRated())
内部callControllerUpdate方法。
仅是我的2美分。