using cylsg.Core;
using cylsg.Model.TransferOrder;
using cylsg.Model.UserModel;
using cylsg.utility;
using cylsg.utility.Extend;
using Cylsg.Filter;
using EzCoreNet.Redis;
using EzInitqMessageDef;
using EzWechat;
using Furion.LinqBuilder;
using MapsterMapper;
using Newtonsoft.Json;
using SKIT.FlurlHttpClient.Wechat.Api.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Ame.V20190916.Models;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ChannelsLeadsGetLeadsInfoByComponentIdResponse.Types;
namespace cylsg.Application.Transfer
{
///
/// 提现服务程序
///
///
[DynamicApiController]
[Authorize]
public class UserTransfer
{
private readonly IEzCoreNetRedisService _redisService;
private readonly IWecharPayServicecs _wecharPayServicecs;
public UserTransfer(IEzCoreNetRedisService ezCoreNetRedisService,IWecharPayServicecs wecharPayServicecs) {
_redisService = ezCoreNetRedisService;
_wecharPayServicecs = wecharPayServicecs;
}
///
/// 提现
///
///
[LimitFilter(LimiType = Limttype.User, timespan = 10, ResponseMeg = "请勿在10秒内重复请求")]
public async Task GetTransferMoney([FromQuery] decimal Money)
{
if (Money < 0.3m)
throw Oops.Oh("必须大于0.3元");
if (Money > 2000)
throw Oops.Oh("每人每天最多只能提取2000元");
var rs = new BaseRepository();
var UserID = App.User?.FindFirstValue("UserID");
int userid = 0;
if (!string.IsNullOrEmpty(UserID))
{
userid = int.Parse(UserID);
}
else
{
throw Oops.Oh("没有识别到用户收入");
}
if (await _redisService.TryLock(StaticStringDef.TransferMoneyLockKey + userid.ToString(), 300))
{
try
{
var UserRs = new BaseRepository();
var user = await UserRs.GetByIdAsync(userid);
if (user == null)
{
throw Oops.Oh($"没有找到用户");
}
if (string.IsNullOrEmpty(user.WxOpenId))
{
throw Oops.Oh($"用户微信OpenID确实");
}
var uw = await rs.GetFirstAsync(x => x.UserId == userid);
if (uw == null)
{
throw Oops.Oh("该用户没有收入");
}
if ((uw.TiXianZonge - uw.YiTiXianJine) < Money)
{
throw Oops.Oh("用户余额不足");
}
var totle = _redisService.Get(StaticStringDef.TransferMoneyManKey + userid.ToString());
if (totle + Money > 2000)
{
throw Oops.Oh("提现金额不可超出2000");
}
var UserTiXianDetailwork = new BaseRepository();
var WeChatTransferOrderwork = new BaseRepository();
if ((uw != null) && ((uw.TiXianZonge - uw.YiTiXianJine) >= Money))
{
//满足条件,发起支付
var TransferOrder = new WeChatTransferOrder
{
CreateBy = uw.UserId.ToString(),
CreateTime = DateTime.Now,
// BatchId = _redisService.Get32sn(),
OutBatchNumber = _redisService.Get32sn(),
Remake = "川印工资支付",
TransferDetailList = new List(),
UserID = uw.UserId,
};
try
{
await UserTiXianDetailwork.AsTenant().BeginTranAsync();
var moneylist = Money;
var maxPayItem = Convert.ToDecimal(App.Configuration["WechartPay:PayMoneyMax"].toInt()); ;
while ((moneylist > maxPayItem))
{
TransferOrder.TransferDetailList.Add(new WeChatTransferItem
{
CreateBy = uw.UserId.ToString(),
CreateTime = TransferOrder.CreateTime,
IsEn = true,
OpenId = user.WxOpenId,
OutDetailNumber = _redisService.Get32sn(),
TransferAmount = (int)maxPayItem * 100,
TransferRemark = "川印工资支付",
});
moneylist -= maxPayItem;
}
if (moneylist <= 0.3m)
{
//如果这里低于0.3毛,将社区预检,留下次处理
Money -= moneylist;
}
else
{
TransferOrder.TransferDetailList.Add(new WeChatTransferItem
{
CreateBy = uw.UserId.ToString(),
CreateTime = TransferOrder.CreateTime,
IsEn = true,
OpenId = user.WxOpenId,
OutDetailNumber = _redisService.Get32sn(),
TransferAmount = (int)(moneylist * 100),
TransferRemark = "川印工资支付",
});
}
TransferOrder.TotalAmount = (int)(Money * 100);
TransferOrder.TotalNum = TransferOrder.TransferDetailList.Count();
TransferOrder = await WeChatTransferOrderwork.AsSugarClient().InsertNav(TransferOrder).Include(x => x.TransferDetailList).ExecuteReturnEntityAsync();
await UserTiXianDetailwork.InsertAsync(new UserTiXianDetail
{
CreateBy = uw.UserId.ToString(),
CreateTime = DateTime.Now,
UserId = user.Id,
ZhiChuShouRu = 0,
YiTiXianJine = Money,
WeChatTransferOrderID = TransferOrder.Id,
});
//钱包余额调整
uw.YiTiXianJine += Money;
uw.UpDataBy = uw.UserId.ToString();
uw.UpDataTime = DateTime.Now;
await rs.UpdateAsync(uw);
await UserTiXianDetailwork.AsTenant().CommitTranAsync();
totle += Money;
//设置每日提现限额
_redisService.Add(StaticStringDef.TransferMoneyManKey + userid.ToString(), totle, 60 * 60 * 24);
//发起支付
await InitQMessages.SendMessageAsync(InitQMessages.WxTransfer, TransferOrder.Id.ToString());
}
catch (Exception)
{
await UserTiXianDetailwork.AsTenant().RollbackTranAsync();
throw;
}
// 发起支付
}
}
catch (Exception)
{
throw;
}
finally
{
await _redisService.TryUnLock(StaticStringDef.TransferMoneyLockKey + userid.ToString());
}
}
else
throw Oops.Oh("请不要频繁重复申请");
}
///
/// 获取为支付列表
///
[AllowAnonymous]
[HttpPost]
public async Task GetTransferOder(SearchTransferOder param)
{
var WeChatTransferOrderwork = new BaseRepository();
PageModel pageModel = new PageModel
{ PageIndex = param.PageIndex, PageSize = param.PageSize };
Expression> SearchList = (x) => true;
if (!string.IsNullOrEmpty(param.BatchStatus))
{
SearchList= SearchList.And(x => x.BatchStatus.Contains(param.BatchStatus));
}
if (!string.IsNullOrEmpty(param.NoTBatchStatus))
{
var lisstring = param.NoTBatchStatus?.Split('|');
foreach (var lis in lisstring)
{
SearchList= SearchList.And(x => x.BatchStatus != lis);
}
}
if (param.HasSendOk == false)
SearchList= SearchList.And(x => x.BatchId == null);
else
SearchList= SearchList.And(x => x.BatchId != null);
var data = await WeChatTransferOrderwork.GetPageListAsync(SearchList, pageModel);
return new TransferOderOut
{
listdata = data,
TotalCount=pageModel.TotalCount,
};
}
///
/// 重新支付
///
/// 按订单批次操作
///
[AllowAnonymous]
[HttpGet]
// [ApiExplorerSettings(IgnoreApi = true)]
public async Task ReSendTransferOder([FromQuery] string ids)
{
var itmsRes = new BaseRepository();
if (string.IsNullOrEmpty(ids))
throw Oops.Oh("参数错误");
var idsr= ids.Split(',').Select(x=>x.toInt()).ToList();
foreach (var id in idsr)
{
if (itmsRes.GetById(id) != null)
await InitQMessages.SendMessageAsync(InitQMessages.WxTransferAg, id.ToString());
}
return true;
}
}
///
///
///
public class SearchTransferOder
{
///
/// 搜索状态值 模糊查询
///
public string BatchStatus { get; set; }
///
/// 排除搜索值状态 要排除的状态值必须是全称,多个之间用 “|”间隔
///
public string NoTBatchStatus { get; set; }
///
/// 是否已经成功发起了
///
public bool HasSendOk { get; set; } = false;
///
/// 当前页码
///
public int PageIndex { get; set; }
///
/// 页面大小
///
public int PageSize { get; set; }
}
public class TransferOderOut
{
public List listdata { get; set; }
public int TotalCount { get; set; }
}
}