package com.norteksoft.mms.form.service; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.norteksoft.acs.entity.authorization.BusinessSystem; import com.norteksoft.acs.entity.authorization.Function; import com.norteksoft.acs.entity.authorization.FunctionGroup; import com.norteksoft.acs.service.authorization.BusinessSystemManager; import com.norteksoft.acs.service.authorization.FunctionGroupManager; import com.norteksoft.acs.service.authorization.FunctionManager; import com.norteksoft.mms.base.GenerateCodeUtils; import com.norteksoft.mms.form.dao.DataTableDao; import com.norteksoft.mms.form.dao.GenerateSettingDao; import com.norteksoft.mms.form.dao.ListColumnDao; import com.norteksoft.mms.form.dao.TableColumnDao; import com.norteksoft.mms.form.entity.DataTable; import com.norteksoft.mms.form.entity.FormControl; import com.norteksoft.mms.form.entity.FormView; import com.norteksoft.mms.form.entity.GenerateSetting; import com.norteksoft.mms.form.entity.ListView; import com.norteksoft.mms.form.entity.TableColumn; import com.norteksoft.mms.form.enumeration.DataType; import com.norteksoft.mms.form.jdbc.JdbcSupport; import com.norteksoft.mms.module.dao.MenuDao; import com.norteksoft.mms.module.entity.Menu; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.enumeration.DataState; import com.norteksoft.product.orm.Page; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.PropUtils; @Service public class DataTableManager { private DataTableDao dataTableDao; private TableColumnDao tableColumnDao; private ListColumnDao listColumnDao; private JdbcSupport jdbcDao; private FormViewManager formViewManager; private ListViewManager listViewManager; private GenerateSettingDao generateSettingDao; private Log log = LogFactory.getLog(DataTableManager.class); private FormHtmlParser formHtmlParser = new FormHtmlParser(); @Autowired private FunctionManager functionManager; @Autowired private FunctionGroupManager functionGroupManager; @Autowired private MenuDao menuDao; @Autowired private BusinessSystemManager businessSystemManager; @Autowired public void setDataTableDao(DataTableDao dataTableDao) { this.dataTableDao = dataTableDao; } @Autowired public void setTableColumnDao(TableColumnDao tableColumnDao) { this.tableColumnDao = tableColumnDao; } @Autowired public void setFormViewManager(FormViewManager formViewManager) { this.formViewManager = formViewManager; } @Autowired public void setListViewManager(ListViewManager listViewManager) { this.listViewManager = listViewManager; } @Autowired public void setGenerateSettingDao(GenerateSettingDao generateSettingDao) { this.generateSettingDao = generateSettingDao; } @Autowired public void setListColumnDao(ListColumnDao listColumnDao) { this.listColumnDao = listColumnDao; } public void setJdbcDao(JdbcSupport jdbcDao) { this.jdbcDao = jdbcDao; } /** * 查询数据表实体 * * @param dataTableId * @return 数据表实体 */ public DataTable getDataTable(Long dataTableId) { return dataTableDao.get(dataTableId); } /** * 查询所有的数据表(以createDate排序) * * @param tables */ public void getAllDataTables(Page<DataTable> tables) { dataTableDao.findAllDataTable(tables); } /** * 查询所有启用的数据表(以createDate排序) * * @param tables */ public void getAllEnableDataTables(Page<DataTable> tables) { dataTableDao.findAllEnabledDataTable(tables); } /** * 查询启用的数据表集合(以createDate排序) * * @return 返回数据表集合 */ public List<DataTable> getEnabledDataTables() { return dataTableDao.getEnabledDataTables(); } /** * 查询启用的数据表集合(以createDate排序) * * @return 返回数据表集合 */ public List<DataTable> getAllEnabledDataTables() { return dataTableDao.getAllEnabledDataTables(); } /** * 通过表名查询数据表实体 * * @param tableName * @param tableId * @return 返回是否验证成功 */ public boolean getDataTableByName(String tableName, Long tableId) { DataTable dataTable = dataTableDao.findDataTableByName(tableName); if (tableId != null) { // 修改 if (dataTable != null) { if (dataTable.getId().longValue() == tableId.longValue()) { return true; // 通过 } else { return false; // 不通过 } } else { return true; } } else { // 新建 if (dataTable != null) { return false; } else { return true; } } } /** * 查询数据表字段 * * @param tableColumnId * @return 返回表字段实体 */ public TableColumn getTableColumn(Long tableColumnId) { return tableColumnDao.get(tableColumnId); } /** * 删除草稿状态的数据表 * * @param ids */ @Transactional(readOnly = false) public void deleteDataTables(List<Long> ids) { for (Long long1 : ids) { dataTableDao.delete(long1); } } @Transactional(readOnly = false) public void deleteEnableDataTables(List<Long> ids) { for (Long long1 : ids) { // 删列表、表单、页面 List<FormView> fvs = formViewManager.getFormViewByDataTable(long1); for(FormView fv : fvs){ formViewManager.deleteFormView(fv.getId()); } List<ListView> lvs = listViewManager.getListViewByDataTable(long1); for(ListView lv : lvs){ listColumnDao.deleteListColumnsByView(lv.getId()); listViewManager.deleteEnable(lv.getId()); } //删除数据表对应的字段 tableColumnDao.deleteTableColumnsByTable(long1); //删除数据表 dataTableDao.delete(long1); } } /** * 保存数据表信息 * * @param dataTable */ @Transactional(readOnly = false) public void saveDataTable(DataTable dataTable) { if (dataTable.getId() == null) { dataTable.setCompanyId(ContextUtils.getCompanyId()); dataTable.setCreator(ContextUtils.getLoginName()); dataTable.setCreatorName(ContextUtils.getUserName()); if(dataTable.getTableState()==null||"".equals(dataTable.getTableState())){ dataTable.setTableState(DataState.DRAFT); } } dataTable.setCreatedTime(new Date()); dataTableDao.save(dataTable); } /** * 获取所有未删除的表字段 * * @param dataTable * @return 返回显示的表字段 */ public List<TableColumn> getAllUnDeleteColumns(DataTable dataTable) { List<TableColumn> tableColumns = tableColumnDao.getTableColumnByDataTableId(dataTable.getId()); return tableColumns; } /** * 创建数据表 * * @param dataTable */ @Transactional(readOnly = false) public void createTable(FormView formView) { try{ String tableName ="mms_"+formView.getCode(); List<FormControl> controls=formHtmlParser.getControls(formView.getHtml()); log.debug("begin to create table :" + tableName); jdbcDao.createDefaultTable(tableName, controls); log.debug("create table " + tableName + " end"); // log.debug("begin to create sequence :" + tableName + "_ID"); // jdbcDao.createSequence(tableName + "_ID"); }catch (BadSqlGrammarException e) { log.debug(e.getMessage()); } } /** * 根据实体名获取数据表 * @param entityName * @return */ public DataTable getDataTableByEntity(String entityName){ return dataTableDao.getDataTableByEntity(entityName); } /** * 生成默认视图 * * @param dataTable */ @Transactional(readOnly = false) public void createDefaultView(DataTable dataTable, Long menuId) { String tableAlias = dataTable.getAlias(); String name = dataTable.getName(); String remark = dataTable.getRemark(); FormView formView = new FormView(); formView.setDataTable(dataTable); formView.setCode(name); formView.setName(tableAlias); formView.setRemark(remark); List<TableColumn> columns=tableColumnDao.getTableColumnByDataTableId(dataTable.getId()); StringBuilder html=new StringBuilder(); for(TableColumn col:columns){ if(DataType.TEXT.equals(col.getDataType())||DataType.ENUM.equals(col.getDataType())){//文本、枚举 html.append(getTextControlHtml(col,"TEXT")); }else if(DataType.DATE.equals(col.getDataType())){//日期 html.append(getDateControlHtml(col,"DATE")); }else if(DataType.TIME.equals(col.getDataType())){//时间 html.append(getDateControlHtml(col,"TIME")); }else if(DataType.INTEGER.equals(col.getDataType())||DataType.NUMBER.equals(col.getDataType())){//整型、数字 html.append(getTextControlHtml(col,"INTEGER")); }else if(DataType.LONG.equals(col.getDataType())){//长整型 html.append(getTextControlHtml(col,"LONG")); }else if(DataType.DOUBLE.equals(col.getDataType())||DataType.FLOAT.equals(col.getDataType())||DataType.AMOUNT.equals(col.getDataType())){//浮点数、金额 html.append(getTextControlHtml(col,"DOUBLE")); }else if(DataType.BOOLEAN.equals(col.getDataType())){//布尔型 html.append(getRadioControlHtml(col)); }else if(DataType.CLOB.equals(col.getDataType())){//大文本 html.append(getTextareaControlHtml(col)); }else if(DataType.COLLECTION.equals(col.getDataType())){//集合 html.append(getCollectionControlHtml(col,name)); } } formView.setHtml(html.toString()); formView.setStandard(true); formView.setMenuId(menuId); formView.setFormState(DataState.ENABLE); formViewManager.saveFormView(formView, menuId,null,html.toString()); listViewManager.createDefaultListView(dataTable, name, tableAlias, remark, menuId); } private String getCollectionControlHtml(TableColumn col,String dataTableName) { StringBuilder html=new StringBuilder(); html.append("<p>"); html.append(getInternation(col.getAlias())).append(":"); html.append("<input"); html.append(" id=\"").append(col.getName()).append("\""); html.append(" title=\"").append(getInternation(col.getAlias())).append("\""); html.append(" value=\"").append(getInternation(col.getAlias())).append("\""); html.append(" type=\"button\" datatype=\"COLLECTION\" plugintype=\"STANDARD_LIST_CONTROL\" dbname=\"\""); html.append(" name=\"").append(col.getName()).append("\""); html.append(" columnid=\"").append(col.getId()).append("\""); html.append(" listviewcode=\"").append(dataTableName).append("\"");//listviewcode默认为dataTableName html.append("/>"); html.append("</p>"); return html.toString(); } private String getRadioControlHtml(TableColumn col) { StringBuilder html=new StringBuilder(); html.append("<p>"); html.append(getInternation(col.getAlias())).append(":"); html.append(packagingRadio(col,"是")); html.append(packagingRadio(col,"否")); html.append("</p>"); return html.toString(); } private String packagingRadio(TableColumn col,String type){ StringBuilder html=new StringBuilder(); html.append(type); html.append("<input"); if("是".equals(type)){ html.append(" id=\"").append(col.getName()).append("1\""); html.append(" title=\"是\""); html.append(" value=\"true\""); }else{ html.append(" id=\"").append(col.getName()).append("2\""); html.append(" title=\"否\""); html.append(" value=\"false\""); } html.append(" type=\"radio\""); html.append(" name=\"").append(col.getName()).append("\""); html.append(" datatype=\"BOOLEAN\""); html.append(" format=\"number\" request=\"false\" signaturevisible=\"false\" formattip=\"数字\" readolny=\"false\" formattype=\"null\" plugintype=\"TEXT\""); html.append("/>"); return html.toString(); } private String getTextControlHtml(TableColumn col,String datatype) { StringBuilder html=new StringBuilder(); html.append("<p>"); html.append(getInternation(col.getAlias())).append(":"); html.append("<input"); html.append(" id=\"").append(col.getName()).append("\""); html.append(" title=\"").append(getInternation(col.getAlias())).append("\""); if(StringUtils.isNotEmpty(col.getDefaultValue())){ html.append(" value=\"").append(col.getDefaultValue()).append("\""); } if(col.getMaxLength()!=null){ html.append(" maxlength=\"").append(col.getMaxLength()).append("\""); } html.append(" name=\"").append(col.getName()).append("\""); html.append(" datatype=\"").append(datatype).append("\""); html.append(" format=\"number\" request=\"false\" signaturevisible=\"false\" formattip=\"数字\" readolny=\"false\" formattype=\"null\" plugintype=\"TEXT\""); html.append("/>"); html.append("</p>"); return html.toString(); } private String getTextareaControlHtml(TableColumn col) { StringBuilder html=new StringBuilder(); html.append("<p>"); html.append(getInternation(col.getAlias())).append(":"); html.append("<textarea"); html.append(" id=\"").append(col.getName()).append("\""); html.append(" title=\"").append(getInternation(col.getAlias())).append("\""); html.append(" name=\"").append(col.getName()).append("\""); html.append(" dataType=\"").append(col.getDataType()).append("\""); if(col.getMaxLength()==null){ html.append(" maxlength=\"\""); }else{ html.append(" maxlength=\"").append(col.getMaxLength()).append("\""); html.append(" onkeyup=\"calTextareaLen(value,").append(col.getMaxLength()).append(",this);\" "); } html.append(" style=\"width:354px;height:139px;\" plugintype=\"textarea\" "); html.append(" defaultvalue=\"").append(col.getDefaultValue()==null?"":col.getDefaultValue()).append("\""); html.append(">"); html.append(col.getDefaultValue()==null?"":col.getDefaultValue()); html.append("</textarea> "); html.append("</p>"); return html.toString(); } private String getDateControlHtml(TableColumn col,String datatype) { StringBuilder html=new StringBuilder(); html.append("<p>"); html.append(getInternation(col.getAlias())).append(":"); html.append("<input"); html.append(" id=\"").append(col.getName()).append("\""); html.append(" title=\"").append(getInternation(col.getAlias())).append("\""); if(StringUtils.isNotEmpty(col.getDefaultValue())){ html.append(" value=\"").append(col.getDefaultValue()).append("\""); } html.append(" datatype=\"").append(datatype).append("\""); if("DATE".equals(datatype)){ html.append(" format=\"yyyy-MM-dd\""); }else{ html.append(" format=\"yyyy-MM-dd HH:mm\""); } html.append(" request=\"false\" plugintype=\"TIME\" readonly=\"readonly\" "); html.append(" name=\"").append(col.getName()).append("\""); html.append("/>"); html.append("</p>"); return html.toString(); } @Transactional(readOnly = false) public String changeTableState(List<Long> tableIds, Long menuId){ int draftToEn=0,enToDis=0,disToEn=0; StringBuilder sbu=new StringBuilder(""); for(Long tableId:tableIds){ DataTable dataTable = getDataTable(tableId); if (dataTable.getTableState().equals(DataState.DRAFT)) {// 草稿->启用 log.debug("table state has change to " + DataState.ENABLE.toString()); dataTable.setTableState(DataState.ENABLE); draftToEn++; log.debug("begin to create defaultView"); createDefaultView(dataTable, menuId); } else if (dataTable.getTableState().equals(DataState.ENABLE)) {// 启用->禁用 log.debug("table state has change to " + DataState.DISABLE.toString()); dataTable.setTableState(DataState.DISABLE); enToDis++; } else if (dataTable.getTableState().equals(DataState.DISABLE)) {// 禁用->启用 log.debug("table state has change to " + DataState.ENABLE.toString()); dataTable.setTableState(DataState.ENABLE); disToEn++; } saveDataTable(dataTable); } sbu.append(draftToEn).append("个草稿->启用,") .append(enToDis).append("个启用->禁用,") .append(disToEn).append("个禁用->启用"); return sbu.toString(); } /** * 查询标准数据表(以createDate排序) * * @param tables */ public List<DataTable> getStandardDataTables() { return dataTableDao.getStandardDataTables(); } /** * 查询自定义数据表(以createDate排序) * * @param tables */ public List<DataTable> getDefaultDataTables() { return dataTableDao.getDefaultDataTables(); } /** * 查询某个系统下所有的数据表(以createDate排序) * * @param tables */ public void getSystemAllDataTables(Page<DataTable> tables, Long menuId) { dataTableDao.findSystemAllDataTable(tables, menuId); } /** * 查询某个系统下所有自定义的数据表(以createDate排序) * * @param tables */ public void getSystemDefaultDataTables(Page<DataTable> tables, Long menuId) { dataTableDao.findSystemDefaultDataTable(tables, menuId); } /** * 通过表名查询数据表实体 * * @param tableName * @return 返回是否验证成功 */ public DataTable getDataTableByTableName(String tableName) { return dataTableDao.findDataTableByName(tableName); } /** * 获得该菜单中所有的数据表(包括自定义的数据表) * @return */ public List<DataTable> getAllDataTablesByMenu(Long menuId){ return dataTableDao.getAllDataTablesByMenu(menuId); } public List<DataTable> getUnCompanyAllDataTablesByMenu(Long menuId){ return dataTableDao.getUnCompanyAllDataTablesByMenu(menuId); } public String getInternation(String code){ return ApiFactory.getSettingService().getInternationOptionValue(code); } public GenerateSetting getGenerateSettingByTable(Long tableId){ return generateSettingDao.getGenerateSettingByTable(tableId); } public GenerateSetting getGenerateSetting(Long settingId){ return generateSettingDao.getGenerateSetting(settingId); } public void saveGenerateSetting(GenerateSetting generateSetting){ generateSettingDao.save(generateSetting); } public Map<String,Object> generateService(DataTable dataTable, boolean processFlag) throws IOException { Map<String,Object> dataModel= new HashMap<String,Object>(); String packageName = GenerateCodeUtils.getLastLayerPath(dataTable.getEntityName()); String entityName = dataTable.getEntityName().substring(dataTable.getEntityName().lastIndexOf(".")+1,dataTable.getEntityName().length()); dataModel.put("packageName", packageName);//包名 dataModel.put("entityPath", dataTable.getEntityName());//实体引入路径 dataModel.put("entityName", entityName);//实体名 dataModel.put("lowCaseEntityName", GenerateCodeUtils.firstCharLowerCase(entityName));//小写实体名 dataModel.put("processFlag", processFlag+""); dataModel.put("filePath", packageName.replaceAll("\\.", "/")+"/service/"); dataModel.put("fileName", entityName+"Manager.java"); dataModel.put("templateName", "generateService.ftl"); return dataModel; } public Map<String,Object> generateDao(DataTable dataTable) throws IOException { Map<String,Object> dataModel= new HashMap<String,Object>(); String packageName = GenerateCodeUtils.getLastLayerPath(dataTable.getEntityName()); String entityName = dataTable.getEntityName().substring(dataTable.getEntityName().lastIndexOf(".")+1,dataTable.getEntityName().length()); dataModel.put("packageName", packageName);//包名 dataModel.put("entityPath", dataTable.getEntityName());//实体引入路径 dataModel.put("entityName", entityName);//实体名 dataModel.put("lowCaseEntityName", GenerateCodeUtils.firstCharLowerCase(entityName));//小写实体名 dataModel.put("filePath", packageName.replaceAll("\\.", "/")+"/dao/"); dataModel.put("fileName", entityName+"Dao.java"); dataModel.put("templateName", "generateDao.ftl"); return dataModel; } public Map<String, Object> generateAction(DataTable dataTable, boolean processFlag,Long menuId,String workflowCode)throws Exception{ Map<String, Object> root = new HashMap<String, Object>(); String className=dataTable.getEntityName(); String entityName=className.substring(className.lastIndexOf(".")+1,className.length()); String entityPath=className.substring(0,className.lastIndexOf(".")); String packagePath=entityPath.substring(0,entityPath.lastIndexOf(".")); String packageName=packagePath+".web"; String namespace=packagePath.substring(packagePath.lastIndexOf(".")+1,packagePath.length()); List<String> imports=new ArrayList<String>(); imports.add(className); imports.add(packagePath+".service."+entityName+"Manager"); String entityAttribute=GenerateCodeUtils.firstCharLowerCase(entityName); root.put("packageName", packageName);//包名 root.put("namespace", namespace); root.put("entityName", entityName);//实体名 root.put("entityAttribute", entityAttribute);//小写实体名 root.put("imports", imports); root.put("containWorkflow", processFlag); root.put("workflowCode", workflowCode); root.put("ctx", "${ctx}"); root.put("filePath", packageName.replaceAll("\\.", "/")+"/"); root.put("fileName", entityName+"Action.java"); root.put("templateName", "generateAction.ftl"); addFunctions(namespace,processFlag,entityAttribute,menuId); return root; } private void addFunctions(String namespace,boolean processFlag,String entityAttribute,Long menuId) { Menu menu=menuDao.getMenu(menuId); BusinessSystem businessSystem= businessSystemManager.getBusiness(menu.getSystemId()); if(processFlag){ saveFunctions(namespace,entityAttribute,"放弃领取任务","abandonReceive",businessSystem); saveFunctions(namespace,entityAttribute,"加签","addSigner",businessSystem); saveFunctions(namespace,entityAttribute,"完成交互任务","completeInteractiveTask",businessSystem); saveFunctions(namespace,entityAttribute,"完成任务","completeTask",businessSystem); saveFunctions(namespace,entityAttribute,"领取任务","drawTask",businessSystem); saveFunctions(namespace,entityAttribute,"填写意见","fillOpinion",businessSystem); saveFunctions(namespace,entityAttribute,"流程监控中应急处理功能","processEmergency",businessSystem); saveFunctions(namespace,entityAttribute,"减签","removeSigner",businessSystem); saveFunctions(namespace,entityAttribute,"取回任务","retrieveTask",businessSystem); saveFunctions(namespace,entityAttribute,"显示流转历史","showHistory",businessSystem); saveFunctions(namespace,entityAttribute,"启动并提交流程","submitProcess",businessSystem); saveFunctions(namespace,entityAttribute,"办理任务页面","task",businessSystem); saveFunctions(namespace,entityAttribute,"抄送","copyTask",businessSystem); saveFunctions(namespace,entityAttribute,"退回任务","goback",businessSystem); saveFunctions(namespace,entityAttribute,"减签树","cutsignTree",businessSystem); saveFunctions(namespace,entityAttribute,"指派","assign",businessSystem); } saveFunctions(namespace,entityAttribute,"删除","delete",businessSystem); saveFunctions(namespace,entityAttribute,"新建页面","input",businessSystem); saveFunctions(namespace,entityAttribute,"列表页面","list",businessSystem); saveFunctions(namespace,entityAttribute,"可编辑列表页面","listEditable",businessSystem); saveFunctions(namespace,entityAttribute,"列表数据","listDatas",businessSystem); saveFunctions(namespace,entityAttribute,"保存","save",businessSystem); saveFunctions(namespace,entityAttribute,"编辑-保存","editSave",businessSystem); saveFunctions(namespace,entityAttribute,"编辑-删除","editDelete",businessSystem); } private void saveFunctions(String namespace,String entityAttribute,String functionName,String actionFunctionName,BusinessSystem businessSystem){ String systemByCode=businessSystem.getCode(); String functionGroupCode=systemByCode+"-default-functionGroup"; FunctionGroup functionGroup=functionGroupManager.getFuncGroupByCode(functionGroupCode,businessSystem.getId()); if(functionGroup==null){ functionGroup=new FunctionGroup(); } functionGroup.setCode(functionGroupCode); functionGroup.setName("默认资源组"); functionGroup.setBusinessSystem(businessSystem); functionGroupManager.saveFunGroup(functionGroup); String functionPath="/"+namespace+"/"+entityAttribute+"-"+actionFunctionName+".htm"; Function function=functionManager.getFunctionByPath(functionPath, businessSystem.getId()); if(function==null){ function=new Function(); } function.setCode(systemByCode+"-"+namespace+"-"+entityAttribute+"-"+actionFunctionName); function.setName(functionName); function.setPath(functionPath); function.setFunctionGroup(functionGroup); function.setBusinessSystem(businessSystem); functionManager.saveFunction(function); } public Map<String, Object> generateList(DataTable dataTable, boolean processFlag,Long menuId,String workflowCode)throws Exception{ Map<String, Object> root = new HashMap<String, Object>(); String className=dataTable.getEntityName(); String entityName=className.substring(className.lastIndexOf(".")+1,className.length()); String entityPath=className.substring(0,className.lastIndexOf(".")); String packagePath=entityPath.substring(0,entityPath.lastIndexOf(".")); String namespace=packagePath.substring(packagePath.lastIndexOf(".")+1,packagePath.length()); List<String> imports=new ArrayList<String>(); imports.add(className); imports.add(packagePath+".service."+entityName+"Manager"); String entityAttribute=GenerateCodeUtils.firstCharLowerCase(entityName); root.put("entityName", entityName);//实体名 root.put("entityAttribute", entityAttribute);//小写实体名 root.put("namespace", namespace); root.put("containWorkflow", processFlag); root.put("workflowCode", workflowCode); root.put("listCode", dataTable.getName()); root.put("ctx", "${ctx}"); root.put("resourcesCtx", "${resourcesCtx}"); root.put("imatrixCtx", "${imatrixCtx}"); root.put("filePath", "jsp/"+namespace+"/"); root.put("fileName", entityAttribute+"-list.jsp"); root.put("templateName", "generateList.ftl"); return root; } public Map<String, Object> generateInput(DataTable dataTable, boolean processFlag,Long menuId,String workflowCode)throws Exception{ Map<String, Object> root = new HashMap<String, Object>(); String className=dataTable.getEntityName(); String entityName=className.substring(className.lastIndexOf(".")+1,className.length()); String entityPath=className.substring(0,className.lastIndexOf(".")); String packagePath=entityPath.substring(0,entityPath.lastIndexOf(".")); String namespace=packagePath.substring(packagePath.lastIndexOf(".")+1,packagePath.length()); List<String> imports=new ArrayList<String>(); imports.add(className); imports.add(packagePath+".service."+entityName+"Manager"); String entityAttribute=GenerateCodeUtils.firstCharLowerCase(entityName); root.put("entityName", entityName);//实体名 root.put("entityAttribute", entityAttribute);//小写实体名 root.put("namespace", namespace); root.put("containWorkflow", processFlag); root.put("workflowCode", workflowCode); root.put("formCode", dataTable.getName()); root.put("ctx", "${ctx}"); root.put("id", "${id}"); root.put("fieldPermission", "${fieldPermission}"); root.put("resourcesCtx", "${resourcesCtx}"); root.put("entityObject", "${"+entityAttribute+"}"); root.put("filePath", "jsp/"+namespace+"/"); root.put("fileName", entityAttribute+"-input.jsp"); root.put("templateName", "generateInput.ftl"); root.put("taskId", "${taskId }"); root.put("taskTransact", "${taskTransact }"); return root; } /** * 生成实体代码 * @param dataTable * @param processFlag2 * @throws IOException */ @SuppressWarnings("deprecation") public Map<String,Object> generateEntity(DataTable dataTable, boolean processFlag) throws IOException { Map<String,Object> dataModel= new HashMap<String,Object>(); Set<String> importList = new HashSet<String>();//需要引用类的集合 List<String> attrList = new ArrayList<String>();//类属性集合 List<String> methodList = new ArrayList<String>();//get和set方法集合 //获取数据库类型(不同数据库大字段和大文本生成代码不同) String dataBase = PropUtils.getDataBase(); String clob="", blob=""; if(PropUtils.DATABASE_MYSQL.equals(dataBase)){ clob="LONGTEXT"; blob="LONGBLOB"; }else if(PropUtils.DATABASE_ORACLE.equals(dataBase)){ clob="CLOB"; blob="BLOB"; }else if(PropUtils.DATABASE_SQLSERVER.equals(dataBase)){ clob="NTEXT"; blob="image"; } String packageName = dataTable.getEntityName().substring(0,dataTable.getEntityName().lastIndexOf(".")); String entityName = dataTable.getEntityName().substring(dataTable.getEntityName().lastIndexOf(".")+1,dataTable.getEntityName().length()); List<TableColumn> columns=tableColumnDao.getTableColumnByDataTableId(dataTable.getId()); for (TableColumn column : columns) { if(column.getCasual()) importList.add("import javax.persistence.Transient;"); String attrName = column.getName(); String methodName = GenerateCodeUtils.firstCharUpperCase(attrName);//方法中大写的变量名 if(attrName.contains(".")) continue; switch (column.getDataType()) { case TEXT: attrList.add("String_"+attrName+"_"+column.getCasual());//数据类型_属性名称_是否在数据库中生成 methodList.add("String_"+methodName+"_"+attrName);//数据类型_属性名(第一个字母大写)_属性名 break; case DATE: attrList.add("Date_"+attrName+"_"+column.getCasual()); importList.add("import java.util.Date;"); methodList.add("Date_"+methodName+"_"+attrName); break; case TIME: attrList.add("Date_"+attrName+"_"+column.getCasual()); importList.add("import java.util.Date;"); methodList.add("Date_"+methodName+"_"+attrName); break; case INTEGER: attrList.add("Integer_"+attrName+"_"+column.getCasual()); methodList.add("Integer_"+methodName+"_"+attrName); break; case LONG: attrList.add("Long_"+attrName+"_"+column.getCasual()); methodList.add("Long_"+methodName+"_"+attrName); break; case DOUBLE: attrList.add("Double_"+attrName+"_"+column.getCasual()); methodList.add("Double_"+methodName+"_"+attrName); break; case FLOAT: attrList.add("Float_"+attrName+"_"+column.getCasual()); methodList.add("Float_"+methodName+"_"+attrName); break; case BOOLEAN: attrList.add("Boolean_"+attrName+"_"+column.getCasual()); methodList.add("Boolean_"+methodName+"_"+attrName); break; case CLOB: attrList.add("CLOB_"+attrName+"_"+column.getCasual()); importList.add("import javax.persistence.Lob;"); importList.add("import javax.persistence.Column;"); methodList.add("String_"+methodName+"_"+attrName); break; case BLOB: attrList.add("BLOB_"+attrName+"_"+column.getCasual()); importList.add("import javax.persistence.Lob;"); importList.add("import javax.persistence.Column;"); importList.add("import javax.persistence.Basic;"); importList.add("import javax.persistence.FetchType;"); methodList.add("byte[]_"+methodName+"_"+attrName); break; case COLLECTION: String collectionName = column.getObjectPath().substring(column.getObjectPath().lastIndexOf(".")+1,column.getObjectPath().length()); attrList.add("List<"+collectionName+">"+"_"+attrName+"_"+column.getCasual()); methodList.add("List<"+collectionName+">"+"_"+methodName+"_"+attrName); importList.add("import java.util.List;"); break; case ENUM: String enumName = column.getObjectPath().substring(column.getObjectPath().lastIndexOf(".")+1,column.getObjectPath().length()); attrList.add(enumName+"_"+attrName+"_"+column.getCasual()); methodList.add(enumName+"_"+methodName+"_"+attrName); break; case REFERENCE: String refName = column.getObjectPath().substring(column.getObjectPath().lastIndexOf(".")+1,column.getObjectPath().length()); attrList.add(refName+"_"+attrName+"_"+column.getCasual()); methodList.add(refName+"_"+methodName+"_"+attrName); break; case AMOUNT: attrList.add("Float_"+attrName+"_"+column.getCasual()); methodList.add("Float_"+methodName+"_"+attrName); break; case NUMBER: attrList.add("Integer_"+attrName+"_"+column.getCasual()); methodList.add("Integer_"+methodName+"_"+attrName); break; default: break; } if(StringUtils.isNotEmpty(column.getObjectPath())){ String path = column.getObjectPath(); importList.add("import "+path+";"); } } if(processFlag){ importList.add("import com.norteksoft.wf.engine.client.ExtendField;"); importList.add("import com.norteksoft.wf.engine.client.FormFlowable;"); importList.add("import com.norteksoft.wf.engine.client.WorkflowInfo;"); importList.add("import javax.persistence.Embedded;"); } dataModel.put("packageName", packageName);//包名 dataModel.put("tableName", dataTable.getName());//数据表名 dataModel.put("entityName", entityName);//实体名 dataModel.put("importList", importList); dataModel.put("attrList", attrList); dataModel.put("methodList", methodList); dataModel.put("clob", clob); dataModel.put("blob", blob); dataModel.put("processFlag", processFlag+""); dataModel.put("filePath", packageName.replaceAll("\\.", "/")+"/"); dataModel.put("fileName", entityName+".java"); dataModel.put("templateName", "generateEntity.ftl"); return dataModel; } /** * 生成可编辑list列表模板 * @param dataTable * @param processFlag * @return */ public Map<String, Object> generateEditableList(DataTable dataTable,boolean processFlag) { Map<String,Object> dataModel= new HashMap<String,Object>(); String packageName = GenerateCodeUtils.getLastLayerPath(dataTable.getEntityName()); String entityName = dataTable.getEntityName().substring(dataTable.getEntityName().lastIndexOf(".")+1,dataTable.getEntityName().length()); String nameSpace = packageName.substring(packageName.lastIndexOf(".")+1,packageName.length()); String lowCaseEntityName = GenerateCodeUtils.firstCharLowerCase(entityName); dataModel.put("processFlag", processFlag+""); dataModel.put("fileName", lowCaseEntityName+"-listEditable.jsp"); dataModel.put("templateName", "generateEditableList.ftl"); dataModel.put("entityName", entityName);//实体名 dataModel.put("lowCaseEntityName", lowCaseEntityName); dataModel.put("ctx", "${ctx}"); dataModel.put("resourcesCtx", "${resourcesCtx}"); dataModel.put("nameSpace", nameSpace); dataModel.put("listCode", dataTable.getName()); dataModel.put("filePath", "jsp/"+nameSpace); return dataModel; } public Map<String, Object> generateTask(DataTable dataTable) { Map<String,Object> dataModel= new HashMap<String,Object>(); String packageName = GenerateCodeUtils.getLastLayerPath(dataTable.getEntityName()); String entityName = dataTable.getEntityName().substring(dataTable.getEntityName().lastIndexOf(".")+1,dataTable.getEntityName().length()); String nameSpace = packageName.substring(packageName.lastIndexOf(".")+1,packageName.length()); String lowCaseEntityName = GenerateCodeUtils.firstCharLowerCase(entityName); dataModel.put("fileName", lowCaseEntityName+"-task.jsp"); dataModel.put("templateName", "generateTask.ftl"); dataModel.put("lowCaseEntityName",lowCaseEntityName );//实体名 dataModel.put("ctx", "${ctx}"); dataModel.put("fieldPermission", "${fieldPermission}"); dataModel.put("taskId", "${taskId}"); dataModel.put("companyId", "${"+lowCaseEntityName+".companyId}"); dataModel.put("id", "${id}"); dataModel.put("resourcesCtx", "${resourcesCtx}"); dataModel.put("imatrixCtx", "${imatrixCtx}"); dataModel.put("nameSpace", nameSpace); dataModel.put("formCode", dataTable.getName()); dataModel.put("filePath", "jsp/"+nameSpace); dataModel.put("entity", "${"+lowCaseEntityName+"}"); return dataModel; } }