edit
This commit is contained in:
@@ -11,6 +11,8 @@ namespace XLAB2
|
||||
{
|
||||
internal sealed class PsvDataService
|
||||
{
|
||||
private const int EkzMkCompletenessMaxLength = 600;
|
||||
|
||||
public bool DocumentNumberExists(string documentNumber, string excludeDocumentNumber)
|
||||
{
|
||||
var normalizedNumber = NormalizeDocumentNumber(documentNumber);
|
||||
@@ -1816,7 +1818,7 @@ ORDER BY names.NMTP, tips.TP, sizeInfo.DPZN, sizeInfo.NNGSRS;";
|
||||
}
|
||||
}
|
||||
|
||||
public DocumentSaveResult SaveDocument(string currentDocumentNumber, DocumentEditorResult document, IEnumerable<PsvDocumentLine> pendingLines)
|
||||
public DocumentSaveResult SaveDocument(string currentDocumentNumber, DocumentEditorResult document, IEnumerable<PsvDocumentLine> documentLines)
|
||||
{
|
||||
if (document == null)
|
||||
{
|
||||
@@ -1831,14 +1833,23 @@ ORDER BY names.NMTP, tips.TP, sizeInfo.DPZN, sizeInfo.NNGSRS;";
|
||||
|
||||
document.DocumentNumber = normalizedNumber;
|
||||
|
||||
var distinctPendingLines = pendingLines == null
|
||||
var materializedDocumentLines = documentLines == null
|
||||
? new List<PsvDocumentLine>()
|
||||
: pendingLines
|
||||
.Where(IsPendingLineReadyForSave)
|
||||
.GroupBy(GetPendingLineSaveKey, StringComparer.OrdinalIgnoreCase)
|
||||
.Select(delegate(IGrouping<string, PsvDocumentLine> group) { return group.First(); })
|
||||
: documentLines
|
||||
.Where(delegate(PsvDocumentLine line) { return line != null; })
|
||||
.ToList();
|
||||
|
||||
var distinctPendingLines = materializedDocumentLines
|
||||
.Where(IsPendingLineReadyForSave)
|
||||
.GroupBy(GetPendingLineSaveKey, StringComparer.OrdinalIgnoreCase)
|
||||
.Select(delegate(IGrouping<string, PsvDocumentLine> group) { return group.First(); })
|
||||
.ToList();
|
||||
var persistedLines = materializedDocumentLines
|
||||
.Where(delegate(PsvDocumentLine line) { return !line.IsPendingInsert && line.CardId > 0; })
|
||||
.GroupBy(delegate(PsvDocumentLine line) { return line.CardId; })
|
||||
.Select(delegate(IGrouping<int, PsvDocumentLine> group) { return group.First(); })
|
||||
.ToList();
|
||||
|
||||
using (var connection = CreateConnection())
|
||||
{
|
||||
connection.Open();
|
||||
@@ -1872,6 +1883,12 @@ ORDER BY names.NMTP, tips.TP, sizeInfo.DPZN, sizeInfo.NNGSRS;";
|
||||
{
|
||||
throw new InvalidOperationException("Строки EKZMK для выбранного ПСВ не найдены.");
|
||||
}
|
||||
|
||||
var updatedCompletenessCount = UpdateDocumentLineCompleteness(connection, transaction, normalizedNumber, persistedLines);
|
||||
if (updatedCompletenessCount > updatedEkzMkCount)
|
||||
{
|
||||
updatedEkzMkCount = updatedCompletenessCount;
|
||||
}
|
||||
}
|
||||
|
||||
var insertedEkzMkCount = 0;
|
||||
@@ -3203,7 +3220,7 @@ VALUES
|
||||
@idsptsmp,
|
||||
@idspssmp,
|
||||
@GUIDEKZMK,
|
||||
NULL,
|
||||
@DSEKZMK,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -3257,6 +3274,9 @@ SELECT CAST(SCOPE_IDENTITY() AS int);";
|
||||
command.Parameters.Add("@idsptsmp", SqlDbType.Int).Value = (object)template.IdSptsmp ?? DBNull.Value;
|
||||
command.Parameters.Add("@idspssmp", SqlDbType.Int).Value = (object)template.IdSpssmp ?? DBNull.Value;
|
||||
command.Parameters.Add("@GUIDEKZMK", SqlDbType.UniqueIdentifier).Value = Guid.NewGuid();
|
||||
command.Parameters.Add("@DSEKZMK", SqlDbType.NVarChar, EkzMkCompletenessMaxLength).Value = pendingLine == null
|
||||
? DBNull.Value
|
||||
: (object)NormalizeOptionalCompleteness(pendingLine.Notes) ?? DBNull.Value;
|
||||
command.Parameters.Add("@NRVRMNDmp", SqlDbType.Decimal).Value = (object)template.Nrvrmndmp ?? DBNull.Value;
|
||||
command.Parameters["@NRVRMNDmp"].Precision = 10;
|
||||
command.Parameters["@NRVRMNDmp"].Scale = 2;
|
||||
@@ -4297,6 +4317,75 @@ ORDER BY blocker.TableName;";
|
||||
return normalizedValue;
|
||||
}
|
||||
|
||||
private static int UpdateDocumentLineCompleteness(
|
||||
SqlConnection connection,
|
||||
SqlTransaction transaction,
|
||||
string documentNumber,
|
||||
IEnumerable<PsvDocumentLine> persistedLines)
|
||||
{
|
||||
var materializedLines = persistedLines == null
|
||||
? new List<PsvDocumentLine>()
|
||||
: persistedLines
|
||||
.Where(delegate(PsvDocumentLine line) { return line != null && line.CardId > 0; })
|
||||
.GroupBy(delegate(PsvDocumentLine line) { return line.CardId; })
|
||||
.Select(delegate(IGrouping<int, PsvDocumentLine> group) { return group.First(); })
|
||||
.ToList();
|
||||
|
||||
var updatedCount = 0;
|
||||
foreach (var line in materializedLines)
|
||||
{
|
||||
updatedCount += UpdateDocumentLineCompletenessCore(
|
||||
connection,
|
||||
transaction,
|
||||
documentNumber,
|
||||
line.CardId,
|
||||
NormalizeOptionalCompleteness(line.Notes));
|
||||
}
|
||||
|
||||
return updatedCount;
|
||||
}
|
||||
|
||||
private static int UpdateDocumentLineCompletenessCore(
|
||||
SqlConnection connection,
|
||||
SqlTransaction transaction,
|
||||
string documentNumber,
|
||||
int cardId,
|
||||
string completeness)
|
||||
{
|
||||
const string sql = @"
|
||||
UPDATE dbo.EKZMK
|
||||
SET DSEKZMK = @Completeness
|
||||
WHERE NNZVPV = @DocumentNumber
|
||||
AND IDEKZMK = @CardId;
|
||||
|
||||
SELECT @@ROWCOUNT;";
|
||||
|
||||
using (var command = new SqlCommand(sql, connection, transaction))
|
||||
{
|
||||
command.CommandTimeout = SqlServerConnectionFactory.Current.Options.CommandTimeoutSeconds;
|
||||
command.Parameters.Add("@DocumentNumber", SqlDbType.NVarChar, 60).Value = documentNumber;
|
||||
command.Parameters.Add("@CardId", SqlDbType.Int).Value = cardId;
|
||||
command.Parameters.Add("@Completeness", SqlDbType.NVarChar, EkzMkCompletenessMaxLength).Value = (object)completeness ?? DBNull.Value;
|
||||
return Convert.ToInt32(command.ExecuteScalar());
|
||||
}
|
||||
}
|
||||
|
||||
private static string NormalizeOptionalCompleteness(string value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var normalizedValue = value.Trim();
|
||||
if (normalizedValue.Length > EkzMkCompletenessMaxLength)
|
||||
{
|
||||
throw new InvalidOperationException(string.Format("Комплектность не должна превышать {0} символов.", EkzMkCompletenessMaxLength));
|
||||
}
|
||||
|
||||
return normalizedValue;
|
||||
}
|
||||
|
||||
private static int UpdateDocumentHeader(SqlConnection connection, SqlTransaction transaction, string currentDocumentNumber, DocumentEditorResult document)
|
||||
{
|
||||
const string sql = @"
|
||||
|
||||
Reference in New Issue
Block a user