Exemple #1
0
        /// <summary>
        /// 送签单据
        /// </summary>
        /// <param name="session"></param>
        /// <param name="order"></param>
        public static void ApproveThis(ISession session, IApprovable order)
        {
            log.DebugFormat("submit order {0} for approve", order.OrderNumber);
            OrderTypeDef typeDef = OrderTypeDef.Retrieve(session, order.OrderTypeCode);

            log.DebugFormat("OrderTypeDef {0} retrieved", order.OrderTypeCode);
            //不需要签核
            if (!typeDef.NeedApprove)
            {
                log.DebugFormat("order type {0} don't need approval", order.OrderTypeCode);
                order.ApproveResult = ApproveStatus.Approve;
                order.Update(session, "ApproveResult");
                order.OnApprove(session);
                session.PostCommit += order.PostApprove;
                return;
            }

            //检查该单据是否已经有未完成的签核项,避免重复生成
            int count = session.CreateEntityQuery <OrderApproveItem>()
                        .Where(Exp.Eq("OrderTypeCode", order.OrderTypeCode)
                               & Exp.Eq("OrderNumber", order.OrderNumber)
                               & Exp.Eq("Status", ApproveStatus.UnApprove))
                        .Count();

            if (count > 0)
            {
                log.DebugFormat("order {0} has {1} unfinished approve items, maybe it's already in approving state", order.OrderNumber, count);
                throw new Exception(typeDef.TypeText + order.OrderNumber + "已经在签核中");
            }

            IList <OrderApproveDef> appDefines = session.CreateEntityQuery <OrderApproveDef>()
                                                 .Where(Exp.Eq("OrderTypeCode", order.OrderTypeCode))
                                                 .OrderBy("StepIndex")
                                                 .List <OrderApproveDef>();

            if (appDefines == null || appDefines.Count <= 0)
            {
                log.DebugFormat("no OrderApproveDef exists for order type {0}", order.OrderTypeCode);
                throw new Exception(string.Format("Approve defines error for order type {0}", order.OrderTypeCode));
            }
            else
            {
                log.DebugFormat("{0} OrderApproveDef retrieved", appDefines.Count);
            }

            //生成签核项
            OrderApproveItem appItem = new OrderApproveItem();

            appItem.OrderTypeCode = order.OrderTypeCode;
            appItem.OrderNumber   = order.OrderNumber;
            appItem.Status        = ApproveStatus.UnApprove;
            appItem.ApproveTime   = new DateTime(1900, 1, 1);
            appItem.SubmitUser    = Magic.Security.SecuritySession.CurrentUser.UserId;
            appItem.SubmitTime    = DateTime.Now;
            appItem.CreateUser    = order.CreateUser;
            appItem.CreateTime    = order.CreateTime;
            appItem.Create(session);
            log.DebugFormat("OrderApproveItem {0} created", appItem.ApproveID);

            for (int i = 0; i < appDefines.Count; i++)
            {
                OrderApproveResult appResult = new OrderApproveResult();
                appResult.ApproveID   = appItem.ApproveID;
                appResult.StepIndex   = appDefines[i].StepIndex;
                appResult.ApproveUser = appDefines[i].UserID;
                appResult.HasFinished = false;
                if (i == 0)
                {
                    appResult.ActiveItem = true;
                }
                else
                {
                    appResult.ActiveItem = false;
                }
                appResult.ApproveResult = false;
                appResult.ApproveTime   = new DateTime(1900, 1, 1);
                appResult.ApproveNote   = " ";
                appResult.Create(session);
                log.DebugFormat("OrderApproveResult {0} created", appResult.ApproveResultID);
            }
        }