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
  • 相关阅读:
    1、安装electron
    Bootstrap fileinput v3.0(ssm版)
    Bootstrap fileinput v2.0(ssm版)
    网络概念
    win10远程桌面连接提示身份验证错误,要求的函数不受支持的解决方案
    Quartz 定时任务时间设置
    牛顿迭代法快速寻找平方根
    mysql 中出现:不能打开到主机的连接,在端口3306: 连接失败
    spring boot+mybatis+generator生成domain大小写问题
    Decoder is not a @Sharable handler, so can't be added or removed multiple times
  • 原文地址:https://www.cnblogs.com/zyug/p/7263189.html
Copyright © 2011-2022 走看看