| | |
| | | } |
| | | if (string.IsNullOrEmpty(user.WxOpenId)) |
| | | { |
| | | throw Oops.Oh($"用户微信OpenID确实"); |
| | | throw Oops.Oh($"用户微信确认失败"); |
| | | } |
| | | var uw = await rs.GetFirstAsync(x => x.UserId == userid); |
| | | if (uw == null) |
| | |
| | | /// </summary> |
| | | [AllowAnonymous] |
| | | [HttpPost] |
| | | //[ApiExplorerSettings(IgnoreApi = true)] |
| | | [ApiExplorerSettings(IgnoreApi = true)] |
| | | public async Task<TransferOderOut> GetTransferOder(SearchTransferOder param) |
| | | { |
| | | |
| | |
| | | SearchList= SearchList.And(x => x.BatchStatus != lis); |
| | | } |
| | | } |
| | | if(param.IsSetOK!=null) |
| | | { |
| | | SearchList = SearchList.And(x =>x.IsSetOK==param.IsSetOK); |
| | | } |
| | | if (param.HasSendOk == false) |
| | | SearchList= SearchList.And(x => x.FailNum >0||x.BatchStatus!= "FINISHED"); |
| | | else |
| | | //有一笔大余0 的视为失败 |
| | | SearchList= SearchList.And(x => x.FailNum ==0&&x.BatchStatus== "FINISHED"); |
| | | SearchList= SearchList.And(x => x.FailNum ==0&&x.BatchStatus=="FINISHED"); |
| | | var data=await WeChatTransferOrderwork.AsQueryable().Where(SearchList).Select(x=>new WeChatTransferOrder |
| | | { |
| | | BatchRemark= SqlFunc.Subqueryable<UserWorker>().Where(uw=>uw.UserId==x.UserID).Select(uw => uw.name+ uw.IdCode) |
| | | }).ToPageListAsync(pageModel.PageIndex, pageModel.PageSize,pageModel.TotalCount); |
| | | },true).ToPageListAsync(pageModel.PageIndex, pageModel.PageSize,pageModel.TotalCount); |
| | | //var data = await WeChatTransferOrderwork.GetPageListAsync(SearchList, pageModel); |
| | | |
| | | return new TransferOderOut |
| | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 重新建单 支付 |
| | | /// </summary> |
| | | /// <param name="id"> 订单ID</param> |
| | | /// <returns></returns> |
| | | [AllowAnonymous] |
| | | [HttpGet] |
| | | [ApiExplorerSettings(IgnoreApi = true)] |
| | | public async Task ReSendCreadTransferMoney([FromQuery] string id) |
| | | { |
| | | |
| | | |
| | | var itmsRes = new BaseRepository<WeChatTransferOrder>(); |
| | | if (string.IsNullOrEmpty(id)) |
| | | throw Oops.Oh("参数错误"); |
| | | |
| | | |
| | | var TOrder = await itmsRes.GetByIdAsync(id.toInt()); |
| | | if (TOrder == null) |
| | | { |
| | | throw Oops.Oh("没有订单需要处理"); |
| | | } |
| | | if(TOrder.IsSetOK ==true) |
| | | { |
| | | throw Oops.Oh("已经处理不再处理"); |
| | | } |
| | | if(!(TOrder.ErrorCode== "INVALID_REQUEST"&&TOrder.ErrorMsg== "对应单号已超出重试期,请查单确认后决定是否换单请求")) |
| | | { |
| | | //不满足冲洗支付要求 |
| | | throw Oops.Oh("不满足重新支付要求"); |
| | | } |
| | | |
| | | var rs = new BaseRepository<UserWorker>(); |
| | | var userid = TOrder.UserID; |
| | | var Money = (TOrder.FailAmount??0)/100m; |
| | | if(Money<0.03m) |
| | | { |
| | | throw Oops.Oh("失败金额不足0.3元不能再次发起支付"); |
| | | } |
| | | |
| | | if (await _redisService.TryLock(StaticStringDef.TransferMoneyLockKey + userid.ToString(), 300)) |
| | | { |
| | | |
| | | try |
| | | { |
| | | var UserRs = new BaseRepository<User>(); |
| | | 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("该用户没有收入"); |
| | | } |
| | | |
| | | |
| | | |
| | | var totle = _redisService.Get<decimal>(StaticStringDef.TransferMoneyManKey + userid.ToString()); |
| | | if (totle + Money > 2000) |
| | | { |
| | | throw Oops.Oh("提现金额不可超出2000"); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | var UserTiXianDetailwork = new BaseRepository<UserTiXianDetail>(); |
| | | var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); |
| | | if ((uw != null) && (((uw.TiXianZonge ?? 0) - (uw.YiTiXianJine ?? 0)) >= Money)) |
| | | { |
| | | //满足条件,发起支付 |
| | | var TransferOrder = new WeChatTransferOrder |
| | | { |
| | | |
| | | CreateBy = uw.UserId.ToString(), |
| | | CreateTime = DateTime.Now, |
| | | // BatchId = _redisService.Get32sn(), |
| | | OutBatchNumber = _redisService.Get32sn(), |
| | | Remake = "川印工资支付", |
| | | TransferDetailList = new List<WeChatTransferItem>(), |
| | | UserID = uw.UserId, |
| | | RemakeDes = "补充发起支付" , |
| | | WeChatTransferOrderPrId = TOrder.Id |
| | | |
| | | |
| | | }; |
| | | 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(); |
| | | |
| | | TOrder.IsSetOK = true; |
| | | TOrder.RemakeDes = "已经重新建立支付订单 id="+TransferOrder.Id.ToString(); |
| | | TOrder.UpDataBy = "重新简单支付API"; |
| | | TOrder.UpDataTime= DateTime.Now; |
| | | await WeChatTransferOrderwork.UpdateAsync(TOrder); |
| | | |
| | | |
| | | |
| | | 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; |
| | | } |
| | | // 发起支付 |
| | | |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Oh("系统错误"); |
| | | } |
| | | |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | finally |
| | | { |
| | | await _redisService.TryUnLock(StaticStringDef.TransferMoneyLockKey + userid.ToString()); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | else |
| | | throw Oops.Oh("请不要频繁重复申请"); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 重新创建新的支付单 |
| | | /// </summary> |
| | | /// <param name="ids"></param> |
| | | /// <returns></returns> |
| | | [AllowAnonymous] |
| | | [HttpPost] |
| | | [ApiExplorerSettings(IgnoreApi = true)] |
| | | public async Task<WeChatTransferOrder> CreateTransferOder(CreatTransferOderIN Param) |
| | | { |
| | | if(Param.Key!= DateTime.Now.ToString("yyyy-MM-dd:HH")+"CreatTransfer") |
| | | { |
| | | //key 错误 |
| | | throw Oops.Oh("key错误"); |
| | | } |
| | | |
| | | |
| | | var userbs= new BaseRepository<User>(); |
| | | //判断是否是用户 |
| | | var user= await userbs.GetByIdAsync(Param.UserID); |
| | | if (user == null) |
| | | throw Oops.Oh("没有用户"); |
| | | if(Param.Money<=0.3m) |
| | | { |
| | | throw Oops.Oh("转账金额必须大余0.3元"); |
| | | } |
| | | if (Param.Money >2000) |
| | | { |
| | | throw Oops.Oh("一天转账金额必须小于2000"); |
| | | } |
| | | if (Param.Money > 2000) |
| | | { |
| | | throw Oops.Oh("一天转账金额必须小于2000"); |
| | | } |
| | | |
| | | var totle = _redisService.Get<decimal>(StaticStringDef.TransferMoneyManKey + Param.UserID.ToString()); |
| | | if (totle + Param.Money > 2000) |
| | | { |
| | | throw Oops.Oh("一天转账金额必须小于2000"); |
| | | } |
| | | |
| | | decimal Money = Param.Money; |
| | | |
| | | //满足条件,发起支付 |
| | | var TransferOrder = new WeChatTransferOrder |
| | | { |
| | | |
| | | CreateBy = Param.UserID.ToString(), |
| | | CreateTime = DateTime.Now, |
| | | // BatchId = _redisService.Get32sn(), |
| | | OutBatchNumber = _redisService.Get32sn(), |
| | | Remake = "川印工资支付", |
| | | TransferDetailList = new List<WeChatTransferItem>(), |
| | | UserID = Param.UserID, |
| | | RemakeDes = Param.Remake, |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | }; |
| | | |
| | | |
| | | |
| | | //是否关联收入钱包表 |
| | | if (Param.HasAboutReCome) |
| | | { |
| | | var UserTiXianDetailwork = new BaseRepository<UserTiXianDetail>(); |
| | | var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); |
| | | var rs = new BaseRepository<UserWorker>(); |
| | | var uw = await rs.GetFirstAsync(x => x.UserId == Param.UserID); |
| | | if(uw==null) |
| | | { |
| | | throw Oops.Oh("该用户没有关联钱包"); |
| | | } |
| | | //锁定钱包 |
| | | if (await _redisService.TryLock(StaticStringDef.TransferMoneyLockKey + Param.UserID.ToString(), 300)) |
| | | { |
| | | 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 = Param.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 = Param.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 = Param.UserID.ToString(), |
| | | CreateTime = DateTime.Now, |
| | | UserId = user.Id, |
| | | ZhiChuShouRu = 0, |
| | | YiTiXianJine = Money, |
| | | WeChatTransferOrderID = TransferOrder.Id, |
| | | Remark = "用户提现" |
| | | |
| | | }); |
| | | //钱包余额调整 |
| | | uw.YiTiXianJine = (uw.YiTiXianJine ?? 0) + Money; |
| | | uw.UpDataBy = uw.UserId.ToString(); |
| | | uw.UpDataTime = DateTime.Now; |
| | | await rs.UpdateAsync(uw); |
| | | |
| | | |
| | | await UserTiXianDetailwork.AsTenant().CommitTranAsync(); |
| | | |
| | | totle += Money; |
| | | //设置每日提现限额 |
| | | _redisService.Add(StaticStringDef.TransferMoneyManKey + Param.UserID.ToString(), totle, 60 * 60 * 24); |
| | | //发起支付 |
| | | await InitQMessages.SendMessageAsync(InitQMessages.WxTransfer, TransferOrder.Id.ToString()); |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | finally |
| | | { |
| | | //释放 |
| | | await _redisService.TryUnLock(StaticStringDef.TransferMoneyLockKey + Param.UserID.ToString()); |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Oh("系统繁忙,稍后重试"); |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | //直接转账,不计入钱包记录,主要用于处理超时后无法重新支付的单子 |
| | | |
| | | var UserTiXianDetailwork = new BaseRepository<UserTiXianDetail>(); |
| | | var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); |
| | | |
| | | |
| | | //锁定钱包 |
| | | if (await _redisService.TryLock(StaticStringDef.TransferMoneyLockKey + Param.UserID.ToString(), 300)) |
| | | { |
| | | 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 = Param.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 = Param.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.AsTenant().CommitTranAsync(); |
| | | |
| | | totle += Money; |
| | | //设置每日提现限额 |
| | | _redisService.Add(StaticStringDef.TransferMoneyManKey + Param.UserID.ToString(), totle, 60 * 60 * 24); |
| | | //发起支付 |
| | | await InitQMessages.SendMessageAsync(InitQMessages.WxTransfer, TransferOrder.Id.ToString()); |
| | | } |
| | | catch (Exception) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | finally |
| | | { |
| | | //释放 |
| | | await _redisService.TryUnLock(StaticStringDef.TransferMoneyLockKey + Param.UserID.ToString()); |
| | | } |
| | | |
| | | |
| | | } |
| | | else |
| | | { |
| | | throw Oops.Oh("系统繁忙,稍后重试"); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | return TransferOrder; |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | /// <summary> |
| | | /// 设置为处理状态 |
| | | /// </summary> |
| | | /// <param name="remak"></param> |
| | | /// <returns></returns> |
| | | [AllowAnonymous] |
| | | [HttpGet] |
| | | [ApiExplorerSettings(IgnoreApi = true)] |
| | | public async Task<bool > SetOk([FromQuery] string remark,[FromQuery] string id) |
| | | { |
| | | if(string.IsNullOrEmpty(remark)) |
| | | { |
| | | throw Oops.Oh("必须要有备注信息"); |
| | | |
| | | } |
| | | if (string.IsNullOrEmpty(id)) |
| | | { |
| | | throw Oops.Oh("必须有ID信息"); |
| | | |
| | | } |
| | | var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); |
| | | var oder= await WeChatTransferOrderwork.GetByIdAsync(id.toInt()); |
| | | if(oder == null) |
| | | { |
| | | throw Oops.Oh("没有找到订单"); |
| | | } |
| | | |
| | | if(oder.IsSetOK== true) |
| | | { |
| | | throw Oops.Oh("已经处理了"); |
| | | } |
| | | oder.IsSetOK = true; |
| | | oder.RemakeDes = remark; |
| | | oder.UpDataBy = "API"; |
| | | oder.UpDataTime= DateTime.Now; |
| | | await WeChatTransferOrderwork.UpdateAsync(oder); |
| | | |
| | | return true; |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | public int PageSize { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 是否特殊处理比如支付失败后已经处理为其他情况 |
| | | /// </summary> |
| | | public bool? IsSetOK { get; set; } |
| | | |
| | | } |
| | | |
| | | public class TransferOderOut |
| | |
| | | public List<WeChatTransferOrder> listdata { get; set; } |
| | | public int TotalCount { get; set; } |
| | | } |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | public class CreatTransferOderIN |
| | | { |
| | | /// <summary> |
| | | /// 提现金额 |
| | | /// </summary> |
| | | [Required] |
| | | public decimal Money { get; set; } |
| | | /// <summary> |
| | | /// 提现用户 |
| | | /// </summary> |
| | | [Required] |
| | | public int UserID { get; set; } |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | [Required] |
| | | public string Remake{ get; set; } |
| | | |
| | | /// <summary> |
| | | /// 操作key |
| | | /// </summary> |
| | | [Required] |
| | | public string Key { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 是否关联收益 |
| | | /// </summary> |
| | | [Required] |
| | | public Boolean HasAboutReCome { get; set; } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | } |