schangxiang@126.com
2025-09-18 4b02d54422910170d2cedabf6866b6e6bec20dac
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
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
    {
        /// <summary>
        /// 生成随机设备任务号
        /// </summary>
        /// <param name="deviceId"></param>
        /// <returns></returns>
        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;
        }
 
        /// <summary>
        /// 是否存在未结束的任务,相同任务号,相同设备
        /// </summary>
        /// <param name="deviceId"></param>
        /// <param name="taskCode"></param>
        /// <returns></returns>
        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;
        }
    }
}