package org.yeshi.utils.generater.vo.dao; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import org.yeshi.utils.StringUtil; import org.yeshi.utils.generater.annotation.admin.DaoQueryCondition; import org.yeshi.utils.generater.entity.*; import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoData; import org.yeshi.utils.generater.vo.xmlconfig.dao.DaoQuery; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class MongoDBDaoVO extends BaseData { private String daoName; private ClassInfo baseDao; private ClassInfo entity; private Set importClasses; private ColumnData identityColumn; private List columnDataList; private List daoQueryColumnDataList; public static class Builder { private ClassInfo baseDao; private Class entity; private ClassInfo dao; private DaoData daoData; public Builder setBaseDao(ClassInfo baseDao) { this.baseDao = baseDao; return this; } public Builder setEntity(Class entity) { this.entity = entity; return this; } public Builder setDao(ClassInfo dao) { this.dao = dao; return this; } public Builder setDaoData(DaoData daoData) { this.daoData = daoData; return this; } public MongoDBDaoVO build() throws Exception { if (entity == null) { throw new Exception("entity不能为空"); } if (baseDao == null) { throw new Exception("baseDao不能为空"); } if (dao == null) { throw new Exception("dao不能为空"); } Field[] fields = entity.getDeclaredFields(); String identityColumnName = null; String identityColumnType = null; List columlist = new ArrayList<>(); List daoQueryColumnList = new ArrayList<>(); for (Field fd : fields) { //private/public 非final,static属性才会参与解析 if (fd.getModifiers() != 1 && fd.getModifiers() != 2) { continue; } String columName = fd.getName(); String columnDataType = fd.getGenericType().getTypeName(); Annotation[] as = fd.getAnnotations(); if (columName != null) { for (Annotation a : as) { //主键 if (a instanceof Id) { identityColumnName = new String(columName); identityColumnType = columnDataType; columName = null; break; } } } for (Annotation a : as) { //不参与解析 if (a instanceof Transient || a instanceof java.beans.Transient) { columName = null; break; } } //获取查询条件 if (daoData != null) { //查询条件从外部传入 for (DaoQuery query : daoData.getQueryList()) { if (query.getName().equalsIgnoreCase(columName)) { MybatisColumnData columnData = new MybatisColumnData(columName); if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) { daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt)); daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte)); } else { daoQueryColumnList.add(new DaoQueryColumnData(columName, columnData, fd.getType().getSimpleName(), query.getQueryType())); } } } } else { //根据注解设置的查询条件 for (Annotation a : as) { if (a instanceof DaoQueryCondition) { MybatisColumnData columnData = new MybatisColumnData(columName); if (fd.getType().getSimpleName().equalsIgnoreCase("Date")) { daoQueryColumnList.add(new DaoQueryColumnData("max" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.lt)); daoQueryColumnList.add(new DaoQueryColumnData("min" + StringUtil.firstCharToUpper(columName), columnData, fd.getType().getSimpleName(), DaoQueryCondition.QueryType.gte)); } else { daoQueryColumnList.add(new DaoQueryColumnData(columName, columnData, fd.getType().getSimpleName(), ((DaoQueryCondition) a).queryType())); } break; } } } if (columName != null) { columlist.add(new ColumnData(columName, columnDataType)); } } List columnDataList = new ArrayList<>(); for (ColumnData column : columlist) { //更新时间不参与更新 if (!"updateTime".equalsIgnoreCase(column.getColumnName())) { columnDataList.add(column); } } Set importClasses = new HashSet<>(); for (ColumnData columnData : columnDataList) { if (columnData.getType().indexOf(".") > -1) { importClasses.add(columnData.getType()); columnData.setType(columnData.getType().split("\\.")[columnData.getType().split("\\.").length - 1]); } } importClasses.add("java.util.List"); importClasses.add("java.util.ArrayList"); MongoDBDaoVO data = new MongoDBDaoVO(); data.setBaseDao(baseDao); data.setColumnDataList(columnDataList); data.setDaoQueryColumnDataList(daoQueryColumnList); data.setDaoName(dao.getName()); data.setEntity(new ClassInfo(entity.getSimpleName(), entity.getName())); data.setIdentityColumn(new ColumnData(identityColumnName, identityColumnType)); data.setPackageName(dao.getClazz().replace("." + dao.getName(), "")); importClasses.add(baseDao.getClazz()); importClasses.add(entity.getName()); data.setImportClasses(importClasses); return data; } } public String getDaoName() { return daoName; } public void setDaoName(String daoName) { this.daoName = daoName; } public ClassInfo getBaseDao() { return baseDao; } public void setBaseDao(ClassInfo baseDao) { this.baseDao = baseDao; } @Override public ClassInfo getEntity() { return entity; } @Override public void setEntity(ClassInfo entity) { this.entity = entity; } public ColumnData getIdentityColumn() { return identityColumn; } public void setIdentityColumn(ColumnData identityColumn) { this.identityColumn = identityColumn; } public List getColumnDataList() { return columnDataList; } public void setColumnDataList(List columnDataList) { this.columnDataList = columnDataList; } public Set getImportClasses() { return importClasses; } public void setImportClasses(Set importClasses) { this.importClasses = importClasses; } public List getDaoQueryColumnDataList() { return daoQueryColumnDataList; } public void setDaoQueryColumnDataList(List daoQueryColumnDataList) { this.daoQueryColumnDataList = daoQueryColumnDataList; } }