/// <summary>
        /// 获取红包
        /// </summary>
        /// <returns></returns>
        public Jinher.AMP.BTP.Deploy.CustomDTO.UserRedEnvelopeDTO GetRedEnvelopeExt(Guid redEnvelopeId)
        {
            try
            {
                Jinher.AMP.BTP.Deploy.CustomDTO.UserRedEnvelopeDTO userRedEnvelopeDTO = new UserRedEnvelopeDTO();

                var query = UserRedEnvelope.ObjectSet().Where(q => q.Id == redEnvelopeId).FirstOrDefault();

                if (query != null)
                {
                    userRedEnvelopeDTO.Id              = query.Id;
                    userRedEnvelopeDTO.AppId           = query.AppId;
                    userRedEnvelopeDTO.Content         = query.Content;
                    userRedEnvelopeDTO.Description     = query.Description;
                    userRedEnvelopeDTO.DueDate         = query.DueDate;
                    userRedEnvelopeDTO.GoldCount       = query.GoldCount;
                    userRedEnvelopeDTO.SubTime         = query.SubTime;
                    userRedEnvelopeDTO.ModifiedOn      = query.ModifiedOn;
                    userRedEnvelopeDTO.State           = query.State;
                    userRedEnvelopeDTO.UserId          = query.UserId;
                    userRedEnvelopeDTO.RedEnvelopeType = query.RedEnvelopeType;
                }
                return(userRedEnvelopeDTO);
            }
            catch (Exception ex)
            {
                LogHelper.Error(string.Format("获取我的红包UserRedEnvelopeSV-GetRedEnvelopeExt,参数redEnvelopeId:{0}", redEnvelopeId), ex);
                return(null);
            }
        }
        private static int UpdateRedState(UserRedEnvelope query, int state)
        {
            ContextSession contextSession = ContextFactory.CurrentThreadContext;

            query.State       = state;
            query.EntityState = EntityState.Modified;
            int num = contextSession.SaveChanges();

            return(num);
        }
        /// <summary>
        /// 获取我的红包
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public List <Jinher.AMP.BTP.Deploy.CustomDTO.UserRedEnvelopeDTO> GetMyOrgRedEnvelopeExt(Guid userId, int type, int pageIndex, int pageSize)
        {
            pageSize = pageSize == 0 ? 10 : pageSize;
            List <Jinher.AMP.BTP.Deploy.CustomDTO.UserRedEnvelopeDTO> userRedEnvelopeDTOList = new List <UserRedEnvelopeDTO>();

            try
            {
                List <Guid> orgIdList = Jinher.AMP.BTP.TPS.EBCSV.Instance.GetOrgIdsByUserIdAndCode(userId, "ReceiveRed");

                var qaueryList = UserRedEnvelope.ObjectSet().Where(q => orgIdList.Contains(q.UserId) && q.RedEnvelopeType == type).OrderByDescending(q => q.SubTime).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();


                foreach (var item in qaueryList)
                {
                    Jinher.AMP.BTP.Deploy.CustomDTO.UserRedEnvelopeDTO userRedEnvelopeDTO = new UserRedEnvelopeDTO();

                    userRedEnvelopeDTO.Id              = item.Id;
                    userRedEnvelopeDTO.AppId           = item.AppId;
                    userRedEnvelopeDTO.Content         = item.Content;
                    userRedEnvelopeDTO.Description     = item.Description;
                    userRedEnvelopeDTO.DueDate         = item.DueDate;
                    userRedEnvelopeDTO.GoldCount       = item.GoldCount;
                    userRedEnvelopeDTO.SubTime         = item.SubTime;
                    userRedEnvelopeDTO.ModifiedOn      = item.ModifiedOn;
                    userRedEnvelopeDTO.State           = item.State;
                    userRedEnvelopeDTO.UserId          = item.UserId;
                    userRedEnvelopeDTO.RedEnvelopeType = item.RedEnvelopeType;
                    userRedEnvelopeDTOList.Add(userRedEnvelopeDTO);
                }

                return(userRedEnvelopeDTOList);
            }
            catch (Exception ex)
            {
                LogHelper.Error(string.Format("获取我的组织红包UserRedEnvelopeSV-GetMyRedEnvelopeExt,userId:{0},type:{1},pageIndex:{2},pageSize:{3},", userId, type, pageIndex, pageSize), ex);
                return(null);
            }
        }
        /// <summary>
        /// 领取红包
        /// </summary>
        /// <param name="userRedEnvelopeId"></param>
        /// <returns></returns>
        public Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO DrawRedEnvelopeExt(Guid userRedEnvelopeId)
        {
            ContextSession contextSession = ContextFactory.CurrentThreadContext;

            Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO result = new ResultDTO();

            UserRedEnvelope query = null;

            lock (getRedLock)
            {
                //用户分红表
                query = UserRedEnvelope.ObjectSet().Where(q => q.Id == userRedEnvelopeId).FirstOrDefault();

                if (query == null)
                {
                    result.ResultCode = 1;
                    result.Message    = "没有红包可领";
                    return(result);
                }
                else if (query.State == 0 && DateTime.Now > query.DueDate)
                {
                    result.ResultCode = 1;
                    result.Message    = "红包已过期";
                    return(result);
                }
                else if (query.State == 1)
                {
                    result.ResultCode = 1;
                    result.Message    = "红包已领";
                    return(result);
                }
                int num = UpdateRedState(query, 1);
                if (num > 0)
                {
                    result.ResultCode = 0;
                    result.Message    = "领取红包成功";
                }
                else
                {
                    result.ResultCode = 1;
                    result.Message    = "领取红包失败";
                    return(result);
                }
            }

            MultiPayeeTradeByPasswordArg arg = new MultiPayeeTradeByPasswordArg();
            ReturnInfoDTO gReturnDTO         = new ReturnInfoDTO();

            arg.PayeeComments = new List <string>();
            arg.PayorComments = new List <string>();
            arg.AppId         = query.AppId;
            arg.Payees        = new List <Tuple <Guid, bool> >();
            arg.Payees.Add(new Tuple <Guid, bool>(query.UserId, true));
            arg.BizSystem = "BTP";
            arg.BizId     = query.Id;
            arg.Golds     = new List <long> {
                query.GoldCount
            };
            arg.PayorPassword = CustomConfig.ShareGoldAccout.BTPShareAccountPwd;
            //众销
            if (query.RedEnvelopeType == 0)
            {
                arg.PayorId = CustomConfig.ShareGoldAccout.BTPShareGoldAccount;
                arg.UsageId = CustomConfig.ShareGoldAccout.BTPGlodUsageId;
                arg.BizType = "BTP_ShareDividend_Auto";
                arg.PayorComments.Add("电商分享红包支出");
                arg.PayeeComments.Add("电商分享红包收益");
            }
            else
            {
                //众筹
                arg.PayorId = CustomConfig.CrowdfundingAccount.BTPCrowdfundingAcount;
                arg.UsageId = CustomConfig.CrowdfundingAccount.BTPCrowdfundingUsageId;
                arg.BizType = "BTP_CrowdfundingDividend";
                arg.PayorComments.Add("电商众筹分红支出");
                arg.PayeeComments.Add("电商众筹分红收益");

                //计算用户已得分红
                var uc = UserCrowdfunding.ObjectSet().Where(q => q.AppId == query.AppId && q.UserId == query.UserId).FirstOrDefault();

                uc.RealGetDividend += query.GoldCount;
                uc.EntityState      = EntityState.Modified;
                contextSession.SaveObject(uc);
            }
            try
            {
                gReturnDTO = Jinher.AMP.BTP.TPS.Finance.Instance.MultiPayeeTradeByPassword(arg);
            }
            catch (Exception ex)
            {
                int num = UpdateRedState(query, 0);
                LogHelper.Error(string.Format("获取我的红包UserRedEnvelopeSV-DrawRedEnvelopeExt-MultiPayeeTrade,参数redEnvelopeId:{0},红包状态恢复{1}", userRedEnvelopeId, (num > 0 ? "成功" : "失败")), ex);
                result.ResultCode = 1;
                result.Message    = "调用金币接口失败";
                return(result);
            }

            if (gReturnDTO == null || !gReturnDTO.IsSuccess)
            {
                int num = UpdateRedState(query, 0);
                result.ResultCode = 1;
                result.Message    = "分享红包支付失败";

                LogHelper.Error(string.Format("调用金币MultiPayeeTradeByPassword方法失败,code:{0},错误消息:{1},参数redEnvelopeId:{2},红包状态恢复{3}", gReturnDTO.Code, gReturnDTO.Info, userRedEnvelopeId, (num > 0 ? "成功" : "失败")));

                return(result);
            }
            return(result);
        }
        /// <summary>
        /// 处理众筹过期红包
        /// </summary>
        public void HandleCfInValidRedEnvelopeExt()
        {
            DateTime now       = DateTime.Now;
            int      pageIndex = 0;
            int      pageSize  = 500;


            ContextSession session    = ContextFactory.CurrentThreadContext;
            bool           isContinue = true;

            do
            {
                var userRedEnvelopes = (from u in UserRedEnvelope.ObjectSet()
                                        where u.DueDate < now && u.State == 0 && u.RedEnvelopeType == 1
                                        select u)
                                       .OrderBy(a => a.DueDate).Take(pageSize).Skip(pageIndex).ToList();
                if (!userRedEnvelopes.Any())
                {
                    break;
                }
                if (userRedEnvelopes.Count < pageSize)
                {
                    isContinue = false;
                }


                var totalGoldNum = userRedEnvelopes.Sum(x => x.GoldCount);
                MultiPayeeTradeByPasswordArg arg = new MultiPayeeTradeByPasswordArg();
                arg.PayeeComments = new List <string>();
                arg.PayorComments = new List <string>();

                arg.AppId   = userRedEnvelopes[0].AppId;
                arg.PayorId = CustomConfig.CrowdfundingAccount.BTPCrowdfundingAcount;
                arg.UsageId = CustomConfig.CrowdfundingAccount.BTPCrowdfundingUsageId;
                arg.Golds   = new List <long>()
                {
                    totalGoldNum
                };
                arg.Payees = new List <Tuple <Guid, bool> >();
                arg.Payees.Add(new Tuple <Guid, bool>(CustomConfig.CrowdfundingAccount.JhCrowdfundingGoldAccount, true));
                arg.BizSystem = "BTP";
                arg.BizId     = userRedEnvelopes[0].Id;
                arg.BizType   = "BTP_Cf_InvalidRed_Auto";

                arg.PayorComments.Add("众筹活动电商过期红包支出");
                arg.PayeeComments.Add("众筹活动电商过期红包收益");
                arg.PayorPassword = CustomConfig.CrowdfundingAccount.BTPCrowdfundingPwd;

                ReturnInfoDTO gReturnDTO = new ReturnInfoDTO();
                try
                {
                    gReturnDTO = Jinher.AMP.BTP.TPS.Finance.Instance.MultiPayeeTradeByPassword(arg);

                    if (gReturnDTO.IsSuccess)
                    {
                        foreach (var userRedEnvelope in userRedEnvelopes)
                        {
                            userRedEnvelope.State       = 2;
                            userRedEnvelope.EntityState = System.Data.EntityState.Modified;
                        }
                        session.SaveChanges();
                        LogHelper.Info(string.Format("众筹活动电商过期红包Job处理了UserRedEnvelope表{0}条记录", userRedEnvelopes.Count));
                    }
                    else
                    {
                        JAP.Common.Loging.LogHelper.Error("众筹活动电商过期红包MultiPayeeTrade fail:" + gReturnDTO.Code + ":" + gReturnDTO.Info);
                        isContinue = false;
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Error("众筹活动电商过期红包Job服务异常。", ex);
                    isContinue = false;
                }
            }while (isContinue);
        }
        /// <summary>
        /// 发送众筹红包
        /// </summary>
        public void SendCfRedEnvelopeExt()
        {
            int pageIndex = 0;
            int pageSize  = 500;

            DateTime       today      = DateTime.Now.Date;
            ContextSession session    = ContextFactory.CurrentThreadContext;
            bool           isContinue = true;

            do
            {
                var userDividents = (from s in CfDividend.ObjectSet()
                                     where s.SettlementDate < today && s.State == 0
                                     group s by s.UserId into g
                                     select g
                                     ).OrderBy(a => a.Key).Take(pageSize).Skip(pageIndex)
                                    .ToDictionary(x => x.Key, y => y.ToList());


                foreach (Guid userId in userDividents.Keys)
                {
                    StringBuilder strDescription = new StringBuilder(50);
                    foreach (CfDividend userDivident in userDividents[userId])
                    {
                        userDivident.State       = 1;
                        userDivident.EntityState = System.Data.EntityState.Modified;

                        strDescription.Append(userDivident.AppName);
                        strDescription.Append("  持股");
                        strDescription.Append(userDivident.ShareCount);
                        strDescription.Append("股  获得分红");
                        strDescription.Append(userDivident.Gold);
                        strDescription.Append("个金币").Append(",");
                    }
                    strDescription.Remove(strDescription.Length - 1, 1);
                    var             goldNum     = userDividents[userId].Sum(x => x.Gold);
                    UserRedEnvelope redEnvelope = UserRedEnvelope.CreateUserRedEnvelope();
                    redEnvelope.EntityState = System.Data.EntityState.Added;
                    redEnvelope.AppId       = userDividents[userId][0].AppId;
                    redEnvelope.Content     = CustomConfig.SaleShare.DividentContent;
                    redEnvelope.Description = strDescription.ToString();
                    double dueDateAdd = CustomConfig.CrowdfundingConfig.DividentDue;
                    redEnvelope.DueDate         = DateTime.Now.AddHours(dueDateAdd);
                    redEnvelope.GoldCount       = goldNum;
                    redEnvelope.UserId          = userId;
                    redEnvelope.RedEnvelopeType = 1;

                    session.SaveObject(redEnvelope);

                    ShareRedMessageDTO contentCDTO = new ShareRedMessageDTO();
                    contentCDTO.message  = redEnvelope.Content;
                    contentCDTO.userName = redEnvelope.Content;
                    contentCDTO.msgId    = redEnvelope.Id;
                    contentCDTO.url      = string.Format("{0}ShareRedEnvelope/ShareRedEnvelopesDetail?msgId={1}", CustomConfig.BtpDomain, redEnvelope.Id);

                    double dueMessDateAdd = CustomConfig.CrowdfundingConfig.DividentMessageDue;
                    SendMessage(redEnvelope.Id, redEnvelope.AppId, redEnvelope.UserId, DateTime.Now.AddHours(dueMessDateAdd), contentCDTO);
                }

                try
                {
                    session.SaveChanges();
                    if (userDividents.Count < pageSize)
                    {
                        isContinue = false;
                    }
                    LogHelper.Info(string.Format("发送众筹红包Job处理了CfDividend表{0}条记录", userDividents.Count));
                }
                catch (Exception ex)
                {
                    LogHelper.Error("发送众筹红包Job服务异常。", ex);
                    isContinue = false;
                }
            }while (isContinue);
        }
        /// <summary>
        /// 发送红包
        /// </summary>
        public void SendRedEnvelopeExt()
        {
            int pageIndex = 0;
            int pageSize  = 500;

            DateTime       today      = DateTime.Now.Date;
            ContextSession session    = ContextFactory.CurrentThreadContext;
            bool           isContinue = true;

            do
            {
                var userDividents = (from s in ShareDividendDetail.ObjectSet()
                                     where s.SettlementDate < today && s.State == 0
                                     group s by s.UserId into g
                                     select g
                                     ).OrderBy(a => a.Key).Take(pageSize).Skip(pageIndex)
                                    .ToDictionary(x => x.Key, y => y.ToList());


                foreach (Guid userId in userDividents.Keys)
                {
                    StringBuilder strDescription = new StringBuilder(50);
                    foreach (ShareDividendDetail userDivident in userDividents[userId])
                    {
                        userDivident.State       = 1;
                        userDivident.EntityState = System.Data.EntityState.Modified;

                        strDescription.Append(userDivident.Description).Append(",");
                    }
                    strDescription.Remove(strDescription.Length - 1, 1);
                    var             goldNum     = userDividents[userId].Sum(x => x.Money);
                    UserRedEnvelope redEnvelope = UserRedEnvelope.CreateUserRedEnvelope();
                    redEnvelope.EntityState = System.Data.EntityState.Added;
                    redEnvelope.AppId       = userDividents[userId][0].AppId;
                    redEnvelope.Content     = CustomConfig.SaleShare.DividentContent;
                    redEnvelope.Description = strDescription.ToString();
                    double dueDateAdd = 24;
                    double.TryParse(CustomConfig.SaleShare.DividentDue, out dueDateAdd);
                    redEnvelope.DueDate   = DateTime.Now.AddHours(dueDateAdd);
                    redEnvelope.GoldCount = goldNum;
                    redEnvelope.UserId    = userId;
                    redEnvelope.RoleType  = userDividents[userId][0].RoleType;

                    ShareRedMessageDTO contentCDTO = new ShareRedMessageDTO();
                    contentCDTO.message  = redEnvelope.Content;
                    contentCDTO.userName = redEnvelope.Content;
                    contentCDTO.msgId    = redEnvelope.Id;
                    contentCDTO.url      = string.Format("{0}ShareRedEnvelope/ShareRedEnvelopesDetail?msgId={1}", CustomConfig.BtpDomain, redEnvelope.Id);

                    double dueMessDateAdd = 48;
                    double.TryParse(CustomConfig.SaleShare.DividentMessageDue, out dueMessDateAdd);

                    if (userDividents[userId][0].RoleType == 2)
                    {
                        try
                        {
                            List <Guid> userIds  = Jinher.AMP.BTP.TPS.EBCSV.Instance.GetUserIdsByOrgIdAndCode(userId, "ReceiveRed");
                            int         msgCount = 0;
                            foreach (Guid id in userIds)
                            {
                                SendMessage(redEnvelope.Id, redEnvelope.AppId, id, DateTime.Now.AddHours(dueMessDateAdd), contentCDTO);
                                //最多选择20个代领者
                                msgCount += 1;
                                if (msgCount > 20)
                                {
                                    break;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            LogHelper.Error("发送红包Job服务异常:EBC.ISV.Facade.OrganizationQueryFacade。", ex);

                            continue;
                        }
                    }
                    else
                    {
                        SendMessage(redEnvelope.Id, redEnvelope.AppId, redEnvelope.UserId, DateTime.Now.AddHours(dueMessDateAdd), contentCDTO);
                    }

                    session.SaveObject(redEnvelope);
                }

                try
                {
                    session.SaveChanges();
                    if (userDividents.Count < pageSize)
                    {
                        isContinue = false;
                    }
                    LogHelper.Info(string.Format("发送红包Job处理了ShareDividendDetail表{0}条记录", userDividents.Count));
                }
                catch (Exception ex)
                {
                    LogHelper.Error("发送红包Job服务异常。", ex);
                    isContinue = false;
                }
            }while (isContinue);
        }