diff --git a/activity.hpp b/activity.hpp index d9e559ca4d82482dbbda1d209a92d844353e8eda..6d23d02e8bf4baefa6fa2dd9a5c5765a6e04a465 100644 --- a/activity.hpp +++ b/activity.hpp @@ -87,8 +87,8 @@ namespace CIS { class ManualOperation : public ActivityBase { public: - explicit ManualOperation(string displayName, string message = "", string entityName = "") - : displayName(Utility::HtmlEscapeString(displayName)), messageInCSharp(Utility::HtmlEscapeString("\"" + message + "\"")), entityName(entityName), taskId(Utility::GenUUID()) {} + explicit ManualOperation(string displayName, string message = "", string teamId = "", string entityName = "") + : displayName(Utility::HtmlEscapeString(displayName)), messageInCSharp(Utility::HtmlEscapeString("\"" + message + "\"")), teamId(teamId), entityName(entityName), taskId(Utility::GenUUID()) {} ManualOperation(const ManualOperation &another) : displayName(another.displayName), messageInCSharp(another.messageInCSharp), entityName(another.entityName), taskId(Utility::GenUUID()) {} ManualOperation(ManualOperation &&) = default; @@ -99,12 +99,13 @@ namespace CIS { } private: - string displayName, messageInCSharp, entityName; + string displayName, messageInCSharp, teamId, entityName; string taskId; virtual rlib::string generateXaml() const override { rlib::string xamlCode = templates::MANUAL_OPERATION_XAML; xamlCode.replace_once("__TEMPLATE_ARG_DisplayName", displayName); xamlCode.replace_once("__TEMPLATE_ARG_TaskId", this->taskId); + xamlCode.replace_once("__TEMPLATE_ARG_TeamId", this->teamId); xamlCode.replace_once("__TEMPLATE_ARG_CodeLines", messageInCSharp); auto entityXaml = this->entityName == "" ? "" : rlib::string(templates::ENTITY_DEF_TEMPLATE).replace("__TEMPLATE_ARG_EntityName", this->entityName); diff --git a/web/demo.cc b/web/demo.cc index e44657eff5439205e3cc4309f8f0f62f0aadecf6..90c061e2e0d5bea70d5c9c6b76624a9c74683261 100644 --- a/web/demo.cc +++ b/web/demo.cc @@ -1,33 +1,55 @@ // This is a DEMO. You may use any C++17 syntax here. -// 先演示一下定义一个Activityçš„æ£å¸¸è¯æ³•ã€‚ +// 先演示一下定义一个Activityå’ŒManualOperationçš„æ£å¸¸è¯æ³•ã€‚ // (ActivityName, ClassName_In_Our_Code , DependencyEntityName) Activity HaveASleep ("HaveASleep", "FleetAGC.Activities.DelayActivity", ""); HaveASleep.addInputSetting("Timespan", "60"); +// (DisplayName , Message , DependencyEntityName) +ManualOperation AlertSomeone ("AlertSomeone", "This is some message", ""); +// ä½†æ˜¯å¦‚æžœä½ è¦å®šä¹‰å¾ˆå¤šå¾ˆå¤šActivity,建议下é¢çš„方法å·æ‡’。 -// ä½†æ˜¯å¦‚æžœä½ è¦å®šä¹‰å¾ˆå¤šå¾ˆå¤šActivity,建议用这ç§æ–¹æ³•å·æ‡’。 -#define DEFINE_ACTIVITY(name, entityName) \ - Activity name (#name, "FleetAGC.Activities.DelayActivity", entityName); \ - name.addInputSetting("Timespan", "60"); - -// 使用刚刚定义的å·æ‡’å®ã€‚ -DEFINE_ACTIVITY(GridManager, "M365Poc.SPO.GridManager") -DEFINE_ACTIVITY(AuthAndProvision, "M365Poc.SPO.AuthProvisioning") -DEFINE_ACTIVITY(FarmsAndTennats, "") -DEFINE_ACTIVITY(CSC , "") -DEFINE_ACTIVITY(FastSearch , "") -DEFINE_ACTIVITY(Microservices, "M365Poc.SPO.MicroServices") -DEFINE_ACTIVITY(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting") -DEFINE_ACTIVITY(SPOTooling, "M365Poc.SPO.SPOTooling") -DEFINE_ACTIVITY(UXCDNFailover, "M365Poc.SPO.UXCDNFailover") -DEFINE_ACTIVITY(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient") +//////////////////////////////////////////////////////////////////////////////////////////////// -// 把定义好的Activity组åˆä¸€ä¸‹ï¼Œå…¶ä¸ç®å¤´è¡¨ç¤ºä¸²è¡Œï¼Œç«–线表示并行。 -auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch); -auto block2 = Microservices | MonitorAndAlert; -auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient; +{ // å·æ‡’方案1 + // 这里å‡è®¾ä½ 想用FleetAGC.Activities.DelayActivity,并且想给他一个TimeSpanå‚数。 + #define AC(name, entityName) \ + auto name = Activity(#name, "FleetAGC.Activities.DelayActivity", entityName).addInputSetting("Timespan", "60"); + + // 使用刚刚定义的å·æ‡’å®ã€‚ + AC(GridManager, "M365Poc.SPO.GridManager") + AC(AuthAndProvision, "M365Poc.SPO.AuthProvisioning") + AC(FarmsAndTennats, "") + AC(CSC , "") + AC(FastSearch , "") + AC(Microservices, "M365Poc.SPO.MicroServices") + AC(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting") + AC(SPOTooling, "M365Poc.SPO.SPOTooling") + AC(UXCDNFailover, "M365Poc.SPO.UXCDNFailover") + AC(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient") + + // 把定义好的Activity组åˆä¸€ä¸‹ï¼Œå…¶ä¸ç®å¤´è¡¨ç¤ºä¸²è¡Œï¼Œç«–线表示并行。 + auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch); + auto block2 = Microservices | MonitorAndAlert; + auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient; + + // 最åŽæŒ‡å®šä¸€ä¸‹workflowçš„åå—å°±å¯ä»¥äº†ã€‚ + println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); +} -// 最åŽæŒ‡å®šä¸€ä¸‹workflowçš„åå—å°±å¯ä»¥äº†ã€‚ -println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); +//////////////////////////////////////////////////////////////////////////////////////////////// +if constexpr(false) { // å·æ‡’方案2 + #define A_2(name, entityName) (Activity(#name, "FleetAGC.Activities.DelayActivity", #entityName).addInputSetting("Timespan", "60")) + #define A_1(name) A_2(name, ) + #define A_proxy(x, Arg1, Arg2, FUNC, ...) FUNC + #define A(...) A_proxy(, ##__VA_ARGS__, A_2(__VA_ARGS__), A_1(__VA_ARGS__)) + + // 和上一个例åä¸€æ ·çš„è¯æ³•ï¼Œåªä¸è¿‡è¿™æ¬¡æ›´æ‡’了。 + auto block1 = A(GridManager, M365Poc.SPO.GridManager) >> A(FarmsAndTennats) >> (A(CSC) | A(FastSearch)); + auto block2 = A(Microservices, M365Poc.SPO.MicroServices) | A(MonitorAndAlert, M365Poc.SPO.MonitoringAlerting); + auto completeFlow = block1 | A(AuthAndProvision, M365Poc.SPO.AuthProvisioning) | block2 | A(SPOTooling, M365Poc.SPO.SPOTooling) | A(UXCDNFailover, M365Poc.SPO.UXCDNFailover) | A(ODFBSyncClient, M365Poc.SPO.ODFBSyncClient); + + // 最åŽæŒ‡å®šä¸€ä¸‹workflowçš„åå—å°±å¯ä»¥äº†ã€‚ + println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); +} diff --git a/workflows/another.cc b/workflows/another.cc index d0a01ae699f43351e89bddc25ed51908fc152a97..86e7cdc145f35153dcf28da76892b2d359b1525a 100644 --- a/workflows/another.cc +++ b/workflows/another.cc @@ -1,15 +1,59 @@ #include <cis-workflow-gen/quick-include.hpp> int main() { +// This is a DEMO. You may use any C++17 syntax here. + +// 先演示一下定义一个Activityå’ŒManualOperationçš„æ£å¸¸è¯æ³•ã€‚ +// (ActivityName, ClassName_In_Our_Code , DependencyEntityName) +Activity HaveASleep ("HaveASleep", "FleetAGC.Activities.DelayActivity", ""); +HaveASleep.addInputSetting("Timespan", "60"); +// (DisplayName , Message , TeamId to alert , DependencyEntityName) +ManualOperation AlertSomeone ("AlertSomeone", "This is some message", "AzDNetDeployments", ""); +// ä½†æ˜¯å¦‚æžœä½ è¦å®šä¹‰å¾ˆå¤šå¾ˆå¤šActivity,建议下é¢çš„方法å·æ‡’。 + +//////////////////////////////////////////////////////////////////////////////////////////////// + +{ // å·æ‡’方案1 + // 这里å‡è®¾ä½ 想用FleetAGC.Activities.DelayActivity,并且想给他一个TimeSpanå‚数。 + #define AC(name, entityName) \ + auto name = Activity(#name, "FleetAGC.Activities.DelayActivity", entityName).addInputSetting("Timespan", "60"); + + // 使用刚刚定义的å·æ‡’å®ã€‚ + AC(GridManager, "M365Poc.SPO.GridManager") + AC(AuthAndProvision, "M365Poc.SPO.AuthProvisioning") + AC(FarmsAndTennats, "") + AC(CSC , "") + AC(FastSearch , "") + AC(Microservices, "M365Poc.SPO.MicroServices") + AC(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting") + AC(SPOTooling, "M365Poc.SPO.SPOTooling") + AC(UXCDNFailover, "M365Poc.SPO.UXCDNFailover") + AC(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient") + + // 把定义好的Activity组åˆä¸€ä¸‹ï¼Œå…¶ä¸ç®å¤´è¡¨ç¤ºä¸²è¡Œï¼Œç«–线表示并行。 + auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch); + auto block2 = Microservices | MonitorAndAlert; + auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient; + + // 最åŽæŒ‡å®šä¸€ä¸‹workflowçš„åå—å°±å¯ä»¥äº†ã€‚ + println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); +} + +//////////////////////////////////////////////////////////////////////////////////////////////// + +if constexpr(false) { // å·æ‡’方案2 #define A_2(name, entityName) (Activity(#name, "FleetAGC.Activities.DelayActivity", #entityName).addInputSetting("Timespan", "60")) - #define A_1(name) A_2(name, "") + #define A_1(name) A_2(name, ) #define A_proxy(x, Arg1, Arg2, FUNC, ...) FUNC #define A(...) A_proxy(, ##__VA_ARGS__, A_2(__VA_ARGS__), A_1(__VA_ARGS__)) - + + // 和上一个例åä¸€æ ·çš„è¯æ³•ï¼Œåªä¸è¿‡è¿™æ¬¡æ›´æ‡’了。 auto block1 = A(GridManager, M365Poc.SPO.GridManager) >> A(FarmsAndTennats) >> (A(CSC) | A(FastSearch)); auto block2 = A(Microservices, M365Poc.SPO.MicroServices) | A(MonitorAndAlert, M365Poc.SPO.MonitoringAlerting); auto completeFlow = block1 | A(AuthAndProvision, M365Poc.SPO.AuthProvisioning) | block2 | A(SPOTooling, M365Poc.SPO.SPOTooling) | A(UXCDNFailover, M365Poc.SPO.UXCDNFailover) | A(ODFBSyncClient, M365Poc.SPO.ODFBSyncClient); - - println(to_file("SPOBuildoutPOCWorkflow.xaml"), completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); + + // 最åŽæŒ‡å®šä¸€ä¸‹workflowçš„åå—å°±å¯ä»¥äº†ã€‚ + println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow")); } +} \ No newline at end of file diff --git a/xaml-template.hpp b/xaml-template.hpp index a84987874cf7a5af31989f3d975f70ef5b8fa392..3cbd40671042b73387bc8151d80ecbc7218fda78 100644 --- a/xaml-template.hpp +++ b/xaml-template.hpp @@ -96,7 +96,7 @@ constexpr auto STD_XAML_TAIL = "</Activity>"; constexpr auto MANUAL_OPERATION_XAML = -R"XAML( <mwcwa:ManualOperation DeprecatedTaskId="{x:Null}" TaskId="__TEMPLATE_ARG_TaskId" DisplayName="__TEMPLATE_ARG_DisplayName" MonitoringSystems="icm" WaitUntilFinish="True" __TEMPLATE_ARG_EntityDefPlaceholder> +R"XAML( <mwcwa:ManualOperation TaskId="__TEMPLATE_ARG_TaskId" DisplayName="__TEMPLATE_ARG_DisplayName" MonitoringSystems="icm" WaitUntilFinish="True" mwcwcc:OwningTeamPropertyBinder.OwningTeamId="__TEMPLATE_ARG_TeamId" __TEMPLATE_ARG_EntityDefPlaceholder> <mwcwa:ManualOperation.AdditionalContent> <InArgument x:TypeArguments="x:String"> <mca:CSharpValue x:TypeArguments="x:String">__TEMPLATE_ARG_CodeLines</mca:CSharpValue>