Esempio n. 1
0
        /// <summary>
        /// 根据指定的短信发送统计编号获取发送号码列表
        /// </summary>
        /// <param name="totalId">短信发送统计编号</param>
        /// <param name="companyId">公司编号</param>
        /// <param name="sendStatus">发送状态 0:所有 1:成功 2:失败</param>
        /// <returns></returns>
        public IList <EyouSoft.Model.SMSStructure.SendDetail> GetSendDetails(string totalId, string companyId, int sendStatus)
        {
            IList <EyouSoft.Model.SMSStructure.SendDetail> sendDetails = new List <EyouSoft.Model.SMSStructure.SendDetail>();
            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 = this._db.GetSqlStringCommand(cmdText.ToString());

            this._db.AddInParameter(cmd, "COMPANYID", DbType.AnsiStringFixedLength, companyId);
            this._db.AddInParameter(cmd, "SENDTOTALID", DbType.AnsiStringFixedLength, totalId);


            using (IDataReader rdr = EyouSoft.Toolkit.DAL.DbHelper.ExecuteReader(cmd, this._db))
            {
                while (rdr.Read())
                {
                    EyouSoft.Model.SMSStructure.SendDetail sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetail();

                    sendDetailInfo.ID           = rdr.GetString(rdr.GetOrdinal("ID"));
                    sendDetailInfo.CompanyID    = rdr.GetInt32(rdr.GetOrdinal("CompanyID"));
                    sendDetailInfo.UserID       = rdr.GetInt32(rdr.GetOrdinal("UserID"));
                    sendDetailInfo.MobileNumber = 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);
        }
Esempio n. 2
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 IList <EyouSoft.Model.SMSStructure.SendDetail> GetSendHistorys(int pageSize, int pageIndex, ref int recordCount, string companyId, string keyword, int sendStatus, DateTime?startTime, DateTime?finishTime)
        {
            IList <EyouSoft.Model.SMSStructure.SendDetail> sendHistorys = new List <EyouSoft.Model.SMSStructure.SendDetail>();

            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";

            #region 查询条件

            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);
            }

            #endregion

            using (IDataReader rdr = EyouSoft.Toolkit.DAL.DbHelper.ExecuteReader(this._db, pageSize, pageIndex, ref recordCount, tableName, primaryKey, fields, cmdQuery.ToString(), orderByString))
            {
                while (rdr.Read())
                {
                    EyouSoft.Model.SMSStructure.SendDetail sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetail();

                    sendDetailInfo.ID           = rdr.GetString(rdr.GetOrdinal("ID"));
                    sendDetailInfo.CompanyID    = rdr.GetInt32(rdr.GetOrdinal("CompanyID"));
                    sendDetailInfo.UserID       = rdr.GetInt32(rdr.GetOrdinal("UserID"));
                    sendDetailInfo.SendTotalID  = rdr.GetString(rdr.GetOrdinal("SendTotalID"));
                    sendDetailInfo.SMSType      = rdr.GetInt32(rdr.GetOrdinal("SMSType"));
                    sendDetailInfo.MobileNumber = 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;
                    sendDetailInfo.SMSContent   = rdr.IsDBNull(rdr.GetOrdinal("SMSContent")) ? "" : rdr.GetString(rdr.GetOrdinal("SMSContent"));

                    sendHistorys.Add(sendDetailInfo);
                }
            }

            return(sendHistorys);
        }
Esempio n. 3
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 = DalAccount.DeductAccountMoney(sendMessageInfo.CompanyId, sendMessageInfo.UserId.ToString(), validateResultInfo.CountFee, 0, validateResultInfo.TempFeeTakeId, validateResultInfo.SendTotalId);

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

                return(validateResultInfo);
            }
            #endregion

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

            //发送[移动、联通]内容实际计算费用短信条数
            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.SendDetail       sendDetailInfo = new EyouSoft.Model.SMSStructure.SendDetail();
                EyouSoft.Model.SMSStructure.AcceptMobileInfo mobile         = sendMessageInfo.Mobiles[indexC];

                sendDetailInfo.ID           = Guid.NewGuid().ToString();
                sendDetailInfo.MobileNumber = 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;

                        sms.Timeout = 1000;
                        //发送结果返回值 返回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);
        }