using System; using System.Collections.Generic; using System.Collections; using System.Data; using BP.WF; using BP.En; using BP.DA; using BP.Web; using BP.Sys; using BP.WF.Template; namespace BP.CCBill { /// /// 接口调用 /// public class Dev2Interface { /// /// 增加日志 /// /// /// /// /// /// public static void Dict_AddTrack(string frmID, string frmWorkID, string at, string msg, string paras = null, string flowNo = null, string flowName = null, int nodeID = 0, Int64 workIDOfFlow = 0, string frmName = "") { BP.CCBill.Track tk = new BP.CCBill.Track(); tk.WorkID = frmWorkID; tk.FrmID = frmID; tk.FrmName = frmName; tk.ActionType = at; switch (at) { case FrmActionType.BBS: tk.ActionTypeText = "评论"; break; case FrmActionType.Create: tk.ActionTypeText = "创建"; break; case FrmActionType.DataVerReback: tk.ActionTypeText = "数据版本"; break; case FrmActionType.Save: tk.ActionTypeText = "保存"; break; case FrmActionType.StartFlow: tk.ActionTypeText = "发起流程"; break; default: tk.ActionTypeText = "其他"; break; } tk.Rec = WebUser.No; tk.RecName = WebUser.Name; tk.DeptNo = WebUser.FK_Dept; tk.DeptName = WebUser.FK_DeptName; // 流程信息。 tk.WorkIDOfFlow = workIDOfFlow; tk.NodeID = nodeID; if (flowName != null) tk.FlowName = flowName; if (flowNo != null) tk.FlowNo = flowNo; //tk.setMyPK(tk.FrmID + "_" + tk.WorkID + "_" + tk.Rec + "_" + (int)BP.CCBill.FrmActionType.BBS; tk.Msg = msg; tk.RDT = DataType.CurrentDateTime; ////流程信息. //tk.NodeID = nodeID; //tk.NodeName = nodeName; //tk.FlowNo = flowNo; //tk.FlowName = flowName; //tk.FID = fid; tk.Insert(); } /// /// 创建单据的WorkID /// /// /// /// /// /// /// /// public static Int64 CreateBlankBillID(string frmID, string userNo = null, Hashtable htParas = null, string pDictFrmID = null, Int64 pDictWorkID = 0) { if (userNo == null) userNo = WebUser.No; GenerBill gb = new GenerBill(); int i = gb.Retrieve(GenerBillAttr.FrmID, frmID, GenerBillAttr.Starter, userNo, GenerBillAttr.BillState, 0); if (i == 1) { GERpt rpt1 = new GERpt(frmID); rpt1.OID = gb.WorkID; int count = rpt1.RetrieveFromDBSources(); if (htParas != null) rpt1.Copy(htParas); rpt1.SetValByKey("BillState", 0); rpt1.SetValByKey("Starter", gb.Starter); rpt1.SetValByKey("StarterName", gb.StarterName); rpt1.SetValByKey("FK_Dept", WebUser.FK_Dept); rpt1.SetValByKey("RDT", gb.RDT); rpt1.SetValByKey("Title", gb.Title); rpt1.SetValByKey("BillNo", gb.BillNo); if (pDictFrmID != null) { rpt1.SetValByKey("PWorkID", pDictWorkID); rpt1.SetValByKey("PFrmID", pDictFrmID); } if(count == 0) rpt1.InsertAsOID(gb.WorkID); else rpt1.Update(); return gb.WorkID; } FrmBill fb = new FrmBill(frmID); gb.WorkID = DBAccess.GenerOID("WorkID"); gb.BillState = BillState.None; //初始化状态. gb.Starter = BP.Web.WebUser.No; gb.StarterName = BP.Web.WebUser.Name; gb.FrmName = fb.Name; //单据名称. gb.FrmID = fb.No; //单据ID //if (DataType.IsNullOrEmpty(billNo) == false) // gb.BillNo = billNo; //BillNo gb.FK_Dept = BP.Web.WebUser.FK_Dept; gb.DeptName = BP.Web.WebUser.FK_DeptName; gb.FK_FrmTree = fb.FK_FormTree; //单据类别. gb.RDT = DataType.CurrentDateTime; gb.NDStep = 1; gb.NDStepName = "启动"; //父字典信息. if (pDictFrmID != null) { gb.PFrmID = pDictFrmID; gb.PWorkID = pDictWorkID; } //创建rpt. BP.WF.GERpt rpt = new BP.WF.GERpt(frmID); //设置标题. if (fb.EntityType == EntityType.FrmBill) { gb.Title = Dev2Interface.GenerTitle(fb.TitleRole, rpt); //if (DataType.IsNullOrEmpty(billNo) == false) // gb.BillNo = billNo; //else gb.BillNo = BP.CCBill.Dev2Interface.GenerBillNo(fb.BillNoFormat, gb.WorkID, null, frmID); } if (fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict) { rpt.EnMap.CodeStruct = fb.EnMap.CodeStruct; //if (DataType.IsNullOrEmpty(billNo) == false) // gb.BillNo = billNo; //else gb.BillNo = rpt.GenerNewNoByKey("BillNo"); // BP.CCBill.Dev2Interface.GenerBillNo(fb.BillNoFormat, gb.WorkID, null, frmID); gb.Title = ""; } gb.DirectInsert(); //执行插入. //如果. if (htParas != null) rpt.Copy(htParas); //更新基础的数据到表单表. // rpt = new BP.WF.GERpt(frmID); rpt.SetValByKey("BillState", (int)gb.BillState); rpt.SetValByKey("Starter", gb.Starter); rpt.SetValByKey("StarterName", gb.StarterName); rpt.SetValByKey("FK_Dept", WebUser.FK_Dept); rpt.SetValByKey("RDT", gb.RDT); rpt.SetValByKey("Title", gb.Title); rpt.SetValByKey("BillNo", gb.BillNo); if (pDictFrmID != null) { rpt.SetValByKey("PWorkID", pDictWorkID); rpt.SetValByKey("PFrmID", pDictFrmID); } rpt.OID = gb.WorkID; rpt.InsertAsOID(gb.WorkID); BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, rpt.OID.ToString(), FrmActionType.Create, "创建记录"); return gb.WorkID; } /// /// 创建一个实体ID /// /// 实体ID /// 用户编号 /// 参数 /// 一个实例的workid public static Int64 CreateBlankDictID(string frmID, string userNo, Hashtable htParas) { if (userNo == null) userNo = WebUser.No; // 创建一个实体, 先检查一下是否有空白的数据. GERpt rpt = new GERpt(frmID); int i = rpt.Retrieve("Starter", userNo, "BillState", 0); if (i >= 1) { if (htParas != null) rpt.Copy(htParas); rpt.SetValByKey("RDT", DataType.CurrentDate); rpt.Update(); return rpt.OID; //如果有空白的数据,就返回给他. } //执行copy数据. if (htParas != null) rpt.Copy(htParas); FrmDict fb = new FrmDict(frmID); //更新基础的数据到表单表. rpt.SetValByKey("BillState", 0); rpt.SetValByKey("Starter", WebUser.No); rpt.SetValByKey("StarterName", WebUser.Name); rpt.SetValByKey("FK_Dept", WebUser.FK_Dept); rpt.SetValByKey("RDT", DataType.CurrentDate); //设置编号生成规则. rpt.EnMap.CodeStruct = fb.BillNoFormat; //rpt.SetValByKey("Title", gb.Title); rpt.SetValByKey("BillNo", rpt.GenerNewNoByKey("BillNo")); rpt.OID = DBAccess.GenerOID("WorkID"); rpt.ResetDefaultVal(); rpt.InsertAsOID(rpt.OID); BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, rpt.OID.ToString(), FrmActionType.Create, "创建记录"); return rpt.OID; } /// /// 保存实体数据 /// /// 表单ID /// 工作ID /// 参数数据 /// public static void SaveDictWork(string frmID, Int64 workid, Hashtable htParas) { // 创建一个实体, 先检查一下是否有空白的数据. GERpt rpt = new GERpt(frmID); rpt.OID = workid; if (rpt.RetrieveFromDBSources() == 0) { if (htParas != null) rpt.Copy(htParas); //设置编号生成规则. FrmBill fb = new FrmBill(frmID); rpt.EnMap.CodeStruct = fb.BillNoFormat; rpt.SetValByKey("BillNo", rpt.GenerNewNoByKey("BillNo")); rpt.InsertAsOID(workid); } else { //执行copy数据. if (htParas != null) rpt.Copy(htParas); } //更新基础的数据到表单表. rpt.SetValByKey("BillState", 100); rpt.SetValByKey("Starter", WebUser.No); rpt.SetValByKey("StarterName", WebUser.Name); rpt.SetValByKey("FK_Dept", WebUser.FK_Dept); rpt.SetValByKey("RDT", DataType.CurrentDate); rpt.Update(); BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, workid.ToString(), FrmActionType.Save, "执行保存"); } /// /// 保存 /// /// 表单ID /// 工作ID /// 返回保存结果 public static string SaveBillWork(string frmID, Int64 workID) { FrmBill fb = new FrmBill(frmID); GenerBill gb = new GenerBill(); gb.WorkID = workID; int i = gb.RetrieveFromDBSources(); if (i == 0) return ""; gb.BillState = BillState.Editing; //创建rpt. BP.WF.GERpt rpt = new BP.WF.GERpt(gb.FrmID, workID); if (fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict) { gb.Title = rpt.Title; gb.Update(); return "保存成功..."; } //单据编号. if (DataType.IsNullOrEmpty(gb.BillNo) == true && !(fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict)) { gb.BillNo = BP.CCBill.Dev2Interface.GenerBillNo(fb.BillNoFormat, workID, null, fb.PTable); //更新单据里面的billNo字段. if (DBAccess.IsExitsTableCol(fb.PTable, "BillNo") == true) DBAccess.RunSQL("UPDATE " + fb.PTable + " SET BillNo='" + gb.BillNo + "' WHERE OID=" + workID); } //标题. if (DataType.IsNullOrEmpty(gb.Title) == true && !(fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict)) { gb.Title = Dev2Interface.GenerTitle(fb.TitleRole, rpt); //更新单据里面的 Title 字段. if (DBAccess.IsExitsTableCol(fb.PTable, "Title") == true) DBAccess.RunSQL("UPDATE " + fb.PTable + " SET Title='" + gb.Title + "' WHERE OID=" + workID); } gb.Update(); //把通用的字段更新到数据库. rpt.Title = gb.Title; rpt.BillNo = gb.BillNo; rpt.Update(); BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, rpt.OID.ToString(), FrmActionType.Save, "保存"); return "保存成功..."; } /// /// 提交 /// /// 表单ID /// 工作ID /// 返回保存结果 public static string SubmitWork(string frmID, Int64 workID) { FrmBill fb = new FrmBill(frmID); GenerBill gb = new GenerBill(); gb.WorkID = workID; int i = gb.RetrieveFromDBSources(); if (i == 0) return ""; //设置为归档状态. gb.BillState = BillState.Over; //创建rpt. BP.WF.GERpt rpt = new BP.WF.GERpt(gb.FrmID, workID); if (fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict) { gb.Title = rpt.Title; gb.Update(); return "提交成功..."; } //单据编号. if (DataType.IsNullOrEmpty(gb.BillNo) == true && !(fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict)) { gb.BillNo = BP.CCBill.Dev2Interface.GenerBillNo(fb.BillNoFormat, workID, null, fb.PTable); //更新单据里面的billNo字段. if (DBAccess.IsExitsTableCol(fb.PTable, "BillNo") == true) DBAccess.RunSQL("UPDATE " + fb.PTable + " SET BillNo='" + gb.BillNo + "' WHERE OID=" + workID); } //标题. if (DataType.IsNullOrEmpty(gb.Title) == true && !(fb.EntityType == EntityType.EntityTree || fb.EntityType == EntityType.FrmDict)) { gb.Title = Dev2Interface.GenerTitle(fb.TitleRole, rpt); //更新单据里面的 Title 字段. if (DBAccess.IsExitsTableCol(fb.PTable, "Title") == true) DBAccess.RunSQL("UPDATE " + fb.PTable + " SET Title='" + gb.Title + "' WHERE OID=" + workID); } gb.Update(); //把通用的字段更新到数据库. rpt.Title = gb.Title; rpt.BillNo = gb.BillNo; rpt.Update(); BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, workID.ToString(), FrmActionType.Submit, "执行提交."); return "提交成功..."; } /// /// 保存 /// /// 表单ID /// 工作ID /// 返回保存结果 public static string SaveAsDraft(string frmID, Int64 workID) { GenerBill gb = new GenerBill(workID); if (gb.BillState != BillState.None) return "err@只有在None的模式下才能保存草稿。"; if (gb.BillState != BillState.Editing) { gb.BillState = BillState.Editing; gb.Update(); } return "保存成功..."; } /// /// 删除单据 /// /// /// /// public static string MyBill_Delete(string frmID, Int64 workID) { FrmBill fb = new FrmBill(frmID); string sqls = "DELETE FROM Frm_GenerBill WHERE WorkID=" + workID; sqls += "@DELETE FROM " + fb.PTable + " WHERE OID=" + workID; DBAccess.RunSQLs(sqls); return "删除成功."; } public static string MyBill_DeleteBills(string frmID, string workIds) { FrmBill fb = new FrmBill(frmID); string sqls = "DELETE FROM Frm_GenerBill WHERE WorkID in (" + workIds + ")"; sqls += "@DELETE FROM " + fb.PTable + " WHERE OID in (" + workIds + ")"; DBAccess.RunSQLs(sqls); return "删除成功."; } /// /// 删除实体 /// /// /// /// public static string MyDict_Delete(string frmID, Int64 workID) { FrmBill fb = new FrmBill(frmID); string sql = "@DELETE FROM " + fb.PTable + " WHERE OID=" + workID; DBAccess.RunSQLs(sql); return "删除成功."; } /// /// 删除实体单据 /// /// /// /// public static string MyDict_DeleteDicts(string frmID, string workIds) { FrmBill fb = new FrmBill(frmID); string sql = "DELETE FROM " + fb.PTable + " WHERE OID in (" + workIds + ")"; DBAccess.RunSQLs(sql); return "删除成功."; } /// /// 删除树形结构的实体表单 /// /// /// /// public static string MyEntityTree_Delete(string frmID, string billNo) { FrmBill fb = new FrmBill(frmID); string sql = "DELETE FROM " + fb.PTable + " WHERE BillNo='" + billNo + "' OR ParentNo='" + billNo + "'"; DBAccess.RunSQLs(sql); return "删除成功."; } /// /// 复制单据数据 /// /// /// /// public static string MyBill_Copy(string frmID, Int64 workID) { //获取单据的属性 FrmBill fb = new FrmBill(frmID); GenerBill gb = new GenerBill(); gb.WorkID = DBAccess.GenerOID("WorkID"); gb.BillState = BillState.Editing; //初始化状态. gb.Starter = BP.Web.WebUser.No; gb.StarterName = BP.Web.WebUser.Name; gb.FrmName = fb.Name; //单据名称. gb.FrmID = fb.No; //单据ID gb.FK_FrmTree = fb.FK_FormTree; //单据类别. gb.RDT = DataType.CurrentDateTime; gb.NDStep = 1; gb.NDStepName = "启动"; //创建rpt. BP.WF.GERpt rpt = new BP.WF.GERpt(frmID, workID); //设置标题. gb.Title = Dev2Interface.GenerTitle(fb.TitleRole, rpt); gb.BillNo = BP.CCBill.Dev2Interface.GenerBillNo(fb.BillNoFormat, gb.WorkID, null, frmID); gb.DirectInsert(); //执行插入. //更新基础的数据到表单表. rpt.SetValByKey("BillState", (int)gb.BillState); rpt.SetValByKey("Starter", gb.Starter); rpt.SetValByKey("StarterName", gb.StarterName); rpt.SetValByKey("RDT", gb.RDT); rpt.SetValByKey("Title", gb.Title); rpt.SetValByKey("BillNo", gb.BillNo); rpt.OID = gb.WorkID; rpt.InsertAsOID(gb.WorkID); #region 复制其他数据. //复制明细。 MapDtls dtls = new MapDtls(frmID); if (dtls.Count > 0) { foreach (MapDtl dtl in dtls) { if (dtl.IsCopyNDData == false) continue; //new 一个实例. GEDtl dtlData = new GEDtl(dtl.No); GEDtls dtlsFromData = new GEDtls(dtl.No); dtlsFromData.Retrieve(GEDtlAttr.RefPK, workID); foreach (GEDtl geDtlFromData in dtlsFromData) { //是否启用多附件 FrmAttachmentDBs dbs = null; if (dtl.IsEnableAthM == true) { //根据从表的OID 获取附件信息 dbs = new FrmAttachmentDBs(); dbs.Retrieve(FrmAttachmentDBAttr.RefPKVal, geDtlFromData.OID); } dtlData.Copy(geDtlFromData); dtlData.RefPK = rpt.OID.ToString(); dtlData.InsertAsNew(); if (dbs != null && dbs.Count != 0) { //复制附件信息 FrmAttachmentDB newDB = new FrmAttachmentDB(); foreach (FrmAttachmentDB db in dbs) { newDB.Copy(db); newDB.RefPKVal = dtlData.OID.ToString(); newDB.FID = dtlData.OID; newDB.setMyPK(DBAccess.GenerGUID()); newDB.Insert(); } } } } } //获取附件组件、 FrmAttachments athDecs = new FrmAttachments(frmID); //复制附件数据。 if (athDecs.Count > 0) { foreach (FrmAttachment athDec in athDecs) { FrmAttachmentDBs aths = new FrmAttachmentDBs(); aths.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athDec.MyPK, FrmAttachmentDBAttr.RefPKVal, workID); foreach (FrmAttachmentDB athDB in aths) { FrmAttachmentDB athDB_N = new FrmAttachmentDB(); athDB_N.Copy(athDB); athDB_N.RefPKVal = rpt.OID.ToString(); athDB_N.setMyPK(DBAccess.GenerGUID()); athDB_N.Insert(); } } } #endregion 复制表单其他数据. BP.CCBill.Dev2Interface.Dict_AddTrack(frmID, workID.ToString(), "复制", "执行复制"); return "复制成功."; } /// /// 获得发起列表 /// /// /// public static DataSet DB_StartBills(string empID) { //定义容器. DataSet ds = new DataSet(); //单据类别. SysFormTrees ens = new SysFormTrees(); ens.RetrieveAll(); DataTable dtSort = ens.ToDataTableField("Sort"); dtSort.TableName = "Sort"; ds.Tables.Add(dtSort); //查询出来单据运行模式的. FrmBills bills = new FrmBills(); bills.RetrieveAll(); //bills.Retrieve(FrmBillAttr.EntityType, 0); //实体类型. DataTable dtStart = bills.ToDataTableField(); dtStart.TableName = "Start"; ds.Tables.Add(dtStart); return ds; } /// /// 获得待办列表 /// /// /// public static DataTable DB_Todolist(string empID) { return new DataTable(); } /// /// 草稿列表 /// /// 单据ID /// 操作员 /// public static DataTable DB_Draft(string frmID, string empID) { if (DataType.IsNullOrEmpty(empID) == true) empID = BP.Web.WebUser.No; GenerBills bills = new GenerBills(); bills.Retrieve(GenerBillAttr.FrmID, frmID, GenerBillAttr.Starter, empID); return bills.ToDataTableField(); } public static string GenerTitle(string titleRole, Entity wk) { if (DataType.IsNullOrEmpty(titleRole)) { // 为了保持与ccflow4.5的兼容,从开始节点属性里获取. Attr myattr = wk.EnMap.Attrs.GetAttrByKey("Title"); if (myattr == null) myattr = wk.EnMap.Attrs.GetAttrByKey("Title"); if (myattr != null) titleRole = myattr.DefaultVal.ToString(); if (DataType.IsNullOrEmpty(titleRole) || titleRole.Contains("@") == false) titleRole = "@WebUser.FK_DeptName-@WebUser.No,@WebUser.Name在@RDT发起."; } if (titleRole == "@OutPara" || DataType.IsNullOrEmpty(titleRole) == true) titleRole = "@WebUser.FK_DeptName-@WebUser.No,@WebUser.Name在@RDT发起."; titleRole = titleRole.Replace("@WebUser.No", WebUser.No); titleRole = titleRole.Replace("@WebUser.Name", WebUser.Name); titleRole = titleRole.Replace("@WebUser.FK_DeptNameOfFull", WebUser.FK_DeptNameOfFull); titleRole = titleRole.Replace("@WebUser.FK_DeptName", WebUser.FK_DeptName); titleRole = titleRole.Replace("@WebUser.FK_Dept", WebUser.FK_Dept); titleRole = titleRole.Replace("@RDT", DateTime.Now.ToString("yy年MM月dd日HH时mm分")); if (titleRole.Contains("@")) { Attrs attrs = wk.EnMap.Attrs; // 优先考虑外键的替换,因为外键文本的字段的长度相对较长。 foreach (Attr attr in attrs) { if (titleRole.Contains("@") == false) break; if (attr.IsRefAttr == false) continue; titleRole = titleRole.Replace("@" + attr.Key, wk.GetValStrByKey(attr.Key)); } //在考虑其它的字段替换. foreach (Attr attr in attrs) { if (titleRole.Contains("@") == false) break; if (attr.IsRefAttr == true) continue; titleRole = titleRole.Replace("@" + attr.Key, wk.GetValStrByKey(attr.Key)); } } titleRole = titleRole.Replace('~', '-'); titleRole = titleRole.Replace("'", "”"); // 为当前的工作设置title. wk.SetValByKey("Title", titleRole); return titleRole; } /// /// 生成单据编号 /// /// 单据编号规则 /// 工作ID /// 实体类 /// 表单ID /// 生成的单据编号 public static string GenerBillNo(string billNo, Int64 workid, Entity en, string frmID) { if (DataType.IsNullOrEmpty(billNo)) billNo = "3"; if (billNo.Contains("@")) billNo = BP.WF.Glo.DealExp(billNo, en, null); /*如果,Bill 有规则 */ billNo = billNo.Replace("{YYYY}", DateTime.Now.ToString("yyyy")); billNo = billNo.Replace("{yyyy}", DateTime.Now.ToString("yyyy")); billNo = billNo.Replace("{yy}", DateTime.Now.ToString("yy")); billNo = billNo.Replace("{YY}", DateTime.Now.ToString("yy")); billNo = billNo.Replace("{MM}", DateTime.Now.ToString("MM")); billNo = billNo.Replace("{mm}", DateTime.Now.ToString("MM")); billNo = billNo.Replace("{DD}", DateTime.Now.ToString("dd")); billNo = billNo.Replace("{dd}", DateTime.Now.ToString("dd")); billNo = billNo.Replace("{HH}", DateTime.Now.ToString("HH")); billNo = billNo.Replace("{hh}", DateTime.Now.ToString("HH")); billNo = billNo.Replace("{LSH}", workid.ToString()); billNo = billNo.Replace("{WorkID}", workid.ToString()); billNo = billNo.Replace("{OID}", workid.ToString()); if (billNo.Contains("@WebUser.DeptZi")) { string val = DBAccess.RunSQLReturnStringIsNull("SELECT Zi FROM Port_Dept WHERE No='" + WebUser.FK_Dept + "'", ""); billNo = billNo.Replace("@WebUser.DeptZi", val.ToString()); } string sql = ""; int num = 0; string supposeBillNo = billNo; //假设单据号,长度与真实单据号一致 List> loc = new List>(); //流水号位置,流水号位数 string lsh; //流水号设置码 int lshIdx = -1; //流水号设置码所在位置 for (int i = 2; i < 9; i++) { lsh = "{LSH" + i + "}"; if (!supposeBillNo.Contains(lsh)) continue; while (supposeBillNo.Contains(lsh)) { //查找流水号所在位置 lshIdx = supposeBillNo.IndexOf(lsh); //将找到的流水号码替换成假设的流水号 supposeBillNo = (lshIdx == 0 ? "" : supposeBillNo.Substring(0, lshIdx)) + string.Empty.PadLeft(i, '_') + (lshIdx + 6 < supposeBillNo.Length ? supposeBillNo.Substring(lshIdx + 6) : ""); //保存当前流程号所处位置,及流程号长度,以便之后使用替换成正确的流水号 loc.Add(new KeyValuePair(lshIdx, i)); } } //数据库中查找符合的单据号集合,NOTE:此处需要注意,在LIKE中带有左广方括号时,要使用一对广播号将其转义 sql = "SELECT BillNo FROM Frm_GenerBill WHERE BillNo LIKE '" + supposeBillNo.Replace("[", "[[]") + "'" + " AND WorkID <> " + workid + " AND FrmID ='" + frmID + "' " + " ORDER BY BillNo DESC "; string maxBillNo = DBAccess.RunSQLReturnString(sql); int ilsh = 0; if (string.IsNullOrWhiteSpace(maxBillNo)) { //没有数据,则所有流水号都从1开始 foreach (KeyValuePair kv in loc) { supposeBillNo = (kv.Key == 0 ? "" : supposeBillNo.Substring(0, kv.Key)) + "1".PadLeft(kv.Value, '0') + (kv.Key + kv.Value < supposeBillNo.Length ? supposeBillNo.Substring(kv.Key + kv.Value) : ""); } } else { //有数据,则从右向左开始判断流水号,当右侧的流水号达到最大值,则左侧的流水号自动加1 Dictionary mlsh = new Dictionary(); int plus1idx = -1; for (int i = loc.Count - 1; i >= 0; i--) { //获取单据号中当前位的流水码数 ilsh = Convert.ToInt32(maxBillNo.Substring(loc[i].Key, loc[i].Value)); if (plus1idx >= 0) { //如果当前码位被置为+1,则+1,同时将标识置为-1 ilsh++; plus1idx = -1; } else { mlsh.Add(loc[i].Key, i == loc.Count - 1 ? ilsh + 1 : ilsh); continue; } if (ilsh >= Convert.ToInt32(string.Empty.PadLeft(loc[i].Value, '9'))) { //右侧已经达到最大值 if (i > 0) { //记录前位的码 mlsh.Add(loc[i].Key, 1); } else { supposeBillNo = "单据号超出范围"; break; } //则将前一个流水码位,标记为+1 plus1idx = i - 1; } else { mlsh.Add(loc[i].Key, ilsh + 1); } } if (supposeBillNo == "单据号超出范围") return supposeBillNo; //拼接单据号 foreach (KeyValuePair kv in loc) { supposeBillNo = (kv.Key == 0 ? "" : supposeBillNo.Substring(0, kv.Key)) + mlsh[kv.Key].ToString().PadLeft(kv.Value, '0') + (kv.Key + kv.Value < supposeBillNo.Length ? supposeBillNo.Substring(kv.Key + kv.Value) : ""); } } billNo = supposeBillNo; return billNo; } } }