using cylsg.Core;
using cylsg.Model.TransferOrder;
using cylsg.Model.UserModel;
using cylsg.utility.Extend;
using EzCoreNet.Redis;
using EzInitqMessageDef;
using EzWechat;
using Furion;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using InitQ.Abstractions;
using InitQ.Attributes;
using Mapster;
using MapsterMapper;
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EzInitQ
{
public class PayServiceMessageQ: IRedisSubscribe
{
private IEzCoreNetRedisService _ezCoreNetRedisService;
private IWecharPayServicecs _wecharPayServicecs;
private IMapper _mapper;
//public PayServiceMessageQ(IEzCoreNetRedisService ezCoreNetRedisService,IWecharPayServicecs wecharPayServicecs,IMapper mapper) {
// _ezCoreNetRedisService = ezCoreNetRedisService;
// _wecharPayServicecs = wecharPayServicecs;
// _mapper = mapper;
//}
///
/// 微信转账队列处理
///
[Subscribe(InitQMessages.WxTransferMSQ)]
public async void WxTransferMSQInit(string msg)
{
_ezCoreNetRedisService = App.GetService();
_wecharPayServicecs = App.GetService();
_mapper = App.GetService();
var userdata= JsonConvert.DeserializeObject(msg);
if( userdata != null ) {
throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到用户信息+++++++++{msg}");
}
var UserRs = new BaseRepository();
var user = await UserRs.GetByIdAsync(userdata.UserID);
if(user !=null)
{
throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到用户信息++++++++{msg}");
}
if(string.IsNullOrEmpty( user.WxOpenId))
{
throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到openID+++++++++{msg}");
}
var uWorkRs = new BaseRepository();
var UserTiXianDetailwork = new BaseRepository();
var WeChatTransferOrderwork = new BaseRepository();
var uWork = await uWorkRs.GetFirstAsync(x=>x.UserId==user.Id);
if((uWork != null)& ((uWork.TiXianZonge - uWork.YiTiXianJine) > userdata.money))
{
var TransferOrder = new WeChatTransferOrder
{
CreateBy = uWork.UserId.ToString(),
CreateTime = DateTime.Now,
BatchId = _ezCoreNetRedisService.Get32sn(),
OutBatchNumber = _ezCoreNetRedisService.Get32sn(),
Remake = "川印工资支付",
TransferDetailList = new List()
};
try
{
//满足条件,发起支付
await UserTiXianDetailwork.AsTenant().BeginTranAsync();
var moneylist= userdata.money;
if(moneylist<=0.3m)
{
//放弃处理,低于0.3毛不能发起转账
throw Oops.Oh($"队列WxTransferMSQInit 处理失败,转账金额低于0.3元+++++++++{msg}");
}
var maxPayItem = Convert.ToDecimal(App.Configuration["WechartPay:PayMoneyMax"].toInt()); ;
while ((moneylist > maxPayItem))
{
TransferOrder.TransferDetailList.Add(new WeChatTransferItem
{
CreateBy = uWork.UserId.ToString(),
CreateTime = TransferOrder.CreateTime,
IsEn = true,
OpenId = user.WxOpenId,
OutDetailNumber = _ezCoreNetRedisService.Get32sn(),
TransferAmount = (int )maxPayItem * 100,
TransferRemark="川印工资支付",
});
moneylist -= maxPayItem;
}
if (moneylist <= 0.3m)
{
//如果这里低于0.3毛,将社区预检,留下次处理
userdata.money -= moneylist;
}
else
{
TransferOrder.TransferDetailList.Add(new WeChatTransferItem
{
CreateBy = uWork.UserId.ToString(),
CreateTime = TransferOrder.CreateTime,
IsEn = true,
OpenId = user.WxOpenId,
OutDetailNumber = _ezCoreNetRedisService.Get32sn(),
TransferAmount = (int)(moneylist * 100),
TransferRemark = "川印工资支付",
});
}
TransferOrder = await WeChatTransferOrderwork.AsSugarClient().InsertNav(TransferOrder).Include(x=>x.TransferDetailList).ExecuteReturnEntityAsync();
await UserTiXianDetailwork.InsertAsync(new UserTiXianDetail
{
CreateBy = uWork.UserId.ToString(),
CreateTime = DateTime.Now,
UserId = user.Id,
ZhiChuShouRu= 0,
YiTiXianJine=userdata.money,
WeChatTransferOrderID= TransferOrder.Id,
});
//钱包余额调整
uWork.YiTiXianJine += userdata.money;
uWork.UpDataBy = uWork.UserId.ToString();
uWork.UpDataTime = DateTime.Now;
await uWorkRs.UpdateAsync(uWork);
await UserTiXianDetailwork.AsTenant().CommitTranAsync();
}
catch (Exception)
{
await UserTiXianDetailwork.AsTenant().RollbackTranAsync();
throw;
}
// 发起支付
var requit = _mapper.Map(TransferOrder);
var ret= await _wecharPayServicecs.Transfer(requit);
if (ret.IsSuccessful())
{
var retdata= await WeChatTransferOrderwork.GetByIdAsync(TransferOrder.Id);
retdata.BatchId = ret.BatchId;
retdata.BatchStatus= ret.BatchStatus;
retdata.UpDataBy = "微信付款请求之后";
retdata.UpDataTime= DateTime.Now;
await WeChatTransferOrderwork.UpdateAsync(retdata);
}
else
throw Oops.Oh($"微信请求付款失败+++++++++++++{ret.ToString()}+++++++++++msg{msg}");
}
}
}
}