From f854b708d4df81a0edc5b7bae2d4a16110bc5e40 Mon Sep 17 00:00:00 2001 From: KevinWG <1985088337@qq.com> Date: Wed, 16 Jan 2019 00:27:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A0=91=E5=BD=A2=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E4=BD=8D=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OSS.Common.Tests/ExtentionTests.cs | 8 ++ OSS.Common/ComUtils/TreeNumUtil.cs | 130 +++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 OSS.Common/ComUtils/TreeNumUtil.cs diff --git a/OSS.Common.Tests/ExtentionTests.cs b/OSS.Common.Tests/ExtentionTests.cs index 70f9789..09ff070 100644 --- a/OSS.Common.Tests/ExtentionTests.cs +++ b/OSS.Common.Tests/ExtentionTests.cs @@ -58,6 +58,14 @@ namespace OSS.Common.Tests //var res1 = .UrlEncode(); //var res2 = Uri.EscapeUriString(testStr); } + [TestMethod] + public void TreeNumTest() + { + var t1 = TreeNumUtil.GenerateNextNum(0); + + //var res1 = .UrlEncode(); + //var res2 = Uri.EscapeUriString(testStr); + } } diff --git a/OSS.Common/ComUtils/TreeNumUtil.cs b/OSS.Common/ComUtils/TreeNumUtil.cs new file mode 100644 index 0000000..41ef002 --- /dev/null +++ b/OSS.Common/ComUtils/TreeNumUtil.cs @@ -0,0 +1,130 @@ + +#region Copyright (C) 2019 Kevin (OSS开源系列) 公众号:osscore + +/*************************************************************************** +*   文件功能描述:树形数字位生成 +* +*   创建人: KK +* 创建人Email:1985088337@qq.com +* +*****************************************************************************/ + +#endregion + +using OSS.Common.Extention; + +namespace OSS.Common.ComUtils +{ + /// + /// 树形数字位 + /// + public static class TreeNumUtil + { + // 2位位置索引+ 14位数字位 16位是js接收的最大长度(2的53次方,已排除以9开头的部分最大数) + private const int _positionMod = 100; + private const int _numLength = 14; + + private const string _paddingNumStr = "00000000000000000000000"; + + public static long GenerateNextNum(long previousNum) + { + return GenerateNum(previousNum, TreeNumType.Next); + } + + public static long GenerateFirstSubNum(long parentId) + { + return GenerateNum(parentId, TreeNumType.Sub); + } + + private static long GenerateNum(long treeNum, TreeNumType generateType) + { + var position = GetPositionIndex(treeNum); + + treeNum = treeNum / _positionMod; + var preNumStr = treeNum.ToString().TrimEnd('0'); + + #region 计算节点数值 + + long curNodeNum = 0; + + if (treeNum > 0) + { + var preNodeNumStr = preNumStr.Substring(position); + + if (generateType == TreeNumType.Sub) + { + position += preNodeNumStr.Length; + curNodeNum++; + } + else if (generateType == TreeNumType.Next) + { + var preNodeNum = preNodeNumStr.ToInt32(); + curNodeNum = preNodeNum + 1; + } + + } + else + curNodeNum++; + + + if (position == 0 && curNodeNum == 9) + { + // 首位不能以9开头,否则对应子节点数量太少 + curNodeNum = 11; + } + + if (curNodeNum % 10 == 0) + { + // 0为补位标识,不能出现在节点数的尾部 + curNodeNum++; + } + + + #endregion + + #region 拼装节点值形成树形全局值 + + + var curNodeNumStr = curNodeNum.ToString(); + + var paddingLength = _numLength - position - curNodeNumStr.Length; + if (paddingLength < 0) + { + // 超过位数 + return -1; + } + + if (position < 10) + { + paddingLength++; + } + + var paddingStr = paddingLength > 0 ? _paddingNumStr.Substring(0, paddingLength) : string.Empty; + + var curNumStr = string.Concat( + position > 0 ? preNumStr.Substring(0, position) : string.Empty, + curNodeNum, + paddingStr, + position ); + + + #endregion + + return curNumStr.ToInt64(); + } + + public static int GetPositionIndex(long treeNum) + { + return (int)(treeNum % _positionMod); + } + + + public enum TreeNumType + { + Next, + Sub + } + + + } +}