using IWareCC.ORM; using IWareCommon.Enum.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IWareCC.Extend { public static class NumberHelp { /// /// 生成随机设备任务号 /// /// /// public static string GenerateRandomCode() { //1、第一层校验-跟当前内存数据对比 if (IWareCC.Service.existTaskCodeList.Count > 100) { var removeList = IWareCC.Service.existTaskCodeList.Take(10).OrderBy(x => x.createTime).ToList(); foreach (var item in removeList) { IWareCC.Service.existTaskCodeList.Remove(item); } } int tryCount = 0; var taskCode = _GenerateRandomCode(ref tryCount); //2、第二次校验,跟当前数据库对比 bool result = ValidateIsExistNoFinishedTaskSameTaskCode(taskCode); if (result == false) { tryCount = 0; taskCode = _GenerateRandomCode(ref tryCount); result = ValidateIsExistNoFinishedTaskSameTaskCode(taskCode); if (result == false) { throw new Exception("第二次生成任务号,还是跟数据库中的任务号重复!"); } } //成功后保留到内存 IWareCC.Service.existTaskCodeList.Add(new ExistTaskCodeListModel() { createTime = DateTime.Now, taskCode = taskCode }); return taskCode; } public static string GenerateRandomCodeForMainTask() { var result = new StringBuilder(); for (var i = 0; i < 4; i++) { var r = new Random(Guid.NewGuid().GetHashCode()); result.Append(r.Next(1, 9)); } var taskCode = result.ToString(); return taskCode; } private static string _GenerateRandomCode(ref int tryCount) { if (tryCount >= 3) { throw new Exception("已经重试生成三次了,还是会生成同一个任务号!"); } tryCount++; var result = new StringBuilder(); for (var i = 0; i < 4; i++) { var r = new Random(Guid.NewGuid().GetHashCode()); result.Append(r.Next(1, 9)); } var taskCode = result.ToString(); //判断是否已经存在 if (IWareCC.Service.existTaskCodeList.Exists(x => x.taskCode == taskCode)) { //说明这里面已经存在了 _GenerateRandomCode(ref tryCount); } return taskCode; } /// /// 是否存在未结束的任务,相同任务号,相同设备 /// /// /// /// private static bool ValidateIsExistNoFinishedTaskSameTaskCode(string taskCode) { using (var dbModel = new DbModel()) { var task = dbModel.PartTasks.OrderBy(x => x.finishtimes).FirstOrDefault(x => x.isfinished == (int)EYesOrNo.否 && x.taskcode == taskCode); if (task != null && task.id > 0) { return false; } } return true; } } }