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 Furion.Logging;
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;
///
/// 微信转账队列处理
///
[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;
retdata.ErrorMsg = ret.ErrorMessage;
retdata.ErrorCode = ret.ErrorCode;
await WeChatTransferOrderwork.UpdateAsync(retdata);
}
else
throw Oops.Oh($"微信请求付款失败+++++++++++++{ret.ToString()}+++++++++++msg{msg}");
}
}
[Subscribe(InitQMessages.WxTransfer)]
public async void WxTransfer(string msg)
{
_ezCoreNetRedisService = App.GetService();
_wecharPayServicecs = App.GetService();
_mapper = App.GetService();
var WeChatTransferOrderwork = new BaseRepository();
var TransferOrder = await WeChatTransferOrderwork.AsQueryable().Includes(x => x.TransferDetailList).Includes(x => x.user).Where(x=>x.Id==msg.toInt()).FirstAsync();
if(TransferOrder == null)
{
Log.Error($"WxTransfer微信支付处理 失败,原因是没有找到TransferOrder ,传递Id为{msg}");
return;
}
if(!string.IsNullOrEmpty(TransferOrder.BatchStatus))
{
return;
}
var UserWork = new BaseRepository();
var userWk = await UserWork.GetFirstAsync(x => x.UserId == TransferOrder.UserID);
if(userWk == null) {
Log.Error($"WxTransfer微信支付处理 失败,该用户不是工人 ,传递的TransferOrder Id为{msg}");
return;
}
// 发起支付
var requit = _mapper.Map(TransferOrder);
requit.AppId = App.Configuration["WechatAPP:AppId"];
requit.BatchName = "小镇临时工工资转账";
requit.BatchRemark = $"{TransferOrder.user.ItCode}{userWk.name?.Substring(0, 2)}{userWk.IdCode}";
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;
retdata.ErrorMsg = ret.ErrorMessage;
retdata.ErrorCode = ret.ErrorCode;
await WeChatTransferOrderwork.UpdateAsync(retdata);
}
else
{
var retdata = await WeChatTransferOrderwork.GetByIdAsync(TransferOrder.Id);
retdata.ErrorCode = ret.ErrorCode;
retdata.ErrorMsg = ret.ErrorMessage;
retdata.BatchStatus = ret.BatchStatus;
retdata.UpDataBy = "微信付款请求之后";
retdata.UpDataTime = DateTime.Now;
await WeChatTransferOrderwork.UpdateAsync(retdata);
Log.Error($"WxTransfer微信支付处理 失败,传递Id为{msg} 错误原因:{retdata.ErrorMsg}");
return;
}
}
[Subscribe(InitQMessages.WxTransferAg)]
public async void WxTransferAg(string msg)
{
_ezCoreNetRedisService = App.GetService();
_wecharPayServicecs = App.GetService();
_mapper = App.GetService();
var WeChatTransferOrderwork = new BaseRepository();
var TransferOrder = await WeChatTransferOrderwork.AsQueryable().Includes(x => x.TransferDetailList).Includes(x=>x.user).Where(x => x.Id == msg.toInt()).FirstAsync();
if (TransferOrder == null)
{
Log.Error($" 再次调用WxTransfer微信支付处理 失败,原因是没有找到TransferOrder,传递Id为{msg}");
return;
}
var UserWork = new BaseRepository();
var userWk = await UserWork.GetFirstAsync(x => x.UserId == TransferOrder.UserID);
if (userWk == null)
{
Log.Error($"WxTransfer微信支付处理 失败,该用户不是工人 ,传递的TransferOrder Id为{msg}");
return;
}
// 发起支付
var requit = _mapper.Map(TransferOrder);
requit.BatchName = msg;
requit.AppId = App.Configuration["WechatAPP:AppId"];
requit.BatchName = "小镇临时工工资转账";
requit.BatchRemark = $"{TransferOrder.user.ItCode}{userWk.name?.Substring(0,2)}{userWk.IdCode}";
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;
retdata.ErrorMsg = ret.ErrorMessage;
retdata.ErrorCode = ret.ErrorCode;
await WeChatTransferOrderwork.UpdateAsync(retdata);
}
else
{
var retdata = await WeChatTransferOrderwork.GetByIdAsync(TransferOrder.Id);
retdata.ErrorCode = ret.ErrorCode;
retdata.ErrorMsg = ret.ErrorMessage;
retdata.BatchStatus = ret.BatchStatus;
retdata.UpDataBy = "再微信付款请求";
retdata.UpDataTime = DateTime.Now;
await WeChatTransferOrderwork.UpdateAsync(retdata);
Log.Error($"WxTransfer微信支付处理 失败,传递Id为{msg} 错误原因:{retdata.ErrorMsg}");
return;
}
}
}
}