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