BBParasBo.java 4.78 KB
Newer Older
1 2 3 4 5 6 7
package pwc.taxtech.atms.dto.vatdto;

import lombok.Getter;
import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.eval.EvaluationException;
import org.apache.poi.ss.formula.eval.ValueEval;

8 9 10
import java.util.ArrayList;
import java.util.List;

11 12
import static pwc.taxtech.atms.common.util.FormulaUtil.resolverInteger;
import static pwc.taxtech.atms.common.util.FormulaUtil.resolverString;
13
import static pwc.taxtech.atms.exception.Exceptions.BAD_BBVO_PARAMS;
14 15 16 17 18 19 20 21

@Getter
public class BBParasBo {
    private String reportCode;
    private Integer columnIndex;
    private Integer rowIndex;
    private Integer period;
    private Integer year;
22
    private String formulaExpression;
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    private List<PeriodCellDataTemplate> expressionData = new ArrayList<>();

    public static class PeriodCellDataTemplate {
        Integer period;
        Long cellTemplateId;

        @Override
        public String toString() {
            return period + ":" + cellTemplateId;
        }

        public PeriodCellDataTemplate(Integer period, Long cellTemplateId) {
            this.period = period;
            this.cellTemplateId = cellTemplateId;
        }

    }

    public void putPeriodCellTempate(Integer period, Long cellTemplateId) {
        if (period < 1 || period > 12 || cellTemplateId < 0) throw BAD_BBVO_PARAMS;
        expressionData.add(new PeriodCellDataTemplate(period, cellTemplateId));
    }
45

46
    public BBParasBo(ValueEval[] args, OperationEvaluationContext ec) throws EvaluationException {
47 48
        StringBuilder expression = new StringBuilder("");
        begin(expression);
49
        reportCode = resolverString(args, ec, 0);
50
        concatPara(expression, reportCode);
51 52
        try {
            columnIndex = resolverInteger(args, ec, 1);
53 54
            split(expression);
            concatPara(expression, columnIndex);
55 56
        } catch (Exception e) {
            String columnStr = resolverString(args, ec, 1);
57 58
            split(expression);
            concatPara(expression, columnStr);
59
            int rtn = 0;
60
            columnStr = columnStr.toUpperCase();
61 62 63 64 65 66 67 68 69 70
            char[] excelCol = columnStr.toCharArray();
            for (int i = columnStr.length() - 1; i >= 0; i--) {
                if (excelCol[i] >= 'A' && excelCol[i] <= 'Z') {
                    rtn += ((int) Math.pow(26, excelCol.length - 1 - i) * (excelCol[i] - 64));
                } else {
                    rtn = -1;
                }
            }
            columnIndex = rtn;
        }
71
        rowIndex = resolverInteger(args, ec, 2);
72 73
        split(expression);
        concatPara(expression, rowIndex);
74
        period = args.length >= 4 ? resolverInteger(args, ec, 3) : 0;
75
        year = args.length == 5 ? resolverInteger(args, ec, 4) : 0;
76 77 78 79 80 81 82 83
        if (args.length >= 4) {
            split(expression);
            concatPara(expression, period);
        }
        if (args.length == 5) {
            split(expression);
            concatPara(expression, year);
        }
84
        end(expression);
85 86 87 88 89 90 91 92 93 94 95 96 97
        formulaExpression = expression.toString();
    }

    private StringBuilder begin(StringBuilder expression) {
        return expression.append("BB(");
    }

    private StringBuilder end(StringBuilder expression) {
        return expression.append(")");
    }

    private StringBuilder split(StringBuilder expression) {
        return expression.append(",");
98 99
    }

100 101 102 103 104 105
    private StringBuilder concatPara(StringBuilder expression, String para) {
        return expression.append("\"").append(para).append("\"");
    }

    private StringBuilder concatPara(StringBuilder expression, Integer para) {
        return expression.append(para);
106 107
    }

108
    public BBParasBo(BBParasBo otherBo, int period, int curYear) {
neo's avatar
neo committed
109 110 111 112 113
        this.reportCode = otherBo.reportCode;
        this.columnIndex = otherBo.getColumnIndex();
        this.rowIndex = otherBo.rowIndex;
        this.period = period;
        this.year = curYear;
114
        this.formulaExpression = otherBo.formulaExpression;
115 116 117
    }

    public String expression() {
118 119 120 121
        return formulaExpression;
    }

    public String expressionData() {
122 123
        if (!expressionData.isEmpty()) {
            StringBuilder builder = new StringBuilder("PCT(");
124 125 126 127
            for (int i = 0; i < expressionData.size(); i++) {
                builder.append(expressionData.get(i).toString());
                if (i < expressionData.size() - 1)
                    builder.append(",");
128 129 130 131
            }
            builder.append(")");
            return builder.toString();
        }
132
        return "0";
neo's avatar
neo committed
133
    }
134 135 136 137 138 139 140 141 142 143 144

    @Override
    public String toString() {
        return "BBParasBo{" +
                "reportCode='" + reportCode + '\'' +
                ", columnIndex=" + columnIndex +
                ", rowIndex=" + rowIndex +
                ", period=" + period +
                ", year=" + year +
                '}';
    }
145
}