服务端的TigerApi 框架,基于.NET6 2024 版本
优化条码规则,增加固定值可以设置为不包含;增加流水号取号支持设置取号间隔和跳号规则
已修改2个文件
48 ■■■■ 文件已修改
Tiger.Business/DbCache/Biz.CodeRule.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/DbCache/CodeRuleCache.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tiger.Business/DbCache/Biz.CodeRule.cs
@@ -95,9 +95,9 @@
        /// <summary>
        /// 数据库关联验证
        /// </summary>
        public static bool CheckDB(string key, BAS_CODE_DTL rule)
        public static bool CheckDB(string key, BAS_CODE_DTL ruleDtl)
        {
            return rule.DATA_TYPE == BAS_CODE_DTL.DATA_TYPEs.DbCheck.GetValue() ? Biz.Db.Queryable(rule.CHECK_TABLE, "t").Where($"{rule.CHECK_FIELD} = '{key}'").Any() : true;
            return ruleDtl.DATA_TYPE == BAS_CODE_DTL.DATA_TYPEs.DbCheck.GetValue() ? Biz.Db.Queryable(ruleDtl.CHECK_TABLE, "t").Where($"{ruleDtl.CHECK_FIELD} = '{key}'").Any() : true;
        }
        /// <summary>
@@ -123,7 +123,19 @@
                        //判断流水号是否符合规则
                        if (IsMatch && item.DATA_TYPE == BAS_CODE_DTL.DATA_TYPEs.SerialCode.GetValue())
                        {
                            //按取值范围判断当前流水号是否在范围内
                            IsMatch &= item.SERIAL_MIN <= item.CodeValue.ToInt32() && item.CodeValue.ToInt32() <= item.SERIAL_MAX;
                            //当前流水号是否按设置间隔固定数值
                            IsMatch &= (item.CodeValue.ToInt32() - item.SERIAL_MIN) % item.SERIAL_INTERVAL == 0;
                            //判断当前流水号是否跳过以设置号码结尾的流水号
                            if (!item.SERIAL_IGNORE.IsNullOrEmpty())
                            {
                                var ignoreList = item.SERIAL_IGNORE.Split(',');
                                foreach (var num in ignoreList)
                                {
                                    IsMatch &= !item.CodeValue.EndsWith(num);
                                }
                            }
                        }
                    }
                    //判断关联字段是否符合规则
Tiger.Business/DbCache/CodeRuleCache.cs
@@ -190,27 +190,39 @@
                    }
                    else
                    {
                        next = serialGen.SERIAL_VALUE;
                        //跳过以设置号码结尾的流水号
                        var ignoreList = (rule.SERIAL_IGNORE ?? "").Split(',');
                        var isIgnore = false;
                        do
                        {
                            next += rule.SERIAL_INTERVAL;
                            foreach (var num in ignoreList)
                            {
                                isIgnore |= next.ToString().EndsWith(num);
                            }
                        } while (isIgnore && !ignoreList.IsNullOrEmpty());
                        //流水号重置
                        switch (rule.SERIAL_RESET.GetEnum<BAS_CODE_DTL.SERIAL_RESETs>())
                        {
                            case BAS_CODE_DTL.SERIAL_RESETs.Default:
                                if (serialGen.SERIAL_VALUE + 1 > rule.SERIAL_MAX)
                                if (next > rule.SERIAL_MAX)
                                {
                                    serialGen.SERIAL_VALUE = rule.SERIAL_MIN - 1;
                                    next = rule.SERIAL_MIN;
                                    serialGen.SERIAL_DATE = DateTime.Now;
                                }
                                break;
                            case BAS_CODE_DTL.SERIAL_RESETs.Year:
                                if (serialGen.SERIAL_DATE.Year != DateTime.Now.Year)
                                {
                                    serialGen.SERIAL_VALUE = rule.SERIAL_MIN - 1;
                                    next = rule.SERIAL_MIN;
                                    serialGen.SERIAL_DATE = DateTime.Now;
                                }
                                break;
                            case BAS_CODE_DTL.SERIAL_RESETs.Month:
                                if (serialGen.SERIAL_DATE.Month != DateTime.Now.Month)
                                {
                                    serialGen.SERIAL_VALUE = rule.SERIAL_MIN - 1;
                                    next = rule.SERIAL_MIN;
                                    serialGen.SERIAL_DATE = DateTime.Now;
                                }
                                break;
@@ -218,24 +230,25 @@
                                if ((serialGen.SERIAL_DATE.Date.DayOfWeek.GetValue() > 0 && DateTime.Now.Date.DayOfWeek.GetValue() == 0)
                                    || (DateTime.Now.Date - serialGen.SERIAL_DATE.Date).TotalDays >= 7)
                                {
                                    serialGen.SERIAL_VALUE = rule.SERIAL_MIN - 1;
                                    next = rule.SERIAL_MIN;
                                    serialGen.SERIAL_DATE = DateTime.Now;
                                }
                                break;
                            case BAS_CODE_DTL.SERIAL_RESETs.Day:
                                if (serialGen.SERIAL_DATE.Date != DateTime.Now.Date)
                                {
                                    serialGen.SERIAL_VALUE = rule.SERIAL_MIN - 1;
                                    next = rule.SERIAL_MIN;
                                    serialGen.SERIAL_DATE = DateTime.Now;
                                }
                                break;
                            case BAS_CODE_DTL.SERIAL_RESETs.NotReset:
                                break;
                        }
                        //流水号取号
                        if (serialGen.SERIAL_VALUE + 1 <= rule.SERIAL_MAX)
                        if (next <= rule.SERIAL_MAX)
                        {
                            serialGen.SERIAL_VALUE++;
                            serialGen.SERIAL_VALUE = next;
                            serialGen.LAST_GEN_DATE = DateTime.Now;
                            serialGen.LAST_HIS_ID = hisID;
                        }
@@ -248,7 +261,6 @@
                        {
                            db.Updateable(serialGen, "system").UpdateColumns(q => new { q.SERIAL_VALUE, q.SERIAL_DATE, q.LAST_GEN_DATE, q.LAST_HIS_ID }).ExecuteCommand();
                        }
                        next = serialGen.SERIAL_VALUE;
                        //Debug.WriteLine($"{hisID}: {DateTime.Now:HH:mm:ss.fff} > 继续取号成功[{next}],休息1000ms");
                        //Thread.Sleep(1000);
                    }
@@ -416,8 +428,8 @@
                }
                else
                {
                    var his = new BAS_CODE_HIS();
                    var argsIndex = 0;
                    var his = new BAS_CODE_HIS();
                    foreach (var item in rule.Details.OrderBy(q => q.RULE_SEQ))
                    {
                        switch (item.DATA_TYPE.GetEnum<BAS_CODE_DTL.DATA_TYPEs>())