http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6226|回复: 7

[学生提问] 生成单号重复的问题请教?

[复制链接]
发表于 2016-6-13 10:38:44 | 显示全部楼层 |阅读模式
单号的生成规则是根据数据库当前最大号加一生成的,如A在做申请单产生单号TM1604008,A在做单的同时,B也做申请单号,此时就生产问题了,因为A生产的单号TM1604008还没有写入数据库,所有B生产的单号也是TM16040008,怎么解决这个单号重复的问题?


说明:1.单号的生成规则是"字符“+年月+顺序号 如TM1604008表示16年4月份第008个单
           2.因为为体现单据的顺序所以不想在单号上使用时间戳
        
尝试 方法1:生成单号后直接写入数据库,保存时修改单号内容,取消时直接删除些单号
缺点:可能造成单号不连续


有什么更好的方法?










1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2016-6-13 10:56:11 | 显示全部楼层
可以建一个单号库,写入之前直接取出一个,写入成功就不用返回,失败就返回过去,每次取最小值。这样解决重复并解决不连续问题
 楼主| 发表于 2016-6-13 13:49:45 | 显示全部楼层
是这样理解吧

9958B5086F0843AEAC9F6BA4C2D94F90.jpg
发表于 2016-6-13 14:02:58 | 显示全部楼层

恩对的,就是这样,理解的不错,呵呵
 楼主| 发表于 2016-6-13 14:18:46 | 显示全部楼层
多谢,站长啊,
发表于 2016-6-13 15:52:41 | 显示全部楼层

这个单号库的代码是比较有意思的,写好 了可以贴出来分享一下。
 楼主| 发表于 2016-6-14 00:21:21 | 显示全部楼层
根据站长的思路,又研究了一下发现,还要做以下改进才行,最终实现了所要的效果首先:单号库表结构如下

5DBD74F4432B4C14B98594EA307224B4.jpg FD6A8B45BA17416999F1D5C9693A3FDB.jpg





file:///C:/Users/admin/AppData/Local/YNote/data/qqDFB62CEE325FD4CE92C4587C43C6E439/e6a016739d8943509723a2824793552a/5dbd74f4432b4c14b98594ea307224b4.jpg总体思路:

单号库为空时
窗体打开时生成单号写入单号库状态为占用
窗体关闭后事件里判断是否保存成功,成功能从单号库中删除单号,失败则将单号状态修改为可用

单号库不为空时
窗体打开时获取单号库单号,先判断有状态为可用的单号则直接获取修改状态为占用,再判断有状态为占用的单号时,返回id最大的状态为占用的单号+1的单号,状态修改为占用
窗体关闭后事件里判断是否保存成功,成功能从单号库中删除单号,失败则将单号状态修改为可用

[C#] 纯文本查看 复制代码
/// <summary>
        /// 生成申请单号
        /// </summary>
        /// <returns></returns>
        public string GenApplyNum()
        {
            List<SysCode> listSysCode = GetCode();//获取单号库所有单号

            #region 单号库中有单号时取里面单号
            if (listSysCode.Count > 0)
            {
                //如有单号状态为可用则直接使用,没有则将排队单号加1得到新单号
                //有可用单号时
                SysCode avalibleCode = listSysCode.Where(s => s.CodeStatus.Equals("可用")).FirstOrDefault();
                if (avalibleCode != null)
                {

                    CodeUpdateStatus(avalibleCode.CodeName, "占用");//修改状态为占用,防止其它用户使用
                    return avalibleCode.CodeName;

                }

                //占用单号加1得到新单号
                SysCode orderCode = listSysCode.Where(s => s.CodeStatus.Equals("占用")).OrderByDescending(s => s.CodeId).FirstOrDefault();
                if (orderCode != null)
                {
                    string prefix = orderCode.CodeName.Substring(0, 6);
                    string serialNumber = (Convert.ToInt32(orderCode.CodeName.Substring(6, 3)) + 1).ToString().PadLeft(3, '0');
                    string newId = prefix + serialNumber;
                    SaveCode(newId, "占用");
                    return newId;
                }
            } 
            #endregion

            #region 单号库为空则生成新单号MyRegion
            int maxNumber = GetNewNumber();

            //生成单号
            string newNum = string.Format("TM{0}{1}{2}", DateTime.Now.ToString("yy"), DateTime.Now.ToString("MM"), maxNumber < 10 ? "00" + maxNumber.ToString() : maxNumber.ToString());

            //如生成的单号与单号库里单号相同则单号+1直到不同
            while (listSysCode.Exists(s => s.CodeName.Equals(newNum)))
            {
                newNum = newNum.Substring(0, 6) + (Convert.ToInt32(newNum.Substring(6, 3)) + 1).ToString().PadLeft(3, '0');
            }
            SaveCode(newNum, "占用");//将生成的单号加入单号库排队
            return newNum; 
            #endregion
        }

发表于 2016-6-14 02:27:52 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-8 00:04

© 2014-2021

快速回复 返回顶部 返回列表