public string NextNumber(int yearId, SerialNumberModule module, DateTime?yearEnd = default) { lock (syncRoot) { using (var con = _db.GetConnection()) { SerialNumber serialNumber = con.Select <SerialNumber>(sn => sn.YearId == yearId && sn.SerialModule == module) .FirstOrDefault(); if (serialNumber == null) { return(null); } #region Commented //int firstIndex = serialNumber.SerialFormat.IndexOf('9'); // YYJJJ99999 = 5 //int lastIndex = serialNumber.SerialFormat.LastIndexOf('9'); // YYJJJ99999 = 9 //string nums = serialNumber.SerialFormat.Substring(firstIndex, (lastIndex - firstIndex) + 1); //int nextNumber = serialNumber.LastNumber + 1; //// Serial prefix to increment alpha //string serialPrefix = serialNumber.SerialPrefix; //switch (serialNumber.SerialReset) //{ // case SerialNumberReset.Max: // case SerialNumberReset.AccountingYear: // if (nextNumber.ToString().Length > nums.Length) // { // serialPrefix = IncrementAlpha(serialPrefix); // nextNumber = 1; // } // break; // case SerialNumberReset.Daily: // if (serialNumber.LastDate.Day != DateTime.Today.Day) // { // serialPrefix = IncrementAlpha(serialPrefix); // nextNumber = 1; // } // break; // case SerialNumberReset.Monthly: // if (serialNumber.LastDate.Month != DateTime.Today.Month) // { // serialPrefix = IncrementAlpha(serialPrefix); // nextNumber = 1; // } // break; // case SerialNumberReset.CalendarYear: // if (DateTime.Today.Year > serialNumber.LastDate.Year) // { // serialPrefix = IncrementAlpha(serialPrefix); // nextNumber = 1; // } // break; // //case SerialNumberReset.AccountingYear: // 01/04/2019 - 31/03/2020 // // //var accountYear = await context.AccountYears // // // .FindAsync(yearId); // // if (DateTime.Today > yearEnd) // // { // // serialPrefix = IncrementAlpha(serialPrefix); // // nextNumber = 1; // // } // // break; //} //var sbSerialNumber = // new StringBuilder($"{serialPrefix}{serialNumber.SerialFormat}{serialNumber.SerialSuffix}"); //sbSerialNumber.Replace("YYYY", DateTime.Today.ToString("yyyy")); //sbSerialNumber.Replace("YY", DateTime.Today.ToString("yy")); //sbSerialNumber.Replace("MMM", DateTime.Today.ToString("MMM").ToUpper()); //sbSerialNumber.Replace("MM", DateTime.Today.ToString("MM")); //sbSerialNumber.Replace("DD", DateTime.Today.ToString("dd")); //sbSerialNumber.Replace("JJJ", $"{DateTime.Today.DayOfYear:D3}"); //sbSerialNumber.Replace("HH", DateTime.Now.ToString("HH")); //sbSerialNumber.Replace("MI", DateTime.Now.ToString("mm")); //sbSerialNumber.Replace("SS", DateTime.Now.ToString("ss")); //string nextSerial = nextNumber.ToString().PadLeft(nums.Length, '0'); //sbSerialNumber.Replace(nums, nextSerial); //string nextValue = sbSerialNumber.ToString(); #endregion Commented var(nextValue, nextNumber) = NextNumber(serialNumber.SerialPrefix, serialNumber.SerialFormat, serialNumber.SerialSuffix, serialNumber.LastNumber, serialNumber.LastDate, yearEnd, serialNumber.SerialReset); serialNumber.LastSerial = nextValue; serialNumber.LastNumber = nextNumber; serialNumber.LastDate = DateTime.Now; con.Update(serialNumber); return(nextValue); } } }
//public SerialNumberRepository(AppSettings settings) //{ // _settings = settings; //} //public static SerialNumberRepository Instance //{ // get // { // if (_instance == null) // { // lock (syncRoot) // { // if (_instance == null) // _instance = new SerialNumberRepository(); // } // } // return _instance; // } //} public string NextNumber(Guid yearId, SerialNumberModule module, DateTime?yearEnd = default) { try { //var optionsBuilder = DbContextExtensions.CreateDbContextOptionsBuilder(_settings); //using var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled); //using var context = new FandaContext(optionsBuilder.Options); string moduleString = module.ToString(); lock (syncRoot) { var serialNumber = _context.SerialNumbers .Find(yearId, moduleString); int firstIndex = serialNumber.SerialFormat.IndexOf('N'); // YYJJJNNNNN = 5 int lastIndex = serialNumber.SerialFormat.LastIndexOf('N'); // YYJJJNNNNN = 9 string nums = serialNumber.SerialFormat.Substring(firstIndex, lastIndex - firstIndex + 1); int nextNumber = serialNumber.LastNumber + 1; //Interlocked.Increment(ref nextNumber); // 100000 switch (serialNumber.Reset) { case SerialNumberReset.Max: if (nextNumber.ToString().Length > nums.Length) { //Interlocked.Exchange(ref nextNumber, 1); nextNumber = 1; } break; case SerialNumberReset.Daily: if (serialNumber.LastDate.Day != DateTime.Today.Day) { //Interlocked.Exchange(ref nextNumber, 1); nextNumber = 1; } break; case SerialNumberReset.Monthly: if (serialNumber.LastDate.Month != DateTime.Today.Month) { //Interlocked.Exchange(ref nextNumber, 1); nextNumber = 1; } break; case SerialNumberReset.CalendarYear: if (DateTime.Today.Year > serialNumber.LastDate.Year) { //Interlocked.Exchange(ref nextNumber, 1); nextNumber = 1; } break; case SerialNumberReset.AccountingYear: // 01/04/2019 - 31/03/2020 //var accountYear = await context.AccountYears // .FindAsync(yearId); if (DateTime.Today > yearEnd) { //Interlocked.Exchange(ref nextNumber, 1); nextNumber = 1; } break; } StringBuilder sbSerialNumber = new StringBuilder($"{serialNumber.Prefix}{serialNumber.SerialFormat}{serialNumber.Suffix}"); sbSerialNumber.Replace("YYYY", DateTime.Today.ToString("yyyy")); sbSerialNumber.Replace("YY", DateTime.Today.ToString("yy")); sbSerialNumber.Replace("MMM", DateTime.Today.ToString("MMM").ToUpper()); sbSerialNumber.Replace("MM", DateTime.Today.ToString("MM")); sbSerialNumber.Replace("DD", DateTime.Today.ToString("dd")); sbSerialNumber.Replace("JJJ", $"{DateTime.Today.DayOfYear:D3}"); sbSerialNumber.Replace("HH", DateTime.Now.ToString("HH")); sbSerialNumber.Replace("MI", DateTime.Now.ToString("mm")); sbSerialNumber.Replace("SS", DateTime.Now.ToString("ss")); string nextSerial = nextNumber.ToString().PadLeft(nums.Length, '0'); sbSerialNumber.Replace(nums, nextSerial); string nextValue = sbSerialNumber.ToString(); serialNumber.LastValue = nextValue; serialNumber.LastNumber = nextNumber; serialNumber.LastDate = DateTime.Now; _context.SerialNumbers.Update(serialNumber); _context.SaveChanges(); //scope.Complete(); return(nextValue); } } catch (Exception ex) { throw ex; } }