コード例 #1
0
        /// <summary>
        /// 根据指定的短信发送统计编号获取发送号码列表
        /// </summary>
        /// <param name="totalId">短信发送统计编号</param>
        /// <param name="companyId">公司编号</param>
        /// <param name="sendStatus">发送状态 0:所有 1:成功 2:失败</param>
        /// <returns></returns>
        public virtual IList <EyouSoft.Model.SMSStructure.SendDetailInfo> GetSendDetails(string totalId, string companyId, int sendStatus)
        {
            IList <EyouSoft.Model.SMSStructure.SendDetailInfo> sendDetails = new List <EyouSoft.Model.SMSStructure.SendDetailInfo>();
            StringBuilder cmdText = new StringBuilder();

            cmdText.Append(" SELECT [ID], [CompanyID], [UserID],[MobileNumber],[ReturnResult],[IsEncrypt] FROM  [SMS_SendDetail] WHERE [CompanyId]=@COMPANYID AND [SendTotalID]=@SENDTOTALID ");

            switch (sendStatus)
            {
            case 0:
                cmdText.AppendFormat(" AND(ReturnResult>{0})  ", SendTimeOutEventCode);
                break;

            case 1:
                cmdText.Append(" AND(ReturnResult=0) ");
                break;

            case 2:
                cmdText.AppendFormat(" AND(ReturnResult>{0}) AND (ReturnResult<0) ", SendTimeOutEventCode);
                break;

            default:
                cmdText.AppendFormat(" AND(ReturnResult>{0})  ", SendTimeOutEventCode);
                break;
            }

            DbCommand cmd = base.SMSStore.GetSqlStringCommand(cmdText.ToString());

            base.SMSStore.AddInParameter(cmd, "COMPANYID", DbType.AnsiStringFixedLength, companyId);
            base.SMSStore.AddInParameter(cmd, "SENDTOTALID", DbType.AnsiStringFixedLength, totalId);


            using (IDataReader rdr = DbHelper.ExecuteReader(cmd, base.SMSStore))
            {
                while (rdr.Read())
                {
                    EyouSoft.Model.SMSStructure.SendDetailInfo sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetailInfo();

                    sendDetailInfo.SendId       = rdr.GetString(rdr.GetOrdinal("ID"));
                    sendDetailInfo.CompanyId    = rdr.GetString(rdr.GetOrdinal("CompanyID"));
                    sendDetailInfo.UserId       = rdr.GetString(rdr.GetOrdinal("UserID"));
                    sendDetailInfo.Mobile       = rdr["MobileNumber"].ToString();
                    sendDetailInfo.ReturnResult = rdr.GetInt32(rdr.GetOrdinal("ReturnResult"));
                    sendDetailInfo.IsEncrypt    = rdr.GetString(rdr.GetOrdinal("IsEncrypt")) == "1" ? true : false;

                    sendDetails.Add(sendDetailInfo);
                }
            }

            return(sendDetails);
        }
コード例 #2
0
        /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="sendMessageInfo">发送短信提交的业务实体</param>
        /// <returns></returns>
        public EyouSoft.Model.SMSStructure.SendResultInfo Send(EyouSoft.Model.SMSStructure.SendMessageInfo sendMessageInfo)
        {
            #region 发送短信验证
            //发送短信验证
            EyouSoft.Model.SMSStructure.SendResultInfo validateResultInfo = this.ValidateSend(sendMessageInfo);

            if (!validateResultInfo.IsSucceed)
            {
                return(validateResultInfo);
            }
            #endregion

            #region 定时发送任务处理
            //定时发送任务处理
            if (sendMessageInfo.SendType == EyouSoft.Model.SMSStructure.SendType.定时发送)
            {
                EyouSoft.Model.SMSStructure.SendPlanInfo plan = new EyouSoft.Model.SMSStructure.SendPlanInfo();

                plan.CompanyId   = sendMessageInfo.CompanyId;
                plan.CompanyName = sendMessageInfo.CompanyName;
                plan.ContactName = sendMessageInfo.UserFullName;
                plan.IssueTime   = DateTime.Now;
                plan.Mobiles     = sendMessageInfo.Mobiles;
                plan.PlanId      = Guid.NewGuid().ToString();
                plan.SendChannel = sendMessageInfo.SendChannel;
                plan.SendTime    = sendMessageInfo.SendTime;
                plan.SMSContent  = sendMessageInfo.SMSContent;
                plan.SMSType     = sendMessageInfo.SMSType;
                plan.UserId      = sendMessageInfo.UserId;

                if (dal.InsertSendPlan(plan))
                {
                    validateResultInfo.IsSucceed = true;
                }
                else
                {
                    validateResultInfo.IsSucceed    = false;
                    validateResultInfo.ErrorMessage = "写入定时发送计划任务时发生了错误。";
                }

                return(validateResultInfo);
            }
            #endregion

            #region 发送短信处理
            validateResultInfo.TempFeeTakeId = Guid.NewGuid().ToString();
            validateResultInfo.SendTotalId   = Guid.NewGuid().ToString();
            validateResultInfo.SuccessCount
                    = validateResultInfo.ErrorCount
                    = validateResultInfo.TimeoutCount
                    = 0;

            #region 扣除账户金额
            //扣除账户金额
            bool deductAccountMoneyResult = EyouSoft.BLL.SMSStructure.Account.CreateInstance().DeductAccountMoney(sendMessageInfo.CompanyId, sendMessageInfo.UserId, validateResultInfo.CountFee, 0, validateResultInfo.TempFeeTakeId, validateResultInfo.SendTotalId);

            if (!deductAccountMoneyResult)
            {
                validateResultInfo.IsSucceed    = false;
                validateResultInfo.ErrorMessage = "扣除账户金额时产生了错误,请重试";

                return(validateResultInfo);
            }
            #endregion

            IList <EyouSoft.Model.SMSStructure.SendDetailInfo> sendDetails = new List <EyouSoft.Model.SMSStructure.SendDetailInfo>();

            //发送[移动、联通]内容实际计算费用短信条数
            int mobielFactCount = this.GetSmsTotalCount(sendMessageInfo.SMSContentSendComplete, EyouSoft.Model.SMSStructure.SMSNoType.Mobiel, sendMessageInfo.SendChannel);
            //发送[小灵通]内容实际计算费用短信条数
            int phsFactCount = this.GetSmsTotalCount(sendMessageInfo.SMSContentSendComplete, EyouSoft.Model.SMSStructure.SMSNoType.PHS, sendMessageInfo.SendChannel);

            #region 调用发送短信接口
            //每次调用发送接口时待发送的手机号码
            StringBuilder waitMobiles = new StringBuilder();
            //每次调用发送接口时的最大发送号码个数
            int waitCanMobilesMax = 100;
            //总的要发送的手机号码个数
            int waitMobileLength = sendMessageInfo.Mobiles.Count;
            int indexStart       = 0;
            for (int indexC = 0; indexC < waitMobileLength; indexC++)
            {
                EyouSoft.Model.SMSStructure.SendDetailInfo   sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetailInfo();
                EyouSoft.Model.SMSStructure.AcceptMobileInfo mobile         = sendMessageInfo.Mobiles[indexC];

                sendDetailInfo.SendId    = Guid.NewGuid().ToString();
                sendDetailInfo.Mobile    = mobile.Mobile;
                sendDetailInfo.IsPHS     = this.IsPHS(mobile.Mobile);
                sendDetailInfo.IsEncrypt = mobile.IsEncrypt;

                if (!sendDetailInfo.IsPHS)
                {
                    sendDetailInfo.FactCount = mobielFactCount;
                }
                else
                {
                    sendDetailInfo.FactCount = phsFactCount;
                }

                //添加到集合中
                sendDetails.Add(sendDetailInfo);


                waitMobiles.AppendFormat("{0},", mobile.Mobile);


                #region 判断是否开始发送短信
                if ((indexC + 1) % waitCanMobilesMax == 0 || (indexC + 1) == waitMobileLength)
                {
                    int    sendResult = 0;
                    string sendMsg    = "";


                    try
                    {
                        string sendMessageContent = sendMessageInfo.SMSContentSendComplete;

                        //发送结果返回值 返回int类型的0时成功 返回对应的负数时失败
                        sendResult = sms.SendSms(this.EnterpriseId, waitMobiles.ToString().TrimEnd(",".ToCharArray()), sendMessageInfo.SMSContentSendComplete, sendMessageInfo.SendChannel.UserName, sendMessageInfo.SendChannel.Pw);
                        sendMsg    = this.GetServicesState(sendResult);
                    }
                    catch
                    {
                        sendMsg    = "超时";
                        sendResult = this.SendTimeOutEventCode;
                    }

                    //要发送的号码清空
                    waitMobiles.Remove(0, waitMobiles.Length);

                    #region 处理发送后的结果(处理当次在批量发送内的所有号码)
                    for (int j = indexStart; j <= indexC; j++)
                    {
                        sendDetails[j].ReturnMsg    = sendMsg;
                        sendDetails[j].ReturnResult = sendResult;

                        if (!sendDetails[j].IsPHS)
                        {
                            if (sendResult == this.SendTimeOutEventCode)
                            {
                                validateResultInfo.TimeoutCount = validateResultInfo.TimeoutCount + 1;
                            }
                            else if (sendResult == 0)
                            {
                                validateResultInfo.SuccessCount = validateResultInfo.SuccessCount + 1;
                            }
                            else
                            {
                                validateResultInfo.ErrorCount = validateResultInfo.ErrorCount + 1;
                            }
                        }
                        else
                        {
                            if (sendResult == this.SendTimeOutEventCode)
                            {
                                validateResultInfo.PHSTimeoutCount = validateResultInfo.PHSTimeoutCount + 1;
                            }
                            else if (sendResult == 0)
                            {
                                validateResultInfo.PHSSuccessCount = validateResultInfo.PHSSuccessCount + 1;
                            }
                            else
                            {
                                validateResultInfo.PHSErrorCount = validateResultInfo.PHSErrorCount + 1;
                            }
                        }
                    }
                    #endregion 处理发送后的结果

                    //记录下一批的开始索引号
                    indexStart = indexC + 1;
                }
                #endregion 判断是否开始发送短信
            }

            #endregion

            //写入短信发送明细及统计信息,同时更新账户余额
            dal.InsertSendInfo(sendMessageInfo, sendDetails, validateResultInfo);

            //计算发送短信后实际扣除的消费金额(预扣除金额-发送超时的手机或者小灵通短信条数*1个短信的实际条数*单价)
            validateResultInfo.SendFee = validateResultInfo.CountFee - 0.01M * validateResultInfo.TimeoutCount * validateResultInfo.FactCount * sendMessageInfo.SendChannel.PriceOne - 0.01M * validateResultInfo.PHSTimeoutCount * validateResultInfo.PHSFactCount * sendMessageInfo.SendChannel.PriceOne;
            #endregion

            return(validateResultInfo);
        }
コード例 #3
0
        /// <summary>
        /// 根据指定条件获取所有发送短信历史记录
        /// </summary>
        /// <param name="companyId">公司编号</param>
        /// <param name="keyword">关键字 为空时不做为查询条件</param>
        /// <param name="sendStatus">发送状态 0:所有 1:成功 2:失败</param>
        /// <param name="startTime">发送开始时间 为空时不做为查询条件</param>
        /// <param name="finishTime">发送截止时间 为空时不做为查询条件</param>
        /// <returns></returns>
        public virtual IList <EyouSoft.Model.SMSStructure.SendDetailInfo> GetAllSendHistorys(string companyId, string keyword, int sendStatus, DateTime?startTime, DateTime?finishTime)
        {
            IList <EyouSoft.Model.SMSStructure.SendDetailInfo> sendHistorys = new List <EyouSoft.Model.SMSStructure.SendDetailInfo>();

            StringBuilder cmdText = new StringBuilder();

            cmdText.Append("SELECT  ID, CompanyID, UserID, SendTotalID, SMSType, MobileNumber, SMSContent, SendTime, ReturnResult, ReturnMsg, UseMoeny, SMSSplitCount,  IssueTime,IsEncrypt FROM SMS_SendDetail ");
            cmdText.Append(" WHERE CompanyID=@CompanyId ");

            if (!string.IsNullOrEmpty(keyword))
            {
                cmdText.AppendFormat(" AND (SMSContent LIKE '%{0}%') ", keyword);
            }

            switch (sendStatus)
            {
            case 0:
                cmdText.AppendFormat(" AND(ReturnResult>{0}) ", SendTimeOutEventCode);
                break;

            case 1:
                cmdText.Append(" AND(ReturnResult=0) ");
                break;

            case 2:
                cmdText.AppendFormat(" AND(ReturnResult>{0}) AND (ReturnResult<0) ", SendTimeOutEventCode);
                break;

            default:
                cmdText.AppendFormat(" AND(ReturnResult>{0}) ", SendTimeOutEventCode);
                break;
            }

            if (startTime.HasValue)
            {
                cmdText.AppendFormat(" AND(SendTime>='{0}') ", startTime.Value);
            }

            if (finishTime.HasValue)
            {
                cmdText.AppendFormat(" AND(SendTime<'{0}') ", finishTime.Value);
            }

            cmdText.Append(" ORDER BY IssueTime DESC ");

            DbCommand cmd = base.SMSStore.GetSqlStringCommand(cmdText.ToString());

            base.SMSStore.AddInParameter(cmd, "CompanyId", DbType.String, companyId);

            using (IDataReader rdr = DbHelper.ExecuteReader(cmd, base.SMSStore))
            {
                while (rdr.Read())
                {
                    EyouSoft.Model.SMSStructure.SendDetailInfo sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetailInfo();

                    sendDetailInfo.SendId       = rdr.GetString(rdr.GetOrdinal("ID"));
                    sendDetailInfo.CompanyId    = rdr.GetString(rdr.GetOrdinal("CompanyID"));
                    sendDetailInfo.UserId       = rdr.GetString(rdr.GetOrdinal("UserID"));
                    sendDetailInfo.SendTotalId  = rdr.GetString(rdr.GetOrdinal("SendTotalID"));
                    sendDetailInfo.SMSType      = rdr.GetInt32(rdr.GetOrdinal("SMSType"));
                    sendDetailInfo.Mobile       = rdr["MobileNumber"].ToString();
                    sendDetailInfo.SMSContent   = rdr["SMSContent"].ToString();
                    sendDetailInfo.SendTime     = rdr.GetDateTime(rdr.GetOrdinal("SendTime"));
                    sendDetailInfo.ReturnResult = rdr.GetInt32(rdr.GetOrdinal("ReturnResult"));
                    sendDetailInfo.ReturnMsg    = rdr["ReturnMsg"].ToString();
                    sendDetailInfo.UseMoeny     = rdr.GetDecimal(rdr.GetOrdinal("UseMoeny"));
                    sendDetailInfo.IssueTime    = rdr.GetDateTime(rdr.GetOrdinal("IssueTime"));
                    sendDetailInfo.IsEncrypt    = rdr.GetString(rdr.GetOrdinal("IsEncrypt")) == "1" ? true : false;

                    sendHistorys.Add(sendDetailInfo);
                }
            }

            return(sendHistorys);
        }
コード例 #4
0
        /// <summary>
        /// 根据指定条件获取发送短信历史记录
        /// </summary>
        /// <param name="pageSize">每页记录数</param>
        /// <param name="pageIndex">当前页索引</param>
        /// <param name="recordCount">总记录数</param>
        /// <param name="companyId">公司编号</param>
        /// <param name="keyword">关键字 为空时不做为查询条件</param>
        /// <param name="sendStatus">发送状态 0:所有 1:成功 2:失败</param>
        /// <param name="startTime">发送开始时间 为空时不做为查询条件</param>
        /// <param name="finishTime">发送截止时间 为空时不做为查询条件</param>
        /// <returns></returns>
        public virtual IList <EyouSoft.Model.SMSStructure.SendDetailInfo> GetSendHistorys(int pageSize, int pageIndex, ref int recordCount, string companyId, string keyword, int sendStatus, DateTime?startTime, DateTime?finishTime)
        {
            IList <EyouSoft.Model.SMSStructure.SendDetailInfo> sendHistorys = new List <EyouSoft.Model.SMSStructure.SendDetailInfo>();

            StringBuilder cmdQuery      = new StringBuilder();
            string        tableName     = "SMS_SendDetail";
            string        primaryKey    = "Id";
            string        orderByString = "IssueTime DESC";
            string        fields        = " ID, CompanyID, UserID, SendTotalID, SMSType, MobileNumber, SMSContent, SendTime, ReturnResult, ReturnMsg, UseMoeny, SMSSplitCount,  IssueTime,IsEncrypt";

            cmdQuery.AppendFormat(" CompanyID='{0}' ", companyId.ToString());

            if (!string.IsNullOrEmpty(keyword))
            {
                cmdQuery.AppendFormat(" AND (SMSContent LIKE '%{0}%') ", keyword);
            }

            switch (sendStatus)
            {
            case 0:
                cmdQuery.AppendFormat(" AND(ReturnResult>{0}) ", SendTimeOutEventCode);
                break;

            case 1:
                cmdQuery.Append(" AND(ReturnResult=0) ");
                break;

            case 2:
                cmdQuery.AppendFormat(" AND(ReturnResult>{0}) AND (ReturnResult<0) ", SendTimeOutEventCode);
                break;

            default:
                cmdQuery.AppendFormat(" AND(ReturnResult>{0})  ", SendTimeOutEventCode);
                break;
            }

            if (startTime.HasValue)
            {
                cmdQuery.AppendFormat(" AND(SendTime>='{0}') ", startTime.Value);
            }

            if (finishTime.HasValue)
            {
                cmdQuery.AppendFormat(" AND(SendTime<'{0}') ", finishTime.Value);
            }

            using (IDataReader rdr = DbHelper.ExecuteReader(base.SMSStore, pageSize, pageIndex, ref recordCount, tableName, primaryKey, fields, cmdQuery.ToString(), orderByString))
            {
                while (rdr.Read())
                {
                    EyouSoft.Model.SMSStructure.SendDetailInfo sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetailInfo();

                    sendDetailInfo.SendId       = rdr.GetString(rdr.GetOrdinal("ID"));
                    sendDetailInfo.CompanyId    = rdr.GetString(rdr.GetOrdinal("CompanyID"));
                    sendDetailInfo.UserId       = rdr.GetString(rdr.GetOrdinal("UserID"));
                    sendDetailInfo.SendTotalId  = rdr.GetString(rdr.GetOrdinal("SendTotalID"));
                    sendDetailInfo.SMSType      = rdr.GetInt32(rdr.GetOrdinal("SMSType"));
                    sendDetailInfo.Mobile       = rdr["MobileNumber"].ToString();
                    sendDetailInfo.SMSContent   = rdr["SMSContent"].ToString();
                    sendDetailInfo.SendTime     = rdr.GetDateTime(rdr.GetOrdinal("SendTime"));
                    sendDetailInfo.ReturnResult = rdr.GetInt32(rdr.GetOrdinal("ReturnResult"));
                    sendDetailInfo.ReturnMsg    = rdr["ReturnMsg"].ToString();
                    sendDetailInfo.UseMoeny     = rdr.GetDecimal(rdr.GetOrdinal("UseMoeny"));
                    sendDetailInfo.IssueTime    = rdr.GetDateTime(rdr.GetOrdinal("IssueTime"));
                    sendDetailInfo.IsEncrypt    = rdr.GetString(rdr.GetOrdinal("IsEncrypt")) == "1" ? true : false;

                    sendHistorys.Add(sendDetailInfo);
                }
            }

            return(sendHistorys);
        }