промежуточный. выкинул старые объекты и функционал. Осталось восстановить эксель, и отображение пакетов Сапфор
This commit is contained in:
@@ -3,8 +3,6 @@ import Common.Utils.Utils;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import TestingSystem.SAPFOR.SapforTask.MatchState;
|
||||
import TestingSystem.SAPFOR.SapforTask.SapforTask;
|
||||
import TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage;
|
||||
import TestingSystem.SAPFOR.SapforTasksPackage.UI.*;
|
||||
import com.google.gson.annotations.Expose;
|
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
@@ -15,6 +13,7 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
public class SapforTasksResults_json implements Serializable {
|
||||
/*
|
||||
//---
|
||||
public PackageSummary root = null;
|
||||
public PackageSummary comparison_root = null;
|
||||
@@ -264,4 +263,5 @@ public class SapforTasksResults_json implements Serializable {
|
||||
return res;
|
||||
}
|
||||
//---
|
||||
*/
|
||||
}
|
||||
@@ -39,4 +39,7 @@ public class SapforPackage extends TestingPackage<SapforTasksPackage_json> {
|
||||
public File getHomeDirectory() {
|
||||
return Global.SapforPackagesDirectory;
|
||||
}
|
||||
public boolean isLoaded() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,10 +144,12 @@ public class SapforTask extends DBObject {
|
||||
}
|
||||
return String.join("→", versionsLines);
|
||||
}
|
||||
/*
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return Current.HasSapforTasksPackage() && Current.getSapforTasksPackage().id == this.sapfortaskspackage_id;
|
||||
}
|
||||
*/
|
||||
public LinkedHashMap<String, SapforVersion_json> getSortedVersions() {
|
||||
LinkedHashMap<String, SapforVersion_json> res = new LinkedHashMap<>();
|
||||
for (SapforVersion_json version_json : versions)
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
package TestingSystem.SAPFOR.SapforTask;
|
||||
import Common.Current;
|
||||
import Common.Database.DBTable;
|
||||
import Common.UI.DataSetControlForm;
|
||||
|
||||
import static Common.UI.Tables.TableRenderers.RendererDate;
|
||||
import static Common.UI.Tables.TableRenderers.RendererStatusEnum;
|
||||
public class SapforTasksDBTable extends DBTable<Long, SapforTask> {
|
||||
public SapforTasksDBTable() {
|
||||
super(Long.class, SapforTask.class);
|
||||
}
|
||||
@Override
|
||||
public String getSingleDescription() {
|
||||
return "задача";
|
||||
}
|
||||
@Override
|
||||
public String getPluralDescription() {
|
||||
return "задачи";
|
||||
}
|
||||
@Override
|
||||
public Current CurrentName() {
|
||||
return Current.SapforTask;
|
||||
}
|
||||
@Override
|
||||
protected DataSetControlForm createUI() {
|
||||
return new DataSetControlForm(this) {
|
||||
@Override
|
||||
protected void AdditionalInitColumns() {
|
||||
columns.get(4).setRenderer(RendererStatusEnum);
|
||||
columns.get(5).setRenderer(RendererDate);
|
||||
columns.get(6).setRenderer(RendererDate);
|
||||
}
|
||||
};
|
||||
}
|
||||
@Override
|
||||
public String[] getUIColumnNames() {
|
||||
return new String[]{
|
||||
"Группа",
|
||||
"Тест",
|
||||
"Флаги",
|
||||
"Статус",
|
||||
"Начало",
|
||||
"Окончание",
|
||||
"Версии"
|
||||
};
|
||||
}
|
||||
@Override
|
||||
public Object getFieldAt(SapforTask object, int columnIndex) {
|
||||
switch (columnIndex) {
|
||||
case 1:
|
||||
return object.group_description;
|
||||
case 2:
|
||||
return object.test_description;
|
||||
case 3:
|
||||
return object.flags;
|
||||
case 4:
|
||||
return object.state;
|
||||
case 5:
|
||||
return object.getStartDate();
|
||||
case 6:
|
||||
return object.getChangeDate();
|
||||
case 7:
|
||||
return object.versionsDescription;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package TestingSystem.SAPFOR.SapforTasksPackage;
|
||||
import TestingSystem.Common.Group.Group;
|
||||
import TestingSystem.Common.Test.Test;
|
||||
import TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration;
|
||||
import TestingSystem.SAPFOR.ServerSapfor.ServerSapfor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.LinkedHashMap;
|
||||
public class SapforPackageData implements Serializable {
|
||||
//--->
|
||||
public LinkedHashMap<Integer, Group> groups =new LinkedHashMap<Integer, Group>();
|
||||
public LinkedHashMap<Integer, Test> tests = new LinkedHashMap<>();
|
||||
public LinkedHashMap<Integer, SapforConfiguration> sapforConfigurations = new LinkedHashMap<>();
|
||||
public ServerSapfor sapfor = null;
|
||||
//-->>
|
||||
public String notFound = "";
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
package TestingSystem.SAPFOR.SapforTasksPackage;
|
||||
import Common.Constants;
|
||||
import Common.Database.DBObject;
|
||||
import Common.Global;
|
||||
import Common.Utils.Utils;
|
||||
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||
import TestingSystem.SAPFOR.Json.SapforTasksResults_json;
|
||||
import TestingSystem.SAPFOR.SapforTask.SapforTask;
|
||||
import com.sun.org.glassfish.gmbal.Description;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Comparator;
|
||||
public class SapforTasksPackage extends DBObject {
|
||||
@Description("PRIMARY KEY, UNIQUE")
|
||||
public long id = Constants.Nan;
|
||||
@Description("DEFAULT ''")
|
||||
public String testsNames = "";//имена тестов через ; для отображения
|
||||
//---
|
||||
public int sapforId = Constants.Nan;
|
||||
public String sapfor_version = "?"; //тестируемая версия SAPFOR для таблицы
|
||||
public String sapfor_process_name = "";
|
||||
//---
|
||||
public String workspace = ""; //домашняя папка
|
||||
//---
|
||||
public int tasksCount = 0; //Общее число задач
|
||||
//---
|
||||
public int needsEmail = 0;
|
||||
public long StartDate = 0; //дата начала выполнения
|
||||
public long ChangeDate = 0;//дата окончания выполнения
|
||||
//-
|
||||
public int kernels = 1; //количество потоков.
|
||||
@Description("DEFAULT 'TestsSynchronize'")
|
||||
public TasksPackageState state = TasksPackageState.TestsSynchronize;
|
||||
@Description("DEFAULT ''")
|
||||
public String testsIds = "";
|
||||
@Description("DEFAULT ''")
|
||||
public String configurationsIds = "";
|
||||
@Description("DEFAULT ''")
|
||||
public String summary = "";
|
||||
@Description("IGNORE")
|
||||
public SapforTasksResults_json results = null;
|
||||
///---
|
||||
public File getArchive() {
|
||||
return new File(Global.SapforPackagesDirectory, id + ".zip");
|
||||
}
|
||||
public File getLocalWorkspace() {
|
||||
return new File(Global.SapforPackagesDirectory, String.valueOf(id));
|
||||
}
|
||||
public File getLoadedSign() {
|
||||
return Paths.get(Global.SapforPackagesDirectory.getAbsolutePath(), String.valueOf(id), Constants.LOADED).toFile();
|
||||
}
|
||||
public boolean isLoaded() {
|
||||
return getLoadedSign().exists();
|
||||
}
|
||||
public void readResults() {
|
||||
File json_file = new File(getLocalWorkspace(), Constants.results_json);
|
||||
results = null;
|
||||
try {
|
||||
results = (SapforTasksResults_json) Utils.jsonFromFile(json_file,
|
||||
SapforTasksResults_json.class);
|
||||
//----
|
||||
results.tasks.sort(Comparator.comparing(SapforTask::getUniqueKey));
|
||||
for (SapforTask task : results.tasks)
|
||||
results.allTasks.put(task.getUniqueKey(), task);
|
||||
//---
|
||||
results.SortTasks(); //по состояниям конфигурациям и группам
|
||||
//---
|
||||
results.buildTree(this);
|
||||
//---
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Object getPK() {
|
||||
return id;
|
||||
}
|
||||
@Override
|
||||
public void SynchronizeFields(DBObject src) {
|
||||
super.SynchronizeFields(src);
|
||||
SapforTasksPackage p = (SapforTasksPackage) src;
|
||||
sapforId = p.sapforId;
|
||||
testsNames = p.testsNames;
|
||||
sapfor_version = p.sapfor_version;
|
||||
workspace = p.workspace;
|
||||
tasksCount = p.tasksCount;
|
||||
StartDate = p.StartDate;
|
||||
ChangeDate = p.ChangeDate;
|
||||
kernels = p.kernels;
|
||||
sapfor_process_name = p.sapfor_process_name;
|
||||
state = p.state;
|
||||
needsEmail = p.needsEmail;
|
||||
summary = p.summary;
|
||||
}
|
||||
//---
|
||||
public SapforTasksPackage() {
|
||||
}
|
||||
//--
|
||||
public SapforTasksPackage(SapforTasksPackage sapforTasksPackage) {
|
||||
this.SynchronizeFields(sapforTasksPackage);
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package TestingSystem.SAPFOR.SapforTasksPackage;
|
||||
import Common.Current;
|
||||
import Common.Database.*;
|
||||
import Common.UI.DataSetControlForm;
|
||||
import TestingSystem.SAPFOR.SapforTask.SapforTask;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import static Common.UI.Tables.TableRenderers.RendererDate;
|
||||
import static Common.UI.Tables.TableRenderers.RendererStatusEnum;
|
||||
public class SapforTasksPackagesDBTable extends DBTable<Long,SapforTasksPackage> {
|
||||
public SapforTasksPackagesDBTable() {
|
||||
super(Long.class,SapforTasksPackage.class);
|
||||
}
|
||||
@Override
|
||||
public Current CurrentName() {
|
||||
return Current.SapforTasksPackage;
|
||||
}
|
||||
@Override
|
||||
public String getSingleDescription() {
|
||||
return "пакет задач Sapfor";
|
||||
}
|
||||
@Override
|
||||
public String getPluralDescription() {
|
||||
return "пакеты задач Sapfor";
|
||||
}
|
||||
@Override
|
||||
protected DataSetControlForm createUI() {
|
||||
return new DataSetControlForm(this) {
|
||||
@Override
|
||||
public boolean hasCheckBox() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
protected void AdditionalInitColumns() {
|
||||
// columns.get(0).setVisible(false);
|
||||
columns.get(3).setMaxWidth(200);
|
||||
columns.get(6).setRenderer(RendererDate);
|
||||
columns.get(7).setRenderer(RendererDate);
|
||||
columns.get(8).setRenderer(RendererStatusEnum);
|
||||
}
|
||||
};
|
||||
}
|
||||
@Override
|
||||
public String[] getUIColumnNames() {
|
||||
return new String[]{
|
||||
"SAPFOR",
|
||||
"Тесты",
|
||||
"Задач",
|
||||
"Ядер",
|
||||
"Начало",
|
||||
"Изменено",
|
||||
"Статус"
|
||||
};
|
||||
}
|
||||
@Override
|
||||
public Object getFieldAt(SapforTasksPackage object, int columnIndex) {
|
||||
switch (columnIndex) {
|
||||
case 2:
|
||||
return object.sapfor_version;
|
||||
case 3:
|
||||
return object.testsNames;
|
||||
case 4:
|
||||
return object.tasksCount;
|
||||
case 5:
|
||||
return object.kernels;
|
||||
case 6:
|
||||
return new Date(object.StartDate);
|
||||
case 7:
|
||||
return new Date(object.ChangeDate);
|
||||
case 8:
|
||||
return object.state;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public LinkedHashMap<Class<? extends DBObject>, FKBehaviour> getFKDependencies() {
|
||||
LinkedHashMap<Class<? extends DBObject>, FKBehaviour> res = new LinkedHashMap<>();
|
||||
res.put(SapforTask.class, new FKBehaviour(FKDataBehaviour.DELETE, FKCurrentObjectBehaviuor.ACTIVE));
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
package TestingSystem.SAPFOR.SapforTasksPackageSupervisor;
|
||||
import Common.Constants;
|
||||
import Common.Current;
|
||||
import Common.Global;
|
||||
import Common.GlobalProperties;
|
||||
import Common.Utils.Utils;
|
||||
import Repository.Server.ServerCode;
|
||||
import TestingSystem.Common.Test.Test;
|
||||
import TestingSystem.Common.TestingPlanner_OLD;
|
||||
import TestingSystem.DVM.TasksPackage.TasksPackageState;
|
||||
import TestingSystem.SAPFOR.Json.SapforConfiguration_json;
|
||||
import TestingSystem.SAPFOR.Json.SapforTasksPackage_json;
|
||||
import TestingSystem.SAPFOR.Json.SapforTasksResults_json;
|
||||
import TestingSystem.SAPFOR.Json.SapforTest_json;
|
||||
import TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration;
|
||||
import TestingSystem.SAPFOR.SapforTask.SapforTask;
|
||||
import TestingSystem.SAPFOR.SapforTasksPackage.SapforPackageData;
|
||||
import TestingSystem.SAPFOR.SapforTasksPackage.SapforTasksPackage;
|
||||
import Visual_DVM_2021.Passes.PassCode_2021;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.Vector;
|
||||
public class SapforTasksPackageSupervisor {
|
||||
protected TestingPlanner_OLD planner; //планировщик.
|
||||
SapforTasksPackage sapforTasksPackage = null;
|
||||
public SapforTasksPackageSupervisor(TestingPlanner_OLD planner_in, SapforTasksPackage sapforTasksPackage_in) {
|
||||
planner = planner_in;
|
||||
sapforTasksPackage = sapforTasksPackage_in;
|
||||
}
|
||||
private void TestsSynchronize() throws Exception {
|
||||
SapforPackageData data = (SapforPackageData) planner.ServerCommand(ServerCode.GetActualSapforPackageData, sapforTasksPackage);
|
||||
if (!data.notFound.isEmpty()) {
|
||||
sapforTasksPackage.summary = data.notFound;
|
||||
sapforTasksPackage.state = TasksPackageState.Aborted;
|
||||
return;
|
||||
}
|
||||
//--
|
||||
System.out.println(sapforTasksPackage.id + " — TestsSynchronize");
|
||||
File sapfor_src = new File(data.sapfor.call_command);
|
||||
//--
|
||||
SapforTasksPackage_json package_json = new SapforTasksPackage_json();
|
||||
package_json.kernels = sapforTasksPackage.kernels;
|
||||
for (Test test : data.tests.values()) {
|
||||
SapforTest_json test_json = new SapforTest_json();
|
||||
test_json.description = test.description;
|
||||
test_json.group_description = data.groups.get(test.group_id).description;
|
||||
package_json.tests.add(test_json);
|
||||
}
|
||||
//создание рабочего пространства для пакетного режима
|
||||
File packageWorkspace = new File(Global.SapforPackagesDirectory, String.valueOf(sapforTasksPackage.id));
|
||||
Utils.CheckAndCleanDirectory(packageWorkspace);
|
||||
sapforTasksPackage.workspace = packageWorkspace.getAbsolutePath();
|
||||
//копирование тестов по конфигурациям.
|
||||
int actual_tasks_count = 0;
|
||||
for (SapforConfiguration configuration : data.sapforConfigurations.values()) {
|
||||
//--
|
||||
SapforConfiguration_json configuration_json = new SapforConfiguration_json();
|
||||
configuration_json.id = configuration.id;
|
||||
configuration_json.flags = configuration.getFlags();
|
||||
configuration_json.codes.add(PassCode_2021.SPF_CorrectCodeStylePass); //всегда добавляется.
|
||||
configuration_json.codes.addAll(configuration.getPassCodes());
|
||||
//--->>
|
||||
package_json.configurations.add(configuration_json);
|
||||
//-->>
|
||||
File configurationWorkspace = new File(packageWorkspace, String.valueOf(configuration.id));
|
||||
FileUtils.forceMkdir(configurationWorkspace);
|
||||
//--->>>
|
||||
for (Test test : data.tests.values()) {
|
||||
File test_root = new File(configurationWorkspace, test.description);
|
||||
Utils.CheckAndCleanDirectory(test_root);
|
||||
FileUtils.copyDirectory(new File(Global.TestsDirectory, String.valueOf(test.id)), test_root);
|
||||
actual_tasks_count++;
|
||||
}
|
||||
}
|
||||
sapforTasksPackage.tasksCount = actual_tasks_count;
|
||||
//копирование SAPFOR
|
||||
File sapforFile = new File(sapforTasksPackage.workspace, Utils.getDateName("SAPFOR_F"));
|
||||
FileUtils.copyFile(sapfor_src, sapforFile);
|
||||
if (!sapforFile.setExecutable(true))
|
||||
throw new Exception("Не удалось сделать файл " + sapforFile.getName() + " исполняемым!");
|
||||
sapforTasksPackage.sapfor_process_name = package_json.sapfor_drv = sapforFile.getName();
|
||||
//--->>
|
||||
//копирование визуализатора
|
||||
File visualiser = new File(sapforTasksPackage.workspace, "VisualSapfor.jar");
|
||||
FileUtils.copyFile(new File(Global.Home, "TestingSystem.jar"), visualiser);
|
||||
//создание настроек
|
||||
GlobalProperties properties = new GlobalProperties();
|
||||
properties.Mode = Current.Mode.Package;
|
||||
Utils.jsonToFile(properties, new File(sapforTasksPackage.workspace, "properties"));
|
||||
//создание инструкции
|
||||
File package_json_file = new File(sapforTasksPackage.workspace, "package_json");
|
||||
Utils.jsonToFile(package_json, package_json_file);
|
||||
//подготовка пакетного режима. Запустит его уже очередь.
|
||||
Utils.createScript(packageWorkspace, packageWorkspace, "start", "java -jar VisualSapfor.jar");
|
||||
//--
|
||||
sapforTasksPackage.state = TasksPackageState.RunningPreparation;
|
||||
}
|
||||
void PackageStart() throws Exception {
|
||||
System.out.println("start sapfor package " + sapforTasksPackage.id);
|
||||
File workspace = new File(sapforTasksPackage.workspace);
|
||||
File script = new File(sapforTasksPackage.workspace, "start");
|
||||
ProcessBuilder procBuilder = new ProcessBuilder(script.getAbsolutePath());
|
||||
procBuilder.directory(workspace);
|
||||
procBuilder.start();
|
||||
//--->>
|
||||
File started = new File(sapforTasksPackage.workspace, Constants.STARTED);
|
||||
while (!started.exists()) {
|
||||
System.out.println("waiting for package start...");
|
||||
Utils.sleep(1000);
|
||||
}
|
||||
//-->>
|
||||
sapforTasksPackage.state = TasksPackageState.RunningExecution;
|
||||
planner.UpdateSapforPackage();
|
||||
System.out.println("done");
|
||||
}
|
||||
void CheckPackageState() throws Exception {
|
||||
System.out.println("check sapfor package " + sapforTasksPackage.id);
|
||||
File done = new File(sapforTasksPackage.workspace, Constants.DONE);
|
||||
File aborted = new File(sapforTasksPackage.workspace, Constants.ABORTED);
|
||||
if (done.exists()) {
|
||||
sapforTasksPackage.state = TasksPackageState.Analysis;
|
||||
planner.UpdateSapforPackage();
|
||||
System.out.println("package done, start Analysis");
|
||||
} else if (aborted.exists()) {
|
||||
sapforTasksPackage.state = TasksPackageState.Aborted;
|
||||
planner.UpdateSapforPackage();
|
||||
System.out.println("package aborted");
|
||||
} else {
|
||||
System.out.println("package running");
|
||||
}
|
||||
}
|
||||
//--
|
||||
public boolean packageNeedsKill() throws Exception {
|
||||
return (boolean) planner.ServerCommand(ServerCode.CheckPackageToKill, sapforTasksPackage.id);
|
||||
}
|
||||
public void killPackage() throws Exception {
|
||||
//----
|
||||
File interrupt_file = new File(sapforTasksPackage.workspace, Constants.INTERRUPT);
|
||||
//----
|
||||
FileUtils.writeStringToFile(interrupt_file, new Date().toString());
|
||||
File aborted_file = new File(sapforTasksPackage.workspace, Constants.ABORTED);
|
||||
do {
|
||||
System.out.println("waiting for interrupt...");
|
||||
Thread.sleep(1000);
|
||||
} while (!aborted_file.exists());
|
||||
System.out.println("coup de grace..");
|
||||
String kill_command = "killall -SIGKILL " + sapforTasksPackage.sapfor_process_name;
|
||||
System.out.println(kill_command);
|
||||
Process killer = Runtime.getRuntime().exec(kill_command);
|
||||
killer.waitFor();
|
||||
System.out.println("done!");
|
||||
}
|
||||
public void AnalysePackage() throws Exception {
|
||||
File results_json_file = new File(sapforTasksPackage.workspace, Constants.results_json);
|
||||
if (results_json_file.exists()) {
|
||||
SapforTasksResults_json results_json = (SapforTasksResults_json) Utils.jsonFromFile(results_json_file, SapforTasksResults_json.class);
|
||||
results_json.SortTasks();
|
||||
//--
|
||||
sapforTasksPackage.summary = results_json.getEmailSummary();
|
||||
for (SapforTask task : results_json.tasks) {
|
||||
//--
|
||||
task.versions = null;
|
||||
task.variants = null;
|
||||
}
|
||||
planner.ServerCommand(ServerCode.PublishSapforPackageTasks, planner.email, new Vector<>(results_json.tasks));
|
||||
}
|
||||
//Очистка
|
||||
//очистка служебных файлов.
|
||||
Utils.deleteFilesByExtensions(new File(sapforTasksPackage.workspace),
|
||||
"proj", "dep", "jar"
|
||||
// ,"sh", "exe", "bat"
|
||||
);
|
||||
//удаление сапфора
|
||||
File sapfor = new File(sapforTasksPackage.workspace, sapforTasksPackage.sapfor_process_name);
|
||||
if (sapfor.exists())
|
||||
FileUtils.forceDelete(sapfor);
|
||||
}
|
||||
public void Perform() throws Exception {
|
||||
if (packageNeedsKill()) {
|
||||
System.out.println("PACKAGE " + sapforTasksPackage.id + " NEEDS TO KILL");
|
||||
killPackage();
|
||||
sapforTasksPackage.state = TasksPackageState.Aborted;
|
||||
planner.UpdateSapforPackage();
|
||||
} else {
|
||||
switch (sapforTasksPackage.state) {
|
||||
case TestsSynchronize:
|
||||
TestsSynchronize();
|
||||
planner.UpdateSapforPackage();
|
||||
break;
|
||||
case RunningPreparation:
|
||||
PackageStart();
|
||||
break;
|
||||
case RunningExecution:
|
||||
CheckPackageState();
|
||||
break;
|
||||
case Analysis:
|
||||
AnalysePackage();
|
||||
sapforTasksPackage.state = TasksPackageState.Done;
|
||||
planner.UpdateSapforPackage();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user