/// <summary> /// 执行发送作业(延时或立刻) /// 需要先注册发送方法 /// </summary> /// <param name="model">发送对象</param> /// <param name="response">响应</param> public void JobsRun(PMS.Model.CombineModel.SendAndMessage_Model model, out SMSModel_Receive receive) { receive = new SMSModel_Receive(); if (DoSendJobs != null) { DoSendJobs(model,out receive); } else { //response = new PMS.Model.Message.BaseResponse() { Message = "未绑定方法", Success = false }; } }
public bool SendMsg(SMSModel_Send smsdata, out SMSModel_Receive receiveModel) { String _data = null;//XML文本 String _serverURL = "http://wt.3tong.net/http/sms/Submit";//服务器地址 string returnMsg; //1 判断参数是否足够 if (!SendBeforeCheck(smsdata)) { receiveModel = new SMSModel_Receive() { desc = "参数不全", msgid = smsdata.msgid, failPhones = smsdata.phones, result = SMSDictionary.GetResponseCode()[101] }; return false; } _data = ObjTransform.Model2Xml_FormatSend(smsdata); //2.1 http方式发送 returnMsg = httpInvoke(_serverURL, _data); //解析服务器反馈信息 if (returnMsg.Length < 1) { returnMsg = "未收到服务器返回信息"; receiveModel = new SMSModel_Receive() { desc = returnMsg, msgid = smsdata.msgid, failPhones = smsdata.phones, result = SMSDictionary.GetResponseCode()[101] }; return false; } //2.2 将接收到的短信发送回执转换为对象 receiveModel = ObjTransform.Xml2Model_ReceiveMsg(returnMsg); //等待信息发送完成后 //System.Threading.Thread.Sleep(10000);//10秒 ////自动重发 //vipResend(); return true; }
/// <summary> /// 立刻发送 /// </summary> /// <param name="msg"></param> /// <returns></returns> public bool SendMsgbyNow(PMS.Model.CombineModel.SendAndMessage_Model model, out SMSModel_Receive receiveModel) { //SMSModel_Receive receiveModel = new SMSModel_Receive(); ServiceReference_SMSService.SMSServiceClient client = new ServiceReference_SMSService.SMSServiceClient(); //重新梳理并做抽象 #region 11-14 在控制器中已经调用这些方法(现写在控制器中),此处与控制器重复,注释掉 ////1 根据选定的群组及部门获取相应的联系人 //var list_PersonPhonesByGroupAndDepartment = GetFinalPersonPhoneList(model.Model_Message, GetPersonListByGroupDepartment); ////2 获取临时联系人电话集合 //var list_tempPersonPhones = AddAndGetTempPersons(model.Model_Message, personBLL, groupBLL); ////2.2 获取最终的联系人电话集合 //list_PersonPhonesByGroupAndDepartment.AddRange(list_tempPersonPhones); //var list_phones = list_PersonPhonesByGroupAndDepartment; ////3 转成发送对象 //var sendMsg = ToSendModel(model.Model_Message, list_phones); /*步骤四 生成提交对象及短信及作业对象 由SMSFactory进行短信提交操作(并选择延时/立刻发送) */ //4 短信发送 //注意:desc:定时时间格式错误; // result:定时时间格式错误 //PMS.Model.CombineModel.SendAndMessage_Model sendandMsgModel = new PMS.Model.CombineModel.SendAndMessage_Model() { Model_Message = model, Model_Send = sendMsg }; //model.Model_Send = sendMsg; #endregion // SMSModel_Receive receive = new SMSModel_Receive(); PMS.Model.Message.BaseResponse response = new PMS.Model.Message.BaseResponse(); client.SendMsg(model.Model_Send, out receiveModel); //receiveModel = new SMSModel_Receive() { msgid = "210cb72fe038484fb2952d0db96e0ae7", desc = "提交成功", result = "0", failPhones = new string[] { "" } }; //发送之后执行将发送记录写会数据库的操作 this.AfterSend(model.Model_Message, receiveModel, model.Model_Send.phones.ToList(), this.redis_list_id, this.Interval_OverTime); //SendMsg(model, out response); return true; }
/// <summary> /// 延时发送 /// </summary> /// <param name="msg"></param> /// <returns></returns> public bool SendMsgbyDelayed(PMS.Model.CombineModel.SendAndMessage_Model model,out SMSModel_Receive response) { //response = new PMS.Model.Message.BaseResponse(); //1 创建quartz父类客户端 // 不使用服务因为此处需要通过反射的方式创建作业实例 //Quartz_Service.JobServiceClient client = new Quartz_Service.JobServiceClient(); //ServiceReference_QuartzService.JobServiceClient client = new ServiceReference_QuartzService.JobServiceClient(); QuartzJobFactory.IJobService client = new QuartzJobFactory.JobService(); //2 创建发送作业实例(非模板) /*此处需要实现: 1)向数据库写入创建的新的作业实例 2)创建该作业实例的关联表 */ //var jobTemplateInstance= jobTemplateBLL.GetListBy(t => t.JTID == 3); //jobInfoBLL.Create(new J_JobInfo() { JobName = "发送作业", JobClassName = "SendJob", NextRunTime=model.Model_Message.NextRunTime }); //找到对应的作业模板(发送作业模板) //2.1 查找当前用户 var user_current= userInfoBLL.GetListBy(u =>u.ID== model.Model_Message.UID).FirstOrDefault(); //2.2 根据当前用户找到指定类型(jobType)的作业模板 var jobTemplate_target = (from t in user_current.J_JobTemplate where t.JobType == Convert.ToInt32(PMS.Model.Enum.JobType_Enum.sendJob) select t).FirstOrDefault(); //2.3 根据作业模板创建作业实例 // 调用J_JobInfoBLL中的AddJobInfo方法创建作业实例 J_JobInfo jobInstance = new J_JobInfo() { UID = model.Model_Message.UID, CreateTime = DateTime.Now, EndRunTime = model.Model_Message.EndRunTime == DateTime.MinValue ? model.Model_Message.StartRunTime : model.Model_Message.EndRunTime,//此处加入判断,若EndRunTime时间为1/1/1/1这种情况先将起始时间赋给他 NextRunTime = model.Model_Message.NextRunTime == DateTime.MinValue ? model.Model_Message.StartRunTime : model.Model_Message.NextRunTime, StartRunTime = model.Model_Message.StartRunTime, JobClassName = jobTemplate_target.JobClassName, JobName = jobTemplate_target.JTName, JobGroup = jobTemplate_target.JobGroup }; //执行以下操作 //var jobInstance = jobInfoBLL.GetListBy(j => j.JID == 27).FirstOrDefault(); //3 创建JobData var jobData = new PMS.Model.JobDataModel.SendJobDataModel() { //4 将前台传入的model值赋给JobData中的JobValue JobDataValue=new PMS.Model.CombineModel.SendAndMessage_Model() { Model_Send=new SMSModel_Send() { account = model.Model_Send.account, content = model.Model_Send.content, msgid = model.Model_Send.msgid, password = model.Model_Send.password, phones = model.Model_Send.phones, sendtime = model.Model_Send.sendtime, subcode = model.Model_Send.subcode }, Model_Message =new PMS.Model.ViewModel.ViewModel_Message() { UID = model.Model_Message.UID, Content=model.Model_Send.content, SMSMissionID=model.Model_Message.SMSMissionID } } //JobDataValue = new PMS.Model.SMSModel.SMSModel_Send() //{ // account = model.Model_Send.account, // content = model.Model_Send.content, // msgid = model.Model_Send.msgid, // password = model.Model_Send.password, // phones = model.Model_Send.phones, // sendtime = model.Model_Send.sendtime, // subcode = model.Model_Send.subcode //} }; //5 将发送作业实例添加至计划任务中 //注意此作业实例中需要含UID jobInfoBLL.AddJobInfo(jobInstance, jobData); //**** 11-16 创建jobInfo与其他的关联(以便在作业管理页面中显示) //在job的bll层中创建作业(同时写入数据库,并添加至调度池中) /*var response=*/ //12-6 //统一写在JobInfoBLL层中的AddJobInfo方法中 //QuartzProxy.QuartzServiceFacade quartzService = new QuartzProxy.QuartzServiceFacade(new QuartzProxy.QuartzServiceClientProxy()); //var response_base= quartzService.AddScheduleJob(jobInstance, jobData); //client.AddScheduleJob(jobInstance, jobData); response = new SMSModel_Receive() { result="0"}; return true; }
/// <summary> /// 短信发送 /// </summary> /// <param name="smsdata"></param> /// <returns></returns> public bool SendMsg(PMS.Model.CombineModel.SendAndMessage_Model model, out /*PMS.Model.Message.BaseResponse response*/SMSModel_Receive receive) { SendJobManagement jobManagement = new SendJobManagement(); //判断是否开启定时发送功能 if (model.Model_Message.isTiming) { //绑定定时发送功能 //使用作业调度 jobManagement.DoSendJobs += SendMsgbyDelayed; } else { //绑定立刻发送功能 jobManagement.DoSendJobs += SendMsgbyNow; } //不管具体绑定的是哪个方法,调用该发送方法 //SMSModel_Receive receive = new SMSModel_Receive(); jobManagement.JobsRun(model,out receive); //response = new PMS.Model.Message.BaseResponse() { Success = true }; return false; }
/// <summary> /// 在发送短信之后执行 /// 步骤五: /// 创建短信内容至数据库 /// 创建发送记录至数据库 /// (此处应放在SMSFactory.SendMsg或写在JobInstance中的SendJob.Exceuted) /// </summary> /// <param name="model"></param> /// <param name="receive"></param> /// <param name="list_phones"></param> /// <param name="redis_list_id">redis中保存的list的key</param> /// <param name="redis_expirationDate">redis中保存集合的过期时间(默认72小时)</param> /// <returns></returns> public bool AfterSend(PMS.Model.ViewModel.ViewModel_Message model, SMSModel_Receive receive, List<string> list_phones,string redis_list_id,int redis_expirationDate=72) { //5 将发送的短信以及提交响应存入SMSContent var mid = model.SMSMissionID; var uid = model.UID; bool isSaveMsgOk = smsContentBLL.SaveMsg(receive, model.Content, mid, uid); //在current表中存入发送信息,在query之前,表中的StatusCode默认为98,DescContent默认为"暂时未收到查询回执" //7月28日 注意此处已修改方法为:CreateReceieveMsg!!! if (!smsRecord_CurrentBLL.CreateReceieveMsg(receive.msgid, list_phones)) { return false; } /*步骤六: 写入redis缓存中 (此处应放在SMSFactory.SendMsg中或写在JobInstance中的SendJob.Exceuted) */ ListReidsHelper<PMS.Model.QueryModel.Redis_SMSContent> redisListhelper = new ListReidsHelper<PMS.Model.QueryModel.Redis_SMSContent>(redis_list_id); StringRedisHelper redisStrhelper = new StringRedisHelper(); redisStrhelper.Set(receive.msgid, "1", DateTime.Now.AddMinutes(redis_expirationDate)); return true; }
/// <summary> /// 将返回结果的xml字符串解析为实体对象 /// </summary> /// <param name="result">返回结果的xml字符串</param> /// <returns></returns> public static SMSModel_Receive Xml2Model_ReceiveMsg(string result) { //将xml解析 var msgid = Xml2StrHelper.Xml2Str(result, "response/msgid"); var smsresult = Xml2StrHelper.Xml2Str(result, "response/result"); var desc = Xml2StrHelper.Xml2Str(result, "response/desc"); var blacklist = Xml2StrHelper.Xml2Str(result, "response/blacklist"); //6月1日新增 var resultCode = SMSDictionary.GetResponseCode().Where(d=>d.Value==smsresult).Select(d=>d.Key).FirstOrDefault(); SMSModel_Receive model_receive = new SMSModel_Receive() { msgid = msgid, result =resultCode.ToString(), desc = desc, failPhones = blacklist.Split(',') }; return model_receive; }
private bool DoSendNow(PMS.Model.CombineModel.SendAndMessage_Model model,out SMSModel_Receive receive) { //重新梳理并做抽象 #region 暂时注释掉 ///*步骤一: // 获取传入的群组及部门获取对应联系人 // 获取要删除的联系人id // 从联系人集合中去除要删除的联系人获得最终要发送的联系人 //*/ ////1.1 获取要去除的 联系人id 数组 //var ids = model.PersonId_Int; //int count = 0; //string dids_str = null; //string gids_str = null; //if (model.GroupIds == null) //{ // gids_str = ""; //} //if (model.DepartmentIds == null) //{ // dids_str = ""; //} //if (model.GroupIds != null) //{ // foreach (var item in model.GroupIds) // { // gids_str += item.ToString() + ","; // } //} //if (model.DepartmentIds != null) //{ // foreach (var item in model.DepartmentIds) // { // dids_str += item.ToString() + ","; // } //} ////1.3 根据传入的群组及部门id获取对应的联系人 //var list_person = GetPersonListByGroupDepartment(dids_str, gids_str, out count); ////2.1 去除不需要的联系人,获得最终联系人集合 //list_person = (from p in list_person // where !ids.Contains(p.PID) // select p).ToList(); ////2.2 获取联系人集合中的电话生成电话集合 //List<string> list_phones = new List<string>(); //list_person.ForEach(p => list_phones.Add(p.PhoneNum.ToString())); ///*步骤二: // 获取添加的临时联系人 // 向数据库中写入这些临时联系人 //*/ ////1.2 获取临时联系人的电话数组 //var phoneNums = model.PhoneNum_Str; ////1.3 调用personBLL中的添加联系人方法,将临时联系人写入数据库(qu) //string PName_Temp = "临时联系人"; ////1.4 目前默认只添加到全部联系人群组中 //int groupID_AllContacts = groupBLL.GetListBy(a => a.GroupName.Equals("全部联系人")).FirstOrDefault().GID; //List<int> groupIds = new List<int>(); //groupIds.Add(groupID_AllContacts); ////1.5 循环写入数据库 //bool isSaveTempPersonOk = false; //if (phoneNums != null && phoneNums.Length != 0) //{ // foreach (var item in phoneNums) // { // //1.6 判断输入的联系人在是否存在在数据库中 // if (!personBLL.AddValidation(item)) // { // //1.7 不存在在数据库中,则将临时联系人添加进数据库 // isSaveTempPersonOk = personBLL.DoAddTempPerson(PName_Temp, item, true, groupIds); // if (!isSaveTempPersonOk) // { // return false; // } // } // //1.7 存在在数据库中,且已经在发送列表中,这种情况需讨论 // } // list_phones.AddRange(phoneNums.ToList()); //} ///*步骤三 // 获取短信内容 // 封装要提交至联通接口的发送对象 // (含联系人电话号码) //*/ ////2 获取短信内容 //var content = model.Content; ////2.1 设置发送对象相关参数 //string subCode = "";//短信子码"74431",接收回馈信息用 //string sign = "【国家海洋预报台】"; //短信签名,!仅在!发送短信时用= "【国家海洋预报台】"; // //短信发送与查询所需参数 //string smsContent = content;//短信内容 //string sendTime;//计划发送时间,为空则立即发送 // //3 对短信内容进行校验——先暂时不做 ////6月27日新增将List电话集合转成用,拼接的字符串 ////查询时不需要联系人电话 //SMSModel_Send sendMsg = new SMSModel_Send() //{ // account = "dh74381", // password = "******", // content = content, // phones = list_phones.ToArray(), // sendtime = DateTime.Now, //}; #endregion //1 根据选定的群组及部门获取相应的联系人 var list_PersonPhonesByGroupAndDepartment= smsSendBLL.GetFinalPersonPhoneList(model.Model_Message, GetPersonListByGroupDepartment); //2 获取临时联系人电话集合 var list_tempPersonPhones= smsSendBLL.AddAndGetTempPersons(model.Model_Message, personBLL, groupBLL); //2.2 获取最终的联系人电话集合 list_PersonPhonesByGroupAndDepartment.AddRange(list_tempPersonPhones); var list_phones = list_PersonPhonesByGroupAndDepartment; //3 转成发送对象 var sendMsg= smsSendBLL.ToSendModel(model.Model_Message, list_phones); /*步骤四 生成提交对象及短信及作业对象 由SMSFactory进行短信提交操作(并选择延时/立刻发送) */ //4 短信发送 //注意:desc:定时时间格式错误; // result:定时时间格式错误 //PMS.Model.CombineModel.SendAndMessage_Model sendandMsgModel = new PMS.Model.CombineModel.SendAndMessage_Model() { Model_Message = model, Model_Send = sendMsg }; model.Model_Send = sendMsg; //PMS.Model.Message.BaseResponse response = new PMS.Model.Message.BaseResponse(); smsSendBLL.SendMsg(model, out /*response*/receive); //receive = new SMSModel_Receive(); return true; }
public bool DoSendTiming(PMS.Model.ViewModel.ViewModel_Message model, ref SMSModel_Receive receive) { return true; }
/// <summary> /// 根据传入的 联系人id数组 以及 短信内容进行短信发送 /// </summary> /// <param name="model"></param> /// <returns></returns> public ActionResult DoSend(PMS.Model.ViewModel.ViewModel_Message model) { //1 有效性判断 //1.1 联系人名单为空,不执行发送操作,返回 //if (model.PersonIds == null||model.PersonIds== "undefined") { return Content("empty contact list"); } //1.2 短信内容为空,不执行发送操作,返回 if (model.Content == null) { return Content("empty content"); } //1.3 超出300字,不执行发送操作,返回 if (model.Content.Length + 9 >= 300) { return Content("out of range"); } SMSModel_Receive receive = new SMSModel_Receive(); #region 11月14日已做修改,判断是定时还是实时发送在SMSFactory中的SMSSend中判断,此处暂时注释掉 //SendJobManagement sendjobManagement = new SendJobManagement(); //if (model.isTiming) //{ // //延时发送 //} //else //{ // //立刻发送 // sendjobManagement.DoSendJobs += DoSendNow; // //smsSendBLL.SendMsg() //} //// var isSaveMsgOk = DoSendNow(model,ref receive); ////var isSaveMsgOk = DoSendNow(Combine_model, receive); //sendjobManagement.JobsRun(Combine_model, receive); #endregion PMS.Model.CombineModel.SendAndMessage_Model combine_model = new PMS.Model.CombineModel.SendAndMessage_Model(); combine_model.Model_Message = model; //smsSendBLL.SendMsg(Combine_model, out response); //****注意此处还未实现向前台向后台传递对象时应加上uid,并向combin_model中加入uid(以包含此属性) DoSendNow(combine_model, out receive); #region 测试批量写入时间时的测试返回对象 //测试批量写入时间时的测试返回对象——现注释掉 //SMSModel_Receive testModel = new SMSModel_Receive() //{ // desc = "提交成功", // failPhones = new string[] { }, // msgid = "b14deff1f6ef45bb8e357e961f5c17ab", // result = "0" //}; #endregion //AfterSend(combine_model.Model_Message, receive/*testModel*/, combine_model.Model_Send.phones.ToList()); //if (!isSaveMsgOk) //{ // return Content("服务器错误"); //} if ("0".Equals(receive.result)) { //6 查询发送状态(是否加入等待时间?) return Content("ok"); } else { return Content("error"); } }