审批代码 -> 审批环节 -> 审批岗位 ->在数据库中创建各个节点保存审核记录
一个审批代码表示一个业务需要审批,通过审批代码得到审批中需要流转的环节,每个环节对应着一个或是多个审批岗位
#region 各个审核步骤定义并实现,每个审核步骤均对应一个代码,通过代码得到审核所需的环节,从而得到审批岗位 public class ProgressHelper { #region 流程流转顺序(一个流程顺序包含多个流转(Progress))定义(一个流转(Progress)可以有多个审核节点(Step)) public static List<OrderAudiProgressTemplate> GFanDanOrderAudiProgressTest { get { var progress1 = new OrderAudiProgressTemplate { ProgressName = "翻单订单导SAP审核过程1", PreviousProgress = null, Steps = new List<OrderAudiStepTemplate> { //三个并行审核过程 new OrderAudiStepTemplate{ UserSpecial = "财务-不合理欠款" , Remark = "1查询客户是否有不合理欠款"}, new OrderAudiStepTemplate{ UserSpecial = "财务-库存是否过剩" , Remark = "2查询客户该机型是否有不合理库存"}, new OrderAudiStepTemplate{ UserSpecial = "财务-订金是否到" , Remark = "3查询客户订金是否到帐"} } }; var progress2 = new OrderAudiProgressTemplate { ProgressName = "翻单订单导SAP审核过程2", PreviousProgress = progress1, Steps = new List<OrderAudiStepTemplate> { //三个并行审核过程 new OrderAudiStepTemplate{ UserSpecial = "财务-不合理欠款" , Remark = "4查询客户是否有不合理欠款"}, new OrderAudiStepTemplate{ UserSpecial = "财务-库存是否过剩" , Remark = "5查询客户该机型是否有不合理库存"}, new OrderAudiStepTemplate{ UserSpecial = "财务-订金是否到" , Remark = "6查询客户订金是否到帐"} } }; var progress3 = new OrderAudiProgressTemplate { ProgressName = "翻单订单导SAP审核过程3", PreviousProgress = progress2, Steps = new List<OrderAudiStepTemplate> { //三个并行审核过程 new OrderAudiStepTemplate{ UserSpecial = "财务-不合理欠款" , Remark = "7查询客户是否有不合理欠款"}, new OrderAudiStepTemplate{ UserSpecial = "财务-库存是否过剩" , Remark = "8查询客户该机型是否有不合理库存"}, new OrderAudiStepTemplate{ UserSpecial = "财务-订金是否到" , Remark = "9查询客户订金是否到帐"} } }; return new List<OrderAudiProgressTemplate> { progress2,progress1,progress3 }; } } public static List<OrderAudiProgressTemplate> FanDanOrderAudiProgress { get { var progress1 = new OrderAudiProgressTemplate { ProgressName = "翻单订单导SAP前审核过程", ProgressCode = PendingCode.FandanAudiProgressCode, PreviousProgress = null, Steps = new List<OrderAudiStepTemplate> { //三个并行审核过程 new OrderAudiStepTemplate{ UserSpecial = "财务-不合理欠款" , Remark = "查询客户是否有不合理欠款" ,StepCode = "Ac1"}, new OrderAudiStepTemplate{ UserSpecial = "财务-库存是否过剩" , Remark = "查询客户该机型是否有不合理库存",StepCode = "Ac2"}, new OrderAudiStepTemplate{ UserSpecial = "财务-订金是否到" , Remark = "查询客户订金是否到帐",StepCode = "Ac3"} } }; return new List<OrderAudiProgressTemplate> { progress1 }; } } #endregion private static List<OrderAudiProgressTemplate> GetAudiProgressByCode(string code) { var codeTitles = new Dictionary<string, List<OrderAudiProgressTemplate>>(); codeTitles.Add(PendingCode.TestAudiProgressCode, GFanDanOrderAudiProgressTest); codeTitles.Add(PendingCode.FandanAudiProgressCode, FanDanOrderAudiProgress); if (codeTitles.ContainsKey(code)) { return codeTitles[code]; } return null; } public static void SetAllOrderProgresMoved(int orderId, string progressCode) { using (var db = new DataContext.OverSeaOrderEntities()) { foreach (var item in db.OrderPendingState.Where(p => p.OrderID == orderId && p.ProgressCode == progressCode)) { item.ProgressCode = item.ProgressCode + "_"; } db.SaveChanges(); } } public static void CreateProgressForOrder(int orderId,string progressCode) { var template = GetAudiProgressByCode(progressCode); if (template == null) return; var currentgress = template.FirstOrDefault(p => p.PreviousProgress == null); if (currentgress == null) return; var stateId = 0; using (var db = new DataContext.OverSeaOrderEntities()) { if (db.OrderPendingState.Any(p => p.OrderID == orderId && p.ProgressCode == progressCode)) { return; } var state = new OrderPendingState { CreateDate = System.DateTime.Now, LastUpdateDate = null, OrderID = orderId, PendingResult = (int)OrderPendingResult.Pending, ProgressCode = progressCode }; db.OrderPendingState.Add(state); db.SaveChanges(); stateId = state.ID; } OrderAudiProgress predbgress = null; do { //创建新的Progress项目 var curdb = CreateSaveingProgress(currentgress, orderId, predbgress, stateId); //查找下一个 predbgress = curdb; currentgress = template.FirstOrDefault(p => p.PreviousProgress == currentgress); } while (currentgress != null); //为所有的流转创建一个状态项 } /// <summary> /// 保存用户保存结果 /// </summary> public static void SetStepPendingResult(int userId,int progressStepId, bool result) { using (var db = new DataContext.OverSeaOrderEntities()) { var step = db.ProgressStep.FirstOrDefault(p => p.ID == progressStepId); if (step == null) return; step.Passed = result; //判断每个步骤是否都已经执行 var allsteps = db.ProgressStep.Where(p => p.ProgressID == step.ProgressID && p.ID != progressStepId).ToList(); //此处需等所有人【步骤】都审核完成才执行,是否结果为false时就直接判断结束 if (allsteps.All(p => p.Passed.HasValue) || result == false ) { //所有人已经填写,总结下是否都通过 var progressResult = result; if (result && allsteps.All(p => p.Passed == true)) { progressResult = true; }
//按总结情况更新主状态,是下一步,还是退回 var progress = db.OrderAudiProgress.FirstOrDefault(p => p.ID == step.ProgressID); if (progress == null) return; var orderstat = db.OrderPendingState.FirstOrDefault(p => progress.OrderID == p.OrderID && p.ProgressCode == progress.ProgerssCode); if (orderstat == null) return; progress.IsPassed = progressResult; progress.PassedDate = System.DateTime.Now; if (progressResult) //下一步或是完成 { progress.IsRuning = false; //查找下一步progress var nextProgress = db.OrderAudiProgress.FirstOrDefault(p => p.PreviousProgressID == progress.ID); if (nextProgress == null) { //流程已走完 orderstat.PendingResult = (int)OrderPendingResult.Successed; orderstat.LastUpdateDate = System.DateTime.Now; } else { //更新下一个progress开始进行 nextProgress.IsRuning = true; } } else { //有审核人员意见不通过 orderstat.PendingResult = (int)OrderPendingResult.Backed; orderstat.LastUpdateDate = System.DateTime.Now; } } db.SaveChanges(); } } /// <summary> /// 为每一个流程顺序创建一个数据库对应项并指定流转顺序 /// </summary> /// <param name="gressTemplate"></param> /// <param name="orderId"></param> /// <param name="predbgress"></param> /// <returns></returns> static OrderAudiProgress CreateSaveingProgress(OrderAudiProgressTemplate gressTemplate, int orderId, OrderAudiProgress predbgress,int stateId) { using (var db = new DataContext.OverSeaOrderEntities()) { OrderAudiProgress item = new OrderAudiProgress { CreateDate = System.DateTime.Now, IsPassed = null, OrderID = orderId, PassedDate = null, ProgressName = gressTemplate.ProgressName, ProgressStep = new List<ProgressStep>(), ProgerssCode = gressTemplate.ProgressCode, PendingStateID = stateId }; if (predbgress == null) { item.PreviousProgressID = null; item.IsRuning = true; //如果没有前续表明该流转为第一个开始的 } else { item.PreviousProgressID = predbgress.ID; item.IsRuning = false; } db.OrderAudiProgress.Add(item); foreach (var step in gressTemplate.Steps) { var dbstep = new ProgressStep { AudiorID = 0, CreateDate = System.DateTime.Now, StepTitle = step.Remark, StepCode = step.StepCode }; /**** 审核员查找代码 ***/ var audio = db.User.OrderByDescending(p => p.ID).FirstOrDefault(p => p.AudiSpecial == step.UserSpecial); if (audio != null) { dbstep.AudiorID = audio.ID; } /****-完毕-*/ item.ProgressStep.Add(dbstep); db.ProgressStep.Add(dbstep); } db.SaveChanges(); return item; } } /// <summary> /// 获取用户的审核列表 /// </summary> /// <param name="userId"></param> /// <returns></returns> public static List<ProgressStep> GetUserPendingList(int userId) { using (var db = new DataContext.OverSeaOrderEntities()) { return db.ProgressStep.Where(p => p.AudiorID == userId && p.OrderAudiProgress.IsRuning == true && p.Passed == null).ToList(); } } } #endregion #region 定义审核及审核结果枚举[前提:每个订单对应几个审核情况,如,在导入ERP前有前置审批,在导入后的出货有出货相关流种审批,每个审批对应几个环节,每个环节对应几个岗位] public enum OrderPendingResult { Pending = 0 ,Backed = 4 ,Successed = 8 } public class PendingCode { public const string TestAudiProgressCode = "FDTest"; public const string FandanAudiProgressCode = "FD001"; public static string GetPendingCodeTitle(string code) { var codeTitles = new Dictionary<string, string>(); codeTitles.Add(PendingCode.TestAudiProgressCode, "测试时使用流程"); codeTitles.Add(PendingCode.FandanAudiProgressCode, "翻单导SAP流程"); if (codeTitles.ContainsKey(code)) { return codeTitles[code]; } return string.Empty; } } #endregion #region 定义审核过程及每个过程包含的审核步骤类 //订单审核过程 (1个过程(progress)中包含多个步骤(step) 过程是有先后顺序,步骤则没有但需全部完成) public class OrderAudiProgressTemplate { public string ProgressName { get; set; } public string ProgressCode { get; set; } public List<OrderAudiStepTemplate> Steps { get; set; } public OrderAudiProgressTemplate PreviousProgress { get; set; } } //订单审核 public class OrderAudiStepTemplate { //public User Audior { get; set; } public string UserSpecial { get; set; } //用户岗位 [通过用户岗位描述来查找审核员] public string Remark { get; set; } public string StepCode { get; set; } } #endregion #region 各种情况判定帮助类 public class OrderAudiStateHelper { public static bool IsOrderProgressCreated(int orderId, string progressCode) { return PendingSateAny(p => p.OrderID == orderId && p.ProgressCode == progressCode); } public static bool IsOrderProgressSuccess(int orderId, string progressCode) { var resutl = (int)OrderPendingResult.Successed; return PendingSateAny(p => p.OrderID == orderId && p.ProgressCode == progressCode && p.PendingResult == resutl); } public static bool IsOrderProgressBacked(int orderId, string progressCode) { var resutl = (int)OrderPendingResult.Successed; return PendingSateAny(p => p.OrderID == orderId && p.ProgressCode == progressCode && p.PendingResult == resutl); } private static bool PendingSateAny(Expression<Func<OrderPendingState, bool>> func) { using (var db = new DataContext.OverSeaOrderEntities()) { return db.OrderPendingState.Any(func); } } } #endregion