SfisWorkflowService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. namespace TeamAAS_VP.Core.Sfis
  3. {
  4. public class SfisWorkflowService : IDisposable
  5. {
  6. private readonly SfisConfig _config;
  7. private readonly SfisWebServiceClient _client;
  8. private bool _sessionStarted;
  9. public event Action<string> OnLog;
  10. public SfisWorkflowService(SfisConfig config)
  11. {
  12. _config = config ?? throw new ArgumentNullException(nameof(config));
  13. _client = new SfisWebServiceClient(config);
  14. _client.OnLog += msg => OnLog?.Invoke(msg);
  15. }
  16. public bool IsLoggedIn => _client.IsLoggedIn;
  17. public SfisWorkflowResult ProcessUnit(SfisUnitContext context, bool runInputData, bool runResult)
  18. {
  19. if (context == null)
  20. throw new ArgumentNullException(nameof(context));
  21. if (string.IsNullOrWhiteSpace(context.Isn))
  22. return Fail(context, "ISN 不能为空");
  23. if (!runInputData && !runResult)
  24. return Fail(context, "未指定 SFIS 流程(过站/上传均未触发)");
  25. var workflow = new SfisWorkflowResult { Isn = context.Isn };
  26. try
  27. {
  28. if (_config.AutoLogin && !_client.IsLoggedIn)
  29. {
  30. var login = ExecuteStep(workflow, "Login", () => _client.Login());
  31. if (!login.IsSuccess)
  32. return Fail(workflow, login.Message);
  33. _sessionStarted = true;
  34. }
  35. else if (!_config.AutoLogin && !_client.IsLoggedIn)
  36. {
  37. return Fail(workflow, "SFIS 未登录,请先登录或启用自动登录");
  38. }
  39. var checkRoute = ExecuteStep(workflow, "CheckRoute",
  40. () => _client.CheckRoute(context.Isn, _config.CheckRouteType));
  41. if (!checkRoute.IsSuccess)
  42. return Fail(workflow, checkRoute.Message);
  43. var getVersion = ExecuteStep(workflow, "GetVersion", () => _client.GetVersion(
  44. context.Isn, _config.GetVersionType, _config.GetVersionChkData, _config.GetVersionChkData2));
  45. if (!getVersion.IsSuccess)
  46. return Fail(workflow, getVersion.Message);
  47. if (runInputData)
  48. {
  49. var payload = SfisInputDataBuilder.FromContext(context, _config);
  50. string data = SfisInputDataBuilder.Build(payload);
  51. OnLog?.Invoke("InputData: " + data.Replace(SfisDelimiters.Field, '|'));
  52. var upload = ExecuteStep(workflow, "InputData",
  53. () => _client.SendInputData(data, _config.InputDataType));
  54. if (!upload.IsSuccess)
  55. return Fail(workflow, upload.Message);
  56. }
  57. if (runResult)
  58. {
  59. string data = BuildResultData(context);
  60. var upload = ExecuteStep(workflow, "SendResult", () => _client.SendResult(
  61. context.Isn, data, _config.ResultStatus,
  62. context.TestPassed ? null : context.ErrorCode));
  63. if (!upload.IsSuccess)
  64. return Fail(workflow, upload.Message);
  65. }
  66. workflow.Success = true;
  67. return workflow;
  68. }
  69. catch (Exception ex)
  70. {
  71. return Fail(workflow, ex.Message);
  72. }
  73. }
  74. public void EnsureLogout()
  75. {
  76. if (!_config.AutoLogoutOnExit || !_sessionStarted || !_client.IsLoggedIn)
  77. return;
  78. try { _client.Logout(); }
  79. catch (Exception ex) { OnLog?.Invoke("SFIS 登出失败: " + ex.Message); }
  80. }
  81. private static string BuildResultData(SfisUnitContext context)
  82. {
  83. if (context.TestRecords != null && context.TestRecords.Count > 0)
  84. return SfisResultDataBuilder.Build(context.TestRecords);
  85. return SfisResultDataBuilder.BuildPassOnly(context.Isn, context.TestPassed ? "1" : "0");
  86. }
  87. private static SfisResponse ExecuteStep(SfisWorkflowResult workflow, string stepName, Func<SfisResponse> action)
  88. {
  89. var response = action();
  90. workflow.Steps.Add(new SfisWorkflowStepResult { StepName = stepName, Response = response });
  91. return response;
  92. }
  93. private static SfisWorkflowResult Fail(SfisUnitContext context, string message)
  94. {
  95. return new SfisWorkflowResult { Isn = context?.Isn, Success = false, ErrorMessage = message };
  96. }
  97. private static SfisWorkflowResult Fail(SfisWorkflowResult workflow, string message)
  98. {
  99. workflow.Success = false;
  100. workflow.ErrorMessage = message;
  101. return workflow;
  102. }
  103. public void Dispose()
  104. {
  105. EnsureLogout();
  106. }
  107. }
  108. }