zoukankan      html  css  js  c++  java
  • 一个简易流程审批实现

    审批代码 -> 审批环节 -> 审批岗位 ->在数据库中创建各个节点保存审核记录

    一个审批代码表示一个业务需要审批,通过审批代码得到审批中需要流转的环节,每个环节对应着一个或是多个审批岗位

        #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
  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/zyug/p/7263189.html
Copyright © 2011-2022 走看看