SpecificTableDto.java

package com.mycim.valueobject.table;

import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.bas.TransactionLog;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @author yibing.liu
 * @version 1.0
 * @date 2021/4/13
 */
public abstract class SpecificTableDto implements Serializable {

    String tableName;

    String transId;

    String historyTableName;

    /**
     * 添加 INSERT 时 需要插入的 字段
     */
    private List<TableFieldDto> fieldList = new ArrayList<>();

    /**
     * 添加 主键 字段,一般用于 UPDATE 和 DELETE时
     */
    private List<TableFieldDto> primaryKeyFieldList = new ArrayList<>();

    /**
     * 添加 需要修改的 字段
     */
    private List<TableFieldDto> updateFieldList = new ArrayList<>();

    public SpecificTableDto() {
    }

    public SpecificTableDto(String tableName, String transId) {
        this.tableName = tableName;
        this.transId = transId;
    }

    public SpecificTableDto(String historyTableName, String mainTableName, String transId) {
        this.historyTableName = historyTableName;
        this.tableName = mainTableName;
        this.transId = transId;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getTransId() {
        return transId;
    }

    public void setTransId(String transId) {
        this.transId = transId;
    }

    public List<TableFieldDto> getFieldList() {
        return fieldList;
    }

    public void setFieldList(List<TableFieldDto> fieldList) {
        this.fieldList = fieldList;
    }

    public List<TableFieldDto> getPrimaryKeyFieldList() {
        return primaryKeyFieldList;
    }

    public void setPrimaryKeyFieldList(List<TableFieldDto> primaryKeyFieldList) {
        this.primaryKeyFieldList = primaryKeyFieldList;
    }

    public List<TableFieldDto> getUpdateFieldList() {
        return updateFieldList;
    }

    public void setUpdateFieldList(List<TableFieldDto> updateFieldList) {
        this.updateFieldList = updateFieldList;
    }

    public String getHistoryTableName() {
        return historyTableName;
    }

    public void setHistoryTableName(String historyTableName) {
        this.historyTableName = historyTableName;
    }

    public void addField(String columnName, Object columnValue) {
        TableFieldDto newTfd = new TableFieldDto(columnName, columnValue);
        if (!fieldList.contains(newTfd)) {
            fieldList.add(newTfd);
        }
    }

    public void addField(TableFieldDto... tableFieldList) {
        for (TableFieldDto newTfd : tableFieldList) {
            if (!fieldList.contains(newTfd)) {
                fieldList.add(newTfd);
            }
        }

    }

    public void removeField(String columnName) {
        fieldList.remove(new TableFieldDto(columnName, null));
    }

    public void removePrimaryKeyField(String columnName) {
        primaryKeyFieldList.remove(new TableFieldDto(columnName, null));
    }

    /**
     * 用于历史表组装SQL用 前提条件:主表的字段与历史表一致,若不一致时,选择重载方法指定列名
     *
     * @param columnName
     */
    public void addFieldBySelectMainTable(String columnName) {
        fieldList.add(new TableFieldDto(columnName, columnName, true));
    }

    void addFieldBySelectMainTable(String... columnName) {
        for (String column : columnName) {
            fieldList.add(new TableFieldDto(column, column, true));
        }
    }

    public void addFieldBySelectMainTable(String columnName, String specifyColumn) {
        fieldList.add(new TableFieldDto(columnName, specifyColumn, true));
    }

    public void addUpdateField(String columnName, Object columnValue) {
        if (columnValue != null) {//仅修改不为null的数据
            updateFieldList.add(new TableFieldDto(columnName, columnValue));
        }
    }

    private void addPrimaryKeyAndField(String columnName, Object columnValue) {
        fieldList.add(new TableFieldDto(columnName, columnValue));
        primaryKeyFieldList.add(new TableFieldDto(columnName, columnValue));
    }

    void addPrimaryKeyList(Relation relation) {
        //原关系表Relation中通用的主键
        if (relation.getFromRrn() > 0) {
            addPrimaryKeyAndField("FROM_RRN", relation.getFromRrn());   //Relation的主键一
        } else {
            addFieldBySelectMainTable("FROM_RRN");
        }
        if (relation.getToRrn() > 0) {
            addPrimaryKeyAndField("TO_RRN", relation.getToRrn());       //Relation的主键二
        } else {
            addFieldBySelectMainTable("TO_RRN");
        }
        if (StringUtils.isNotBlank(relation.getLinkType())) {
            addPrimaryKeyAndField("LINK_TYPE", relation.getLinkType()); //Relation的主键三
        } else {
            addFieldBySelectMainTable("LINK_TYPE");
        }
    }

    void addNormalFieldList(Relation relation) {
        //原关系表Relation中通用的字段
        addField("SEQUENCE_NUMBER", relation.getSequenceNumber());
        addField("STATUS", relation.getStatus());
        addField("ATTRIBUTE_DATA_1", relation.getAttributedata1());
        addField("ATTRIBUTE_DATA_2", relation.getAttributedata2());
        addField("ATTRIBUTE_DATA_3", relation.getAttributedata3());
        addField("ATTRIBUTE_DATA_4", relation.getAttributedata4());
        addField("ATTRIBUTE_DATA_5", relation.getAttributedata5());
        addField("ATTRIBUTE_DATA_6", relation.getAttributedata6());
        addField("ATTRIBUTE_DATA_7", relation.getAttributedata7());
    }

    void addUpdatePrimaryKeyList(Relation relation) {
        //原关系表Relation中通用的主键
        if (relation.getFromRrn() > 0) {
            primaryKeyFieldList.add(new TableFieldDto("FROM_RRN", relation.getFromRrn()));   //Relation的主键一
        }
        if (relation.getFromRrn() > 0) {
            primaryKeyFieldList.add(new TableFieldDto("TO_RRN", relation.getToRrn()));       //Relation的主键二
        }
        if (StringUtils.isNotBlank(relation.getLinkType())) {
            primaryKeyFieldList.add(new TableFieldDto("LINK_TYPE", relation.getLinkType())); //Relation的主键三
        }
    }

    /**
     * 添加 Insert时需要插入的字段,以及字段对应的值。以便执行通用SQL
     *
     * @param relation
     * @param transactionLog
     */
    abstract void setInsertFields(Relation relation, TransactionLog transactionLog);

    /**
     * 添加 Update时需要修改的字段,以及字段对应的值。以便执行通用SQL
     *
     * @param relation
     * @param transactionLog
     */
    abstract void setUpdateFields(Relation relation, TransactionLog transactionLog);

    /**
     * 添加 Delete 时需要的主键字段,以及字段对应的值。以便执行通用SQL
     *
     * @param relation
     * @param transactionLog
     */
    abstract void setDeleteFields(Relation relation, TransactionLog transactionLog);

    @Override
    public String toString() {
        return "SpecificTableDto{" + "tableName='" + tableName + '\'' + ", transId='" + transId + '\'' + ", " +
                "historyTableName='" + historyTableName + '\'' + ", fieldList=" + fieldList + ", primaryKeyFieldList" +
                "=" + primaryKeyFieldList + ", updateFieldList=" + updateFieldList + '}';
    }

}