用友U8单据号生成源码

按照用友U8的基础设置中的U8单据号生成规则,生成用友单据号

主要涉及的

表:VoucherNumber ,U8的单据规则设置,栏位:CardNumber:单据的编号,可以通过数据库跟踪工具,跟踪新增单据时,表:VoucherHistory在Insert的时候,记录的CarNumber

表:VoucherHistory,U8单据的历史流水号,记录所有单据的流水号 

 /// <summary>
        /// 
        /// </summary>
        /// <param name="db">U8的数据库对象,通过Linq to SQL Access 生成</param>
        /// <param name="cardNumber">单据编码 可通过数据库跟踪获得单据编码</param>
        /// <param name="whCode">仓库编码</param>
        /// <param name="depCode">部门编码</param>
        /// <param name="currDate">日期</param>
        /// <returns></returns>
        public static string GetVoucherCodeByRuleU812(UAppDataContext db, string cardNumber, string whCode, string depCode, DateTime currDate)
        {

            var numItem = db.VoucherNumberU812s.SingleOrDefault(t => t.CardNumber == cardNumber);
            string codeString = "";
            if (numItem == null)
                throw new Exception("单据类型编码:[" + cardNumber + "]未设置单据规则");
            string SeekCodeNumber = "";
            string SeekCode = "";
            switch (numItem.Prefix1)
            {
                case "远程号":
                    {
                        string curCode = GetFlagID(db, numItem.Prefix1Len);
                        codeString = codeString + curCode;
                        break;
                    }
                case "仓库":
                    {
                        string curCode = GetWareHouseContrapose(db, whCode);
                        codeString = codeString + curCode;
                        break;
                    }

                case "日期":
                case "制单日期":
                case "单据日期":
                    if (numItem.Prefix1Rule == "年")
                    {
                        if (numItem.Prefix1Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix1Len == 4)
                            SeekCodeNumber = currDate.ToString("yyyy");

                        SeekCode = currDate.ToString("yyyy");

                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix1Rule == "年月")
                    {
                        if (numItem.Prefix1Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix1Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix1Len == 6)
                            SeekCodeNumber = currDate.ToString("yyyyMM");

                        SeekCode = currDate.ToString("yyyyMM");

                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix1Rule == "年月日")
                    {
                        if (numItem.Prefix1Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix1Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix1Len == 6)
                            SeekCodeNumber = currDate.ToString("yyMMdd");
                        if (numItem.Prefix1Len == 8)
                            SeekCodeNumber = currDate.ToString("yyyyMMdd");

                        SeekCode = currDate.ToString("yyyyMMdd");

                        codeString = codeString + SeekCodeNumber;
                    }
                    break;

                case "手工输入":
                    {
                        codeString = codeString + numItem.Prefix1Rule;
                        break;
                    }

            }

            switch (numItem.Prefix2)
            {
                case "远程号":
                    codeString = codeString + GetFlagID(db, numItem.Prefix2Len);
                    break;
                case "仓库":
                    codeString = codeString + GetWareHouseContrapose(db, whCode);
                    break;
                case "部门":
                    codeString = codeString + GetDepartMentContrapose(db, depCode);
                    break;
                case "日期":
                case "制单日期":
                case "单据日期":
                    if (numItem.Prefix2Rule == "年")
                    {
                        if (numItem.Prefix2Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix2Len == 4)
                            SeekCodeNumber = currDate.ToString("yyyy");

                        SeekCode = currDate.ToString("yyyy");
                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix2Rule == "年月")
                    {
                        if (numItem.Prefix2Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix2Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix2Len == 6)
                            SeekCodeNumber = currDate.ToString("yyyyMM");

                        SeekCode = currDate.ToString("yyyyMM");

                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix2Rule == "年月日")
                    {
                        if (numItem.Prefix2Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix2Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix2Len == 6)
                            SeekCodeNumber = currDate.ToString("yyMMdd");
                        if (numItem.Prefix2Len == 8)
                            SeekCodeNumber = currDate.ToString("yyyyMMdd");

                        SeekCode = currDate.ToString("yyyyMMdd");

                        codeString = codeString + SeekCodeNumber;
                    }
                    break;
                case "手工输入":
                    codeString = codeString + numItem.Prefix1Rule;
                    break;

            }

            switch (numItem.Prefix3)
            {
                case "远程号":
                    codeString = codeString + GetFlagID(db, numItem.Prefix3Len);
                    break;
                case "仓库":
                    codeString = codeString + GetWareHouseContrapose(db, whCode);
                    break;

                case "日期":
                case "制单日期":
                case "单据日期":
                    if (numItem.Prefix3Rule == "年")
                    {
                        if (numItem.Prefix3Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix3Len == 4)
                            SeekCodeNumber = currDate.ToString("yyyy");

                        SeekCode = currDate.ToString("yyyy");

                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix3Rule == "年月")
                    {
                        if (numItem.Prefix3Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix3Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix3Len == 6)
                            SeekCodeNumber = currDate.ToString("yyyyMM");

                        SeekCode = currDate.ToString("yyyyMM");

                        codeString = codeString + SeekCodeNumber;
                    }
                    if (numItem.Prefix3Rule == "年月日")
                    {
                        if (numItem.Prefix3Len == 2)
                            SeekCodeNumber = currDate.ToString("yy");
                        if (numItem.Prefix3Len == 4)
                            SeekCodeNumber = currDate.ToString("yyMM");
                        if (numItem.Prefix3Len == 6)
                            SeekCodeNumber = currDate.ToString("yyMMdd");
                        if (numItem.Prefix3Len == 8)
                            SeekCodeNumber = currDate.ToString("yyyyMMdd");


                        SeekCode = currDate.ToString("yyyyMMdd");
                        codeString = codeString + SeekCodeNumber;
                    }
                    break;
                case "手工输入":
                    codeString = codeString + numItem.Prefix1Rule;
                    break;

            }


            //流水号
            string sortNumber = GetVouchNumber(db, cardNumber, numItem.Glide, numItem.GlideRule, SeekCode, numItem.GlideLen, currDate);

            codeString = codeString + sortNumber;
            return codeString;
        }

 /// <summary>
        /// 获得用友单据号
        /// </summary>
        /// <param name="dbu">用友数据实体</param>
        /// <param name="cardNumber">单据代号</param>
        /// <param name="content">单据生产规则[单据日期]</param>
        /// <param name="rule">流水类型[月/日]</param>
        /// <returns></returns>
        public static string GetVouchNumber(UAppDataContext dbu, string cardNumber, string content, string rule, string seed, int serialLen, DateTime currDate)
        {
            VoucherHistory newItem = new VoucherHistory();

            var items = dbu.VoucherHistories.Where(t => t.CardNumber == cardNumber
                       && (t.cContent ?? "") == (content ?? "") && (t.cSeed ?? "") == (seed ?? ""));

            //string sql = "select * from  dbo.VoucherHistory  with (nolock) where CardNumber ='{0}' and isnull(cContent,'') ='{1}' and isnull(cSeed,'') ='{2}'";
            //sql = string.Format(sql, cardNumber, content, seed);
            //DataTable dt = SqlHelper.ExecuteDataset(Config.UFConn, CommandType.Text, sql).Tables[0];

            int currentNumber = 0;
            if (items .Count ()== 0)
            {
                newItem = new VoucherHistory();
                newItem.bEmpty = false;
                newItem.CardNumber = cardNumber;
                newItem.cContent = content;
                newItem.cContentRule = rule;
                newItem.cNumber = "1";

                newItem.cSeed = seed;
                dbu.VoucherHistories.InsertOnSubmit(newItem);
                dbu.SubmitChanges();
                currentNumber = 1;
            }
            else
            {

                currentNumber = int.Parse(items.First().cNumber) + 1;
                int autoId = items.First().AutoId;
                var upItem = dbu.VoucherHistories.SingleOrDefault(t => t.AutoId == autoId);
                upItem.cNumber = currentNumber.ToString();
                dbu.SubmitChanges();
                //int autoId = int.Parse(dt.Rows[0]["AutoId"].ToString());
                //sql = "update dbo.VoucherHistory set cNumber ='{0}'  where AutoId ='{1}'";
                //sql = string.Format(sql, currentNumber, autoId);
                //dbu.ExecuteCommand(sql, "");
                //dbu.SubmitChanges();
            }
            string serialFormat = "";
            for (int i = 0; i < serialLen - 1; i++)
            {
                serialFormat += "0";
            }
            serialFormat += "#";
            string usedNumber = "";

            usedNumber = currentNumber.ToString(serialFormat);
            return usedNumber;

        }


        private static string GetFlagID(UAppDataContext db, int len)
        {

            string result = "";
            var aItems = db.AccInformations.Where(t => t.cSysID == "AA" && t.cName == "cID");
            if (aItems.Count() > 0)
            {
                if (aItems.First().cValue == null)
                    result = "";
                else
                    result = aItems.First().cValue;
            }
            else
            {
                result = "";
            }
            string empStr = "";
            for (int i = 0; i < len - result.Length; i++)
            {
                empStr += "0";
            }
            return empStr + result;
        }

        // '取得仓库的对照码,用于进行编码
        private static string GetWareHouseContrapose(UAppDataContext db, string cWhCode)
        {
            var items = db.VoucherContraposes.Where(t => t.cContent == "WareHouse" && t.cSeed == cWhCode);
            if (items.Count() > 0)
            {
                return items.First().cCode;
            }
            return "";
        }


        private static string GetDepartMentContrapose(UAppDataContext db, string depCode)
        {
            var items = db.VoucherContraposes.Where(t => t.cContent == "Department" && t.cSeed == depCode);
            if (items.Count() > 0)
            {
                return items.First().cCode;
            }
            return "";

        }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daniel_qsy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值