You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.7 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 MqProcBillcenterDs6Feedback
{
private const string ExchangeName = "billcenter";
private const string QueueName = "billcenter.feedback.ds6";
private static string FeedbackMqUri = ConfigurationManager.AppSettings["FeedbackMQUri"];
private static IConnection mqConn;
private static ILog logger = LogManager.GetLogger("MqProcBillcenterDs6Feedback");
public static void DoProcess()
{
logger.Debug($"ds6账单反馈开始执行");
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri(FeedbackMqUri);
mqConn = factory.CreateConnection("ds6 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($"收到ds6账单反馈{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($"处理账单中心DS6反馈状态时出错无效的数据ID {feedback.ReceiveId}");
}
}
catch (Exception ex)
{
logger.Error($"处理账单中心DS6反馈状态时出错");
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;
}
}
}
}