From 1548ad44cd82576963ce8b26fe3a9e975431ba9b Mon Sep 17 00:00:00 2001 From: hezq Date: Fri, 15 Dec 2023 10:15:19 +0800 Subject: [PATCH] Signed-off-by: hezq --- .classpath | 7 + .project | 28 ++ .settings/org.eclipse.jdt.core.prefs | 8 + META-INF/MANIFEST.MF | 21 + .../plm/performancemanagement/Activator.class | Bin 0 -> 958 bytes .../handlers/TaskFolderMatchingHandler.class | Bin 0 -> 17476 bytes build.properties | 6 + icons/sample.png | Bin 0 -> 332 bytes icons/sample@2x.png | Bin 0 -> 526 bytes plugin.xml | 50 ++ .../plm/performancemanagement/Activator.java | 44 ++ .../handlers/TaskFolderMatchingHandler.java | 426 ++++++++++++++++++ 12 files changed, 590 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 META-INF/MANIFEST.MF create mode 100644 bin/com/langtech/plm/performancemanagement/Activator.class create mode 100644 bin/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.class create mode 100644 build.properties create mode 100644 icons/sample.png create mode 100644 icons/sample@2x.png create mode 100644 plugin.xml create mode 100644 src/com/langtech/plm/performancemanagement/Activator.java create mode 100644 src/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..eca7bdb --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..24d35fc --- /dev/null +++ b/.project @@ -0,0 +1,28 @@ + + + com.langtech.plm.performancemanagement + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..9f6ece8 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..7afe5d5 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,21 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Performancemanagement +Bundle-SymbolicName: com.langtech.plm.performancemanagement;singleton:=true +Bundle-Version: 1.0.0 +Bundle-Activator: com.langtech.plm.performancemanagement.Activator +Bundle-Vendor: LANGTECH +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + com.teamcenter.rac.aifrcp;bundle-version="13000.1.0", + com.teamcenter.rac.tcapps;bundle-version="13000.1.0", + com.teamcenter.rac.ui;bundle-version="13000.1.0", + com.teamcenter.rac.ui.views;bundle-version="13000.1.0", + com.teamcenter.rac.util;bundle-version="13000.1.0", + com.teamcenter.rac.common;bundle-version="13000.1.0", + com.teamcenter.rac.kernel;bundle-version="13000.1.0", + com.teamcenter.rac.external;bundle-version="13000.1.0", + org.apache.poi.39;bundle-version="3.9.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Automatic-Module-Name: com.langtech.plm.performancemanagement +Bundle-ActivationPolicy: lazy diff --git a/bin/com/langtech/plm/performancemanagement/Activator.class b/bin/com/langtech/plm/performancemanagement/Activator.class new file mode 100644 index 0000000000000000000000000000000000000000..ea465757a0f3cdf82331a1ea9e99695526a0ccef GIT binary patch literal 958 zcmbVKTTc@~6#k}Hx-Lb*qEHozLfV>ijq-*uK@iiVAtXp&&2*VAqq{rJ>@4!LygZQj z;1BRe8P7}+65}QMGBfAQneUeQ`t9=<0GrsTqQLMdR7nu?G%_MQ2_|t8OoSdQo$xdi zwD3qIA~nHwXyhq3N>@>0*ibqOL>S9SCW2hjyF8L9%W2xovJ6aGuq4DbIg5kqc>>v2moZh zga+p6d)vaq-B-RTYp5aVGZ|*#hQQMT#<*5XuhYq0PEd`26P;X^}}e+ H-mQNJO*71w literal 0 HcmV?d00001 diff --git a/bin/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.class b/bin/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..994f3bbe1d52fffd5044ea8deb97b18b224d2dfd GIT binary patch literal 17476 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 literal 0 HcmV?d00001 diff --git a/build.properties b/build.properties new file mode 100644 index 0000000..0d3d3a7 --- /dev/null +++ b/build.properties @@ -0,0 +1,6 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + icons/ diff --git a/icons/sample.png b/icons/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..02c4b79e10986d56bda97051eb0da2e9119c97f5 GIT binary patch literal 332 zcmV-S0ki&zP)o}PQ;SW4Q?|D@o|!n4bZ+dmjHl(fFnOU>N3Hz|3`e^PLI_Tklq z9dEUPF8GjIQ2+RLZpDrNq~L=3C%1s!j|YcCWZ+aA5&{s6WBjJ7phjchl+7dD zK%??C5t{FV)M8Cck-?KSfC{eT(i|B$Wp$+QOcA_!0hFXcX&$6FDqzZKU<%z0%uwCY e0aKi5l4}7X=XWJ6VmxR70000{ZT)6VX-X|e!skhH1SmmK(Q+8xOk9EsoDx9;%V9VIujLL74J^=XMJoq9 z1|@9VK_4(VhK80y5@pbo6ckI-X8va_ZhIdO!f9Fi&L*dB`%g;@wBtO?KClDIJKpgF zIsXR&gB_67@QMe>IbYQF_DWvOz5n#UMXhhIg6u>s=Yd5ht>Yhtu@=)Y0h1l*%f Qr~m)}07*qoM6N<$f|JJHQ2+n{ literal 0 HcmV?d00001 diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..5a25493 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/langtech/plm/performancemanagement/Activator.java b/src/com/langtech/plm/performancemanagement/Activator.java new file mode 100644 index 0000000..67636fc --- /dev/null +++ b/src/com/langtech/plm/performancemanagement/Activator.java @@ -0,0 +1,44 @@ +package com.langtech.plm.performancemanagement; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "com.langtech.plm.performancemanagement"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + @Override + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/src/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.java b/src/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.java new file mode 100644 index 0000000..212380b --- /dev/null +++ b/src/com/langtech/plm/performancemanagement/handlers/TaskFolderMatchingHandler.java @@ -0,0 +1,426 @@ +package com.langtech.plm.performancemanagement.handlers; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +import com.teamcenter.rac.aif.AbstractAIFApplication; +import com.teamcenter.rac.aifrcp.AIFUtility; +import com.teamcenter.rac.kernel.TCComponent; +import com.teamcenter.rac.kernel.TCComponentDataset; +import com.teamcenter.rac.kernel.TCComponentTcFile; +import com.teamcenter.rac.kernel.TCException; +import com.teamcenter.rac.kernel.TCProperty; +import com.teamcenter.rac.kernel.TCSession; +import com.teamcenter.rac.util.FileUtility; +import com.teamcenter.rac.util.MessageBox; + +/** + * 功能描述:选中项目文件夹,导出绩效报表 数据库表维护任务要求表 + * + * + */ +public class TaskFolderMatchingHandler extends AbstractHandler { + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + AbstractAIFApplication app = AIFUtility.getCurrentApplication(); + TCSession session = (TCSession) app.getSession(); + TCComponent target = null; + target = (TCComponent) app.getTargetComponent(); + // 选中项目类型,否则报错 + String type = target.getType(); + if (type.equals("LD6_CusProdFolder") || type.equals("客户成品文件夹")) { + // TODO 换成数据库方式维护 +// TCComponent[] workRequest = null; +// try { +// workRequest = session.search("常规...", new String[] { "名称", "类型" }, new String[] { "任务要求表", "xxxx" }); +// } catch (Exception e) { +// e.printStackTrace(); +// MessageBox.post("查询异常", "", MessageBox.INFORMATION); +// } +// if (workRequest.length == 0) { +// MessageBox.post("系统中没有任务要求表,请导入后重试", "", MessageBox.INFORMATION); +// } else if (workRequest.length > 1) { +// +// MessageBox.post("系统中存在多个任务要求表", "", MessageBox.INFORMATION); +// } + // 检查报表模板是否存在(首选项ld_billboards_uid) + String ldBillboardsUid = session.getPreferenceService().getStringValue("ld_billboards_uid"); + if (!getMessageboxInfo(ldBillboardsUid, "ld_billboards_uid")) { + return null; + } + TCComponent billboard = null; + try { + billboard = session.stringToComponent(ldBillboardsUid); + } catch (TCException e) { + e.printStackTrace(); + MessageBox.post("请通知管理员检查首选项ld_billboards_uid是否配置", "", MessageBox.INFORMATION); + return null; + } + if (billboard == null) { + MessageBox.post("请通知管理员检查首选项ld_billboards_uid是否配置", "", MessageBox.INFORMATION); + return null; + } + // 获取岗位系数 难度系数 紧张度系数 要求完成时间公式的首选项 + String[] ldPostCoefficient = session.getPreferenceService().getStringValues("ld_postCoefficient"); + String[] ldTaskNature = session.getPreferenceService().getStringValues("ld_taskNature");// 难度系数对应的难度系数? + String[] ldUrgency = session.getPreferenceService().getStringValues("ld_urgency"); + // 超时配置 + String[] ldOvertime = session.getPreferenceService().getStringValues("ld_overtime");// 严重等级:天数区间(整数)[0,0]:扣分系数;一般:(0,1]:1/5;严重:(1,2]:1/3;超严重:(2,3]:1/2 + // 流程信息配置成 任务包名称=流程名称:审核节点名称 + String[] ldProcessReview = session.getPreferenceService().getStringValues("ld_processReview"); + if (!getMessageInfo(ldPostCoefficient, "ld_processReview")) { + return false; + } + if (!getMessageInfo(ldTaskNature, "ld_taskNature")) { + return false; + } + if (!getMessageInfo(ldUrgency, "ld_urgency")) { + return false; + } + if (!getMessageInfo(ldProcessReview, "ld_processReview")) { + return false; + } + if (!getMessageInfo(ldOvertime, "ld_overtime")) { + return false; + } + Map postCoefficientMap = new HashMap();// 岗位,岗位系数 + Map taskNatureMap = new HashMap();// 任务性质,任务系数 + Map urgencyMap = new HashMap();// 紧急程度,紧急程度系数 + Map processReviewMap = new HashMap();// 流程名称,指派的节点名称 + Map severityIntervalMap = new HashMap();// 键:天数区间;值:扣分系数 + for (int i = 0; i < ldPostCoefficient.length; i++) { + String value = ldPostCoefficient[i]; + postCoefficientMap.put(value.split("=")[0], value.split("=")[0]); + } + for (int i = 0; i < ldTaskNature.length; i++) { + String value = ldTaskNature[i]; + taskNatureMap.put(value.split("=")[0], value.split("=")[0]); + } + for (int i = 0; i < ldUrgency.length; i++) { + String value = ldUrgency[i]; + urgencyMap.put(value.split("=")[0], value.split("=")[0]); + } + for (int i = 0; i < ldProcessReview.length; i++) { + String value = ldProcessReview[i]; + processReviewMap.put(value.split("=")[0], value.split("=")[0]); + } + for (int i = 0; i < ldOvertime.length; i++) { + String dayInterval = ldOvertime[i].split(":")[1]; + String severity = ldOvertime[i].split(":")[0]; + String point = ldOvertime[i].split(":")[2]; + severityIntervalMap.put(dayInterval, point); + } + // 下载报表命名引用和任务要求表的命名引用 + String billboardAddress = downLoadFile(billboard); + // TODO 获取工艺结束时间 + String targetName = ""; + try { + targetName = target.getProperty("object_name"); + } catch (TCException e) { + e.printStackTrace(); + } + Date processEndTime = getEndTime(targetName); + if (processEndTime == null) { + MessageBox.post("请检查是否设置或者导入相关客户成品文件夹名称和工艺程序结束时间", "", MessageBox.INFORMATION); + return null; + } + // 获取任务包的流程 组织 + // 先遍历底层结构 + String path = ""; + path = targetName; + String link = "/"; + List taskPathList = new ArrayList(); + Map folderMap = new HashMap();// 键:文件夹层级结构 值:文件夹对象 + getAllFolderPath(target, path, link, taskPathList, folderMap); + // 获取首选项Connor_JXFolder + Map> packageMap = new HashMap>(); + String connorJXFolderPreference = "Connor_JXFolder"; + String[] ConnorJXFolders = session.getPreferenceService().getStringValues(connorJXFolderPreference); + if (getMessageInfo(ConnorJXFolders, connorJXFolderPreference)) { + return false; + } + for (int i = 0; i < ConnorJXFolders.length; i++) { + String[] values = ConnorJXFolders[i].split("="); + String[] folders = values[1].split(";"); + List folderList = Arrays.asList(folders); + packageMap.put(values[0], folderList); + } + // 读取报表信息 + File file = new File(billboardAddress); + XSSFWorkbook workbook = null; + try { + FileInputStream fis = new FileInputStream(file); + workbook = new XSSFWorkbook(fis); + } catch (IOException e) { + e.printStackTrace(); + } + XSSFSheet sheet = workbook.getSheet("新品任务分配表"); + int rowNum = sheet.getLastRowNum(); + for (int i = 1; i < rowNum; i++) { + XSSFRow row = sheet.getRow(i); + String cellBValue = row.getCell(1).getStringCellValue().trim();// 任务包名 + List folderList = packageMap.get(cellBValue); + if (folderList != null && folderList.size() > 0) { + String folderPath = folderList.get(0); + TCComponent folder = folderMap.get(folderPath); + String[] properties = new String[] { "object_desc", "任务性质", "难易程度", "紧急程度", "额定业务工时(小时)", + "fnd0AllWorkflows" }; + TCProperty[] tcproperties = null; + try { + tcproperties = folder.getTCProperties(properties); + } catch (TCException e) { + e.printStackTrace(); + } + // 新品任务要求描述 + String objectDesc = tcproperties[0].getStringValue(); + String taskNature = tcproperties[1].getDisplayValue(); + String difficulty = tcproperties[2].getDisplayValue(); + String urgency = tcproperties[3].getDisplayValue(); + String ratedBusinessHours = tcproperties[4].getStringValue(); + String taskNatureCoefficient = taskNatureMap.get(difficulty); + String urgencyCoefficient = urgencyMap.get(urgency); + String postCoefficient = "";// 待定 + // 获取流程信息 + String processReview = processReviewMap.get(cellBValue); + String processName = processReview.split(":")[0]; + String reviewName = processReview.split(":")[1]; + String assignee = "";// 被指派者fnd0Assignee,如果流程任务没有经过转发,被指派者即流程接受者;等同于责任方 + String assigner = "";// 指派者fnd0Assigner,如果流程任务没有经过转发,这个属性没有值,可以取被指派者 + String assigneeGroup = "";// 被指派者的组 + String status = "";// 流程状态 + String startData = "";// 流程开始时间 + String endDateValue = "";// 流程结束时间 + String actualHours = "";// 实际业务工时 + String deductPoints = "";// 超时扣分 + TCComponent[] workflows = tcproperties[5].getReferenceValueArray(); + for (int j = 0; j < workflows.length; j++) { + TCComponent workflow = workflows[j]; + try { + String[] workflowProperties = new String[] { "object_name", "fnd0ActuatedInteractiveTsks", + "fnd0EndDate", "fnd0StartDate", "fnd0Status" }; + TCProperty[] workflowTcProperties = workflow.getTCProperties(workflowProperties); + String workflowName = workflowTcProperties[0].getDisplayValue(); + TCComponent[] reviews = workflowTcProperties[1].getReferenceValueArray(); + if (workflowName.equals(processName)) { + for (int k = 0; k < reviews.length; k++) { + TCComponent review = reviews[k]; + String typeName = review.getType(); + if (typeName.equals("签发")) {// 任务:fnd0AliasTaskName;执行者:fnd0Performer + // fnd0AssigneeGroupRole owning_group + String[] reviewProperties = new String[] { "fnd0AliasTaskName", "fnd0Performer", + "owning_group", "fnd0Assigner", "fnd0Assignee" }; + TCProperty[] reviewTcProperties = review.getTCProperties(reviewProperties); + String aliasTaskName = reviewTcProperties[0].getDisplayValue(); + if (aliasTaskName.contains(":")) { + String reviewNodeName = aliasTaskName.split(":")[0]; + if (reviewNodeName.equals(reviewName)) { + assignee = reviewTcProperties[4].getDisplayValue(); + assigneeGroup = reviewTcProperties[2].getDisplayableValue(); + TCProperty assigneeProperty = reviewTcProperties[3]; + if (assigneeProperty.getDisplayValue().length() > 0) { + assigner = assigneeProperty.getDisplayValue(); + } else { + assigner = assignee; + } + } + } + status = workflowTcProperties[4].getDisplayValue().equals("已完成") ? "已完成" + : "未完成"; + endDateValue = workflowTcProperties[2].getDisplayValue(); + Date startDate = workflowTcProperties[2].getDateValue(); + Date endDate = workflowTcProperties[3].getDateValue(); + actualHours = "" + (endDate.getTime() - startDate.getTime()) / 1000 / 3600; + float point = (float) 0.0; + if (status.equals("已完成")) { + ZoneId zoneId = ZoneId.systemDefault(); + Instant instantEnd = endDate.toInstant(); + Instant instantProcessEnd = processEndTime.toInstant(); + LocalDate localEndDate = instantEnd.atZone(zoneId).toLocalDate(); + LocalDate localProcessEndDate = instantProcessEnd.atZone(zoneId) + .toLocalDate(); + long diff = localEndDate.toEpochDay() - localProcessEndDate.toEpochDay(); + String overtimeCoefficient = "";// 扣分系数 + postCoefficient = postCoefficientMap.get(assigneeGroup); + for (Map.Entry me : severityIntervalMap.entrySet()) { + String interval = me.getKey(); + String startDay = interval.split(",")[0]; + String endDay = interval.split(",")[1]; + boolean condition1 = false; + boolean condition2 = false; + if (startDay.startsWith("[")) { + condition1 = diff >= (Integer + .valueOf(startDay.substring(1, startDay.length() - 1))) + ? true + : false; + } else if (startDay.startsWith("(")) { + condition1 = diff > (Integer + .valueOf(startDay.substring(1, startDay.length() - 1))) + ? true + : false; + } + if (endDay.endsWith("]")) { + condition2 = diff <= (Integer + .valueOf(endDay.substring(0, endDay.length() - 2))) ? true + : false; + } else if (startDay.startsWith(")")) { + condition2 = diff < (Integer + .valueOf(endDay.substring(0, endDay.length() - 2))) ? true + : false; + } + if (condition1 == true && condition2 == true) { + overtimeCoefficient = me.getValue(); + } else { + continue; + } + } + if (!overtimeCoefficient.equals("")) { + point = 1 * Float.valueOf(overtimeCoefficient) + * Float.valueOf(taskNatureCoefficient) + * Float.valueOf(urgencyCoefficient);// TODO 公式待定,尤其时任务性质和难度系数 + } + } + } + } + } + } catch (TCException e) { + e.printStackTrace(); + } + } + } else { + continue; + } + } + } else { + MessageBox.post("请选择客户成品文件夹", "", MessageBox.INFORMATION); + } + return null; + } + + /** + * 通过数据方式获取工艺结束时间 + */ + private Date getEndTime(String targetName) { + // TODO + return null; + } + + /** + * 检查首选项是否设置 + * + * @param preferenceValue 首选项值 + * @param preferenceName 首选项名称 + * @return 没有配置就返回false + */ + private boolean getMessageInfo(String[] preferenceValue, String preferenceName) { + if (preferenceValue == null || preferenceValue.length == 0) { + MessageBox.post("请通知管理员检查首选项" + preferenceName + "是否配置", "", MessageBox.INFORMATION); + return false; + } + return true; + } + + /** + * 检查首选项是否设置 + * + * @param preferenceValue 首选项值 + * @param preferenceName 首选项名称 + * @return 没有配置就返回false + */ + private boolean getMessageboxInfo(String preferenceValue, String preferenceName) { + if (preferenceValue == null || preferenceValue.length() == 0) { + MessageBox.post("请通知管理员检查首选项" + preferenceName + "是否配置", "", MessageBox.INFORMATION); + return false; + } + return true; + } + + /** + * 循环便利项目文件夹下的所有文件夹,并添加到集合和map中 + * + * @param target 文件夹 + * @param path 文件路径 + * @param link 连接符 + * @param taskPathList 任务包路径集合 + * @param folderMap 任务包路径,任务包对象 + * @return 下载的命名引用文件 + */ + private void getAllFolderPath(TCComponent target, String path, String link, List taskPathList, + Map folderMap) { + try { + TCComponent[] contents = target.getRelatedComponents("contents"); + for (int i = 0; i < contents.length; i++) { + TCComponent content = contents[i]; + TCComponent[] childContents = content.getRelatedComponents("contents"); + path = path + link + content.getProperty("object_name"); + if (childContents.length > 0) { + getAllFolderPath(content, path, link, taskPathList, folderMap); + } else { + taskPathList.add(path); + folderMap.put(path, content); + } + } + } catch (TCException e) { + e.printStackTrace(); + } + } + + /** + * 下载文件 + * + * @param 数据集对象 + * @return 下载的命名引用文件 + */ + public String downLoadFile(TCComponent comp) { + if (comp == null) { + return ""; + } + String value = ""; + String tempPath = System.getenv("TEMP"); + if (tempPath == null) { + tempPath = ""; + } else if (!tempPath.endsWith("\\")) { + tempPath = tempPath + "\\"; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + try { + if (comp instanceof TCComponentDataset) { + TCComponentTcFile[] tcFiles = ((TCComponentDataset) comp).getTcFiles(); + File file = null; + System.out.println("tcFiles:" + tcFiles.length); + if (tcFiles != null && tcFiles.length != 0) { + file = tcFiles[0].getFmsFile(); + String fileName = file.getName(); + System.out.println("fileName:" + fileName); + String fileDix = fileName.substring(fileName.lastIndexOf("."), fileName.length()); + fileName = tempPath + sdf.format(new Date()) + fileDix; + File dirFile = new File(fileName); + FileUtility.copyFile(file, dirFile); + return fileName; + } + } + } catch (TCException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return value; + } +}