package foundation.io; import java.io.File; import java.util.Date; import java.util.List; import foundation.action.ActionProvider; import foundation.action.WorkflowDispatcher; import foundation.dao.DataPackage; import foundation.dao.Domain; import foundation.dao.Filter; import foundation.dao.PackageStringMap; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.object.DataObject; import foundation.io.define.DataIO; import foundation.io.define.DataIOContainer; import foundation.io.define.IODirection; import foundation.io.define.IOTask; import foundation.io.engine.IOEngine; import foundation.io.engine.IOResult; import foundation.io.engine.IOWatchPoint; import foundation.io.object.DownloadAction; import foundation.io.object.DownloadWriter; import foundation.io.object.FileRecord; import foundation.monitor.Monitor; import foundation.right.IRightObjectExecutor; import foundation.right.Range; import foundation.right.RightAssistant; import foundation.right.RightPool; import foundation.server.config.Configer; import foundation.token.IOnlineUser; import foundation.token.IUser; import foundation.translator.Translator; import foundation.util.Util; public class IOHandler extends ActionProvider implements IRightObjectExecutor { private static Monitor monitor; private IOTask ioTask; private IOContext context; static { monitor = new Monitor(); } public IOHandler() { } @Override public void publishMethod() { //1. 上载一个文件 addMethod("uploadOneFile"); //2. 上载多个文件 addMethod("uploadFiles"); //3. 下载一个文件 addMethod("downloadOneFile"); //4. 获取文件记录(文件名、大小、物理地址) addMethod("getFileRecord"); //5. 导出数据 addMethod("exportData"); //6. 导入数据 addMethod("importData"); //6. 运行导入导出(通过 work flow) addMethod("execIO"); //6. 下载导入数据的错误信息 addMethod("downloadImportErrors"); //7. 导入数据 addMethod("loadData"); //9. 获取当前状态 addMethod("getIOStatus"); //10. 获取数据文件 addMethod("getDataFile"); //11. 注入数据到模板,并生成文件 addMethod("injectDataToOneFile"); //12. 注入数据到多个模板,并生成多个文件 addMethod("injectDataToFiles"); //13. 完善文件路径 addMethod("fillFilePath"); } public void uploadOneFile() throws Exception { FileRecord record = FileCenter.uploadOneFile(dataReader); dataWriter.addValue("file", record); } public void uploadFiles() throws Exception { List recordList = FileCenter.uploadFiles(dataReader); dataWriter.addValue("fileList", recordList); } public void downloadOneFile() throws Exception { String fileURL = dataReader.getString("url"); DownloadAction action = DownloadAction.parse(dataReader.getString("action")); //1. 根据 URL 直接到目录下面获取文件并下载 if (!Util.isEmpty(fileURL)) { File file = new File(FileRepository.urlToPath(fileURL)); if (!file.exists()) { dataWriter.reportOneError("download", "文件不存在"); return; } DownloadWriter downloadWriter = new DownloadWriter(dataWriter); downloadWriter.write(file, file.getName(), action); return; } //2. 根据文件索引下载文件 String dataName = dataReader.getString("dataName"); String fileId = dataReader.getString("file_index_id"); if (Util.isEmpty(dataName) || Util.isEmpty(fileId)) { logger.error("file get error, empty dataname or file_index_id"); return; } FileRecord record = FileCenter.getFile(dataName, fileId); if (action == DownloadAction.Unknown) { action = DownloadAction.parse(record.getContentType()); } DownloadWriter downloadWriter = new DownloadWriter(dataWriter); downloadWriter.write(record.getFile(), record.getFileName(), action); } public void getFileRecord() throws Exception { String dataName = dataReader.getString("dataName"); String fileId = dataReader.getString("id"); FileRecord fileRecord = FileCenter.getFile(dataName, fileId); dataWriter.addValue("data", fileRecord); } public void exportData() throws Exception { IODirection direction = IODirection.TableToSheet; String taskName = dataReader.getString("ioName"); if (Util.isEmpty(taskName)) { logger.error("can not exec io task for empty io name"); return; } //1. 获取或创建 IOTask IOTask ioTask = getIOTask(taskName, direction); //2. 运行 IOTask doExecIO(ioTask); } public void importData() throws Exception { IODirection direction = IODirection.SheetToTable; String taskName = dataReader.getString("ioName"); if (Util.isEmpty(taskName)) { logger.error("can not exec io task for empty io name"); return; } //1. 获取或创建 IOTask ioTask = getIOTask(taskName, direction); //2. 通过 workflow 运行 IOTask context = new IOContext(); DataIO dataIO = ioTask.getDataIO(0); if (dataIO != null) { context.setToDateObject(dataIO.getToDataObject()); context.setToTempDateObject(dataIO.getToTempDataObject()); } ImportStep workStep = new ImportStep(ioTask, this); WorkflowDispatcher dispatcher = WorkflowDispatcher.getInstance(); dispatcher.execWorkflow(dataReader, dataWriter, workStep, context); } public void downloadImportErrors() throws Exception { String taskName = dataReader.getString("ioName"); String ioBatchId = dataReader.getString("ioBatchId"); if(Util.isEmpty(ioBatchId)) { ioBatchId = context.getIoBatchId(); } if (Util.isEmpty(taskName) || Util.isEmpty(ioBatchId)) { logger.error("can not exec io task for empty io name"); return; } IOTask ioTask = IOCreator.createDownloadErrorsTask(dataReader, taskName, ioBatchId); doExecIO(ioTask); } public void loadData() throws Exception { IODirection direction = IODirection.SheetToMemory; String taskName = dataReader.getString("ioName"); if (Util.isEmpty(taskName)) { logger.error("can not exec io task for empty io name"); return; } //1. 获取或创建 IOTask IOTask ioTask = getIOTask(taskName, direction); //2. 运行 IOTask doExecIO(ioTask); } public void execIO() throws Exception { if (ioTask == null) { return; } doExecIO(ioTask); } private IOTask getIOTask(String taskName, IODirection direction) throws Exception { DataIOContainer ioContainer = DataIOContainer.getInstance(); IOTask ioTask = ioContainer.getIOTask(taskName); if (ioTask == null) { ioTask = IOCreator.createTask(dataReader, taskName, direction); } return ioTask; } private void doExecIO(IOTask ioTask) throws Exception { Range range = ioTask.getRange(); IOnlineUser user = IOnlineUser.getInstance(); //1. apply right String resourceKey = RightPool.getResourceKey(range, "DataIO", ioTask.getName()); RightAssistant assistant = new RightAssistant(this, user); RightPool.apply(range, "DataIO", assistant); //2. get watch point IOWatchPoint watchPoint = monitor.getWathchPoint(resourceKey); //3. if not success if (!assistant.isSuccess()) { String message = createSkipMessage(watchPoint); dataWriter.reportOneError("获取导入/导出权限", message); return; } //4. create watch point for first time if (watchPoint == null) { watchPoint = (IOWatchPoint) assistant.getData(); monitor.addWatchPoint(resourceKey, watchPoint); } //5. run engine IOEngine engine = watchPoint.getEngine(); engine.init(dataReader, dataWriter, ioTask, context); engine.syncExec("exec"); //6. set result IOResult result = engine.getResult(); dataWriter.addValue("status", result); dataWriter.addValue("data", result.getEntitySet()); dataWriter.addValue("title", result.getTitles()); } public void getFile() throws Exception { String fileName = dataReader.getString("name"); if (Util.isEmpty(fileName)) { logger.error("file name is empty"); return; } // String path = Configer.getPath_Temp() + "/" + fileName; // File file = new File(path); File file = new File(""); if (!file.exists()) { dataWriter.reportOneError("下载文件", "文件不存在: " + fileName); return; } DownloadWriter downloadWriter = new DownloadWriter(dataWriter); downloadWriter.write(file, file.getName(), DownloadAction.AsExcel); } public void getStatus() throws Exception { String taskName = dataReader.getString("ioName"); DataIOContainer ioContainer = DataIOContainer.getInstance(); IOTask ioTask = ioContainer.getIOTask(taskName); if (ioTask == null) { dataWriter.reportOneError("获取导入/导出定义", "定义不存在" + taskName); return; } Range range = ioTask.getRange(); String resourceKey = RightPool.getResourceKey(range, "DataIO", taskName); IOWatchPoint watchPoint = monitor.getWathchPoint(resourceKey); if (watchPoint == null) { dataWriter.reportOneError("获取watchPoint", "系统空闲,没有运行"); return; } IOResult result = watchPoint.getIOResult(); dataWriter.addValue("status", result); } public void injectDataToFiles() throws Exception { //1. 获取模板名称 List templates = dataReader.getStringList("template"); if (templates == null || templates.isEmpty()) { dataWriter.writeError("inject data to file error, template is null"); return; } //2. 根据ID获取数据 Domain domain = dataReader.getDomain(); DataPackage dataPackage = (domain != null) ? domain.getDataPackage() : null; if (dataPackage == null) { dataWriter.writeError("inject data to file error, data package not exists"); return; } //3. 数据注入 IOnlineUser user = IOnlineUser.getInstance(); PackageStringMap dataMap = dataPackage.toStringMap(); dataMap.setNullResult("***"); List files = FileInjector.createFiles(user, templates, FileTypes.PDF, dataMap); //4. 返回结果 dataWriter.addValue("file", files); // DownloadWriter downloadWriter = new DownloadWriter(dataWriter); // downloadWriter.write(file, file.getName(), DownloadAction.AsPDF); } public void injectDataToOneFile() throws Exception { //1. 获取模板名称 String template = dataReader.getString("template"); if (Util.isEmpty(template)) { dataWriter.writeError("inject data to file error, template is null"); return; } //2. 根据ID获取数据 Domain domain = dataReader.getDomain(); DataPackage dataPackage = (domain != null) ? domain.getDataPackage() : null; if (dataPackage == null) { dataWriter.writeError("inject data to file error, data package not exists"); return; } //3. 数据注入 IOnlineUser user = IOnlineUser.getInstance(); PackageStringMap dataMap = dataPackage.toStringMap(); dataMap.setNullResult("***"); File file = FileInjector.createOneFile(user, template, FileTypes.PDF, dataMap); if (!file.exists()) { dataWriter.reportOneError("下载文件", "文件不存在: " + file); return; } //4. 返回结果 dataWriter.addValue("file", file.toString()); // DownloadWriter downloadWriter = new DownloadWriter(dataWriter); // downloadWriter.write(file, file.getName(), DownloadAction.AsPDF); } @Override public Object createRightObject(IUser user, String resourceKey) { IOEngine engine = new IOEngine(); IOWatchPoint watchPoint = new IOWatchPoint(user, engine); monitor.addWatchPoint(resourceKey, watchPoint); return watchPoint; } @Override public boolean isIdle(Object data) { if (data == null) { return true; } IOWatchPoint watchPoint = (IOWatchPoint) data; IOEngine engine = watchPoint.getEngine(); return engine.isIdle(); } private String createSkipMessage(IOWatchPoint watchPoint) { if (watchPoint == null) { return "该操作刚刚被其他人执行,系统正在运行..."; } IUser user = watchPoint.getRunningUser(); Date date = watchPoint.getBegionTime(); String result = user.getName() + "在【" + Translator.toString(date) + "】已经运行..."; return result; } public void fillFilePath() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); DataPackage host = dataPackage.getHost(); DataObject dataObject = DataObject.getInstance("so_implant_file"); EntitySet fileList = dataObject.getTableEntitySet(new Filter("sender_id", host.getMasterId())); String filePath; for (Entity entity : fileList) { filePath = entity.getString("file_path"); filePath = Configer.getParam("PathRepository") + filePath; entity.set("file_path", filePath); dataObject.updateEntity(entity); } } }