控制器和检票口页面的设计模式帮助

问题描述 投票:0回答:1

我有一个检票口页面,它将发布交易。它吸收净值并计算佣金和税金。更改一个值时,将使用控制器类来更新其他值。我已经开始工作了,但是我觉得控制器的设计不是最好的,因为它有不同的更新方法,这取决于它是总交易还是净交易。

我的最初想法是要有一个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()));
    }
}

我对检票口还很陌生,但我已经做好了。我认为代码可能会更好。有什么想法可以改善设计吗?

java spring wicket
1个回答
0
投票

如果要重构由两个不同组件组成的控制器,则对页面执行相同操作可能会有所帮助。例如,您可以创建两个不同的页面,一个用于净值,一个用于总额。您甚至可以使用两个不同的路径(例如/ net和/ gross)安装它们。因此,您可以将正确的控制器注入相应的页面并避免使用[]

if(getModelObject()。isNetRated())

内部callControllerUpdate方法。

仅是我的2美分。

© www.soinside.com 2019 - 2024. All rights reserved.