commit 10358f00897b9f0603b3f08772e36bebd44fff80 Author: Zhenfei.Li Date: Sun Jun 28 19:07:05 2020 +0800 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..ba50209 --- /dev/null +++ b/build.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..e2fd4b7 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,26 @@ + + com.fr.plugin.hw.import.excel + + yes + 1.8.3 + 10.0 + 2018-07-31 + author + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f9b78ed --- /dev/null +++ b/pom.xml @@ -0,0 +1,28 @@ + + + + starter + com.fr.plugin + 10.0 + + 4.0.0 + + plugin-exceldatamanagement + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + -Xlint:unchecked + + + + ${project.basedir}/../webroot/WEB-INF/plugins/plugin-com.fr.plugin.exceldatamanagement-1.0/classes + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/decision/ExcelMngAliasBridge.java b/src/main/java/com/fr/plugin/decision/ExcelMngAliasBridge.java new file mode 100644 index 0000000..3d8cf4b --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/ExcelMngAliasBridge.java @@ -0,0 +1,24 @@ +package com.fr.plugin.decision; + +import com.fr.decision.fun.impl.AbstractURLAliasProvider; +import com.fr.decision.webservice.url.alias.URLAlias; +import com.fr.decision.webservice.url.alias.URLAliasFactory; + +public class ExcelMngAliasBridge extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + URLAliasFactory.createPluginAlias("/excelmng/addlink","/excelmng/addlink",false), + URLAliasFactory.createPluginAlias("/excelmng/delete","/excelmng/delete",false), + URLAliasFactory.createPluginAlias("/excelmng/querylink","/excelmng/querylink",false), + URLAliasFactory.createPluginAlias("/excelmng/rename","/excelmng/rename",false), + URLAliasFactory.createPluginAlias("/excelmng/querydata","/excelmng/querydata",false), + URLAliasFactory.createPluginAlias("/excelmng/querycolattr","/excelmng/querycolattr",false), + URLAliasFactory.createPluginAlias("/excelmng/getSchema","/excelmng/getSchema",false), + URLAliasFactory.createPluginAlias("/excelmng/iftableexist","/excelmng/iftableexist",false), + URLAliasFactory.createPluginAlias("/excelmng/getAllUserList","/excelmng/getAllUserList",false), + URLAliasFactory.createPluginAlias("/excelmng/getAuthUserList","/excelmng/getAuthUserList",false), + URLAliasFactory.createPluginAlias("/excelmng/updateLinkAuth","/excelmng/updateLinkAuth",false) + }; + } +} diff --git a/src/main/java/com/fr/plugin/decision/ExcelMngConfigAccessBridge.java b/src/main/java/com/fr/plugin/decision/ExcelMngConfigAccessBridge.java new file mode 100644 index 0000000..bdc385b --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/ExcelMngConfigAccessBridge.java @@ -0,0 +1,40 @@ +package com.fr.plugin.decision; + +import com.fr.db.fun.impl.AbstractDBAccessProvider; +import com.fr.plugin.decision.dao.ExcelMngDao; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.stable.db.accessor.DBAccessor; +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.dao.DAOProvider; + +public class ExcelMngConfigAccessBridge extends AbstractDBAccessProvider { + + private static DBAccessor dbAccessor = null; + + public static DBAccessor getDbAccessor() { + return dbAccessor; + } + + @Override + public DAOProvider[] registerDAO() { + return new DAOProvider[]{ + new DAOProvider(){ + + @Override + public Class getEntityClass() { + return ExcelMngEntity.class; + } + + @Override + public Class getDAOClass() { + return ExcelMngDao.class; + } + } + }; + } + + @Override + public void onDBAvailable(DBAccessor dbAccessor) { + ExcelMngConfigAccessBridge.dbAccessor = dbAccessor; + } +} diff --git a/src/main/java/com/fr/plugin/decision/ExcelMngHandleBridge.java b/src/main/java/com/fr/plugin/decision/ExcelMngHandleBridge.java new file mode 100644 index 0000000..3a3484c --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/ExcelMngHandleBridge.java @@ -0,0 +1,24 @@ +package com.fr.plugin.decision; + +import com.fr.decision.fun.HttpHandler; +import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; +import com.fr.plugin.decision.http.*; + +public class ExcelMngHandleBridge extends AbstractHttpHandlerProvider { + @Override + public HttpHandler[] registerHandlers() { + return new HttpHandler[]{ + new AddLinkHttpHandler(), + new DeleteLinkHttpHandle(), + new QueryLinkHttpHandle(), + new RenameHttpHandle(), + new QueryTableDataHttpHandle(), + new QueryTableColAttrHttpHandle(), + new GetSchemaHttpHandler(), + new IfTableExistHttpHandler(), + new GetAllUserListHandler(), + new GetAuthUserByLinkNameHandler(), + new UpdateLinkAuthHandler() + }; + } +} diff --git a/src/main/java/com/fr/plugin/decision/HWComponent.java b/src/main/java/com/fr/plugin/decision/HWComponent.java new file mode 100644 index 0000000..e87576c --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/HWComponent.java @@ -0,0 +1,15 @@ +package com.fr.plugin.decision; + +import com.fr.web.struct.Component; +import com.fr.web.struct.category.ScriptPath; + +/** + * created by ezreal 2020/1/9 + */ +public class HWComponent extends Component { + public static HWComponent KEY = new HWComponent(); + @Override + public ScriptPath script() { + return ScriptPath.build("/com/fr/plugin/hw/decision/js/hw.option.js"); + } +} diff --git a/src/main/java/com/fr/plugin/decision/HWOptionProvider.java b/src/main/java/com/fr/plugin/decision/HWOptionProvider.java new file mode 100644 index 0000000..955c77e --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/HWOptionProvider.java @@ -0,0 +1,37 @@ +package com.fr.plugin.decision; + +import com.fr.decision.fun.impl.AbstractSystemOptionProvider; +import com.fr.decision.web.MainComponent; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.web.struct.Atom; + +/** + * created by ezreal 2020/1/9 + */ +@FunctionRecorder +public class HWOptionProvider extends AbstractSystemOptionProvider { + @Override + public String id() { + return "fanruan-hw-excecl"; + } + + @Override + public String displayName() { + return "Excel导入"; + } + + @Override + public int sortIndex() { + return 3; + } + + @Override + public Atom attach() { + return MainComponent.KEY; + } + + @Override + public Atom client() { + return HWComponent.KEY; + } +} diff --git a/src/main/java/com/fr/plugin/decision/HWUtils.java b/src/main/java/com/fr/plugin/decision/HWUtils.java new file mode 100644 index 0000000..ad47f35 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/HWUtils.java @@ -0,0 +1,305 @@ +package com.fr.plugin.decision; + +import com.fr.cache.Attachment; +import com.fr.cache.AttachmentSource; +import com.fr.general.CommonDateUtils; +import com.fr.general.DateUtils; +import com.fr.general.Inter; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.poi.hssf.usermodel.*; +import com.fr.third.org.apache.poi.hssf.util.Region; +import com.fr.third.org.apache.poi.poifs.filesystem.POIFSFileSystem; +import com.fr.third.v2.org.apache.poi.ss.usermodel.Cell; +import com.fr.third.v2.org.apache.poi.ss.usermodel.DateUtil; +import com.fr.third.v2.org.apache.poi.ss.util.CellRangeAddress; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFCell; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRow; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * created by ezreal 2020/1/12 + */ +public class HWUtils { + /** + * 根据附件id获取对应附件excel对象 + * + * @param attachId + * @return + */ + public static XSSFWorkbook getExcelWork(String attachId) { + XSSFWorkbook sheets = null; + try { + Attachment attachment = AttachmentSource.getAttachment(attachId); + if (attachment != null) { + InputStream inputStream = attachment.getInputStream(); + sheets = new XSSFWorkbook(inputStream); + sheets.getNumberOfSheets(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return sheets; + } + + public static JSONArray getSheetFiled(XSSFSheet sheet) { + JSONArray result = JSONArray.create(); + int rowCounts = sheet.getPhysicalNumberOfRows(); + int titleRow = -1; + for (int row = 0; row < rowCounts; row++) { + XSSFRow xssfRow = sheet.getRow(row); + if (xssfRow == null) { + continue; + } + titleRow = row; + //循环取每个单元格(cell)的数据 + Iterator cellIterator = xssfRow.cellIterator(); + while (cellIterator.hasNext()) { + XSSFCell cell = (XSSFCell) cellIterator.next(); + String value = getString(cell); + if (StringUtils.isNotBlank(value)) { + JSONObject o = JSONObject.create().put("titleRow", titleRow).put("value", cell.getColumnIndex()).put("text", value); + result.add(o); + } + } + if (titleRow >= 0) { + break; + } + } + return result; + } + + public static Map getSheetContent(XSSFSheet sheet, int titleRow, JSONObject tableCol) { + Map result = new HashMap(); + Iterator> iterator = tableCol.iterator(); + List combineCell = getCombineCell(sheet); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + result.put(entry.getKey(), new ArrayList()); + } + int lastRowNum = sheet.getLastRowNum(); + for (int row = titleRow + 1; row <= lastRowNum; row++) { + XSSFRow xssfRow = sheet.getRow(row); + if (xssfRow == null) { + continue; + } + for (Map.Entry entry : result.entrySet()) { + String key = entry.getKey(); + int col = tableCol.getInt(key); + List value = entry.getValue(); + XSSFCell cell = xssfRow.getCell(col); + + if (cell != null) { + String cellValue = getCellValue(sheet, combineCell, row, col, cell); + value.add(StringUtils.isBlank(cellValue) ? StringUtils.EMPTY : cellValue); + } else { + value.add(StringUtils.EMPTY); + } + } + } + return result; + } + + public static String getCellValue(XSSFSheet sheet, List combineCell, int row, int col, XSSFCell cell) { + int firstC = 0; + int lastC = 0; + int firstR = 0; + int lastR = 0; + for (CellRangeAddress ca : combineCell) { + // 获得合并单元格的起始行, 结束行, 起始列, 结束列 + firstC = ca.getFirstColumn(); + lastC = ca.getLastColumn(); + firstR = ca.getFirstRow(); + lastR = ca.getLastRow(); + if (cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) { + if (cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) { + XSSFRow xRow = sheet.getRow(firstR); + XSSFCell xCell = xRow.getCell(firstC); + return getString(xCell); + } + } + } + return getString(cell); + } + + public static List getCombineCell(XSSFSheet sheet) { +// 获得一个 sheet 中合并单元格的数量 + List list = new ArrayList(); + int sheetmergerCount = sheet.getNumMergedRegions(); +// 遍历合并单元格 + for (int i = 0; i < sheetmergerCount; i++) { +// 获得合并单元格加入list中 + CellRangeAddress ca = sheet.getMergedRegion(i); + list.add(ca); + } + return list; + } + + /** + * 把单元格的内容转为字符串 + * + * @param xssfCell 单元格 + * @return 字符串 + */ + public static String getString(XSSFCell xssfCell) { + if (xssfCell == null) { + return ""; + } + int type = xssfCell.getCellType(); + if (type == XSSFCell.CELL_TYPE_NUMERIC) { + if (DateUtil.isCellDateFormatted(xssfCell)) { + // 如果是date类型则 ,获取该cell的date值 + return new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(xssfCell.getNumericCellValue())); + } else { // 纯数字 + return String.valueOf(xssfCell.getNumericCellValue()); + } + } else if (type == XSSFCell.CELL_TYPE_BOOLEAN) { + return String.valueOf(xssfCell.getBooleanCellValue()); + } else { + return xssfCell.getStringCellValue(); + } + } + + /********************************excel2003*************************************************/ + + public static HSSFWorkbook getExcel2003Work(String attachId) { + HSSFWorkbook sheets = null; + try { + Attachment attachment = AttachmentSource.getAttachment(attachId); + if (attachment != null) { + InputStream inputStream = attachment.getInputStream(); + POIFSFileSystem poifsFileSystem = null; + + try { + poifsFileSystem = new POIFSFileSystem(inputStream); + } catch (IOException var13) { + throw new IOException(Inter.getLocText("Fine-Engine_NS_Exception_ReadExcelError")); + } + sheets = new HSSFWorkbook(poifsFileSystem); + sheets.getNumberOfSheets(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return sheets; + } + + public static JSONArray get2003SheetFiled(HSSFSheet sheet) { + JSONArray result = JSONArray.create(); + int rowCounts = sheet.getPhysicalNumberOfRows(); + int titleRow = -1; + for (int row = 0; row < rowCounts; row++) { + HSSFRow hssfRow = sheet.getRow(row); + if (hssfRow == null) { + continue; + } + //循环取每个单元格(cell)的数据 + for (int cellIndex = 0; cellIndex < hssfRow.getPhysicalNumberOfCells(); cellIndex++) { + HSSFCell hssfCell = hssfRow.getCell(cellIndex); + String value = get2003String(hssfCell); + if (StringUtils.isNotBlank(value)) { + titleRow = row; + JSONObject o = JSONObject.create().put("titleRow", titleRow).put("value", cellIndex).put("text", value); + result.add(o); + } + } + if (titleRow >= 0) { + break; + } + } + return result; + } + + /** + * 把单元格的内容转为字符串 + * + * @param hssfCell 单元格 + * @return 字符串 + */ + public static String get2003String(HSSFCell hssfCell) { + if (hssfCell == null) { + return ""; + } + int type = hssfCell.getCellType(); + if (type == HSSFCell.CELL_TYPE_NUMERIC) { + if (HSSFDateUtil.isCellDateFormatted(hssfCell)) { + // 如果是date类型则 ,获取该cell的date值 + return new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(hssfCell.getNumericCellValue())); + } else { // 纯数字 + return String.valueOf(hssfCell.getNumericCellValue()); + } + } else if (type == XSSFCell.CELL_TYPE_BOOLEAN) { + return String.valueOf(hssfCell.getBooleanCellValue()); + } else { + return hssfCell.getStringCellValue(); + } + } + + /** + * 获取2003的值 + * + * @param sheet + * @param row + * @param col + * @param cell + * @return + */ + public static String get2003CellValue(HSSFSheet sheet, int row, int col, HSSFCell cell) { + int sheetMergeCount = sheet.getNumMergedRegions(); + for (int i = 0; i < sheetMergeCount; i++) { + Region mergedRegionAt = sheet.getMergedRegionAt(i); + mergedRegionAt.getRowFrom(); + // CellRangeAddress ca = sheet.getMergedRegion(i); + int firstColumn = mergedRegionAt.getColumnFrom(); + int lastColumn = mergedRegionAt.getColumnTo(); + int firstRow = mergedRegionAt.getRowFrom(); + int lastRow = mergedRegionAt.getRowTo(); + if (row >= firstRow && row <= lastRow) { + if (col >= firstColumn && col <= lastColumn) { + HSSFRow fRow = sheet.getRow(firstRow); + HSSFCell fCell = fRow.getCell(firstColumn); + return get2003String(fCell); + } + } + } + return get2003String(cell); + } + + public static Map get2003SheetContent(HSSFSheet sheet, int titleRow, JSONObject tableCol) { + Map result = new HashMap(); + Iterator> iterator = tableCol.iterator(); + // List combineCell = getCombineCell(sheet); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + result.put(entry.getKey(), new ArrayList()); + } + int lastRowNum = sheet.getLastRowNum(); + for (int row = titleRow + 1; row <= lastRowNum; row++) { + HSSFRow hssfRow = sheet.getRow(row); + if (hssfRow == null) { + continue; + } + for (Map.Entry entry : result.entrySet()) { + String key = entry.getKey(); + int col = tableCol.getInt(key); + List value = entry.getValue(); + HSSFCell cell = hssfRow.getCell(col); + + if (cell != null) { + String cellValue = get2003CellValue(sheet, row, col, cell); + value.add(StringUtils.isBlank(cellValue) ? StringUtils.EMPTY : cellValue); + } else { + value.add(StringUtils.EMPTY); + } + } + } + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/ReuseConfigAccessBridge.java b/src/main/java/com/fr/plugin/decision/ReuseConfigAccessBridge.java new file mode 100644 index 0000000..576ad3f --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/ReuseConfigAccessBridge.java @@ -0,0 +1,40 @@ +package com.fr.plugin.decision; + +import com.fr.db.fun.impl.AbstractDBAccessProvider; +import com.fr.plugin.decision.dao.ReuseDao; +import com.fr.plugin.decision.dao.ReuseEntity; +import com.fr.stable.db.accessor.DBAccessor; +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.dao.DAOProvider; + +public class ReuseConfigAccessBridge extends AbstractDBAccessProvider { + + private static DBAccessor dbAccessor = null; + + public static DBAccessor getDbAccessor() { + return dbAccessor; + } + + @Override + public DAOProvider[] registerDAO() { + return new DAOProvider[]{ + new DAOProvider(){ + + @Override + public Class getEntityClass() { + return ReuseEntity.class; + } + + @Override + public Class getDAOClass() { + return ReuseDao.class; + } + } + }; + } + + @Override + public void onDBAvailable(DBAccessor dbAccessor) { + ReuseConfigAccessBridge.dbAccessor = dbAccessor; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/ActionEunm.java b/src/main/java/com/fr/plugin/decision/core/ActionEunm.java new file mode 100644 index 0000000..fedd7e6 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/ActionEunm.java @@ -0,0 +1,29 @@ +package com.fr.plugin.decision.core; + +import com.fr.stable.StringUtils; + +public enum ActionEunm { + + ADDTO_ACTION("addTo"), + COVER_ACTION("cover"), + CREATE_ACTION("add"); + + private String value; + + private ActionEunm(String value){ + this.value = value; + } + + public String getValue(){ + return value; + } + + public static ActionEunm fromTypeName(String value){ + for (ActionEunm typeEnum: ActionEunm.values()) { + if(StringUtils.equals(value, typeEnum.getValue())){ + return typeEnum; + } + } + return null; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/ActionFactory.java b/src/main/java/com/fr/plugin/decision/core/ActionFactory.java new file mode 100644 index 0000000..cb81339 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/ActionFactory.java @@ -0,0 +1,32 @@ +package com.fr.plugin.decision.core; + +import com.fr.plugin.decision.core.action.AddAction; +import com.fr.plugin.decision.core.action.CoverAction; +import com.fr.plugin.decision.core.action.CreateAction; +import com.fr.plugin.decision.core.action.ExcelDmlAction; + +import java.util.HashMap; +import java.util.Map; + +public class ActionFactory { + + private static Map actionMap = new HashMap(); + private static ActionFactory actionFactory = new ActionFactory(); + + private ActionFactory(){ + } + + public static ActionFactory getInstance(){ + return actionFactory; + } + + public ExcelDmlAction create(String type){ + return (ExcelDmlAction) actionMap.get(ActionEunm.fromTypeName(type)); + } + + { + actionMap.put(ActionEunm.ADDTO_ACTION, new AddAction()); + actionMap.put(ActionEunm.COVER_ACTION, new CoverAction()); + actionMap.put(ActionEunm.CREATE_ACTION,new CreateAction()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/DML.java b/src/main/java/com/fr/plugin/decision/core/DML.java new file mode 100644 index 0000000..453a5f7 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/DML.java @@ -0,0 +1,238 @@ +package com.fr.plugin.decision.core; + +import com.fr.cache.Attachment; +import com.fr.cache.list.IntList; +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.base.DialectKeyConstants; +import com.fr.data.core.db.dialect.base.key.init.table.DialectInitTableParameter; +import com.fr.data.core.db.dml.CreateTable; +import com.fr.data.core.db.dml.Delete; +import com.fr.data.core.db.dml.Table; +import com.fr.data.core.db.tableObject.Column; +import com.fr.data.core.db.tableObject.ColumnSize; +import com.fr.data.dao.*; +import com.fr.file.DatasourceManager; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.stable.StableUtils; +import com.fr.web.AttachmentHelper; +import com.fr.workspace.WorkContext; + +import java.io.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.*; + +public class DML { + + public static void initTable(Dialect dialect, Connection conn, Table table, String connectionName, List tableColName, List tableColLength, List tableColType) throws Exception { + FieldColumnMapper[] fieldColumnMappers = new FieldColumnMapper[tableColName.size()]; + for (int k=0; k tableColName, List tableColLength, List tableColType, List tablePrimaryKey) throws SQLException { + CreateTable createTable = new CreateTable(table, dialect); + for (int i=0; i 1) { + column.setColumnSize(new ColumnSize(Integer.parseInt(colLen[0]), Integer.parseInt(colLen[1]))); + } else { + column.setColumnSize(new ColumnSize(Integer.parseInt(tableColLength.get(i)))); + } + if (tablePrimaryKey.get(i)) { + column.setPrimaryKey(true); + column.setAllowNull(false); + } + createTable.addColumn(column); + } + PreparedStatement createPs = createTable.createPreparedStatementByValidatedParameters(conn); + createPs.execute(); + } + + public static int deleteTable(Dialect dialect, Connection conn, Table table) throws SQLException { + Delete delete = new Delete(table, dialect); + PreparedStatement deletePs = delete.createPreparedStatementByValidatedParameters(conn); + return deletePs.executeUpdate(); + } + + public static void dropTable(Dialect dialect, Connection conn, Table table) throws SQLException { + Drop drop = new Drop(table, dialect); + PreparedStatement dropPs = drop.createPreparedStatementByValidatedParameters(conn); + dropPs.execute(); + } + + public static PreparedStatement createInsertedPreparedStatement(Dialect dialect, Connection conn, Table table, List tableColName) throws SQLException { + IntList intList = new IntList(); + ArrayList list = new ArrayList(); + ArrayList list1 = new ArrayList(); + int i = 0; + + for(int colSize = tableColName.size(); i < colSize; ++i) { + list.add(dialect.column2SQL(tableColName.get(i))); + list1.add("?"); + intList.add(i); + } + + if (list1.isEmpty()) { + return null; + } else { + String sql = "INSERT INTO " + table.toStatementSQLString(dialect) + " (" + StableUtils.join(list, ",") + ") VALUES (" + StableUtils.join(list1, ",") + ")"; + FineLoggerFactory.getLogger().sql("SQL: " + sql); + return conn.prepareStatement(sql); + } + } + + public static int execInsertedPreparedStatement(Dialect dialect, Connection conn, Table table,PreparedStatement ps, int rowCount, List tableColName, List tableColType, Map tableValue) throws SQLException, IOException { + int count = 0; + boolean supportsBatchUpdates = conn.getMetaData().supportsBatchUpdates(); + if (JdbcUtils.isHive(conn)) { + return execHiveInsert(dialect, conn, table, ps, rowCount, tableColName, tableColType, tableValue); + } + + if (!supportsBatchUpdates) { + return execInsertedPreparedStatementByItem(dialect, conn, table, ps, rowCount, tableColName, tableColType, tableValue); + } + + for (int rownum=0; rownum tableColName, List tableColType, Map tableValue) throws SQLException { + int count = 0; + + for (int rownum=0; rownum tableColName, List tableColType, Map tableValue){ + try { + String txt = hiveInsertCreateTxt(tableValue); + DBUtils.close(ps); + String sql = "LOAD DATA LOCAL INPATH '" + txt +"' OVERWRITE into table " + dialect.table2SQL(table); + FineLoggerFactory.getLogger().info("execHiveInsert insert sql:" + sql); + PreparedStatement hiveInsertPs = conn.prepareStatement(sql); + hiveInsertPs.execute(); + FineLoggerFactory.getLogger().info("execHiveInsert:执行正常"); + } catch (SQLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return rowCount; + } + + public static String hiveInsertCreateTxt(Map tableValue) throws IOException { + StringBuffer txtStr = new StringBuffer(); + String path = new StringBuilder().append(WorkContext.getCurrent().getPath()).append("/txt/hw_excel_hive").append((int)(Math.random() * 10000)).append(".txt").toString() ; + FineLoggerFactory.getLogger().info("hiveInsert_path: " + path); + + File writename = new File(path); + if(!writename.exists()){ + writename.createNewFile(); + } + + BufferedWriter out = new BufferedWriter(new FileWriter(writename)); + + Set set = tableValue.entrySet(); + Iterator iterator = set.iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry)iterator.next(); + List colItems = (ArrayList) entry.getValue(); + for (String item : colItems) { + txtStr.append(item).append("\001"); + } + txtStr.deleteCharAt(txtStr.length()-4); + txtStr.append("\n"); + } + txtStr.deleteCharAt(txtStr.length()-2); + out.write(txtStr.toString()); + out.flush(); + out.close(); + + FineLoggerFactory.getLogger().info("hiveInsert_path: " + path + " 文件创建成功"); + return path; + } +} + diff --git a/src/main/java/com/fr/plugin/decision/core/Drop.java b/src/main/java/com/fr/plugin/decision/core/Drop.java new file mode 100644 index 0000000..217c8f6 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/Drop.java @@ -0,0 +1,45 @@ +package com.fr.plugin.decision.core; + +import com.fr.base.TemplateUtils; +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dml.AbstractDML; +import com.fr.data.core.db.dml.Table; +import com.fr.log.FineLoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class Drop extends AbstractDML { + protected Drop(Table table, Dialect dialect) { + super(table, dialect); + } + + @Override + protected PreparedStatement createPreparedStatementByValidatedParameters(Connection connection) throws SQLException { + String dropSQL = TemplateUtils.render("DROP TABLE ${table} ", new String[]{"table"}, new String[]{this.getTable().toStatementSQLString(this.dialect)}); + FineLoggerFactory.getLogger().debug(dropSQL.toString()); + PreparedStatement preparedStatement = connection.prepareStatement(dropSQL); + + return preparedStatement; + } + + // todo: executeUpdate 执行 drop 后的返回值 + public int execute(Connection connection) throws SQLException { + PreparedStatement preparedStatement = this.createPreparedStatement(connection); + + int result; + try { + if (preparedStatement == null) { + return 0; + } + + result = preparedStatement.executeUpdate(); + } finally { + DBUtils.closeStatement(preparedStatement); + } + + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/ExcelDmlBean.java b/src/main/java/com/fr/plugin/decision/core/ExcelDmlBean.java new file mode 100644 index 0000000..6999d18 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/ExcelDmlBean.java @@ -0,0 +1,91 @@ +package com.fr.plugin.decision.core; + +import com.fr.data.core.db.dml.Table; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ExcelDmlBean { + + private String connectionName; + private Table table; + private int rowCount; + private Map tableValue; + private List tableColName = new ArrayList<>(); + private List tableColLength = new ArrayList<>(); + private List tableColType = new ArrayList<>(); + private List tablePrimaryKey = new ArrayList<>(); + + public ExcelDmlBean(String connectionName, String schema, String tableName, JSONArray tableColItems, Map tableValue){ + this.connectionName = connectionName; + this.tableValue = tableValue; + for (Object o : tableColItems) { + String colName = ((JSONObject) o).getString("colName"); + String colLength = ((JSONObject) o).getString("colLength"); + int colType = ((JSONObject) o).getInt("colType"); + boolean primaryKey = ((JSONObject) o).getBoolean("primaryKey"); + tableColName.add(colName); + tableColType.add(colType); + tableColLength.add(colLength); + tablePrimaryKey.add(primaryKey); + } + + table = new Table(schema, tableName); + rowCount = tableValue.get(tableColName.get(0)).size(); + } + + public List getTablePrimaryKey() { + return tablePrimaryKey; + } + + public void setTablePrimaryKey(List tablePrimaryKey) { + this.tablePrimaryKey = tablePrimaryKey; + } + + public Table getTable() { + return table; + } + + public int getRowCount() { + return rowCount; + } + + public List getTableColLength() { + return tableColLength; + } + + public String getConnectionName() { + return connectionName; + } + + public void setConnectionName(String connectionName) { + this.connectionName = connectionName; + } + + public Map getTableValue() { + return tableValue; + } + + public void setTableValue(Map tableValue) { + this.tableValue = tableValue; + } + + public List getTableColName() { + return tableColName; + } + + public void setTableColName(List tableColName) { + this.tableColName = tableColName; + } + + public List getTableColType() { + return tableColType; + } + + public void setTableColType(List tableColType) { + this.tableColType = tableColType; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/action/AddAction.java b/src/main/java/com/fr/plugin/decision/core/action/AddAction.java new file mode 100644 index 0000000..b91f9c0 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/action/AddAction.java @@ -0,0 +1,56 @@ +package com.fr.plugin.decision.core.action; + +import com.fr.data.core.db.DBUtils; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.core.DML; + +import java.sql.PreparedStatement; + +public class AddAction extends ExcelDmlAction { + + public AddAction() { + } + + @Override + public JSONObject execute() { + PreparedStatement preparedStatement = null; + JSONObject result = JSONObject.create(); + int count = -1; + try { + conn.setAutoCommit(false); + preparedStatement = DML.createInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + excelDmlBean.getTableColName() + ); + + count = DML.execInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + preparedStatement, + excelDmlBean.getRowCount(), + excelDmlBean.getTableColName(), + excelDmlBean.getTableColType(), + excelDmlBean.getTableValue() + ); + + conn.commit(); + conn.setAutoCommit(true); + result.put("status", "success").put("text", "成功追加数据条数为 "+ count +"条").put("addLink",false); + + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:AddAction failed !", e.getMessage()); + DBUtils.rollback(conn); + e.printStackTrace(); + result.put("status", "fail").put("errorText", "追加操作数据插入异常" + e.getLocalizedMessage()); + } finally { + DBUtils.close(conn); + DBUtils.close(preparedStatement); + } + + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/action/CoverAction.java b/src/main/java/com/fr/plugin/decision/core/action/CoverAction.java new file mode 100644 index 0000000..8ae5150 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/action/CoverAction.java @@ -0,0 +1,60 @@ +package com.fr.plugin.decision.core.action; + +import com.fr.data.core.db.DBUtils; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.core.DML; + +import java.sql.PreparedStatement; + +public class CoverAction extends ExcelDmlAction { + + public CoverAction() { + } + + @Override + public JSONObject execute() { + PreparedStatement preparedStatement = null; + JSONObject result = JSONObject.create(); + int insertCount = 0; + int deleteCount = 0; + try { + conn.setAutoCommit(false); + deleteCount = DML.deleteTable( + dialect, + conn, + excelDmlBean.getTable() + ); + + preparedStatement = DML.createInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + excelDmlBean.getTableColName() + ); + + insertCount = DML.execInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + preparedStatement, + excelDmlBean.getRowCount(), + excelDmlBean.getTableColName(), + excelDmlBean.getTableColType(), + excelDmlBean.getTableValue() + ); + conn.commit(); + conn.setAutoCommit(true); + result.put("status", "success").put("text", "成功删除数据" + deleteCount + "条,插入数据 " + insertCount +"条").put("addLink",false); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:CoverAction failed !", e.getMessage()); + DBUtils.rollback(conn); + e.printStackTrace(); + result.put("status", "fail").put("errorText", "覆盖操作数据插入异常" + e.getLocalizedMessage()); + } finally { + DBUtils.close(conn); + DBUtils.close(preparedStatement); + } + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/action/CreateAction.java b/src/main/java/com/fr/plugin/decision/core/action/CreateAction.java new file mode 100644 index 0000000..c0a8d39 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/action/CreateAction.java @@ -0,0 +1,67 @@ +package com.fr.plugin.decision.core.action; + +import com.fr.data.core.db.DBUtils; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.core.DML; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class CreateAction extends ExcelDmlAction { + public CreateAction() { + } + + @Override + public JSONObject execute() { + PreparedStatement preparedStatement = null; + JSONObject result = JSONObject.create(); + int count = 0; + try { + conn.setAutoCommit(false); + DML.createTable( + dialect, + conn, + excelDmlBean.getTable(), + excelDmlBean.getTableColName(), + excelDmlBean.getTableColLength(), + excelDmlBean.getTableColType(), + excelDmlBean.getTablePrimaryKey() + ); + preparedStatement = DML.createInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + excelDmlBean.getTableColName() + ); + count = DML.execInsertedPreparedStatement( + dialect, + conn, + excelDmlBean.getTable(), + preparedStatement, + excelDmlBean.getRowCount(), + excelDmlBean.getTableColName(), + excelDmlBean.getTableColType(), + excelDmlBean.getTableValue() + ); + conn.commit(); + conn.setAutoCommit(true); + result.put("status", "success").put("text", "表创建正常,成功插入数据" + count + "条").put("addLink",true); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:CreateAction failed !", e.getMessage()); + DBUtils.rollback(conn); + try { + DML.dropTable(dialect, conn, excelDmlBean.getTable()); + } catch (SQLException e1) { + FineLoggerFactory.getLogger().error("HW_excel导入:dropTable failed !", e.getMessage()); + } + e.printStackTrace(); + result.put("status", "failed").put("errorText", "新增操作异常" + e.getLocalizedMessage()); + } finally { + DBUtils.close(conn); + DBUtils.close(preparedStatement); + } + + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/core/action/ExcelDmlAction.java b/src/main/java/com/fr/plugin/decision/core/action/ExcelDmlAction.java new file mode 100644 index 0000000..4d55e09 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/core/action/ExcelDmlAction.java @@ -0,0 +1,27 @@ +package com.fr.plugin.decision.core.action; + +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.core.ExcelDmlBean; +import com.fr.plugin.decision.utils.JdbcUtils; + +import java.sql.Connection; + +public abstract class ExcelDmlAction { + + public Connection conn; + public Dialect dialect; + public ExcelDmlBean excelDmlBean; + + public ExcelDmlAction(){ + } + + public void setExcelDmlBean(ExcelDmlBean excelDmlBean) { + this.excelDmlBean = excelDmlBean; + this.conn = JdbcUtils.getConnection(excelDmlBean.getConnectionName()); + this.dialect = DialectFactory.generateDialect(conn); + } + + public abstract JSONObject execute(); +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ExcelLinkService.java b/src/main/java/com/fr/plugin/decision/dao/ExcelLinkService.java new file mode 100644 index 0000000..a527cfe --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ExcelLinkService.java @@ -0,0 +1,142 @@ +package com.fr.plugin.decision.dao; + +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.stable.StringUtils; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.condition.QueryCondition; +import com.fr.stable.query.condition.impl.QueryConditionImpl; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.web.utils.WebUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class ExcelLinkService { + + private static ExcelLinkService instance ; + + private ExcelLinkService(){ + } + + public static synchronized ExcelLinkService getInstance() { + if (instance == null) { + instance = new ExcelLinkService(); + } + return instance; + } + + public void addLink(final String name, final String datasouces, final String schema, final String tablename, final String createUser){ + try { + ExcelMngConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + ExcelMngEntity entity=new ExcelMngEntity(); + + entity.setId(UUID.randomUUID().toString()); + entity.setName(name); + entity.setDatasouces(datasouces); + entity.setSchema(schema); + entity.setTablename(tablename); + entity.setCreateUser(createUser); + + daoContext.getDAO(ExcelMngDao.class).add(entity); + return entity; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接添加失败"); + e.printStackTrace(); + } + } + + public void deleteLinkById(final String id){ + try { + ExcelMngConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + daoContext.getDAO(ExcelMngDao.class).remove(id); + return null; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接删除失败"); + e.printStackTrace(); + } + } + + public void deleteLinkByName(final String name){ + try { + ExcelMngConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + daoContext.getDAO(ExcelMngDao.class).remove(new QueryConditionImpl().addRestriction(RestrictionFactory.eq("name", name))); + return null; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接删除失败"); + e.printStackTrace(); + } + } + + public ExcelMngEntity getLinkById(final String id){ + ExcelMngEntity entity = null; + try { + entity = ExcelMngConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ExcelMngDao.class).findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id",id))); + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接查询失败"); + e.printStackTrace(); + } + return entity; + } + + public ExcelMngEntity getLinkByName(final String name){ + ExcelMngEntity entity = null; + try { + entity = ExcelMngConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ExcelMngDao.class).findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name",name))); + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接查询失败"); + e.printStackTrace(); + } + return entity; + } + + public List getAllLink(final String key, final String createUser){ + List entities = new ArrayList<>(); + final QueryCondition queryCondition = StringUtils.isBlank(key)? QueryFactory.create().addSort("name"):QueryFactory.create().addSort("name").addRestriction(RestrictionFactory.like("name", key)); + + try { + if (!UserService.getInstance().isAdmin(createUser)){ + queryCondition.addRestriction(RestrictionFactory.eq("createUser", createUser)); + } + + entities = ExcelMngConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction >() { + @Override + public List run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ExcelMngDao.class).find(queryCondition); + } + }); + } catch (Exception e){ + FineLoggerFactory.getLogger().error("HW_excel导入:查询全部链接异常"); + e.printStackTrace(); + } + return entities; + } + +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ExcelMngDao.java b/src/main/java/com/fr/plugin/decision/dao/ExcelMngDao.java new file mode 100644 index 0000000..cb661db --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ExcelMngDao.java @@ -0,0 +1,16 @@ +package com.fr.plugin.decision.dao; + +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.session.DAOSession; + +public class ExcelMngDao extends BaseDAO { + public ExcelMngDao(DAOSession daoSession){ + super(daoSession); + } + + @Override + protected Class getEntityClass() { + return ExcelMngEntity.class; + } + +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ExcelMngEntity.java b/src/main/java/com/fr/plugin/decision/dao/ExcelMngEntity.java new file mode 100644 index 0000000..08cb1bb --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ExcelMngEntity.java @@ -0,0 +1,70 @@ +package com.fr.plugin.decision.dao; + +import com.fr.stable.db.entity.BaseEntity; +import com.fr.third.javax.persistence.Column; +import com.fr.third.javax.persistence.Entity; +import com.fr.third.javax.persistence.Table; + +@Entity +@Table(name = "FINE_PLUGIN_HW_EXCEL") +public class ExcelMngEntity extends BaseEntity { + + @Column(name="name", unique = true) + private String name; + + @Column(name="dataSources") + private String datasouces; + + @Column(name="schemaName") + private String schema; + + @Column(name="tableName") + private String tablename; + + @Column(name="createUser") + private String createUser; + + public ExcelMngEntity(){ + } + + public void setName(String name){ + this.name = name; + } + + public String getName(){ + return name; + } + + public void setDatasouces(String datasouces){ + this.datasouces = datasouces; + } + + public String getDatasouces(){ + return datasouces; + } + + public void setSchema(String schema){ + this.schema = schema; + } + + public String getSchema(){ + return schema; + } + + public void setTablename(String tablename){ + this.tablename = tablename; + } + + public String getTablename(){ + return tablename; + } + + public void setCreateUser(String createUser){ + this.createUser = createUser; + } + + public String getCreateUser(){ + return createUser; + } + +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ReuseDao.java b/src/main/java/com/fr/plugin/decision/dao/ReuseDao.java new file mode 100644 index 0000000..fe03caa --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ReuseDao.java @@ -0,0 +1,15 @@ +package com.fr.plugin.decision.dao; + +import com.fr.stable.db.dao.BaseDAO; +import com.fr.stable.db.session.DAOSession; + +public class ReuseDao extends BaseDAO { + public ReuseDao(DAOSession daoSession) { + super(daoSession); + } + + @Override + protected Class getEntityClass() { + return ReuseEntity.class; + } +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ReuseEntity.java b/src/main/java/com/fr/plugin/decision/dao/ReuseEntity.java new file mode 100644 index 0000000..f8c4cd2 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ReuseEntity.java @@ -0,0 +1,36 @@ +package com.fr.plugin.decision.dao; + +import com.fr.stable.db.entity.BaseEntity; +import com.fr.third.javax.persistence.Column; +import com.fr.third.javax.persistence.Entity; +import com.fr.third.javax.persistence.Table; + +@Entity +@Table(name = "FINE_PLUGIN_HW_EXCEL_REUSE") +public class ReuseEntity extends BaseEntity { + @Column(name="userName") + private String userName; + + @Column(name="linkName") + private String linkName; + + public ReuseEntity(){ + + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getLinkName() { + return linkName; + } + + public void setLinkName(String linkName) { + this.linkName = linkName; + } +} diff --git a/src/main/java/com/fr/plugin/decision/dao/ReuseService.java b/src/main/java/com/fr/plugin/decision/dao/ReuseService.java new file mode 100644 index 0000000..94dbda9 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dao/ReuseService.java @@ -0,0 +1,104 @@ +package com.fr.plugin.decision.dao; + +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.plugin.decision.ReuseConfigAccessBridge; +import com.fr.stable.StringUtils; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.condition.QueryCondition; +import com.fr.stable.query.condition.impl.QueryConditionImpl; +import com.fr.stable.query.restriction.RestrictionFactory; + +import java.util.*; + +public class ReuseService { + private static ReuseService instance ; + + private ReuseService(){ + } + + public static synchronized ReuseService getInstance() { + if (instance == null) { + instance = new ReuseService(); + } + return instance; + } + + public void addUserOnLinkName(final String userNames, final String linkName){ + try { + ReuseConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ReuseEntity run(DAOContext daoContext) throws Exception { + //for (String user:userNames){ + ReuseEntity entity = new ReuseEntity(); + entity.setId(UUID.randomUUID().toString()); + entity.setLinkName(linkName); + entity.setUserName(userNames); + daoContext.getDAO(ReuseDao.class).add(entity); + //} + return null; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:复用添加用户失败"); + e.printStackTrace(); + } + + } + + public void deleteUserOnLinkName(final String userNames, final String linkName){ + try { + ReuseConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ReuseEntity run(DAOContext daoContext) throws Exception { + daoContext.getDAO(ReuseDao.class).remove(new QueryConditionImpl().addRestriction(RestrictionFactory.eq("linkName", linkName)).addRestriction(RestrictionFactory.eq("userName",userNames))); + return null; + } + }); + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:链接删除失败"); + e.printStackTrace(); + } + + } + + public List getUserByLinkName(final String linkName){ + List entities = new ArrayList<>(); + final QueryCondition queryCondition = QueryFactory.create().addSort("userName").addRestriction(RestrictionFactory.eq("linkName", linkName)); + + try { + entities = ReuseConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction >() { + @Override + public List run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ReuseDao.class).find(queryCondition); + } + }); + } catch (Exception e){ + FineLoggerFactory.getLogger().error("HW_excel导入:getUserByLinkName异常"); + e.printStackTrace(); + } + return entities; + } + + public List getLinkByUserName(final String userName){ + List entities = new ArrayList<>(); + final QueryCondition queryCondition = QueryFactory.create().addSort("linkName").addRestriction(RestrictionFactory.eq("userName", userName)); + + try { + entities = ReuseConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction >() { + @Override + public List run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ReuseDao.class).find(queryCondition); + } + }); + } catch (Exception e){ + FineLoggerFactory.getLogger().error("HW_excel导入:getLinkByUserName异常"); + e.printStackTrace(); + } + return entities; + } + +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/DialectCreator.java b/src/main/java/com/fr/plugin/decision/dialect/DialectCreator.java new file mode 100644 index 0000000..55b2822 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/DialectCreator.java @@ -0,0 +1,41 @@ +package com.fr.plugin.decision.dialect; + +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.dialect.gauss.GaussDialectConsummate; +import com.fr.plugin.decision.dialect.hive.HiveDialectConsummate; +import com.fr.plugin.decision.dialect.postgre.PostgreDialectConsummate; +import com.fr.plugin.decision.dialect.sybase.SybaseDialectConsummate; +import com.fr.stable.StringUtils; +import com.fr.stable.UrlDriver; +import com.fr.stable.fun.impl.AbstractDialectCreator; + +import java.sql.Connection; +import java.sql.SQLException; + +public class DialectCreator extends AbstractDialectCreator { + @Override + public Class generate(UrlDriver urlDriver) { + return null; + } + + @Override + public Class generate(Connection connection) { + try { + String DatabaseProductName = connection.getMetaData().getDatabaseProductName().trim().toUpperCase(); + FineLoggerFactory.getLogger().debug("DialectCreator:" + DatabaseProductName); + if (StringUtils.contains(DatabaseProductName,"POSTGRE")){ + return PostgreDialectConsummate.class; + } else if (StringUtils.contains(DatabaseProductName,"SYBASE")){ + return SybaseDialectConsummate.class; + } else if (StringUtils.contains(DatabaseProductName,"ZENITH")){ // gauss + return GaussDialectConsummate.class; + } else if (StringUtils.contains(DatabaseProductName,"HIVE")){ + return HiveDialectConsummate.class; + } + + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectColumnType2SQLExecutor.java b/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectColumnType2SQLExecutor.java new file mode 100644 index 0000000..5aa2bb8 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectColumnType2SQLExecutor.java @@ -0,0 +1,58 @@ +package com.fr.plugin.decision.dialect.gauss; + +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.base.key.column.typetosql.AbstractDialectColumnType2SQLExecutor; +import com.fr.data.core.db.dialect.base.key.column.typetosql.DialectColumnType2SQLParameter; +import com.fr.data.core.db.dialect.util.DialectUtils; + +public class GaussDialectColumnType2SQLExecutor extends AbstractDialectColumnType2SQLExecutor { + public GaussDialectColumnType2SQLExecutor(){ + + } + + @Override + public String execute(DialectColumnType2SQLParameter dialectColumnType2SQLParameter, Dialect dialect) { + int columnType = dialectColumnType2SQLParameter.getColumnType(); + String columnSize = dialectColumnType2SQLParameter.getParameter(); + switch(columnType) { + case -7: + return "bit"; + case -5: + return "numeric(" + columnSize + ")"; + case -4: + return "image"; + case -3: + return "varbinary(" + columnSize + ")"; + case -2: + return "binary(" + columnSize + ")"; + case -1: + return "text"; + case 1: + return "char(" + columnSize + ")"; + case 2: + return "numeric(" + columnSize + ")"; + case 3: + return "decimal(" + columnSize + ")"; + case 4: + return "int"; + case 8: + return "float"; + case 12: + return "varchar(" + columnSize + ")"; + case 16: + return "boolean"; + case 91: + return "datetime"; + case 92: + return "datetime"; + case 93: + return "datetime"; + case 2004: + return "image"; + case 2005: + return "text"; + default: + return DialectUtils.getTypeName(dialectColumnType2SQLParameter.getColumnType()); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectConsummate.java b/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectConsummate.java new file mode 100644 index 0000000..fdd3aad --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/gauss/GaussDialectConsummate.java @@ -0,0 +1,15 @@ +package com.fr.plugin.decision.dialect.gauss; + +import com.fr.data.core.db.dialect.GaussDBDialect; +import com.fr.data.core.db.dialect.base.DialectKeyConstants; +import com.fr.data.core.db.dialect.base.key.column.tosql.DialectColumn2SQLWithDoubleQuoteExecutor; +import com.fr.data.core.db.dialect.base.key.topn.KylinDialectCreateTOPNSQLExecutor; + +public class GaussDialectConsummate extends GaussDBDialect { + public GaussDialectConsummate(){ + super(); + this.putExecutor(DialectKeyConstants.COLUMN_2_SQL_KEY, new DialectColumn2SQLWithDoubleQuoteExecutor()); + this.putExecutor(DialectKeyConstants.COLUMN_TYPE_2_SQL_KEY, new GaussDialectColumnType2SQLExecutor()); + this.putExecutor(DialectKeyConstants.CREATE_TOP_N_SQL_KEY, new KylinDialectCreateTOPNSQLExecutor()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectColumnType2SQLExecutor.java b/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectColumnType2SQLExecutor.java new file mode 100644 index 0000000..416b133 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectColumnType2SQLExecutor.java @@ -0,0 +1,50 @@ +package com.fr.plugin.decision.dialect.hive; + +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.base.key.column.typetosql.AbstractDialectColumnType2SQLExecutor; +import com.fr.data.core.db.dialect.base.key.column.typetosql.DialectColumnType2SQLParameter; +import com.fr.data.core.db.dialect.util.DialectUtils; + +public class HiveDialectColumnType2SQLExecutor extends AbstractDialectColumnType2SQLExecutor { + public HiveDialectColumnType2SQLExecutor(){ + + } + + @Override + public String execute(DialectColumnType2SQLParameter dialectColumnType2SQLParameter, Dialect dialect) { + int columnType = dialectColumnType2SQLParameter.getColumnType(); + String columnSize = dialectColumnType2SQLParameter.getParameter(); + switch(columnType) { + case -7: + return "boolean"; + case 1: + return "char(" + columnSize + ")"; + case 2: + return "bigint"; + case 3: + return "decimal(" + columnSize + ")"; + case 4: + return "int"; + case 7: + return "float"; + case 8: + return "float"; + case 12: + return "varchar(" + columnSize + ")"; + case 16: + return "boolean"; + case 91: + return "date"; + case 92: + return "date"; + case 93: + return "date"; + case 2004: + return "image"; + case 2005: + return "text"; + default: + return DialectUtils.getTypeName(columnType); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectConsummate.java b/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectConsummate.java new file mode 100644 index 0000000..3d93a00 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/hive/HiveDialectConsummate.java @@ -0,0 +1,17 @@ +package com.fr.plugin.decision.dialect.hive; + +import com.fr.data.core.db.dialect.HiveDialect; +import com.fr.data.core.db.dialect.base.DialectKeyConstants; +import com.fr.data.core.db.dialect.base.key.column.tosql.DialectColumn2SQLWithBackQuoteExecutor; +import com.fr.data.core.db.dialect.base.key.init.column.DialectInitColumnUnSupportNullExecutor; +import com.fr.data.core.db.dialect.base.key.topn.KylinDialectCreateTOPNSQLExecutor; + +public class HiveDialectConsummate extends HiveDialect { + public HiveDialectConsummate(){ + super(); + this.putExecutor(DialectKeyConstants.COLUMN_2_SQL_KEY, new DialectColumn2SQLWithBackQuoteExecutor()); + this.putExecutor(DialectKeyConstants.COLUMN_TYPE_2_SQL_KEY, new HiveDialectColumnType2SQLExecutor()); + this.putExecutor(DialectKeyConstants.CREATE_TOP_N_SQL_KEY, new KylinDialectCreateTOPNSQLExecutor()); + this.putExecutor(DialectKeyConstants.INIT_COLUMN_KEY, new DialectInitColumnUnSupportNullExecutor()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/postgre/PostgreDialectConsummate.java b/src/main/java/com/fr/plugin/decision/dialect/postgre/PostgreDialectConsummate.java new file mode 100644 index 0000000..7024be7 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/postgre/PostgreDialectConsummate.java @@ -0,0 +1,13 @@ +package com.fr.plugin.decision.dialect.postgre; + +import com.fr.data.core.db.dialect.PostgreSQLDialect; +import com.fr.data.core.db.dialect.base.DialectKeyConstants; +import com.fr.data.core.db.dialect.base.key.topn.KylinDialectCreateTOPNSQLExecutor; + +public class PostgreDialectConsummate extends PostgreSQLDialect { + + public PostgreDialectConsummate(){ + super(); + this.putExecutor(DialectKeyConstants.CREATE_TOP_N_SQL_KEY, new KylinDialectCreateTOPNSQLExecutor()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/dialect/sybase/SybaseDialectConsummate.java b/src/main/java/com/fr/plugin/decision/dialect/sybase/SybaseDialectConsummate.java new file mode 100644 index 0000000..cd7023d --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/dialect/sybase/SybaseDialectConsummate.java @@ -0,0 +1,12 @@ +package com.fr.plugin.decision.dialect.sybase; + +import com.fr.data.core.db.dialect.SybaseDialect; +import com.fr.data.core.db.dialect.base.DialectKeyConstants; +import com.fr.data.core.db.dialect.base.key.column.tosql.DialectColumn2SQLWithDoubleQuoteExecutor; + +public class SybaseDialectConsummate extends SybaseDialect { + public SybaseDialectConsummate(){ + super(); + this.putExecutor(DialectKeyConstants.COLUMN_2_SQL_KEY, new DialectColumn2SQLWithDoubleQuoteExecutor()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/AddLinkHttpHandler.java b/src/main/java/com/fr/plugin/decision/http/AddLinkHttpHandler.java new file mode 100644 index 0000000..81da38f --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/AddLinkHttpHandler.java @@ -0,0 +1,53 @@ +package com.fr.plugin.decision.http; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.plugin.decision.dao.ExcelLinkService; +import com.fr.plugin.decision.dao.ExcelMngDao; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.UUID; + +public class AddLinkHttpHandler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/addlink"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + + final String name = WebUtils.getHTTPRequestParameter(req,"name"); + final String datasouces = WebUtils.getHTTPRequestParameter(req,"datasouces"); + final String schema = WebUtils.getHTTPRequestParameter(req,"schema"); + final String tablename = WebUtils.getHTTPRequestParameter(req,"tablename"); + final String createUser = UserService.getInstance().getCurrentUserIdFromCookie(req); + + try { + ExcelLinkService.getInstance().addLink(name, datasouces, schema, tablename, createUser); + WebUtils.printAsJSON(res, new JSONObject().put("status","success")); + return; + } catch (Exception e) { + e.printStackTrace(); + WebUtils.printAsJSON(res, new JSONObject().put("status","fail")); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/DeleteLinkHttpHandle.java b/src/main/java/com/fr/plugin/decision/http/DeleteLinkHttpHandle.java new file mode 100644 index 0000000..6d6a52d --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/DeleteLinkHttpHandle.java @@ -0,0 +1,73 @@ +package com.fr.plugin.decision.http; + +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.data.core.db.dml.Table; +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.core.DML; +import com.fr.plugin.decision.dao.ExcelLinkService; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Connection; +import java.sql.Statement; + +public class +DeleteLinkHttpHandle extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/delete"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + final String id = WebUtils.getHTTPRequestParameter(req,"id"); + + ExcelMngEntity entity = ExcelLinkService.getInstance().getLinkById(id); + if (entity == null){ + WebUtils.printAsJSON(res,new JSONObject().put("status","fail")); + FineLoggerFactory.getLogger().error("HW_excel导入:链接根据Id查询结果为空"); + return; + } + + String connection = entity.getDatasouces(); + String tableName = entity.getTablename(); + String schema = entity.getSchema(); + Connection conn = null; + + try { + conn = JdbcUtils.getConnection(connection); + Dialect dialect = DialectFactory.generateDialect(conn); + Table table = new Table(schema, tableName); + DML.deleteTable(dialect, conn, table); + + FineLoggerFactory.getLogger().info("表删除成功"); + ExcelLinkService.getInstance().deleteLinkById(id); + WebUtils.printAsJSON(res,new JSONObject().put("status","success")); + + } catch (Exception e) { + e.printStackTrace(); + FineLoggerFactory.getLogger().info("表删除失败"); + WebUtils.printAsJSON(res, new JSONObject().put("status","fail")); + } finally { + DBUtils.close(conn); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/GetAllUserListHandler.java b/src/main/java/com/fr/plugin/decision/http/GetAllUserListHandler.java new file mode 100644 index 0000000..fb6a9ce --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/GetAllUserListHandler.java @@ -0,0 +1,43 @@ +package com.fr.plugin.decision.http; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.decision.webservice.bean.user.UserSearchBean; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.utils.HttpUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +public class GetAllUserListHandler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/getAllUserList"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + try { + String adminId = UserService.getInstance().getAdminUserNameList().get(0); + UserSearchBean userSearchBean = HttpUtils.readObject(req, UserSearchBean.class); + Map userList = UserService.getInstance().getAllUsers(adminId, userSearchBean,false); + WebUtils.printAsJSON(res, new JSONObject().put("status", "success").put("data", userList)); + } catch (Exception e) { + e.printStackTrace(); + WebUtils.printAsJSON(res, new JSONObject().put("status", "fail")); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/GetAuthUserByLinkNameHandler.java b/src/main/java/com/fr/plugin/decision/http/GetAuthUserByLinkNameHandler.java new file mode 100644 index 0000000..fead32a --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/GetAuthUserByLinkNameHandler.java @@ -0,0 +1,53 @@ +package com.fr.plugin.decision.http; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.dao.ReuseEntity; +import com.fr.plugin.decision.dao.ReuseService; +import com.fr.plugin.decision.utils.HttpUtils; +import com.fr.stable.StringUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +public class GetAuthUserByLinkNameHandler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/getAuthUserList"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + String linkName = HttpUtils.readJson(req).getString("linkName"); + if (StringUtils.isBlank(linkName)){ + WebUtils.printAsJSON(res, new JSONObject().put("status", "fail")); + return; + } + JSONArray result = new JSONArray(); + try { + List entities = ReuseService.getInstance().getUserByLinkName(linkName); + for (ReuseEntity entity : entities) { + result.add(entity.getUserName()); + } + + WebUtils.printAsJSON(res, new JSONObject().put("status", "success").put("data", result)); + } catch (Exception e) { + WebUtils.printAsJSON(res, new JSONObject().put("status", "fail")); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/GetSchemaHttpHandler.java b/src/main/java/com/fr/plugin/decision/http/GetSchemaHttpHandler.java new file mode 100644 index 0000000..991cc65 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/GetSchemaHttpHandler.java @@ -0,0 +1,62 @@ +package com.fr.plugin.decision.http; + +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.stable.StringUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +public class GetSchemaHttpHandler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/getSchema"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + String connectionName = WebUtils.getHTTPRequestParameter(req, "connectionName"); + Connection conn = null; + JSONArray result = new JSONArray(); + + // schema 添加一条为空的缺省选项 + result.add(new JSONObject().put("value", "缺省").put("text","缺省")); + + try{ + conn = JdbcUtils.getConnection(connectionName); + Dialect dialect = DialectFactory.generateDialect(conn); + String[] schemaArray = dialect.getSchemas(conn); + + for (int i=0; i entities = ExcelLinkService.getInstance().getAllLink(key, createUser); + List reuseEntities = ReuseService.getInstance().getLinkByUserName(createUser); + + for (ExcelMngEntity entity : entities) { + result.add(new JSONObject().put("id",entity.getId()).put("name",entity.getName()).put("create","true")); + } + if (containReuse) { + for (ReuseEntity entity: reuseEntities) { + result.add(new JSONObject().put("id",entity.getId()).put("name",entity.getLinkName()).put("create","false")); + } + } + + WebUtils.printAsJSON(res,new JSONObject().put("data",result)); + return; + + } catch (Exception e) { + e.printStackTrace(); + WebUtils.printAsJSON(res,new JSONObject().put("status","fail")); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/QueryTableColAttrHttpHandle.java b/src/main/java/com/fr/plugin/decision/http/QueryTableColAttrHttpHandle.java new file mode 100644 index 0000000..bf964a5 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/QueryTableColAttrHttpHandle.java @@ -0,0 +1,50 @@ +package com.fr.plugin.decision.http; + +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.plugin.decision.dao.ExcelLinkService; +import com.fr.plugin.decision.dao.ExcelMngDao; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSetMetaData; + +public class QueryTableColAttrHttpHandle extends QueryTableDataHttpHandle { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/querycolattr"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + protected void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) throws Exception { + setQueryCount(1); + super.deal(req, res, para, result); + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/QueryTableDataHttpHandle.java b/src/main/java/com/fr/plugin/decision/http/QueryTableDataHttpHandle.java new file mode 100644 index 0000000..011b0c7 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/QueryTableDataHttpHandle.java @@ -0,0 +1,125 @@ +package com.fr.plugin.decision.http; + +import com.fr.data.core.db.ColumnInformation; +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.dialect.Dialect; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.data.core.db.dml.Table; +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.plugin.decision.dao.ExcelMngDao; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.plugin.decision.request.handler.HWAbstractHandler; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public class QueryTableDataHttpHandle extends HWAbstractHandler { + + private int queryCount = 5000; + private JSONObject para ; + private JSONObject result ; + + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/querydata"; + } + + @Override + public boolean isPublic() { + return false; + } + + public int getQueryCount() { + return queryCount; + } + + public void setQueryCount(int queryCount) { + this.queryCount = queryCount; + } + + @Override + protected void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) throws Exception { + final String name = para.getString("name"); + ExcelMngEntity entity = null; + try { + entity = ExcelMngConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ExcelMngDao.class).findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("name",name))); + } + }); + } catch (Exception e) { + e.printStackTrace(); + WebUtils.printAsJSON(res,new JSONObject().put("status","fail")); + } + + String connection = entity.getDatasouces(); + String tableName = entity.getTablename(); + String schema = entity.getSchema(); + Connection conn = null; + Statement smt = null; + List primaryKeyCol = new ArrayList<>(); + + try { + conn = JdbcUtils.getConnection(connection); + smt = conn.createStatement(); + Dialect dialect = DialectFactory.generateDialect(conn); + Table table = new Table(schema, tableName); + ResultSet resultSet = smt.executeQuery(dialect.getTopNRowSql(queryCount, table)); + ColumnInformation[] columnInformations = dialect.getColumnInformation(conn, resultSet, StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY); + + /* + * catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。 + * schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%"); + * table - 表名称;可包含单字符通配符("_"),或多字符通配符("%"); + */ + DatabaseMetaData databaseMetaData = conn.getMetaData(); + ResultSet primaryKeysResult = databaseMetaData.getPrimaryKeys(null, schema, tableName); + while(primaryKeysResult.next()){ + primaryKeyCol.add(primaryKeysResult.getString(4)); + } + JSONArray tableData = JdbcUtils.formatRsToTableData(resultSet); + JSONArray colAttr = JdbcUtils.formatRs2ColAttr(columnInformations); + JdbcUtils.addPrimaryKeyColAttr(colAttr, primaryKeyCol); + + result.put(SUCCESS,"success").put("data", + new JSONObject() + .put("tableData", tableData) + .put("colAttr", colAttr) + .put("tableAttr", new JSONObject() + .put("connection", connection) + .put("schema", schema) + .put("tableName", tableName) + .put("aliasName", name) + ) + ); + } catch (Exception e){ + e.printStackTrace(); + } finally { + DBUtils.close(smt); + DBUtils.close(conn); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/RenameHttpHandle.java b/src/main/java/com/fr/plugin/decision/http/RenameHttpHandle.java new file mode 100644 index 0000000..2db5a30 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/RenameHttpHandle.java @@ -0,0 +1,65 @@ +package com.fr.plugin.decision.http; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.ExcelMngConfigAccessBridge; +import com.fr.plugin.decision.dao.ExcelMngDao; +import com.fr.plugin.decision.dao.ExcelMngEntity; +import com.fr.stable.db.accessor.DBAccessor; +import com.fr.stable.db.action.DBAction; +import com.fr.stable.db.dao.DAOContext; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class RenameHttpHandle extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/rename"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + final String name = WebUtils.getHTTPRequestParameter(req, "name"); + final String id = WebUtils.getHTTPRequestParameter(req,"id"); + try { + + final ExcelMngEntity entity = ExcelMngConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + return daoContext.getDAO(ExcelMngDao.class).findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id",id))); + } + }); + + entity.setName(name); + + ExcelMngConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction() { + @Override + public ExcelMngEntity run(DAOContext daoContext) throws Exception { + daoContext.getDAO(ExcelMngDao.class).update(entity); + return null; + } + }); + + WebUtils.printAsJSON(res,new JSONObject().put("status","success")); + return; + } catch (Exception e) { + e.printStackTrace(); + WebUtils.printAsJSON(res,new JSONObject().put("status","fail")); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/http/UpdateLinkAuthHandler.java b/src/main/java/com/fr/plugin/decision/http/UpdateLinkAuthHandler.java new file mode 100644 index 0000000..df34f28 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/http/UpdateLinkAuthHandler.java @@ -0,0 +1,41 @@ +package com.fr.plugin.decision.http; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.dao.ReuseService; +import com.fr.plugin.decision.utils.HttpUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UpdateLinkAuthHandler extends BaseHttpHandler { + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return "/excelmng/updateLinkAuth"; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + JSONObject para = HttpUtils.readJson(req); + boolean isAdd = para.getBoolean("auth"); + if (isAdd) { + ReuseService.getInstance().addUserOnLinkName(para.getString("userName"), para.getString("linkName")); + } else { + ReuseService.getInstance().deleteUserOnLinkName(para.getString("userName"), para.getString("linkName")); + } + + WebUtils.printAsJSON(res, new JSONObject().put("status","success")); + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/HWHandlerProvider.java b/src/main/java/com/fr/plugin/decision/request/HWHandlerProvider.java new file mode 100644 index 0000000..6fb20e3 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/HWHandlerProvider.java @@ -0,0 +1,23 @@ +package com.fr.plugin.decision.request; + +import com.fr.decision.fun.HttpHandler; +import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; +import com.fr.plugin.decision.request.handler.ExcelFiledHandler; +import com.fr.plugin.decision.request.handler.ExcelSheetCountHandler; +import com.fr.plugin.decision.request.handler.HWFileUploadHander; +import com.fr.plugin.decision.request.handler.TableDataImport; + +/** + * created by ezreal 2020/1/12 + */ +public class HWHandlerProvider extends AbstractHttpHandlerProvider { + @Override + public HttpHandler[] registerHandlers() { + return new HttpHandler[]{ + new HWFileUploadHander(), + new ExcelSheetCountHandler(), + new ExcelFiledHandler(), + new TableDataImport() + }; + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/HWURLAliasProvider.java b/src/main/java/com/fr/plugin/decision/request/HWURLAliasProvider.java new file mode 100644 index 0000000..7bf64d5 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/HWURLAliasProvider.java @@ -0,0 +1,26 @@ +package com.fr.plugin.decision.request; + +import com.fr.decision.fun.impl.AbstractURLAliasProvider; +import com.fr.decision.webservice.url.alias.URLAlias; +import com.fr.decision.webservice.url.alias.URLAliasFactory; +import com.fr.plugin.decision.request.handler.ExcelFiledHandler; +import com.fr.plugin.decision.request.handler.ExcelSheetCountHandler; +import com.fr.plugin.decision.request.handler.HWFileUploadHander; +import com.fr.plugin.decision.request.handler.TableDataImport; + +/** + * created by ezreal 2020/1/12 + */ +public class HWURLAliasProvider extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + URLAliasFactory.createPluginAlias(HWFileUploadHander.PATH, HWFileUploadHander.PATH,true), + URLAliasFactory.createPluginAlias(ExcelSheetCountHandler.PATH,ExcelSheetCountHandler.PATH,false), + URLAliasFactory.createPluginAlias(ExcelFiledHandler.PATH,ExcelFiledHandler.PATH,false), + URLAliasFactory.createPluginAlias(TableDataImport.PATH,TableDataImport.PATH,false), + + + }; + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/handler/ExcelFiledHandler.java b/src/main/java/com/fr/plugin/decision/request/handler/ExcelFiledHandler.java new file mode 100644 index 0000000..3b354f5 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/handler/ExcelFiledHandler.java @@ -0,0 +1,62 @@ +package com.fr.plugin.decision.request.handler; + +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.HWUtils; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.poi.hssf.usermodel.HSSFSheet; +import com.fr.third.org.apache.poi.hssf.usermodel.HSSFWorkbook; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * created by ezreal 2020/1/12 + */ +public class ExcelFiledHandler extends HWAbstractHandler { + public static final String PATH = "/hw/excel/filed"; + private final int MAX_ROW = 1000000; + + @Override + public String getPath() { + return PATH; + } + + + @Override + protected void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) { + String attachId = para.getString("attachId"); + String fileName = para.getString("fileName", StringUtils.EMPTY); + + if (fileName.endsWith(".xlsx")) { + XSSFWorkbook sheets = HWUtils.getExcelWork(attachId); + if (sheets != null) { + int sheetNo = para.getInt("sheetNo"); + XSSFSheet xssfSheet = sheets.getSheetAt(sheetNo); + int count = xssfSheet.getLastRowNum();//总行数 + if (count >= MAX_ROW) {//大于最大行数就提示 + result.put("msg", "数据大于" + MAX_ROW + "行"); + return; + } + JSONArray data = HWUtils.getSheetFiled(xssfSheet); + result.put(SUCCESS, true).put("data", data); + } + } else if (fileName.endsWith(".xls")) { + HSSFWorkbook excel2003Work = HWUtils.getExcel2003Work(attachId); + if (excel2003Work != null) { + int sheetNo = para.getInt("sheetNo"); + HSSFSheet sheet = excel2003Work.getSheetAt(sheetNo); + int count = sheet.getLastRowNum();//总行数 + if (count >= MAX_ROW) {//大于最大行数就提示 + result.put("msg", "数据大于" + MAX_ROW + "行"); + return; + } + JSONArray data = HWUtils.get2003SheetFiled(sheet); + result.put(SUCCESS, true).put("data", data); + } + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/handler/ExcelSheetCountHandler.java b/src/main/java/com/fr/plugin/decision/request/handler/ExcelSheetCountHandler.java new file mode 100644 index 0000000..80ed16b --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/handler/ExcelSheetCountHandler.java @@ -0,0 +1,66 @@ +package com.fr.plugin.decision.request.handler; + +import com.fr.cache.Attachment; +import com.fr.cache.AttachmentSource; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.decision.HWUtils; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.poi.hssf.usermodel.HSSFWorkbook; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; + +/** + * created by ezreal 2020/1/12 + */ +public class ExcelSheetCountHandler extends HWAbstractHandler { + public static final String PATH = "/hw/excel/sheet"; + + @Override + public String getPath() { + return PATH; + } + + + @Override + protected void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) { + try { + String attachId = para.getString("attachId"); + String fileName = para.getString("fileName", StringUtils.EMPTY); + int count = 1; + JSONArray data = JSONArray.create(); + if (fileName.endsWith(".xlsx")) { + XSSFWorkbook sheets = HWUtils.getExcelWork(attachId); + + if (sheets != null) { + count = sheets.getNumberOfSheets(); + for (int i = 0; i < count; i++) { + JSONObject object = JSONObject.create(); + object.put("value", i).put("text", sheets.getSheetName(i)); + data.add(object); + } + result.put(SUCCESS, true).put("data", data); + } + } else if (fileName.endsWith(".xls")) { + HSSFWorkbook excel2003Work = HWUtils.getExcel2003Work(attachId); + if (excel2003Work != null) { + count = excel2003Work.getNumberOfSheets(); + for (int i = 0; i < count; i++) { + JSONObject object = JSONObject.create(); + object.put("value", i).put("text", excel2003Work.getSheetName(i)); + data.add(object); + } + result.put(SUCCESS, true).put("data", data); + } + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/handler/HWAbstractHandler.java b/src/main/java/com/fr/plugin/decision/request/handler/HWAbstractHandler.java new file mode 100644 index 0000000..abd9173 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/handler/HWAbstractHandler.java @@ -0,0 +1,64 @@ +package com.fr.plugin.decision.request.handler; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONObject; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +/** + * created by ezreal 2020/1/12 + */ +public abstract class HWAbstractHandler extends BaseHttpHandler { + public static String SUCCESS="success"; + + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public boolean isPublic() { + return false; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + JSONObject para=getParaJSON(req); + JSONObject result=JSONObject.create().put(SUCCESS,false); + deal(req,res,para,result); + WebUtils.printAsJSON(res,result); + } + protected abstract void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) throws Exception; + + /** + * 获取json参数方法 + * + * @param req 请求 + * @return + * @throws IOException + * @throws UnsupportedEncodingException + */ + public JSONObject getParaJSON(HttpServletRequest req) throws IOException, UnsupportedEncodingException { + JSONObject result = JSONObject.create(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream(), StandardCharsets.UTF_8)); + String line = null; + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null) { + sb.append(line); + } + return new JSONObject(sb.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/handler/HWFileUploadHander.java b/src/main/java/com/fr/plugin/decision/request/handler/HWFileUploadHander.java new file mode 100644 index 0000000..902e7f8 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/handler/HWFileUploadHander.java @@ -0,0 +1,40 @@ +package com.fr.plugin.decision.request.handler; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.decision.webservice.v10.attach.AttachmentService; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * created by ezreal 2020/1/12 + */ +public class HWFileUploadHander extends BaseHttpHandler { + public static final String PATH = "/hw/file/upload"; + + @Override + public RequestMethod getMethod() { + return null; + } + + @Override + public String getPath() { + return PATH; + } + + @Override + public boolean isPublic() { + return true; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + int width = WebUtils.getHTTPRequestIntParameter(req, "width"); + int height = WebUtils.getHTTPRequestIntParameter(req, "height"); + String fileName = WebUtils.getHTTPRequestParameter(req, "filename"); + AttachmentService.getInstance().uploadAttach(req, res, width, height, fileName); + + } +} diff --git a/src/main/java/com/fr/plugin/decision/request/handler/TableDataImport.java b/src/main/java/com/fr/plugin/decision/request/handler/TableDataImport.java new file mode 100644 index 0000000..72d8489 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/request/handler/TableDataImport.java @@ -0,0 +1,91 @@ +package com.fr.plugin.decision.request.handler; + +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.HWUtils; +import com.fr.plugin.decision.core.*; +import com.fr.plugin.decision.core.action.ExcelDmlAction; +import com.fr.plugin.decision.dao.ExcelLinkService; +import com.fr.plugin.decision.utils.JdbcUtils; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.poi.hssf.usermodel.HSSFSheet; +import com.fr.third.org.apache.poi.hssf.usermodel.HSSFWorkbook; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet; +import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Connection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * created by ezreal 2020/1/13 + */ +public class TableDataImport extends HWAbstractHandler { + public static final String PATH="/hw/table/import"; + @Override + protected void deal(HttpServletRequest req, HttpServletResponse res, JSONObject para, JSONObject result) throws Exception { + JSONArray items=para.getJSONArray("items"); + JSONObject sheetInfo=para.getJSONObject("sheetInfo"); + String attachId=sheetInfo.getString("attachId"); + String fileName=sheetInfo.getString("fileName"); + int sheetNo=sheetInfo.getInt("sheetNo"); + Map values=new HashMap(); + if(fileName.endsWith(".xlsx")){ + XSSFWorkbook excelWork = HWUtils.getExcelWork(attachId); + if(excelWork!=null){ + XSSFSheet sheet = excelWork.getSheetAt(sheetNo); + JSONObject tableCol=JSONObject.create(); + for(int i=0;i T readObject(HttpServletRequest req, Class cls) throws Exception { + ObjectMapper map = new ObjectMapper(); + return map.readValue(req.getInputStream(), cls); + } + + public static JSONObject readJson(HttpServletRequest request) throws IOException { + BufferedReader bufferReader = new BufferedReader(request.getReader()); + StringBuilder sb = new StringBuilder(); + String line = null; + while ((line = bufferReader.readLine()) != null) { + sb.append(line); + } + return new JSONObject(sb.toString()); + } +} diff --git a/src/main/java/com/fr/plugin/decision/utils/JdbcUtils.java b/src/main/java/com/fr/plugin/decision/utils/JdbcUtils.java new file mode 100644 index 0000000..40d3836 --- /dev/null +++ b/src/main/java/com/fr/plugin/decision/utils/JdbcUtils.java @@ -0,0 +1,566 @@ +package com.fr.plugin.decision.utils; + +import com.fr.data.core.db.ColumnInformation; +import com.fr.data.core.db.DBUtils; +import com.fr.data.impl.NameDatabaseConnection; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.decision.dialect.hive.HiveDialectConsummate; +import com.fr.report.core.A.S; +import com.fr.stable.StringUtils; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; +import java.sql.*; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class JdbcUtils { + + public static Connection getConnection(String connection) { + NameDatabaseConnection db = new NameDatabaseConnection(connection); + try { + Connection conn = db.createConnection(); + return conn; + } catch (Exception e) { + FineLoggerFactory.getLogger().error("HW_excel导入:" + connection + "数据连接创建失败"); + } + return null; + } + + public static String getCreateSql(int type, String tableName, JSONArray items){ + String createSql = ""; + switch (type){ + case 1: + createSql = getOracleCreateSql(items,tableName); + break; + case 2: + createSql = getSqlServerCreateSql(items,tableName); + break; + case 3: + createSql = getMysqlCreateSql(items,tableName); + break; + case 4: + createSql = getPostGreCreateSql(items, tableName); + break; + case 5: + createSql = getSybaseCreateSql(items,tableName); + break; + } + FineLoggerFactory.getLogger().debug("HW_excel导入:建表语句为 " + createSql); + return createSql; + } + + /* + mysql boolean 0/1 + oracle char(1) 0/1 不允许为空 + sqlServer bit 0/1 + PostGre boolean 0/1/true/false + sybase bit 0/1 不允许为空 + */ + + private static String getMysqlCreateSql(JSONArray items, String tableName){ + String sql = " ( "; + for (Object ja : items){ + JSONObject item = new JSONObject(ja.toString()); + String colname = "`" + item.getString("colName") + "`"; + int colType = item.getInt("colType"); + String colLen = item.getString("colLength"); + String colTypeStr ; + switch (colType){ + case 1: + colTypeStr = colname + " int,"; + break; + case 3: + colTypeStr = colname + " boolean,"; + break; + case 4: + colTypeStr = colname + " datetime,"; + break; + case 5: + colTypeStr = colname + " decimal(" + colLen.split(",")[0]+","+ colLen.split(",")[1] + "),"; + break; + default: + colTypeStr = colname + " varchar(" +colLen + "),"; + break; + } + + sql += colTypeStr; + } + return "create table "+ tableName + sql.substring(0,sql.length()-1) +" )" ; + } + + private static String getSqlServerCreateSql(JSONArray items, String tableName){ + String sql = " ( "; + for (Object ja : items){ + JSONObject item = new JSONObject(ja.toString()); + String colname = "[" + item.getString("colName") + "]" ; + int colType = item.getInt("colType"); + String colLen = item.getString("colLength"); + String colTypeStr ; + switch (colType){ + case 1: + colTypeStr = colname + " int,"; + break; + case 3: + colTypeStr = colname + " bit,"; + break; + case 4: + colTypeStr = colname + " datetime,"; + break; + case 5: + colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),"; + break; + default: + colTypeStr = colname + " varchar(" +colLen + "),"; + break; + } + + sql += colTypeStr; + } + return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ; + } + + + private static String getOracleCreateSql(JSONArray items, String tableName){ + String sql = " ( "; + for (Object ja : items){ + JSONObject item = new JSONObject(ja.toString()); + String colname = "\"" + item.getString("colName") + "\""; + int colType = item.getInt("colType"); + String colLen = item.getString("colLength"); + String colTypeStr ; + switch (colType){ + case 1: + int len = Integer.parseInt(colLen) > 38 ? 38:Integer.parseInt(colLen); + colTypeStr = colname + " number(" + len + "),"; + break; + case 3: + colTypeStr = colname + " char(1),"; + break; + case 4: + colTypeStr = colname + " date,"; + break; + case 5: + colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),"; + break; + default: + colTypeStr = colname + " varchar2(" +colLen + "),"; + break; + } + + sql += colTypeStr; + } + return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ; + } + + private static String getPostGreCreateSql(JSONArray items, String tableName){ + String sql = " ( "; + for (Object ja : items){ + JSONObject item = new JSONObject(ja.toString()); + String colname = "\"" + item.getString("colName") + "\""; + int colType = item.getInt("colType"); + String colLen = item.getString("colLength"); + String colTypeStr ; + switch (colType){ + case 1: + colTypeStr = colname + " integer,"; + break; + case 3: + colTypeStr = colname + " boolean,"; + break; + case 4: + colTypeStr = colname + " date,"; + break; + case 5: + colTypeStr = colname + " decimal(" + colLen.split(",")[0] + ","+ colLen.split(",")[1] + "),"; + break; + default: + colTypeStr = colname + " varchar(" + colLen + "),"; + break; + } + + sql += colTypeStr; + } + return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ; + } + + private static String getSybaseCreateSql(JSONArray items, String tableName){ + String sql = " ( "; + for (Object ja : items){ + JSONObject item = new JSONObject(ja.toString()); + String colname = "[" + item.getString("colName") + "]" ; + int colType = item.getInt("colType"); + String colLen = item.getString("colLength"); + String colTypeStr ; + switch (colType){ + case 1: + colTypeStr = colname + " int,"; + break; + case 3: + colTypeStr = colname + " bit,"; + break; + case 4: + colTypeStr = colname + " date,"; + break; + case 5: + colTypeStr = colname + " decimal(" + colLen.split(",")[0] + "," + colLen.split(",")[1] + "),"; + break; + default: + colTypeStr = colname + " varchar(" + colLen + "),"; + break; + } + + sql += colTypeStr; + } + return "create table "+ tableName + sql.substring(0,sql.length()-1) + " )" ; + } + + public static String getInsertSql(String tableName, JSONArray items, int type){ + String colStr = " ("; + + StringBuffer stringBuffer = new StringBuffer(" values ("); + for (int i = 0, len = items.size(); i < len; i++) { + String colName = dealColName(items.getJSONObject(i).getString("colName"), type); + if (i == len - 1) { + colStr += colName + ")"; + stringBuffer.append("?)"); + } else { + colStr += colName + ","; + stringBuffer.append("?,"); + } + } + + FineLoggerFactory.getLogger().debug("HW_excel导入:插入语句为 " + "insert into " + tableName + colStr + stringBuffer.toString()); + return "insert into " + tableName + colStr + stringBuffer.toString(); + } + + private static String dealColName(String colName, int type){ + switch (type){ + case 1: + case 4: + return "\"" + colName + "\""; + case 2: + case 5: + return "[" + colName + "]"; + case 3: + return "`" + colName + "`"; + } + return ""; + } + + public static String getDeleteSql(String tableName, int type){ + return "delete from " + tableName; + } + + public static String getDropSql(String tableName){ + return "drop table " + tableName; + } + + public static String getQuerySql(String tableName, int type, String schema){ + switch (type){ + case 1: + return "select * from " + tableName + " rownum < 5000"; + case 2: + case 5: + return "select top(5000) * from " + tableName; + case 3: + case 4: + return "select * from " + tableName + " limit 0,5000"; + default: + FineLoggerFactory.getLogger().debug("HW_excel导入:getQuerySql返回为空"); + return ""; + } + } + + public static String getQueryColSql(String tableName, int type, String schema){ + return "select * from " + tableName + " where 1=2"; + } + + /* + oracle:1 + sqlserver:2 + mysql:3 + postgresql:4 + sybase:5 + */ + public static int getConnectionType(Connection conn) throws SQLException { + String DatabaseProductName = conn.getMetaData().getDatabaseProductName().trim().toUpperCase(); + FineLoggerFactory.getLogger().debug("HW_excel导入:数据库 ProductName 为: " + DatabaseProductName); + + if (StringUtils.contains(DatabaseProductName,"ORACLE")){ + return 1; + } + if (StringUtils.contains(DatabaseProductName,"SQL SERVER")) { + return 2; + } + if (StringUtils.contains(DatabaseProductName,"MYSQL")){ + return 3; + } + if (StringUtils.contains(DatabaseProductName,"POSTGRE")){ + return 4; + } + if (StringUtils.contains(DatabaseProductName,"SYBASE")){ + return 5; + } + + return 0; + } + + private static void dealPrepareStatement(PreparedStatement pstm, String value, int index, int type, int databaseType) throws SQLException { + try { + switch (type) { + case 1: + pstm.setInt(index, Double.valueOf(value).intValue()); + break; + case 3: + switch (value.toUpperCase()) { + case "TRUE": + case "1": + if (databaseType == 4){ + pstm.setBoolean(index, true); + } else { + pstm.setInt(index, 1); + } break; + case "FALSE": + case "0": + if (databaseType == 4){ + pstm.setBoolean(index, false); + } else { + pstm.setInt(index, 0); + } break; + } + break; + case 4: + java.sql.Date date = java.sql.Date.valueOf(value); + pstm.setDate(index, date); + break; + case 5: + pstm.setFloat(index, Float.parseFloat(value)); + break; + default: + if (isNumeric(value)){ + pstm.setString(index, value.split("\\.")[0]); + } else { + pstm.setString(index, value); + } + } + } catch (Exception e){ + pstm.setString(index, value); + } + } + + + /** + * 匹配是否为数字 + * @param str 可能为中文,也可能是-19162431.1254,不使用BigDecimal的话,变成-1.91624311254E7 + */ + public static boolean isNumeric(String str) { + // 该正则表达式可以匹配所有的数字 包括负数 + Pattern pattern = Pattern.compile("-?[0-9]+(\\.0)"); + String bigStr; + try { + bigStr = new BigDecimal(str).toString(); + } catch (Exception e) { + return false;//异常 说明包含非数字。 + } + + Matcher isNum = pattern.matcher(bigStr); // matcher是全匹配 + if (!isNum.matches()) { + return false; + } + return true; + } + + /** + * 把从数据库中查询出来的 ResultSetMetaData 转为 JSONArray + */ + public static JSONArray formatRsToTableData(ResultSet rs) throws Exception{ + ResultSetMetaData md = rs.getMetaData(); + + JSONArray jsonArray = new JSONArray(); + while(rs.next()) { + JSONArray rowArray = new JSONArray(); + for(int i=1; i<=md.getColumnCount(); i++) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("text", rs.getString(i)); + rowArray.add(jsonObject); + } + jsonArray.add(rowArray); + } + return jsonArray; + } + + public static JSONArray formatRs2ColAttr(ColumnInformation[] columnInformations){ + JSONArray colsAttr = JSONArray.create(); + for(int i = 0; i < columnInformations.length; i++) { + JSONObject colAttr = JSONObject.create(); + colAttr.put("colType", columnInformations[i].getColumnType()); + colAttr.put("colName", columnInformations[i].getColumnName()); + colAttr.put("colLength", columnInformations[i].getColumnSize()); + colAttr.put("id",i+1); + colAttr.put("excelCol",""); + colsAttr.add(colAttr); + } + return colsAttr; + } + + public static void addPrimaryKeyColAttr(JSONArray colsAttr, List primaryKeyCol) { + for (Object col:colsAttr) { + String colName = ((JSONObject) col).getString("colName"); + if (primaryKeyCol.contains(colName)) { + ((JSONObject) col).put("primaryKey", true); + } else { + ((JSONObject) col).put("primaryKey", false); + } + } + } + + public static JSONArray formatRsToJsonArray(ResultSet rs) throws Exception{ + ResultSetMetaData md = rs.getMetaData(); + + JSONArray jsonArray = new JSONArray(); + while(rs.next()) { + JSONObject jsonObject = new JSONObject(); + for(int i=1; i<=md.getColumnCount(); i++) { + jsonObject.put(md.getColumnName(i), rs.getString(i)); + } + jsonArray.add(jsonObject); + } + return jsonArray; + } + + + public static int changeStr2Type(String typeStr , int connType, int scale){ + int type; + switch (typeStr.toUpperCase()){ + case "INT": + case "INT4": + case "INTEGER": + type = 1; break; + case "BIT": + case "CHAR": + case "BOOL": + case "TINYINT": + case "BOOLEAN": + type = 3; break; + case "DATE": + case "DATETIME": + type = 4; break; + case "DECIMAL": + case "NUMERIC": + type = 5; break; + case "NUMBER": // oracle 整形和小数都是 number 类型,需要判断 scale + if (scale == 0) { + type = 1; break; + } else { + type = 5; break; + } + + default: + type = 2; + } + return type; + } + + public static int pstsExecBatch(PreparedStatement psts, JSONArray items, Map values, int type) throws SQLException { + int count = 0; + for (int j =0; j< values.get(items.getJSONObject(0).get("colName")).size(); j++) { + for (int k=0; k 0; + }, + errorText: "必须是数字",*/ + id: item.id, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + self.store.updateItemColLength(this.options.id,this.getValue()); + } + } + ] + }; + result.push(colLength); + var excelCol = { + type: "bi.text_value_combo", + widgetType: "bi.text_editor", + value: item.excelCol, + items:self.model.excelItems, + id: item.id, + ref: function (_ref) { + self.excelBox.push(_ref); + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + self.store.updateItemExcelCol(this.options.id,this.getValue()[0]); + } + } + ] + }; + result.push(excelCol); + var primaryKey = { + type: "bi.checkbox", + widgetType: "bi.checkbox", + selected: item.primaryKey, + disabled: !o.add, + id: item.id, + ref: function(_ref){ + self.primaryKeyBox.push(_ref); + }, + handler: function () { + var id = this.options.id; + self.store.updateItemPrimaryKey(id, this.isSelected()); + /*this.isSelected() && BI.each(self.primaryKeyBox, function (index, item) { + if (id != item.options.id) { + item.setSelected(false); + } + });*/ + } + }; + result.push(primaryKey); + var deleteButton = { + type: "bi.button", + widgetType: "bi.button", + disabled: !o.add, + value: "删除", + handler: function () { + self.store.removeItems(this.options.id); + }, + id: item.id + }; + result.push(deleteButton); + allResult.push(result); + } + return allResult; + }, + + popularExcelBox:function (vals) { + console.log("popularExcelBox"); + var self = this; + BI.each(self.excelBox, function (index, item) { + item.populate(vals); + item.setValue(self.model.perItems[index].excelCol); + }) + } + }); + BI.shortcut("dec.hw.table.col.attr", info); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/attr/col.attr.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/attr/col.attr.model.js new file mode 100644 index 0000000..0f6bd22 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/attr/col.attr.model.js @@ -0,0 +1,104 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + _init: function () { + this.add = this.options.add; + }, + + state: function () { + return { + perCount: 5, + page: 1 + }; + }, + + context: ["items", "connection", "schema", "aliasName", "tableName", "excelItems", "infoId"], + + computed: { + perItems: function () { + var self = this; + var start = (self.model.page - 1) * self.model.perCount; + var end = self.model.page * self.model.perCount; + var self = this; + return BI.filter(self.model.items, function (index, item) { + return index + 1 > start && index + 1 <= end; + }) + }, + count: function () { + return this.model.items.length; + } + }, + watch:{ + count: function () { + var allPageCount = Math.ceil(this.model.count/ this.model.perCount); + if(allPageCount<=0){ + allPageCount=1; + } + if (allPageCount < this.model.page) { + this.setPage(allPageCount); + } + } + }, + + actions: { + initData: function (callback) { + callback(); + }, + setPage: function (v) { + this.model.page = v; + }, + addItems: function () { + this.model.items = BI.concat(this.model.items, { + id: BI.UUID(), + colName: "", + colType: "12", + colLength: 255, + excelCol: "", + primaryKey: false + }) + }, + removeItems: function (id) { + BI.remove(this.model.items, function (index, item) { + return item.id == id + }); + }, + updateItemColName:function (id, colName) { + BI.each(this.model.items,function (index, item) { + if(item.id==id){ + item.colName=colName; + } + }); + }, + updateItemColType:function (id, colType) { + BI.each(this.model.items,function (index, item) { + if(item.id==id){ + item.colType=colType; + } + }); + }, + updateItemColLength:function (id, colLength) { + BI.each(this.model.items,function (index, item) { + if(item.id==id){ + item.colLength=colLength; + } + }); + }, + updateItemExcelCol:function (id, excelCol) { + BI.each(this.model.items,function (index, item) { + if(item.id==id){ + item.excelCol=excelCol; + } + }); + }, + updateItemPrimaryKey:function (id, primaryKey) { + BI.each(this.model.items,function (index, item) { + if(item.id==id){ + item.primaryKey=primaryKey; + } /*else { + item.primaryKey=false; + }*/ + }); + } + } + }); + BI.model("dec.hw.table.col.attr.model", Model); +})(); diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/attr/sheet.masker.js b/src/main/resources/com/fr/plugin/hw/decision/js/attr/sheet.masker.js new file mode 100644 index 0000000..8198020 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/attr/sheet.masker.js @@ -0,0 +1,127 @@ +/** + * 用于测试上传,上传文件等,从上传中到成功或者失败的状态 + * qcc + * 2018/3/28 + */ + +!(function () { + var Masker = BI.inherit(BI.Widget, { + props: { + baseCls: "dec-status-change-masker", + $testId: "dec-status-change-masker", + waitingText: BI.i18nText("Dec-Reg_Upload_Waiting"), + successText: BI.i18nText("Dec-Reg_Upload_Success"), + failText: BI.i18nText("Dec-Reg_Upload_Fail") + }, + + + watch: {}, + + render: function () { + var self = this, o = this.options; + return { + type: "bi.center_adapt", + cls: "bi-z-index-mask", + items: [{ + type: "bi.center_adapt", + items: [{ + type: "bi.absolute", + width: 300, + height: 150, + cls: "bi-card", + items: [{ + el: { + type: "bi.vtape", + items: [{ + el: { + type: "bi.vertical_adapt", + items: [{ + type: "bi.label", + textAlign: "right", + cls: "dec-font-weight-bold", + text: "选择sheet:", + width: 60 + }, { + el: { + type: "bi.text_value_combo", + lgap: 4, + cls: "bi-border", + textAlign: "left", + // value: o.info.subjectType, + items: o.items, + // items: self.model.typeItems, + width: 200, + height: 22, + ref: function (_ref) { + self.sheet = _ref; + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + } + } + ] + }, + lgap: 10 + }] + } + }, { + el: { + type: "bi.right_vertical_adapt", + lgap: 10, + items: [{ + type: "bi.button", + ref: function (_ref) { + + }, + text: "确定", + height: 24, + handler: function () { + var value = self.sheet.getValue(); + if (BI.isEmptyArray(value)) { + BI.Msg.toast("先选择sheet"); + return; + } + self.options.onClickConfirm(value[0], function (result) { + if (result) { + BI.Msg.toast("成功"); + self.close() + } else { + BI.Msg.toast("失败"); + } + + }) + + } + + }, { + type: "bi.button", + ref: function (_ref) { + + }, + text: "取消", + height: 24, + level: "ignore", + handler: function () { + self.close(); + } + + }] + }, height: 44 + }] + }, + top: 40, left: 10, bottom: 0, right: 10 + }] + }] + }] + + }; + }, + close: function () { + this.fireEvent("EVENT_CLOSE"); + } + + }); + BI.shortcut("dec.hw.sheet.select", Masker); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.js b/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.js new file mode 100644 index 0000000..df3563f --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.js @@ -0,0 +1,193 @@ +;!(function () { + var EDITOR_WIDTH = 480, EDITOR_HEIGHT = 22, LABEL_WIDTH = 100; + var info = BI.inherit(BI.Widget, { + props: { + typeItems: [], + levelItems: [], + departId: "", + departName: "", + departType: "", + institution: "", + departLevel: "", + startDate: {}, + endDate: {}, + add: true, + info: {} + }, + _store: function () { + console.log("table.attr.js"); + return BI.Models.getModel("dec.hw.table.attr.model"); + }, + watch: { + schemaItems:function () { + this.schema.setValue(); + }, + isSchemaLoaded: function (v) { + this.schema.setEnable(v); + } + }, + beforeInit: function (callback) { + this.store.initData(callback); + }, + render: function () { + var self = this, o = this.options, borderEditorWidth = EDITOR_WIDTH - 2; + console.log("table.attr.js"); + return { + type: "bi.vertical", + width: 640, + vgap: 15, + items: [{ + type: "bi.vertical_adapt", + items: [{ + type: "bi.label", + textAlign: "right", + cls: "dec-font-weight-bold", + text: "数据源:", + title: "数据源", + width: LABEL_WIDTH + }, { + el: { + type: "bi.text_value_combo", + lgap: 4, + disabled: !o.add, + cls: "bi-border", + textAlign: "left", + value: o.info.connection, + items: self.model.connectionItems, + // items: self.model.typeItems, + width: borderEditorWidth, + height: EDITOR_HEIGHT, + ref: function (_ref) { + self.connection = _ref; + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + self.store.setConnection(this.getValue()[0]); + self.store.getSchemaItems(this.getValue()[0]); + } + } + ] + }, + lgap: 10 + }] + }, { + type: "bi.vertical_adapt", + items: [{ + type: "bi.label", + textAlign: "right", + cls: "dec-font-weight-bold", + text: "别名(*):", + title: "别名", + width: LABEL_WIDTH + }, { + el: { + type: "bi.text_editor", + lgap: 4, + cls: "bi-border", + textAlign: "left", + value: o.info.aliasName, + width: borderEditorWidth, + disabled: !o.add, + height: EDITOR_HEIGHT, + ref: function (_ref) { + self.alias = _ref; + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + self.store.setAliasName(this.getValue()); + } + } + ] + }, lgap: 10 + }] + }, { + type: "bi.vertical_adapt", + items: [{ + type: "bi.label", + textAlign: "right", + cls: "dec-font-weight-bold", + text: "表名(*):", + title: "表名", + width: LABEL_WIDTH + }, { + el: { + type: "bi.text_editor", + lgap: 4, + cls: "bi-border", + textAlign: "left", + width: borderEditorWidth, + disabled: !o.add, + value: o.info.tableName, + height: EDITOR_HEIGHT, + ref: function (_ref) { + self.tableName = _ref; + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action: function () { + self.store.setTableName(this.getValue()); + } + } + ] + }, lgap: 10 + }] + }] + } + }, + getValue: function () { + var self = this; + return { + id: self.subjectId.getValue(), + subjectName: self.subjectName.getValue(), + subjectType: self.subjectType.getValue()[0], + accountSubject: self.accountSubject.getValue()[0], + beginDate: Dec.AMB.getDynamicDateValue(self.beginDate.getValue()), + endDate: Dec.AMB.getDynamicDateValue(self.endDate.getValue()), + mark: self.mark.getValue() + } + }, + setValue: function (v) { + var self = this; + self.subjectId.setValue(v.id); + self.subjectName.setValue(v.subjectName); + self.subjectType.setValue([v.subjectType]); + self.accountSubject.setValue([v.accountSubject]); + self.beginDate.setValue(Dec.AMB.createDateWidgetValue(v.beginDate)); + self.endDate.setValue(Dec.AMB.createDateWidgetValue(v.endDate)); + self.mark.setValue(v.mark); + }, + getSchemaValue: function () { + return this.schema.getValue() + }, + _itemsCreator:function (options, populate) { + var self = this, o = this.options, keyword = options.keywords && options.keywords[0]; + var filter = BI.filter(self.model.schemaItems,function (i, value) { + if(BI.isEmpty(keyword)){ + return true; + } + return BI.contains(value.value, keyword); + }); + populate({ + items: self._processSchemaItems(filter) + }) + }, + _processSchemaItems:function (items) { + var self = this; + return BI.map(items, function (i, v) { + var res = { + type: "bi.icon_text_item", + value: v.value, + cls: "item-check-font bi-list-item" + }; + return res; + }); + } + + }); + BI.shortcut("dec.hw.table.attr", info); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.model.js new file mode 100644 index 0000000..9c88fee --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/attr/table.attr.model.js @@ -0,0 +1,73 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + _init: function () { + this.add = this.options.add; + + }, + + state: function () { + return { + connectionItems: [], + schemaItems: [], + isSchemaLoaded: false + }; + }, + + context: [ "connection", "schema", "aliasName", "tableName"], + + actions: { + initData: function (callback) { + var self=this; + Dec.Utils.getConnections(function (res) { + console.log(res); + self.model.connectionItems = + BI.map( + /*// 根据驱动过滤下数据连接 + BI.filter(res, + function (i,val) { + var reg = RegExp('MYSQL|ORACLE|SQLSERVER|POSTGRE|SYBASE'); + return JSON.parse(val.connectionData).driver.toUpperCase().match(reg) != null + }),*/ + res, + function (i,val) { + return BI.extend({value:"",text:""},{ + text : val.connectionName, + value : val.connectionName + }) + }); + callback(); + }); + //self.model.connectionItems=[{value: "zhizao", text: "制造"}, {value: "xiaoshou", text: "销售"}]; + }, + setConnection:function (v) { + this.model.connection=v; + }, + setSchema:function (v) { + this.model.schema=v; + }, + setSchemaLoaded:function (v) { + this.model.isSchemaLoaded=v; + }, + setAliasName:function (v) { + this.model.aliasName=v; + }, + setTableName:function (v) { + this.model.tableName=v; + }, + getSchemaItems:function (v) { + var self = this; + self.setSchemaLoaded(false); + Dec.reqGet( + "/url/excelmng/getSchema?connectionName=" + v, + null,null, + function (e) { + console.log(e); + self.model.schemaItems = e.data; + self.setSchemaLoaded(true); + } + ) + } + } + }); + BI.model("dec.hw.table.attr.model", Model); +})(); diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/attr/td.widget.js b/src/main/resources/com/fr/plugin/hw/decision/js/attr/td.widget.js new file mode 100644 index 0000000..d921015 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/attr/td.widget.js @@ -0,0 +1,46 @@ +;!(function () { + var EDITOR_WIDTH = 440, EDITOR_HEIGHT = 22, LABEL_WIDTH = 140; + var info = BI.inherit(BI.Widget, { + props: { + widgetType: "", + id: "", + isArr: false, + value: "", + errorText: "", + validationChecker: BI.emptyFn, + listeners:[], + handler: BI.emptyFn, + items: [] + }, + /*beforeInit: function (callback) { + this.store.initData(callback) + },*/ + render: function () { + var self = this, o = this.options; + return { + id:o.id, + type: o.widgetType, + value: o.value, + text: o.value, + items: o.items, + disabled: o.disabled, + validationChecker: o.validationChecker, + errorText: o.errorText, + handler:o.handler, + listeners:o.listeners, + ref: function (_ref) { + self.showWidget = _ref; + } + } + }, + getValue: function () { + var o = this.options; + var result = this.showWidget.getValue(); + return o.isArr ? result[0] : result; + }, + getId: function () { + return this.options.id; + } + }); + BI.shortcut("dec.hw.table.col.attr.td", info); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/hw.option.js b/src/main/resources/com/fr/plugin/hw/decision/js/hw.option.js new file mode 100644 index 0000000..ad3ab3d --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/hw.option.js @@ -0,0 +1,265 @@ +;!(function () { + var commPath = Dec.fineServletURL + "/file?path=/com/fr/plugin/hw/decision/js"; + + BI.$import(commPath + "/utils.js"); + BI.$import(commPath + "/table.info.js"); + BI.$import(commPath + "/table.info.model.js"); + BI.$import(commPath + "/hw.table.add.pop.js"); + BI.$import(commPath + "/hw.table.add.pop.model.js"); + + BI.$import(commPath + "/attr/table.attr.js"); + BI.$import(commPath + "/attr/table.attr.model.js"); + BI.$import(commPath + "/attr/col.attr.js"); + BI.$import(commPath + "/attr/col.attr.model.js"); + BI.$import(commPath + "/attr/sheet.masker.js"); + BI.$import(commPath + "/attr/td.widget.js"); + + BI.$import(commPath + "/pane/panes.js"); + BI.$import(commPath + "/pane/panes.model.js"); + BI.$import(commPath + "/pane/dec.hw.excel.export.pane.js"); + BI.$import(commPath + "/pane/dec.hw.excel.export.pane.model.js"); + BI.$import(commPath + "/pane/left.js"); + BI.$import(commPath + "/pane/left.model.js"); + BI.$import(commPath + "/pane/left.linklist.item.js"); + BI.$import(commPath + "/pane/left.linklist.item.model.js"); + BI.$import(commPath + "/pane/left.linklist.js"); + BI.$import(commPath + "/pane/left.linklist.model.js"); + BI.$import(commPath + "/pane/right.js"); + BI.$import(commPath + "/pane/right.model.js"); + BI.$import(commPath + "/pane/right.table.js"); + BI.$import(commPath + "/pane/right.table.model.js"); + BI.$import(commPath + "/pane/dec.page.table.plugin.js"); + + BI.$import(commPath + "/pane/authPane/auth.pane.js"); + BI.$import(commPath + "/pane/authPane/auth.pane.model.js"); + BI.$import(commPath + "/pane/authPane/auth.pane.right.js"); + BI.$import(commPath + "/pane/authPane/auth.pane.right.model.js"); + + + BI.config("dec.constant.management.navigation", function (items) { + items.push({ + value: "hw", // 地址栏显示的hash值 + id: "fanruan-hw-excecl", // id + text: "Excel导入", // 文字 + //cardType: "dec.mng.excelExportPane", + cardType: "dec.mng.panes", + cls: "dir-font-20" // 图标类名 + }); + return items; + }); + + /** + * 管理项 + */ + BI.constant("dec.hw.col.type", [ + {value: "2", text: "整数"}, + {value: "3", text: "小数"}, + {value: "12", text: "文本"}, + {value: "16", text: "布尔"}, + {value: "91", text: "日期"} + ]); + + BI.constant("dec.hw.col.type.int", [2, 4]); + BI.constant("dec.hw.col.type.str", [1, 12]); + BI.constant("dec.hw.col.type.bool", [-7, 16]); + BI.constant("dec.hw.col.type.date", [91, 93]); + + BI.hwColTypeDeal = function(data){ + BI.each(data, function (index, val) { + if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.int"), val.colType)) { + val.colType = 2; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.str"), val.colType)) { + val.colType = 12; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.bool"), val.colType)) { + val.colType = 16; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.date"), val.colType)) { + val.colType = 91; + } + }); + console.log(data); + return data; + }; + + /** + * tab项 + */ + BI.constant("dec.hw.constant.tabs", [ + {value: "export", text: "Excel数据管理"}, + {value: "auth", text: "Excel权限管理"} + ]); + + +// 组件实现,效果为使用绝对布局组件放置了一个iframe + var Fanruan = BI.inherit(BI.Widget, { + + props: { + baseCls: "dec-management-fanruan" + }, + + render: function () { + var self = this, o = this.options; + + var file = { + type: "bi.multifile_editor", + ref: function (_ref) { + self.file = _ref; + }, + width: 200, + // accept: "*.zip;", + url: Dec.fineServletURL + "/url/demo/test?width=32&height=32", + listeners: [ + { + eventName: BI.MultifileEditor.EVENT_ERROR, + action: function (args) { + /* self.fireEvent("EVENT_ERROR"); + self._closeUpload();*/ + } + }, { + eventName: BI.MultifileEditor.EVENT_UPLOADED, + action: function (args) { + var files = this.getValue(); + if (files[files.length - 1].errorCode) { + BI.Msg.toast(BI.i18nText(files[files.length - 1].errorMsg), { + level: "error" + }); + self._closeUpload(); + return; + } + var id = files[files.length - 1].attach_id; + var filename = files[files.length - 1].filename; + // self.store.analysisFile(id, filename); + } + }, { + eventName: BI.MultifileEditor.EVENT_CHANGE, + action: function () { + this.upload(); + /* self._startUpload();*/ + } + } + ] + }; + return { + type: "bi.absolute", + items: [ + { + el: { + type: "bi.center_adapt", + items: [ + { + el: file + }, { + el: { + type: "bi.button", + width: 200, + text: "123123", + handler: function () { + self.file.select(); + } + } + } + ] + }, + top: 100, + left: 0, + right: 0, + bottom: 0 + }, { + el: { + type: "bi.vertical_adapt", + items: [{ + type: "bi.button", + text: "新建", + handler: function () { + var pane = { + type: "dec.hw.table.add.popup", + add:true, + infoId:"add", + onClickConfirm: function (val, callback) { + console.log(val); + Dec.HW.importTableData(val,function (res) { + debugger; + }); + + callback(true); + // self.store.addDepartment(val, callback); + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "add"); + } + } + ] + }; + BI.Popovers.create(self.getName() + "add", { + type: "bi.popover", + header: BI.i18nText("Dec-Add_Department"), + body: pane, + width: 700, + height: 800, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "add"); + } + } + ] + }).open(self.getName() + "add"); + + } + }, { + type: "bi.button", + text: "编辑", + handler:function () { + var pane = { + type: "dec.hw.table.add.popup", + add:false, + infoId:"edit", + onClickConfirm: function (val, callback) { + console.log(val); + Dec.HW.importTableData(val,function (res) { + debugger; + }); + + callback(true); + // self.store.addDepartment(val, callback); + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }; + BI.Popovers.create(self.getName() + "edit", { + type: "bi.popover", + header: BI.i18nText("Dec-Add_Department"), + body: pane, + width: 700, + height: 800, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }).open(self.getName() + "edit"); + } + }] + + }, + top: 0, + left: 0 + } + ] + }; + } + }); + BI.shortcut("dec.management.fanruan_demo", Fanruan); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.js b/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.js new file mode 100644 index 0000000..3f73b13 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.js @@ -0,0 +1,187 @@ +!(function () { + + var WIDTH = 80; + var HEIGHT = 50; + + var AddDepartment = BI.inherit(BI.Widget, { + + props: { + baseCls: "dec-add-department-popup", + btns: [BI.i18nText(BI.i18nText("Dec-Basic_Sure")), BI.i18nText(BI.i18nText("Dec-Basic_Cancel"))], + onClickConfirm: BI.emptyFn, + info: {} + }, + + _store: function () { + return BI.Models.getModel("dec.model.hw.table.add.popup"); + }, + + watch:{ + importStatus: function (v) { + switch (v) { + case "importing": + this._startImport(); + break; + case "abort": + this._stopImport(); + break; + case "finish": + default: + this._finishImport(); + } + } + }, + + render: function () { + var self = this, o = this.options; + + return { + type: "bi.vtape", + items: [ + { + el: { + type: "dec.hw.table.info", + text: "测试", + add: o.add, + infoId:o.infoId, + aliasName: o.aliasName, + ref: function (_ref) { + self.hwTableInfo = _ref; + } + } + }, { + el: this.rebuildSouth(), + height: 44 + } + ] + }; + }, + + + rebuildSouth: function () { + var self = this, o = this.options; + var sure = BI.createWidget({ + type: "bi.button", + ref: function (_ref) { + self.sure = _ref; + }, + text: this.options.btns[0], + warningTitle: o.warningTitle, + height: 24, + handler: function () { + self.end(); + } + }); + var cancel = BI.createWidget({ + type: "bi.button", + ref: function (_ref) { + self.cancel = _ref; + }, + text: this.options.btns[1], + height: 24, + level: "ignore", + handler: function () { + self.close(); + } + }); + return { + type: "bi.right_vertical_adapt", + lgap: 10, + items: [cancel, sure] + }; + }, + + getValue: function () { + return this.hwTableInfo.getValue(); + }, + + setValue: function (info) { + this.departmentName.setValue(info.text); + }, + + close: function () { + this.fireEvent("EVENT_CLOSE"); + }, + + end: function () { + var self = this; + self.store.setImportStatus("importing"); + console.log("end"); + + if (self.getValue().infoId == "add") { + self._tableNameExistsAndImportChecker(); + } else { + self._importChecker(); + } + }, + + _tableNameExistsAndImportChecker: function(){ + var self = this; + if (self.getValue().infoId == "add") { + var tableName = BI.isEmpty(self.getValue().schema)?self.getValue().tableName:self.getValue().schema+ "." + self.getValue().tableName ; + var encodeTableName = encodeURIComponent(tableName); // 编码下表名,模式中可能存在 # + Dec.reqGet( + "/url/excelmng/iftableexist?connection=" + self.getValue().connection + "&tableName=" + encodeTableName, + null,null,function(e){ + if(e.status == "success"){ + self._importChecker(); + } else { + self.store.setImportStatus("abort"); + BI.Msg.toast(e.errorText); + } + }) + } + }, + + _importChecker: function () { + var self = this, o = this.options; + o.onClickConfirm(self.getValue(), function (res) { + if (res.status == "success") { + self.store.setImportStatus("finish"); + BI.Msg.toast("操作成功!" + res.text); + } else { + self.store.setImportStatus("abort"); + BI.Msg.toast("操作失败," + res.errorText); + } + }) + }, + + _startImport: function () { + var self = this, name = this.getName() + "status"; + var upload = { + type: "dec.test.status", + waitingText: "导入中", + successText: "导入成功", + failText: "导入失败", + listeners: [{ + eventName: "EVENT_CLOSE", + action: function () { + BI.Maskers.hide(name); + BI.Maskers.remove(name); + } + }], + ref: function (_ref) { + self.uploadMasker = _ref; + } + }; + BI.Maskers.create(name, null, { + render: upload + }); + BI.Maskers.show(name); + }, + _stopImport: function () { + var name = this.getName() + "status"; + BI.Maskers.hide(name); + BI.Maskers.remove(name); + }, + _finishImport: function () { + this.uploadMasker && this.uploadMasker.setStatus({ + status: DecCst.TestStatus.SUCCESS + }); + this.close(); + } + }); + + AddDepartment.EVENT_CLICK_CONFIRM = "EVENT_CONFIRM"; + BI.shortcut("dec.hw.table.add.popup", AddDepartment); +}()); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.model.js new file mode 100644 index 0000000..21d662b --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/hw.table.add.pop.model.js @@ -0,0 +1,15 @@ +!(function () { + var Store = BI.inherit(Fix.Model, { + state: function(){ + return{ + importStatus: ""//导入的状态 + } + }, + actions: { + setImportStatus:function (v) { + this.model.importStatus=v; + } + } + }); + BI.model("dec.model.hw.table.add.popup", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.js new file mode 100644 index 0000000..b8bd946 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.js @@ -0,0 +1,72 @@ +!(function () { + var AuthPane = BI.inherit(BI.Widget, { + props: { + baseCls: "" + }, + + _store: function () { + return BI.Models.getModel("dec.model.mng.authPane"); + }, + + render: function () { + var self = this, o = this.options; + var left = { + type: "dec.common.resizeable_layout", + ref: function (_ref) { + self.left = _ref; + }, + width: 240, + maxSize: 450, + minSize: 200, + resize: BI.bind(self.resize, this), + item: { + type: "dec.excelexport.left", + showButton: false, + cls: "bi-border-right" + } + }; + + var right = { + type: "dec.auth.right", + ref: function (_ref) { + self.right = _ref; + } + }; + + return { + type: "bi.vtape", + items: [{ + type: "bi.absolute", + items: [ + { + el: { + type: "bi.htape", + cls: "bi-card", + ref: function (_ref) { + self.wrapper = _ref; + }, + items: [ + { + el: left, + width: 240 + }, { + el: right + } + ] + }, + top: 10, right: 10, left: 10, bottom: 10 + } + ] + } + ] + }; + }, + + resize: function (size) { + var self = this; + self.wrapper.options.items[0].width = size; + self.wrapper.resize(); + } + }); + BI.shortcut("dec.mng.authPane", AuthPane); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.model.js new file mode 100644 index 0000000..003e719 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.model.js @@ -0,0 +1,12 @@ +!(function(){ + var Store = BI.inherit(Fix.Model, { + state: function () { + return { + selectedLink: "" + }; + }, + + childContext: ["selectedLink"] + }); + BI.model("dec.model.mng.authPane", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.js new file mode 100644 index 0000000..92525be --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.js @@ -0,0 +1,99 @@ +!(function () { + var Right = BI.inherit(BI.Widget, { + + props: { + baseCls: "" + }, + + _store: function () { + return BI.Models.getModel("dec.model.auth.right"); + }, + + watch:{ + selectedLink:function(v){ + var self = this; + self.loader.setVisible(true); + self.store.setAllUser([]); + self.store.setPage(2); + self.store.initAuthData(function(){ + self.store.initData(function(e){ + self.loader.populate(e); + self.store.setPage(2); + }, 1); + }); + }, + keyword:function(v){ + var self = this; + self.store.initData(function(e){ + self.loader.populate(e); + self.store.setPage(2); + }, 1); + } + }, + render: function () { + var self = this, o = this.options; + + return { + type: "bi.vtape", + items: [{ + el:{ + type: "bi.left_right_vertical_adapt", + cls: "bi-border-bottom", + items:{ + left:[{ + type: "bi.label", + text: "人员列表", + textAlign: "left", + hgap: 5, + lgap: 20 + },{ + type: "bi.search_editor", + width: 200, + watermark: "用户搜索", + listeners: [{ + eventName: "EVENT_CHANGE", + action: function() { + self.store.setKeyword(this.getKeywords()[0]); + } + },{ + eventName: "EVENT_CLEAR", + action: function() { + self.store.setAllUser([]); + self.store.setKeyword(BI.emptyStr); + } + }] + }], + right:[{ + type: "bi.label", + text: "权限", + textAlign: "left", + hgap: 5, + rgap: 20 + }] + } + }, + height: 40, + },{ + el:{ + type: "bi.loader", + height: "90%", + invisible: true, + ref: function(_ref) { + self.loader = _ref + }, + // options 表示加载的次数 times:1 + itemsCreator: function (options, populate) { + self.store.initData(populate, self.model.page); + self.store.setPage(self.model.page+1) ; + }, + hasNext: function (options) { + return self.model.hasNext; + } + }, + tgap: 15 + }] + }; + } + }); + BI.shortcut("dec.auth.right", Right); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.model.js new file mode 100644 index 0000000..3593ca8 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/authPane/auth.pane.right.model.js @@ -0,0 +1,123 @@ +!(function(){ + var Store = BI.inherit(Fix.Model, { + state: function () { + return { + keyword: "", + allUser:[], + authUser:[], + page: 1, + count: 100, + userName: "", + hasNext: true + }; + }, + context:["selectedLink"], + computed: { + }, + actions: { + initData:function(callback, page){ + var self = this; + Dec.HW.getAllUserData({ + page:page, + count:self.model.count, + keyword:self.model.keyword + },function(e){ + if (e.status) { + self.model.hasNext = e.data.hasNext; + self.model.allUser = e.data.items; + callback && callback(self._formatItems(e.data.items)) + } + }); + }, + + initAuthData:function(callback){ + var self = this; + Dec.HW.getAuthUserData({ + linkName: self.model.selectedLink + },function(res){ + if (res.status) { + self.model.authUser = res.data; + callback && callback() + } + }) + }, + + setAllUser: function (v) { + this.model.allUser = v + }, + + setKeyword: function (v) { + this.model.keyword = v + }, + + setPage: function (v) { + this.model.page = v + }, + + updateAuth: function(v){ + var self = this; + Dec.HW.updateLinkAuth({ + linkName: self.model.selectedLink, + userName: self.model.userName, + auth: v + },function(res){ + self.initAuthData(BI.emptyFn); + }) + }, + + _formatItems:function(v){ + var self = this; + return BI.map( v, function(i,val){ + var selected = BI.contains(self.model.authUser, val.id); + var item = { + type:"bi.htape", + cls: "bi-list-item-active", + ref: function(_ref) { + self.tape = _ref + }, + height:24, + items:[{ + el:{ + type:"bi.label", + }, + width:60 + },{ + el:{ + type:"bi.label", + value: val.realName + " (" + val.username + ")", + text: val.realName + " (" + val.username + ")" + }, + },{ + el:{ + type:"dec.auth.checkbox", + selected:selected, + value: val.id, + hoverHandler:{ + moveIn:function(arguments){ + self.model.userName = arguments + }, + moveOut:function(){ + } + }, + listeners: [{ + eventName: BI.Controller.EVENT_CHANGE, + action: function() { + self.updateAuth(this.isSelected()); + } + }] + }, + rgap:10 + },{ + el:{ + type:"bi.label", + }, + width:40 + }] + } + return item; + }) + } + } + }); + BI.model("dec.model.auth.right", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.js new file mode 100644 index 0000000..1a826f3 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.js @@ -0,0 +1,86 @@ +!(function () { + var ExcelExportPane = BI.inherit(BI.Widget, { + props: { + baseCls: "" + }, + + _store: function () { + return BI.Models.getModel("dec.model.mng.excelExportPane"); + }, + + render: function () { + var self = this, o = this.options; + var left = { + type: "dec.common.resizeable_layout", + ref: function (_ref) { + self.left = _ref; + }, + width: 240, + maxSize: 450, + minSize: 200, + resize: BI.bind(self.resize, this), + item: { + type: "dec.excelexport.left", + showButton: true, + containReuse: true, + cls: "bi-border-right" + } + }; + + var right = { + type: "dec.excelexport.right", + ref: function (_ref) { + self.mid = _ref; + } + }; + + return { + type: "bi.vtape", + items: [ + /*{ + type: "bi.vertical_adapt", + cls: "bi-card bi-border-bottom", + items: [ + { + type: "bi.label", + text: "Excel数据管理", + textAlign: "left", + hgap: 10 + } + ], + height: 40 + }, */{ + type: "bi.absolute", + items: [ + { + el: { + type: "bi.htape", + cls: "bi-card", + ref: function (_ref) { + self.wrapper = _ref; + }, + items: [ + { + el: left, + width: 240 + }, { + el: right + } + ] + }, + top: 10, right: 10, left: 10, bottom: 10 + } + ] + } + ] + }; + }, + + resize: function (size) { + var self = this; + self.wrapper.options.items[0].width = size; + self.wrapper.resize(); + } + }); + BI.shortcut("dec.mng.excelExportPane", ExcelExportPane); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.model.js new file mode 100644 index 0000000..708a8b8 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.hw.excel.export.pane.model.js @@ -0,0 +1,11 @@ +!(function () { + var Store = BI.inherit(Fix.Model, { + state: function () { + return { + selectedLink: "" + } + }, + childContext: ["selectedLink"] + }); + BI.model("dec.model.mng.excelExportPane", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.page.table.plugin.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.page.table.plugin.js new file mode 100644 index 0000000..c7b55f3 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/dec.page.table.plugin.js @@ -0,0 +1,88 @@ +!(function () { + var i = BI.inherit(BI.Widget, { + props: { + baseCls: "dec-page-table", + perPage: 10, + showPager: !0, + columnSize: [] + }, + _store: function() { + return BI.Models.getModel("dec.model.page.table") + }, + watch: { + sort: function(e) { + this.fireEvent(i.EVENT_SORT, e) + }, + "totalCount || currentPage": function() { + this.pager.setCount(this.model.totalCount), + this.pager.setPage(this.model.currentPage), + this.pager.setAllPages(Math.ceil(this.model.totalCount / this.options.perPage)) + } + }, + render: function() { + var t = this + , e = this.options; + return { + type: "bi.vertical", + scrollx: true, + items: [{ + type: "dec.page.table.header", + columnSize: e.columnSize, + items: e.header + }, { + type: "bi.button_group", + cls: "table-items", + layouts: [{ + type: "bi.vertical", + scrollx: true + }], + items: this._createItems(e.items), + ref: function(e) { + t.listGroup = e + }, + height: e.listHeight + }, { + type: "dec.pager", + height: 30, + invisible: !e.showPager, + tgap: 10, + count: e.totalCount, + pages: 0 === e.totalCount ? 1 : Math.ceil(e.totalCount / e.perPage), + curr: e.currentPage, + ref: function(e) { + t.pager = e + }, + listeners: [{ + eventName: i.PAGER_EVENT_CHANGE, + action: function() { + t.fireEvent(i.PAGER_EVENT_CHANGE, this.getCurrentPage()) + } + }] + }] + } + }, + setCount: function(e) { + this.store.setCount(e) + }, + setPage: function(e) { + this.store.setPage(e) + }, + populate: function(e) { + this.listGroup.populate(this._createItems(e)) + }, + _createItems: function(e) { + var i = this.options; + return BI.map(e, function(e, t) { + return { + type: "dec.page.table.row", + odd: BI.isOdd(e), + columnSize: i.columnSize, + item: t + } + }) + } + }); + i.PAGER_EVENT_CHANGE = "EVENT_CHANGE", + i.EVENT_SORT = "EVENT_SORT", + BI.shortcut("dec.page.table.plugin", i) +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.js new file mode 100644 index 0000000..6a39ea9 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.js @@ -0,0 +1,107 @@ +!(function () { + var Left = BI.inherit(BI.Widget, { + + props: { + baseCls: "", + showButton: false, + containReuse: false + }, + + _store: function () { + return BI.Models.getModel("dec.model.excelexport.left"); + }, + + render: function () { + var self = this, o = this.options; + return { + type: "bi.vtape", + items: [ + { + type: "bi.left_right_vertical_adapt", + cls: "bi-border-bottom", + items:{ + left: [{ + type: "bi.label", + text: "数据列表", + textAlign: "left", + hgap: 5, + height: 40 + }], + right: [{ + type: "bi.icon_button", + cls: "plus-font", + invisible: !o.showButton, + width: 16, + hgap: 10, + handler: function () { + var pane = { + type: "dec.hw.table.add.popup", + add:true, + infoId:"add", + onClickConfirm: function (tableData, callback) { + console.log(tableData); + Dec.HW.importTableData(tableData, function (res) { + if (res.status === "success") { + BI.Utils.addTables2Pack({ + packId: "__my_analysis__" + BI.Utils.getCurrentUserId(), + tables: [{ + tableName: tableData.tableName, + connectionName: tableData.connection + }] + }, function () { + callback(res); + self.linkListPane.populate(); + }); + } else { + callback(res); + self.linkListPane.populate(); + } + }); + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "add"); + } + } + ] + }; + BI.Popovers.create(self.getName() + "add", { + type: "bi.popover", + header: "添加Excel导入链接", + body: pane, + width: 700, + height: 700, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "add"); + } + } + ] + }).open(self.getName() + "add"); + } + }] + }, + height: 40 + }, { + type: "dec.excelexport.left.linklist", + containReuse: o.containReuse, + ref: function (_ref) { + self.linkListPane = _ref; + } + } + ] + }; + }, + + resize: function (size) { + var self = this; + self.wrapper.options.items[0].width = size; + self.wrapper.resize(); + } + }); + BI.shortcut("dec.excelexport.left", Left); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.js new file mode 100644 index 0000000..f065752 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.js @@ -0,0 +1,100 @@ +!(function () { + var ICON_WIDTH = 26; + var Item = BI.inherit(BI.BasicButton, { + + props: { + baseCls: "dec-tabledata-set-list-item", + $testId: "dec-tabledata-set-list-item", + height: 24, + value: "", + text: "", + create: false + }, + + _store: function () { + return BI.Models.getModel("dec.model.excelexport.left.linklist.item", this.options); + }, + + render: function () { + var self = this, o = this.options; + this.storeValue = o.value; + return { + type: "bi.htape", + css: o.create == "true" ? {"color":"blue"}:{}, + items: [{ + type: "bi.center_adapt", + width: 24, + cls: "dcm-link-font", + hgap: 5, + items: [{ + type: "bi.icon" + }] + }, { + type: "bi.shelter_editor", + allowBlank: false, + value: o.value, + text: o.text, + validationChecker: BI.bind(this.store.nameChecker, this.store), + errorText: function (v) { + return BI.i18nText(BI.isEmptyString(v) ? "Dec-Data_Set_Server_Name_Empty" : "Dec-Data_Set_Server_Name_Duplicate"); + }, + title: function () { + return self.editor.getValue(); + }, + ref: function (_ref) { + self.editor = _ref; + }, + listeners: [{ + eventName: BI.ShelterEditor.EVENT_CONFIRM, + action: function () { + self.storeValue = this.getValue(); + self.fireEvent("EVENT_RENAME", self.storeValue); + } + }] + }, { + type: "bi.vertical_adapt", + width: ICON_WIDTH * 2 , + cls: "operations", + invisible: o.create != "true", + items: [{ + type: "bi.icon_button", + cls: "rename-font", + height: o.height, + width: ICON_WIDTH, + stopPropagation: true, + title: BI.i18nText("Dec-Basic_Rename"), + handler: function () { + self.editor.focus(); + } + }, { + type: "dec.bubble.combo", + el: { + type: "bi.icon_button", + cls: "default-delete-font", + height: o.height, + width: ICON_WIDTH, + title: BI.i18nText("Dec-Basic_Delete") + }, + text: BI.i18nText("Dec-Data_Set_Confirm_Delete"), + onClickConfirm: function () { + self.fireEvent("EVENT_DELETE"); + self.deleteCombo.hideView(); + }, + ref: function (_ref) { + self.deleteCombo = _ref; + } + }] + }] + }; + }, + + getValue: function () { + return this.storeValue; + }, + + setValue: function (v) { + this.editor.setValue(v); + } + }); + BI.shortcut("dec.excelexport.left.linklist.item", Item); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.model.js new file mode 100644 index 0000000..038915d --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.item.model.js @@ -0,0 +1,18 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + + context: ["names"], + + computed: {}, + + actions: { + nameChecker: function (name) { + if (name === this.options.value) { + return true; + } + return !BI.contains(this.model.names, name); + } + } + }); + BI.model("dec.model.excelexport.left.linklist.item", Model); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.js new file mode 100644 index 0000000..d2ec471 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.js @@ -0,0 +1,60 @@ +!(function () { + var SINGLE = BI.inherit(BI.Widget, { + + props: { + baseCls: "dec-directory-left-single", + $testId: "dec-directory-left-single", + containReuse: false + }, + + _store: function () { + return BI.Models.getModel("dec.model.excelexport.left.linklist", this.options); + }, + + beforeInit: function (callback) { + this.store.initData(callback); + }, + + watch:{ + linklist: function () { + this.linkListPane.populate(this.model.items); + this.linkListPane.setValue(this.model.selectedName); + } + }, + + render: function () { + var self = this, o = this.options; + return { + type: "bi.absolute", + items: [{ + el: { + type: "bi.button_group", + chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE, + layouts: [{ + type: "bi.vertical" + }], + items: self.model.items, + value: self.model.selectedLink, + listeners: [{ + eventName: BI.ButtonGroup.EVENT_CHANGE, + action: function (v) { + self.store.setSelectedLink(v); + } + }], + ref: function (_ref) { + self.linkListPane = _ref; + } + }, top: 10, left: 0, right: 0, bottom: 10 + }] + }; + }, + + populate: function () { + var self = this; + self.store.initData( + self.linkListPane.populate(this.model.items) + ); + } + }); + BI.shortcut("dec.excelexport.left.linklist", SINGLE); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.model.js new file mode 100644 index 0000000..f62c5ad --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.linklist.model.js @@ -0,0 +1,99 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + + state: function () { + return { + linklist: [] + }; + }, + + context: ["selectedLink"], + + computed: { + items: function () { + var self = this , o = this.options; + + return BI.map(self.model.linklist, function (i, v) { + return { + type: "dec.excelexport.left.linklist.item", + value: v.name, + create: v.create, + listeners: [{ + eventName: "EVENT_RENAME", + action: function (name) { + self.rename(v, name); + } + }, { + eventName: "EVENT_DELETE", + action: function () { + self.deleteLink(v.id); + } + }] + }; + }); + } + }, + + actions: { + initData: function(callback){ + var self = this ; + Dec.reqGet("/url/excelmng/querylink?containReuse=" + self.options.containReuse,null,function(e){ + self.model.linklist = e.data; + console.log(self.model.linklist); + BI.isFunction(callback) && callback(); + },BI.emptyFn) + }, + + //link重命名 + rename: function(item, name){ + if (item.name === name) { + return; + } + var self = this; + var linkSet = BI.extend({}, item, { + id: item.id, + name: item.name + }); + + Dec.reqGet("/url/excelmng/rename?id="+item.id+"&name="+name, + null, + function (e) { + if (e.status === "success"){ + BI.remove(self.model.linklist, function (i, v) { + return v.id === item.id; + }); + self.model.linklist.unshift(BI.extend(linkSet, { + name: name + })); + if (self.model.selectedLink === linkSet.name) { + self.setSelectedDataSet(name); + } + } + }, + BI.emptyFn) + }, + + //link删除 + deleteLink: function(id){ + var self = this; + Dec.reqGet("/url/excelmng/delete?id="+id, + null, + function (e) { + if (e.status === "success"){ + BI.remove(self.model.linklist, function (i, v) { + return v.id === id; + }); + } else { + BI.Msg.toast(BI.i18nText("Dec-Basic_Delete_Fail"), {level: "error"}); + } + }, + BI.emptyFn) + }, + + setSelectedLink: function(v){ + this.model.selectedLink = v; + } + } + }); + BI.model("dec.model.excelexport.left.linklist", Model); +}()); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.model.js new file mode 100644 index 0000000..b92c0af --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/left.model.js @@ -0,0 +1,7 @@ +!(function () { + var Store = BI.inherit(Fix.Model, { + context:["selectedLink"], + childContext: ["selectedLink"] + }); + BI.model("dec.model.excelexport.left", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.js new file mode 100644 index 0000000..cdadafc --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.js @@ -0,0 +1,70 @@ +!(function () { + var panes = BI.inherit(BI.Widget, { + props: { + baseCls: "" + }, + _store: function () { + return BI.Models.getModel("dec.model.mng.panes"); + }, + watch:{ + activeTab:function(v){ + this.tab.setSelect(v); + } + }, + render: function () { + var self = this, o = this.options; + return { + type: "bi.vertical", + items: [{ + type: "bi.htape", + cls: "bi-card bi-border-bottom", + items: [{ + el: { + type: "dec.line_segment", + cls: "dec-font-weight-bold", + layouts: [{ + type: "bi.vertical_adapt" + }], + items: BI.map(BI.Constants.getConstant("dec.hw.constant.tabs"), function(e, t) { + return BI.extend({ + type: "dec.line_segment_button", + hgap: 15 + }, t) + }), + value: "export", + height: 40, + listeners: [{ + eventName: "EVENT_CHANGE", + action: function(e) { + self.store.setSelect(e); + } + }] + }, + lgap: 10 + }], + height: 40 + }, { + type: "bi.tab", + ref: function(_ref) { + self.tab = _ref; + }, + height: "95%", + showIndex: "export", + cardCreator: function(v) { + switch (v) { + case "export": + return { + type: "dec.mng.excelExportPane" + }; + case "auth": + return { + type: "dec.mng.authPane" + }; + } + } + }] + } + } + }); + BI.shortcut("dec.mng.panes", panes); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.model.js new file mode 100644 index 0000000..74c6735 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/panes.model.js @@ -0,0 +1,16 @@ +var Store = BI.inherit(Fix.Model, { + state: function () { + return { + activeTab: "" + }; + }, + computed: { + + }, + actions: { + setSelect: function (v) { + this.model.activeTab = v + } + } +}); +BI.model("dec.model.mng.panes", Store); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.js new file mode 100644 index 0000000..a1a16a8 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.js @@ -0,0 +1,150 @@ +!(function () { + var Left = BI.inherit(BI.Widget, { + + props: { + baseCls: "" + }, + + _store: function () { + return BI.Models.getModel("dec.model.excelexport.right"); + }, + + render: function () { + var self = this, o = this.options; + + return { + type: "bi.vtape", + items: [ + { + type: "bi.left_right_vertical_adapt", + cls: "bi-border-bottom", + items:{ + left: [{ + type: "bi.label", + text: "数据明细", + textAlign: "left", + hgap: 5, + height: 40 + }], + right: [{ + type: "bi.button", + text: "刷新", + level: "success", + minWidth:60, + hgap:10, + handler:function(){ + if (BI.isKey(self.model.selectedLink)) { + self.table.populate(); + } + } + },{ + type: "bi.button", + text: "覆盖", + level: "common", + minWidth:60, + hgap:10, + handler:function () { + var pane = { + type: "dec.hw.table.add.popup", + add:false, + infoId:"cover", + aliasName: self.model.selectedLink, + onClickConfirm: function (val, callback) { + console.log(val); + Dec.HW.importTableData(val,function (res) { + debugger; + callback(res); + }); + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }; + if (self.model.selectedLink === BI.emptyStr) { + BI.Msg.toast("先选择左侧链接"); + return; + } + BI.Popovers.create(self.getName() + "edit", { + type: "bi.popover", + header: "覆盖", + body: pane, + width: 700, + height: 600, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }).open(self.getName() + "edit"); + } + },{ + type: "bi.button", + text: "追加", + level: "common", + minWidth:60, + hgap:10, + handler:function () { + var pane = { + type: "dec.hw.table.add.popup", + add:false, + infoId:"addTo", + aliasName: self.model.selectedLink, + onClickConfirm: function (val, callback) { + console.log(val); + Dec.HW.importTableData(val,function (res) { + callback(res); + }) + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }; + if (self.model.selectedLink === BI.emptyStr) { + BI.Msg.toast("先选择左侧链接"); + return; + } + BI.Popovers.create(self.getName() + "edit", { + type: "bi.popover", + header: "追加", + body: pane, + width: 700, + height: 600, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Popovers.remove(self.getName() + "edit"); + } + } + ] + }).open(self.getName() + "edit"); + } + }] + }, + height: 40 + }, { + type: "dec.excelexport.right.table", + ref:function(_ref){ + self.table = _ref + } + } + ] + }; + } + + }); + BI.shortcut("dec.excelexport.right", Left); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.model.js new file mode 100644 index 0000000..8034f35 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.model.js @@ -0,0 +1,7 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + context:["selectedLink"], + childContext: ["selectedLink"], + }); + BI.model("dec.model.excelexport.right", Model); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.js new file mode 100644 index 0000000..c0668f6 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.js @@ -0,0 +1,74 @@ +!(function () { + var Counter = BI.inherit(BI.Widget, { + + _store: function () { + return BI.Models.getModel("dec.model.excelexport.right.table"); + }, + + watch:{ + "header||items": function (v) { + var self = this; + self.pager.setAllPages(0 === self.model.totalCount ? 1 : Math.ceil(self.model.totalCount / self.model.perCount)); + self.table.populate(self.model.items, [self.model.header]); + }, + selectedLink:function (v){ + this.pager.setPage(1); + this.tabpane.setVisible(true); + } + }, + + render: function () { + var self = this, o = this.options; + return { + type:"bi.absolute", + items:[{ + el:{ + type:"bi.absolute", + invisible: true, + items:[{ + el:{ + type: "bi.preview_table", + header: [self.model.header], + items: self.model.items, + headerRowSize: 40, + ref: function (_ref) { + self.table = _ref; + } + }, + top:0,bottom:0,left:0,right:0 + }], + ref: function (_ref) { + self.tabpane = _ref; + } + }, + top:10,bottom:30,left:10,right:10 + },{ + el:{ + type: "dec.pager", + height: 30, + tgap: 10, + count: self.model.totalCount, + pages: 0 === self.model.totalCount ? 1 : Math.ceil(self.model.totalCount / self.model.perCount), + ref: function(_ref) { + self.pager = _ref + }, + listeners: [{ + eventName: "EVENT_CHANGE", + action: function() { + self.store.setPage(this.getCurrentPage()); + } + }] + }, + bottom:0,right:30 + }] + }; + }, + + populate: function(){ + this.model.currentPage = 1; + this.pager.setPage(1); + this.store.initData(); + } + }); + BI.shortcut("dec.excelexport.right.table", Counter); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.model.js new file mode 100644 index 0000000..c3d1442 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/pane/right.table.model.js @@ -0,0 +1,77 @@ +!(function () { + var Store = BI.inherit(Fix.Model, { + state: function () { + return { + tableData:[], + headerData:[], + currentPage: 1, + totalCount: 0, + perCount: 20 + }; + }, + + context:["selectedLink"], + + watch: { + selectedLink: function () { + this.model.currentPage = 1; + this.initData(); + } + }, + + computed: { + header: function () { + var self = this; + var head = []; + var con = BI.Constants.getConstant("dec.hw.col.type") ; + BI.map( self.model.headerData,function (i, val) { + var text = BI.filter(con, function (index, v) { + return BI.isEqual(val.colType, parseInt(v.value)) + })[0].text; + head.push({"text":val.colName + "(" + text + ")"}) + }); + return head; + }, + columnSize: function () { + var self = this; + var len = self.model.header.length; + return new Array(len).fill((1/len).toFixed(2)); + }, + items: function () { + var startNum = this.model.perCount * (this.model.currentPage - 1); + return this.model.tableData.slice(startNum, startNum + this.model.perCount) + }, + totalCount: function () { + return BI.size(this.model.tableData) + } + }, + + actions:{ + initData: function (callback) { + var self = this; + Dec.HW.queryData({ + name: self.model.selectedLink + }, function (res) { + self.model.tableData = res.data.tableData; + /*BI.each(res.tabledata.colAttr, function (index, val) { + if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.int"), val.colType)) { + val.colType = 2; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.str"), val.colType)) { + val.colType = 12; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.bool"), val.colType)) { + val.colType = 16; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.date"), val.colType)) { + val.colType = 91; + } + });*/ + self.model.headerData = BI.hwColTypeDeal(res.data.colAttr); + BI.isFunction(callback) && callback(); + }); + }, + setPage: function(val) { + this.model.currentPage = val + } + } + }); + BI.model("dec.model.excelexport.right.table", Store); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/table.info.js b/src/main/resources/com/fr/plugin/hw/decision/js/table.info.js new file mode 100644 index 0000000..1215cf4 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/table.info.js @@ -0,0 +1,243 @@ +;!(function () { + var tableInfo = BI.inherit(BI.Widget, { + props: { + add: true, + infoId:"" + }, + _store: function () { + return BI.Models.getModel("dec.hw.table.info.model",{ + infoId:this.options.infoId, + aliasName:this.options.aliasName + }); + }, + beforeInit: function (callback) { + this.store.initData(callback) + }, + watch: { + sheetItems: function (v) { + if (v.show) { + this.showSheetSelect(v.items); + } else { + this.hideSheetSelect() + } + }, + importStatus: function (v) { + switch (v) { + case "importing": + this._startImport(); + break; + case "abort": + this._stopImport(); + break; + case "finish": + default: + this._finishImport(); + } + } + }, + render: function () { + var self = this, o = this.options; + var file = { + type: "bi.multifile_editor", + ref: function (_ref) { + self.file = _ref; + }, + url: Dec.fineServletURL + "/url/hw/file/upload?width=32&height=32", + listeners: [ + { + eventName: BI.MultifileEditor.EVENT_ERROR, + action: function (args) { + /* self.fireEvent("EVENT_ERROR"); + self._closeUpload();*/ + } + }, { + eventName: BI.MultifileEditor.EVENT_UPLOADED, + action: function (args) { + console.log("EVENT_UPLOADED"); + var files = this.getValue(); + if (files[files.length - 1].errorCode) { + BI.Msg.toast(BI.i18nText(files[files.length - 1].errorMsg), { + level: "error" + }); + self.store.setImportStatus("abort"); + return; + } + var filename = files[files.length - 1].filename; + // 新增文件格式判断 + if ( !BI.endWith(filename,".xls") && !BI.endWith(filename,".xlsx")){ + BI.Msg.toast(BI.i18nText("上传文件格式不正确, 请重新上传excel文件"), { + level: "error" + }); + self.store.setImportStatus("abort"); + return; + } + self.uploadButton.setEnable(false); + self.uploadButton.setText("已上传"); + var id = files[files.length - 1].attach_id; + self.store.getExcelSheetNumber(id, filename); + } + }, { + eventName: BI.MultifileEditor.EVENT_CHANGE, + action: function () { + self.store.setImportStatus("importing"); + this.upload(); + /*self._startUpload();*/ + } + } + ] + }; + var header = { + type: "bi.htape", + height: 24, + items: [ + { + el:{ + type: "bi.button", + textAlign: "center", + height: 24, + text: "上传文件", + ref: function (_ref) { + self.uploadButton = _ref; + }, + handler: function () { + self.file.select(); + } + } + }, { + el: file + } + ] + }; + return { + type: "bi.absolute", + items: [{ + el: { + type: "bi.vtape", + items: [ + { + el: header, + height: 24 + }, + { + type: "bi.absolute", + items: [{ + el: { + type: "bi.vtape", + items: [{ + height: 0.35, + el: { + type: "dec.card.vertical", + showButtons: false, + text: "表信息", + content: { + type: "dec.hw.table.attr", + add:o.add, + ref:function(_ref){ + self.table = _ref; + }, + info:{ + connection:self.model.connection, + schema:self.model.schema, + tableName:self.model.tableName, + aliasName:o.aliasName + } + } + } + }, { + height: 0.65, + el: { + type: "dec.card.vertical", + showButtons: false, + text: "列信息", + content: { + type: "dec.hw.table.col.attr", + add:o.add + //text: "111" + } + } + }] + }, + top: 0, bottom: 0, left: 0, right: 0 + }] + } + ] + }, + top: 0, bottom: 0, left: 10, right: 10 + }] + } + }, + showSheetSelect: function (items) { + var self=this; + var name = this.getName() + "sheet"; + BI.Maskers.create(name, null, { + render: { + type: "dec.hw.sheet.select", + items: items, + onClickConfirm:function(val,callback){ + self.store.getSheetFiledWithNo(val,callback) + }, + listeners: [ + { + eventName: "EVENT_CLOSE", + action: function () { + BI.Maskers.hide(name); + BI.Maskers.remove(name); + } + } + ] + } + }); + BI.Maskers.show(name); + }, + hideSheetSelect: function () { + var name = this.getName() + "sheet"; + BI.Maskers.hide(name); + BI.Maskers.remove(name); + }, + getValue: function () { + return { + items: this.model.items, + connection: this.model.connection, + schema: this.model.schema, + aliasName: this.model.aliasName, + tableName: this.model.tableName, + infoId: this.model.infoId, + sheetInfo:this.model.result + } + }, + _startImport: function () { + var self = this, name = this.getName() + "status"; + var upload = { + type: "dec.test.status", + waitingText: "导入中", + successText: "导入成功", + failText: "导入失败", + listeners: [{ + eventName: "EVENT_CLOSE", + action: function () { + BI.Maskers.hide(name); + BI.Maskers.remove(name); + } + }], + ref: function (_ref) { + self.uploadMasker = _ref; + } + }; + BI.Maskers.create(name, null, { + render: upload + }); + BI.Maskers.show(name); + }, + _stopImport: function () { + var name = this.getName() + "status"; + BI.Maskers.hide(name); + BI.Maskers.remove(name); + }, + _finishImport: function () { + this.uploadMasker && this.uploadMasker.setStatus({ + status: DecCst.TestStatus.SUCCESS + }); + } + }); + BI.shortcut("dec.hw.table.info", tableInfo); +})(); \ No newline at end of file diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/table.info.model.js b/src/main/resources/com/fr/plugin/hw/decision/js/table.info.model.js new file mode 100644 index 0000000..cbcee6f --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/table.info.model.js @@ -0,0 +1,158 @@ +!(function () { + var Model = BI.inherit(Fix.Model, { + state: function () { + var o=this.options; + return { + items: [], + connection: "", + schema: "", + tableName: "", + excelItems: [], + infoId: o.infoId, + result: {attachId: "", fileName: "",titleRow:-1,sheetNo:-1}, + sheetItems: {show: false, items: []}, + importStatus: ""//导入的状态 + }; + }, + + childContext: ["items", "connection", "schema", "aliasName", "tableName", "excelItems", "infoId"], + + computed: {}, + + watch: { + aliasName: function (v) { + //console.log(v) + }, + excelItems:function (v) { + if (this.model.infoId == "add"){ + this.addItems() + } + } + }, + + actions: { + initData: function (callback) { + var self = this, o = this.options; + + console.log(self.model.infoId); + if(self.model.infoId === "add"){ + callback && callback(); + return; + } + + Dec.HW.queryData({ + name: o.aliasName + }, function (res) { + /*BI.each(res.tabledata.colAttr, function (index, val) { + if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.int"), val.colType)) { + val.colType = 2; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.str"), val.colType)) { + val.colType = 12; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.bool"), val.colType)) { + val.colType = 16; + } else if (BI.contains(BI.Constants.getConstant("dec.hw.col.type.date"), val.colType)) { + val.colType = 91; + } + });*/ + self.model.items = BI.hwColTypeDeal(res.data.colAttr); + self.model.connection = res.data.tableAttr.connection; + self.model.schema = res.data.tableAttr.schema; + self.model.tableName = res.data.tableAttr.tableName; + BI.isFunction(callback) && callback(); + }); + }, + getExcelSheetNumber: function (attachId, fileName) { + var self = this; + Dec.HW.getExcelItmes({attachId: attachId, fileName: fileName}, function (res) { + if (res.success) { + self.model.result.attachId = attachId; + self.model.result.fileName = fileName; + self.getSheetFiled(res.data); + } else { + self.model.importStatus="abort"; + } + }) + }, + getSheetFiled: function (data) { + var self = this; + if (data.length == 1) {//只有一个sheet 的话 就不让选择了直接 + Dec.HW.getSheetFiled({ + attachId: self.model.result.attachId, + sheetNo: 0, + fileName: self.model.result.fileName + }, function (res) { + if (res.success) { + self.model.result.sheetNo=0; + self.model.result.titleRow=res.data[0].titleRow; + self.model.excelItems = res.data; + + // items 匹配相同的列名 + BI.each(self.model.items, function (index, item) { + var sameNameItem = BI.filter(self.model.excelItems, function (i, v) { + return v.text == item.colName + }); + if (sameNameItem.length != 0){ + item.excelCol = sameNameItem[0].value; + } + }); + + self.model.importStatus="finish"; + } else { + self.model.importStatus="abort"; + BI.Msg.toast(res.msg,{level:"error"}); + } + }); + } else { + self.model.sheetItems = {show: true, items: data}; + } + }, + getSheetFiledWithNo: function (sheetNo, callback) { + var self = this; + Dec.HW.getSheetFiled({ + attachId: self.model.result.attachId, + sheetNo: sheetNo, + fileName: self.model.result.fileName + }, function (res) { + if (res.success) { + self.model.result.sheetNo=sheetNo; + self.model.result.titleRow=res.data[0].titleRow; + self.model.excelItems = res.data; + + // items 匹配相同的列名 + BI.each(self.model.items, function (index, item) { + var sameNameItem = BI.filter(self.model.excelItems, function (i, v) { + return v.text == item.colName + }); + if (sameNameItem.length != 0){ + item.excelCol = sameNameItem[0].value; + } + }); + self.model.importStatus="finish"; + callback && callback(true); + } else { + self.model.importStatus="abort"; + BI.Msg.toast(res.msg,{level:"error"}); + callback && callback(false); + } + }); + }, + setImportStatus:function (v) { + this.model.importStatus=v; + }, + addItems:function () { + var self=this; + var result=BI.map(self.model.excelItems,function (index, item) { + return { + id:BI.UUID(), + colName:item.text, + colType:"12", + colLength: 255, + excelCol:item.value + } + }); + self.model.items=BI.concat(self.model.items,result); + } + } + }); + BI.model("dec.hw.table.info.model", Model); +})(); diff --git a/src/main/resources/com/fr/plugin/hw/decision/js/utils.js b/src/main/resources/com/fr/plugin/hw/decision/js/utils.js new file mode 100644 index 0000000..72f4209 --- /dev/null +++ b/src/main/resources/com/fr/plugin/hw/decision/js/utils.js @@ -0,0 +1,26 @@ +;!(function (res) { + Dec.HW = Dec.HW || {}; + Dec.HW = $.extend(Dec.HW, { + getExcelItmes: function (config, callback) { + Dec.reqPost("/url/hw/excel/sheet", config, callback) + }, + getSheetFiled: function (config, callback) { + Dec.reqPost("/url/hw/excel/filed", config, callback) + }, + importTableData: function (config, callback) { + Dec.reqPost("/url/hw/table/import", config, callback) + }, + getAllUserData: function (config, callback) { + Dec.reqPost("/url/excelmng/getAllUserList", config, callback) + }, + getAuthUserData: function (config, callback) { + Dec.reqPost("/url/excelmng/getAuthUserList", config, callback) + }, + updateLinkAuth: function (config, callback) { + Dec.reqPost("/url/excelmng/updateLinkAuth", config, callback) + }, + queryData: function (config, callback) { + Dec.reqPost("/url/excelmng/querydata", config, callback) + } + }) +})(); \ No newline at end of file