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; } } }