${package}
import com.fastchar.core.FastChar;
import com.fastchar.extjs.core.FastExtEntity;
import com.fastchar.database.FastPage;
import com.fastchar.database.info.FastSqlInfo;
${imports}

/**
 * ${markName}数据库实体类
 * @author ${author}
 * @date ${datetime}
 */
public class ${entityName} extends FastExtEntity<${entityName}> {
    private static final long serialVersionUID = 1L;

    public static ${entityName} dao() {
        return FastChar.getOverrides().singleInstance(${entityName}.class);
    }

    public static ${entityName} newInstance() {
        return FastChar.getOverrides().newInstance(${entityName}.class);
    }

    @Override
    public String getTableName() {
        return "${tableName}";
    }

    @Override
    public String getEntityCode() {
        return this.getClass().getSimpleName();
    }

    @Override
    public FastPage<${entityName}> showList(int page, int pageSize) {
        ${target}

        String sqlStr = "${selectSql}";
        ShowListSqlAdapter showListSqlAdapter = FastChar.getOverrides().singleInstance(false, ShowListSqlAdapter.class);
        if (showListSqlAdapter != null) {
            sqlStr = showListSqlAdapter.convertSql(this, sqlStr);
        }
        FastSqlInfo sqlInfo = toSelectSql(sqlStr);
        FastPage<${entityName}> select = selectBySql(page, pageSize, sqlInfo.getSql(), sqlInfo.toParams());
        boolean isSearch = getBoolean("^treeSearch");
        for (${entityName} entity : select.getList()) {
            entity.put("leaf", entity.getInt("childCount") == 0);
            if (isSearch) {
                entity.put("leaf", true);
            }
        }
        return select;
    }

    @Override
    public void setDefaultValue() {
        ${defaultValue}
    }

    @Override
    public void convertValue() {
        super.convertValue();
         ${convertValue}
    }

    @Override
    public boolean save() {
        ${saveCode}
        return super.save();
    }

    @Override
    public boolean update() {
        ${updateCode}
        return super.update();
    }



    ${enum}

    public List<${entityName}> getList(int parentId) {
        if (parentId == -2) {
            String sqlStr = "select * from ${tableName} ";
            List<${entityName}> list = selectBySql(sqlStr);
            return pluckChild(-1, list);
        }else{
            String sqlStr = "select * from ${tableName} where ${treeParentId} = ? ";
            return selectBySql(sqlStr,parentId);
        }

    }

    private List<${entityName}> pluckChild(int parentId, List<${entityName}> list) {
        List<${entityName}> child = new ArrayList<>();
        for (${entityName} data : list) {
            if (data.getInt("${treeParentId}") == parentId) {
                List<${entityName}> childList = pluckChild(data.getId(), list);
                if (childList.size() > 0) {
                    data.put("child", childList);
                }
                child.add(data);
            }
        }
        return child;
    }

    ${methods}
}
