按照用友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 "";
}