using System; using System.Data; using BP.DA; using BP.En; using BP.Web; using BP.Sys; using BP.WF.Port; using System.Net.Mail; using System.Threading.Tasks; namespace BP.WF { /// /// 消息类型 /// public class SMSMsgType { /// /// 自定义消息 /// public const string Self = "Self"; /// /// 抄送消息 /// public const string CC = "CC"; /// /// 待办消息 /// public const string SendSuccess = "SendSuccess"; /// /// 其他 /// public const string Etc = "Etc"; /// /// 退回消息 /// public const string ReturnAfter = "ReturnAfter"; /// /// 移交消息 /// public const string Shift = "Shift"; /// /// 加签消息 /// public const string AskFor = "AskFor"; /// /// 挂起消息 /// public const string Hungup = "HangUp"; /// /// 催办消息 /// public const string DoPress = "DoPress"; /// /// 拒绝挂起的信息 /// public const string RejectHungup = "RejectHungup"; /// /// 错误信息 /// public const string Err = "Err"; } /// /// 消息状态 /// public enum MsgSta { /// /// 未开始 /// UnRun, /// /// 成功 /// RunOK, /// /// 失败 /// RunError, /// /// 禁止发送 /// Disable } /// /// 消息属性 /// public class SMSAttr : EntityMyPKAttr { /// /// 消息标记(有此标记的不在发送) /// public const string MsgFlag = "MsgFlag"; /// /// 状态 0 未发送, 1 发送成功,2发送失败. /// public const string EmailSta = "EmailSta"; /// /// 邮件 /// public const string Email = "Email"; /// /// 邮件标题 /// public const string EmailTitle = "EmailTitle"; /// /// 邮件内容 /// public const string EmailDoc = "EmailDoc"; /// /// 发送人 /// public const string Sender = "Sender"; /// /// 发送给 /// public const string SendTo = "SendTo"; /// /// 插入日期 /// public const string RDT = "RDT"; /// /// 发送日期 /// public const string SendDT = "SendDT"; /// /// 是否读取 /// public const string IsRead = "IsRead"; /// /// 状态 0 未发送, 1 发送成功,2发送失败. /// public const string MobileSta = "MobileSta"; /// /// 手机 /// public const string Mobile = "Mobile"; /// /// 手机信息 /// public const string MobileInfo = "MobileInfo"; /// /// 是否提示过了 /// public const string IsAlert = "IsAlert"; /// /// 消息类型 /// public const string MsgType = "MsgType"; /// /// 其他参数. /// public const string Paras = "Paras"; /// /// 打开的连接 /// public const string OpenUrl = "OpenUrl"; /// /// 接受消息的工具 丁丁、微信 /// public const string PushModel = "PushModel"; /// /// 主键 /// public const string WorkID = "WorkID"; } /// /// 消息 /// public class SMS : EntityMyPK { #region 新方法 2013 /// /// 发送消息 /// /// 接受人 /// 标题 /// 内容 /// 标记 /// 类型 /// 扩展参数 public static void SendMsg(string userNo, string msgTitle, string msgDoc, string msgFlag, string msgType, string paras, Int64 workid, string pushModel = null, string openUrl = null) { SMS sms = new SMS(); sms.setMyPK(DBAccess.GenerGUID()); sms.HisEmailSta = MsgSta.UnRun; sms.Sender = WebUser.No; sms.SendToEmpNo = userNo; sms.Title = msgTitle; sms.DocOfEmail = msgDoc; sms.MobileInfo = msgDoc; sms.Sender = BP.Web.WebUser.No; sms.RDT = DataType.CurrentDateTime; sms.MsgFlag = msgFlag; // 消息标志. sms.MsgType = msgType; // 消息类型.' sms.AtPara = paras; sms.WorkID = workid; ///如果没有设置模式,就设置邮件. if (pushModel == null) pushModel = "Email"; if (DataType.IsNullOrEmpty(openUrl) == false) sms.SetPara("OpenUrl", openUrl); if (DataType.IsNullOrEmpty(pushModel) == false) sms.SetPara("PushModel", pushModel); sms.Insert(); } #endregion 新方法 #region 手机短信属性 /// /// 手机号码 /// public string Mobile { get { return this.GetValStringByKey(SMSAttr.Mobile); } set { SetValByKey(SMSAttr.Mobile, value); } } /// /// 手机状态 /// public MsgSta HisMobileSta { get { return (MsgSta)this.GetValIntByKey(SMSAttr.MobileSta); } set { SetValByKey(SMSAttr.MobileSta, (int)value); } } /// /// 手机信息 /// public string MobileInfo { get { return this.GetValStringByKey(SMSAttr.MobileInfo); } set { SetValByKey(SMSAttr.MobileInfo, value); } } #endregion #region 邮件属性 /// /// 参数 /// public string AtPara { get { return this.GetValStrByKey("AtPara", ""); } set { this.SetValByKey("AtPara", value); } } /// /// 邮件状态 /// public MsgSta HisEmailSta { get { return (MsgSta)this.GetValIntByKey(SMSAttr.EmailSta); } set { this.SetValByKey(SMSAttr.EmailSta, (int)value); } } /// /// Email /// public string Email { get { return this.GetValStringByKey(SMSAttr.Email); } set { SetValByKey(SMSAttr.Email, value); } } /// /// 发送给 /// public string SendToEmpNo { get { return this.GetValStringByKey(SMSAttr.SendTo); } set { SetValByKey(SMSAttr.SendTo, value); } } public int IsRead { get { return this.GetValIntByKey(SMSAttr.IsRead); } set { this.SetValByKey(SMSAttr.IsRead, (int)value); } } public int IsAlert { get { return this.GetValIntByKey(SMSAttr.IsAlert); } set { this.SetValByKey(SMSAttr.IsAlert, (int)value); } } /// /// 消息标记(可以用它来避免发送重复) /// public string MsgFlag { get { return this.GetValStringByKey(SMSAttr.MsgFlag); } set { SetValByKey(SMSAttr.MsgFlag, value); } } /// /// 类型 /// public string MsgType { get { return this.GetValStringByKey(SMSAttr.MsgType); } set { SetValByKey(SMSAttr.MsgType, value); } } /// /// 工作ID /// public Int64 WorkID { get { return this.GetValInt64ByKey(SMSAttr.WorkID); } set { SetValByKey(SMSAttr.WorkID, value); } } /// /// 发送人 /// public string Sender { get { return this.GetValStringByKey(SMSAttr.Sender); } set { SetValByKey(SMSAttr.Sender, value); } } /// /// 记录日期 /// public string RDT { get { return this.GetValStringByKey(SMSAttr.RDT); } set { this.SetValByKey(SMSAttr.RDT, value); } } /// /// 标题 /// public string Title { get { return this.GetValStringByKey(SMSAttr.EmailTitle); } set { SetValByKey(SMSAttr.EmailTitle, value); } } /// /// 邮件内容 /// public string DocOfEmail { get { string doc = this.GetValStringByKey(SMSAttr.EmailDoc); if (DataType.IsNullOrEmpty(doc)) return this.Title; return doc.Replace('~', '\''); } set { SetValByKey(SMSAttr.EmailDoc, value); } } /// /// 邮件内容. /// public string Doc { get { string doc = this.GetValStringByKey(SMSAttr.EmailDoc); if (DataType.IsNullOrEmpty(doc)) return this.Title; return doc.Replace('~', '\''); return this.DocOfEmail; } set { SetValByKey(SMSAttr.EmailDoc, value); } } /// /// 打开的连接 /// public string OpenURL { get { return this.GetParaString(SMSAttr.OpenUrl); } set { this.SetPara(SMSAttr.OpenUrl, value); } } #endregion public string PushModel { get { return this.GetParaString(SMSAttr.PushModel); } } #region 构造函数 /// /// UI界面上的访问控制 /// public override UAC HisUAC { get { UAC uac = new UAC(); uac.OpenAll(); return uac; } } /// /// 消息 /// public SMS() { } /// /// Map /// public override Map EnMap { get { if (this._enMap != null) return this._enMap; Map map = new Map("Sys_SMS", "消息"); map.AddMyPK(); map.AddTBString(SMSAttr.Sender, null, "发送人(可以为空)", false, true, 0, 200, 20); map.AddTBString(SMSAttr.SendTo, null, "发送给(可以为空)", false, true, 0, 200, 20); map.AddTBDateTime(SMSAttr.RDT, "写入时间", true, false); map.AddTBString(SMSAttr.Mobile, null, "手机号(可以为空)", false, true, 0, 30, 20); map.AddTBInt(SMSAttr.MobileSta, (int)MsgSta.UnRun, "消息状态", true, true); map.AddTBString(SMSAttr.MobileInfo, null, "短信信息", false, true, 0, 1000, 20); map.AddTBString(SMSAttr.Email, null, "Email(可以为空)", false, true, 0, 200, 20); map.AddTBInt(SMSAttr.EmailSta, (int)MsgSta.UnRun, "EmaiSta消息状态", true, true); map.AddTBString(SMSAttr.EmailTitle, null, "标题", false, true, 0, 3000, 20); map.AddTBStringDoc(SMSAttr.EmailDoc, null, "内容", false, true); map.AddTBDateTime(SMSAttr.SendDT, null, "发送时间", false, false); map.AddTBInt(SMSAttr.IsRead, 0, "是否读取?", true, true); map.AddTBInt(SMSAttr.IsAlert, 0, "是否提示?", true, true); //用于获得数据. map.AddTBInt(SMSAttr.WorkID, 0, "WorkID", true, true); //消息主键. map.AddTBString(SMSAttr.MsgFlag, null, "消息标记(用于防止发送重复)", false, true, 0, 200, 20); map.AddTBString(SMSAttr.MsgType, null, "消息类型(CC抄送,Todolist待办,Return退回,Etc其他消息...)", false, true, 0, 200, 20); //其他参数. map.AddTBAtParas(500); //map.IsShowSearchKey = false; //map.SearchFields="Tel,Addr," this._enMap = map; return this._enMap; } } #endregion /// /// 发送邮件 /// /// /// /// /// public static bool SendEmailNowAsync(string mail, string mailTitle, string mailDoc) { try { System.Net.Mail.MailMessage myEmail = new System.Net.Mail.MailMessage(); //邮件地址. string emailAddr = BP.Difference.SystemConfig.GetValByKey("SendEmailAddress", null); if (emailAddr == null) { return false; //emailAddr = "ccbpmtester@tom.com"; } string emailPassword = BP.Difference.SystemConfig.GetValByKey("SendEmailPass", null); if (emailPassword == null) { return false; emailPassword = "ccbpm123"; } mailDoc = DataType.ParseText2Html(mailDoc); string displayName = BP.Difference.SystemConfig.GetValByKey("SendEmailDisplayName", "驰骋BPM"); myEmail.From = new System.Net.Mail.MailAddress(emailAddr, displayName, System.Text.Encoding.UTF8); myEmail.To.Add(mail); myEmail.Subject = mailTitle; myEmail.SubjectEncoding = System.Text.Encoding.UTF8;//邮件标题编码 myEmail.IsBodyHtml = true; myEmail.Body = mailDoc; myEmail.BodyEncoding = System.Text.Encoding.UTF8;//邮件内容编码 myEmail.IsBodyHtml = true;//是否是HTML邮件 myEmail.Priority = MailPriority.High; // 邮件优先级 SmtpClient client = new SmtpClient(); client.UseDefaultCredentials = true; if (BP.Difference.SystemConfig.GetValByKeyInt("SendEmailEnableSsl", 1) == 1) client.EnableSsl = true; //经过ssl加密. else client.EnableSsl = false; client.Credentials = new System.Net.NetworkCredential(emailAddr, emailPassword); client.Port = BP.Difference.SystemConfig.GetValByKeyInt("SendEmailPort", 587); //使用的端口 client.Host = BP.Difference.SystemConfig.GetValByKey("SendEmailHost", "smtp.gmail.com"); object userState = myEmail; //调用自带的异步方法 client.Send(myEmail); /* client.SendMailAsync(myEmail); client.SendAsync(myEmail, userState);*/ } catch (Exception e) { BP.DA.Log.DebugWriteError(e.Message); return false; } return true; } /// /// SAAS发送. /// public void SendMsgToSAAS() { //获取设置. string messageUrl = BP.Difference.SystemConfig.AppSettings["HandlerOfMessage"]; if (DataType.IsNullOrEmpty(messageUrl) == true) return; string httpUrl = messageUrl + "?Sender=" + BP.Web.WebUser.No + "&OrgNo=" + WebUser.OrgNo + "&ToUserIDs=" + this.SendToEmpNo + "&Title=" + this.Title + "&Docs=" + this.GetValDocText(); string json = ""; if (BP.Difference.SystemConfig.CustomerNo.Equals("YuTong") == true) { json = "{"; json += " \"token\": '34c45c2b30512e8a8e10467cee45d7ed',"; json += " \"Sender\": \"" + WebUser.No + "\","; json += " \"OrgNo\": \"" + WebUser.OrgNo + "\","; json += " \"userid\": \"" + this.SendToEmpNo + "\","; json += " \"Tel\": \"" + this.Mobile + "\","; json += " \"title\":\"" + this.Title + "\","; json += " \"MsgFlg\":\"" + this.MsgFlag + "\","; json += " \"MobileInfo\":\"" + this.MobileInfo + " \","; json += " \"contents\":\"" + this.Doc + " \","; json += " \"wx\":'true',"; json += " \"isEmail\":'true',"; json += " \"url\":\"" + this.OpenURL + " \"}"; } else { json = "{"; json += " \"Sender\": \"" + WebUser.No + "\","; json += " \"OrgNo\": \"" + WebUser.OrgNo + "\","; json += " \"SendTo\": \"" + this.SendToEmpNo + "\","; json += " \"Tel\": \"" + this.Mobile + "\","; json += " \"Title\":\"" + this.Title + "\","; json += " \"MsgFlg\":\"" + this.MsgFlag + "\","; json += " \"MobileInfo\":\"" + this.MobileInfo + " \","; json += " \"Doc\":\"" + this.Doc + " \","; json += " \"Url\":\"" + this.OpenURL + " \"}"; } //微信 if (this.PushModel.Contains("WeiXin") == true) { //注册到url里面去. BP.WF.Glo.HttpPostConnect(httpUrl, json); } } /// /// 插入之后执行的方法. /// protected override void afterInsert() { try { //如果是SAAS模式. if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS) { SendMsgToSAAS(); return; } //if (BP.Difference.SystemConfig.CustomerNo.Equals("YuTong") == true) //{ // DealYuTong(); // return; //} if (this.HisEmailSta != MsgSta.UnRun) return; #region 发送邮件 if (this.PushModel.Contains("Email") == true && DataType.IsNullOrEmpty(this.Email) == false) { string emailStrs = this.Email; emailStrs = emailStrs.Replace(",", ";"); emailStrs = emailStrs.Replace(",", ";"); //包含多个邮箱 if (emailStrs.Contains(";") == true) { string[] emails = emailStrs.Split(';'); foreach (string email in emails) { if (DataType.IsNullOrEmpty(email) == true) continue; SendEmailNowAsync(email, this.Title, this.DocOfEmail); } } else { //单个邮箱 SendEmailNowAsync(this.Email, this.Title, this.DocOfEmail); } } #endregion 发送邮件 #region 发送短消息 调用接口 //发送短消息的前提必须是手机号不能为空 //if (DataType.IsNullOrEmpty(this.Mobile) == true) // return; //throw new Exception("发送短消息时接收人的手机号不能为空,否则接受不到消息"); string messageUrl = BP.Difference.SystemConfig.AppSettings["HandlerOfMessage"]; if (DataType.IsNullOrEmpty(messageUrl) == true) return; string httpUrl = ""; string json = "{"; json += " \"sender\": \"" + WebUser.No + "\","; json += " \"sendTo\": \"" + this.SendToEmpNo + "\","; json += " \"tel\": \"" + this.Mobile + "\","; json += " \"title\":\"" + this.Title + "\","; json += " \"msgFlag\":\"" + this.MsgFlag.Replace("WKAlt", "") + "\","; json += " \"content\":\"" + this.MobileInfo + " \","; json += " \"openUrl\":\"" + this.OpenURL + " \"}"; //soap = BP.WF.Glo.GetPortalInterfaceSoapClient(); //站内消息 if (this.PushModel.Contains("CCMsg") == true) { httpUrl = messageUrl + "?DoType=SendToCCMSG"; BP.WF.Glo.HttpPostConnect(httpUrl, json); //soap.SendToCCMSG(this.MyPK, WebUser.No, this.SendToEmpNo, this.Mobile, this.MobileInfo, this.Title, this.OpenURL); } //短信 if (this.PushModel.Contains("SMS") == true) { httpUrl = messageUrl + "?DoType=SMS"; BP.WF.Glo.HttpPostConnect(httpUrl, json); //soap.SendToWebServices(this.MyPK, WebUser.No, this.SendToEmpNo, this.Mobile, this.MobileInfo,this.Title, this.OpenURL); } //钉钉 if (this.PushModel.Contains("DingDing") == true) { httpUrl = messageUrl + "?DoType=SendToDingDing&sendTo=" + this.SendToEmpNo + "&title=" + this.Title + "&msgConten=" + this.MobileInfo; BP.WF.Glo.HttpPostConnect(httpUrl, json); //soap.SendToDingDing(this.MyPK, WebUser.No, this.SendToEmpNo, this.Mobile, this.MobileInfo, this.Title, this.OpenURL); } //微信 if (this.PushModel.Contains("WeiXin") == true) { httpUrl = messageUrl + "?DoType=SendToWeiXin&sendTo=" + this.SendToEmpNo; BP.WF.Glo.HttpPostConnect(httpUrl, json); //BP.WF.WeiXin.WeiXinMessage.SendMsgToUsers(this.SendToEmpNo, this.Title, this.Doc, WebUser.No); } //WebService if (this.PushModel.Contains("WS") == true) { httpUrl = messageUrl + "?DoType=SendToWebServices"; BP.WF.Glo.HttpPostConnect(httpUrl, json); //soap.SendToWebServices(this.MyPK, WebUser.No, this.SendToEmpNo, this.Mobile, this.MobileInfo, this.Title, this.OpenURL); } #endregion 发送短消息 调用接口 } catch (Exception ex) { BP.DA.Log.DebugWriteError("@消息机制没有配置成功." + ex.Message); } base.afterInsert(); } /// /// 设置已读 /// public void DoRead() { this.IsRead = 1; this.Update(); } } /// /// 消息s /// public class SMSs : Entities { /// /// 获得实体 /// public override Entity GetNewEntity { get { return new SMS(); } } public SMSs() { } #region 为了适应自动翻译成java的需要,把实体转换成List. /// /// 转化成 java list,C#不能调用. /// /// List public System.Collections.Generic.IList ToJavaList() { return (System.Collections.Generic.IList)this; } /// /// 转化成list /// /// List public System.Collections.Generic.List Tolist() { System.Collections.Generic.List list = new System.Collections.Generic.List(); for (int i = 0; i < this.Count; i++) { list.Add((SMS)this[i]); } return list; } #endregion 为了适应自动翻译成java的需要,把实体转换成List. } }