using DSWeb.Common.DB; using log4net; using Newtonsoft.Json; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DSWeb.EventBus { public static class MqProcBillcenterDs7Feedback { private const string ExchangeName = "billcenter"; private const string QueueName = "billcenter.feedback.ds7"; private static string FeedbackMqUri = ConfigurationManager.AppSettings["FeedbackMQUri"]; private static IConnection mqConn; private static ILog logger = LogManager.GetLogger("MqProcBillcenterDs7Feedback"); public static void DoProcess() { logger.Debug($"ds7账单反馈开始执行"); ConnectionFactory factory = new ConnectionFactory(); factory.Uri = new Uri(FeedbackMqUri); mqConn = factory.CreateConnection("ds7 feedback"); IModel model = mqConn.CreateModel(); model.ExchangeDeclare(ExchangeName, ExchangeType.Direct); model.QueueDeclare(QueueName, false, false, false, null); var consumer = new EventingBasicConsumer(model); consumer.Received += (ch, ea) => { var body = ea.Body; var strBody = Encoding.UTF8.GetString(body.ToArray()); logger.Debug($"收到ds7账单反馈:{strBody}"); try { //回写数据 var feedback = JsonConvert.DeserializeAnonymousType(strBody, new { ReceiveId = string.Empty, Success = false, Reason = string.Empty }); BillCenterDataContext billCenterData = new BillCenterDataContext(); var bill = billCenterData.BillCenterRecord.FirstOrDefault(b => b.GID == feedback.ReceiveId); if (bill != null) { bill.CustSysRecStatus = feedback.Success ? "接收成功" : "接收失败"; bill.CustSysRecTime = DateTime.Now; bill.CustSysRecResult = feedback.Reason; billCenterData.SaveChanges(); //更新附件发送状态 var attach = billCenterData.Attachments.First(a => a.GID == bill.AttachId); var staListInAtt = billCenterData.BillCenterRecord.AsNoTracking() .Where(x => x.AttachId == bill.AttachId) .Select(x => x.CustSysRecStatus) .Distinct() .ToList(); if (staListInAtt.Where(x => x == "接收成功").Count() == staListInAtt.Count) { attach.SendStatus = "发送成功"; } else if (staListInAtt.Contains("接收失败")) { attach.SendStatus = "发送失败"; } billCenterData.SaveChanges(); //更细邮件状态 var mail = billCenterData.Mails.First(m => m.GID == attach.MailGID); var staListInMail = billCenterData.Attachments.AsNoTracking() .Where(a => a.MailGID == attach.MailGID) .Select(a => a.SendStatus) .Distinct() .ToList(); if (staListInMail.Where(x => x == "发送成功").Count() == staListInMail.Count) { mail.Status = "Success"; } else if (staListInMail.Contains("发送失败")) { mail.Status = "Processing"; } billCenterData.SaveChanges(); } else { logger.Error($"处理账单中心DS7反馈状态时出错:无效的数据ID {feedback.ReceiveId}"); } } catch (Exception ex) { logger.Error($"处理账单中心DS7反馈状态时出错:"); logger.Error(ex.Message); logger.Error(ex.StackTrace); } }; model.BasicConsume(QueueName, true, consumer); } public static void StopProcess() { if (mqConn != null && mqConn.IsOpen) { mqConn.Close(); mqConn = null; } } } }