ModuleSharedFunctions.cs
8.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
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
}
}