ModuleSharedFunctions.cs 8.78 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;

namespace DirRX.DciCore.Shared
{
  public class ModuleFunctions
  {
    
    #region Полезные функции
    
    /// <summary>
    /// Сформировать гиперссылку на сайт адаптера DCI для просмотра сообщений по процессу.
    /// </summary>
    /// <param name="setting">Запись справочника "Настройки DCI".</param>
    /// <param name="processGUID">GUID процесса DCI.</param>
    /// <returns>Гиперссылка.</returns>
    [Public]
    public string GetHyperlinkToDciProcess(IDciSetting setting, string processGUID)
    {
      // TODO в адресе может сформироваться два //.
      return string.Format(@"{0}/Messages?processGuid={1}", setting.AdapterSiteUrl, System.Net.WebUtility.UrlEncode(processGUID));
    }
    
    /// <summary>
    /// Проверить строку на наличие символов, недопустимых для имени вида процесса или сообщения.
    /// </summary>
    /// <param name="name">Проверяемая строка.</param>
    /// <returns>Пустая строка или текст ошибки.</returns>
    [Public]
    public string ValidateDciName(string name)
    {
      // Буквы (латиница, кириллица), цифры и символ "_", и начинается с буквы или "_".
      var pattern = @"^[_A-Za-zА-Яа-я]+[_0-9A-Za-zА-Яа-я]*$";
      var regex = new System.Text.RegularExpressions.Regex(pattern);
      if (!regex.IsMatch(name))
        return DirRX.DciCore.DciProcessKinds.Resources.NotValidDciNameFormat(name);
      
      return string.Empty;
    }
    
    #endregion
    
    #region Функции по преобразованию данных из строки в объект.
    
    /// <summary>
    /// Преобразовать строку в double.
    /// </summary>
    /// <param name="value">Строка.</param>
    /// <returns>Число типа double или null.</returns>
    /// <seealso cref="https://docs.microsoft.com/en-us/dotnet/api/system.globalization.numberstyles"></seealso>
    /// <seealso cref="https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.getcultureinfo"></seealso>
    /// <seealso cref="https://en.wikipedia.org/wiki/Decimal_separator"></seealso>
    [Public]
    public virtual double? StringToDouble(string value)
    {
      if (string.IsNullOrWhiteSpace(value))
        return null;
      
      double result;
      // Попробовать выполнить преобразование в ru-RU культуре.
      if (!double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("ru-RU"), out result) &&
          // Затем попробовать выполнить преобразование в en-US культуре.
          !double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("en-US"), out result) &&
          // Затем попробовать выполнить преобразование в es-ES культуре.
          !double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("es-ES"), out result))
        // "NumberStyles.Any" + локаль "ru-RU"/"en-US" покрывает большую часть форматов написания числа - комбинаций из десятичного разделителя ("," и ".") и разделителя групп разрядов (" ", "," и ".").
        // Еще часть комбинаций закрывается поиском по локали "es-ES" (например "1.234.567,89"), но остаются другие экзотические форматы (например "1 234 567.89") и арабский разделитель "мумаййиз".
      {
        return null;
      }

      return result;
    }
    
    /// <summary>
    /// Преобразовать строку в целое число.
    /// </summary>
    /// <param name="value">Строка с числом.</param>
    /// <returns>Целое число или null.</returns>
    /// <seealso cref="https://docs.microsoft.com/en-us/dotnet/api/system.globalization.numberstyles"></seealso>
    /// <seealso cref="https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.getcultureinfo"></seealso>
    /// <seealso cref="https://en.wikipedia.org/wiki/Decimal_separator"></seealso>
    [Public]
    public virtual int? StringToInt(string value)
    {
      if (string.IsNullOrWhiteSpace(value))
        return null;

      int result;

      // Попробовать выполнить преобразование в ru-RU культуре.
      if (!int.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("ru-RU"), out result) &&
          // Затем попробовать выполнить преобразование в en-US культуре.
          !int.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("en-US"), out result) &&
          // Затем попробовать выполнить преобразование в es-ES культуре.
          !int.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.GetCultureInfo("es-ES"), out result))
      {
        return null;
      }

      return result;
    }
    
    /// <summary>
    /// Преобразовать статус записи RX из строки в перечисление.
    /// </summary>
    /// <param name="stringStatus">Статус записи RX (строка).</param>
    /// <returns>Статус записи RX (перечисление).</returns>
    [Public]
    public virtual Enumeration? ConvertTextRXStatusToRXStatus(string stringStatus)
    {
      Enumeration? result = null;
      
      if (stringStatus == Sungero.CoreEntities.DatabookEntry.Status.Active.Value)
        return Sungero.CoreEntities.DatabookEntry.Status.Active;
      
      if (stringStatus == Sungero.CoreEntities.DatabookEntry.Status.Closed.Value)
        return Sungero.CoreEntities.DatabookEntry.Status.Closed;
      
      return result;
    }
    
    /// <summary>
    /// Преобразовать состояние записи D5 в статус записи RX (перечисление).
    /// </summary>
    /// <param name="d5Status">Состояния записи из D5.</param>
    /// <returns>Статус записи RX.</returns>
    [Public]
    public virtual Enumeration? ConvertD5StatusToRXStatus(string d5Status)
    {
      Enumeration? result = null;
      
      if (d5Status == Constants.Module.D5StatusName.Active)
        return Sungero.CoreEntities.DatabookEntry.Status.Active;
      
      if (d5Status == Constants.Module.D5StatusName.Closed)
        return Sungero.CoreEntities.DatabookEntry.Status.Closed;
      
      return result;
    }
    
    /// <summary>
    /// Раскодировать строку из base64.
    /// </summary>
    /// <param name="value">Строка в base64.</param>
    /// <returns>Строка.</returns>
    [Public]
    public virtual string Base64ToString(string value)
    {
      var b = Convert.FromBase64String(value);
      var strOriginal = System.Text.Encoding.UTF8.GetString(b);
      return strOriginal;
    }
    
    #endregion
    
    #region Функции по преобразованию данных в строку.
    
    /// <summary>
    /// Преобразовать статус записи RX в состояние записи D5.
    /// </summary>
    /// <param name="rxStatus">Статус записи RX.</param>
    /// <returns>Состояние записи в D5.</returns>
    [Public]
    public virtual string ConvertRXStatusToD5Status(Enumeration? rxStatus)
    {
      var result = string.Empty;
      
      if (rxStatus == Sungero.CoreEntities.DatabookEntry.Status.Active)
        return Constants.Module.D5StatusName.Active;
      
      if (rxStatus == Sungero.CoreEntities.DatabookEntry.Status.Closed)
        return Constants.Module.D5StatusName.Closed;
      
      return result;
    }
    
    /// <summary>
    /// Закодировать строку в base64.
    /// </summary>
    /// <param name="value">Строка.</param>
    /// <returns>Закодированная строка.</returns>
    [Public]
    public virtual string StringToBase64(string value)
    {
      var b = System.Text.Encoding.UTF8.GetBytes(value);
      var strModified = Convert.ToBase64String(b);
      return strModified;
    }
    
    #endregion
    
  }
}