移动系统liao
2025-03-19 16b063870156db78148440971ab46c649e3e6018
cylsg/cylsg.Application/Transfer/UserTransfer.cs
@@ -1,6 +1,7 @@
using cylsg.Core;
using cylsg.Model.TransferOrder;
using cylsg.Model.UserModel;
using cylsg.Model.utilityViewModel;
using cylsg.utility;
using cylsg.utility.Extend;
using Cylsg.Filter;
@@ -19,6 +20,7 @@
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Ame.V20190916.Models;
using TencentCloud.Domain.V20180808.Models;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ChannelsLeadsGetLeadsInfoByComponentIdResponse.Types;
namespace cylsg.Application.Transfer
@@ -81,7 +83,7 @@
                    }
                    if (string.IsNullOrEmpty(user.WxOpenId))
                    {
                        throw Oops.Oh($"用户微信OpenID确实");
                        throw Oops.Oh($"用户微信确认失败");
                    }
                    var uw = await rs.GetFirstAsync(x => x.UserId == userid);
                    if (uw == null)
@@ -256,7 +258,7 @@
        /// </summary>
        [AllowAnonymous]
        [HttpPost]
        //[ApiExplorerSettings(IgnoreApi = true)]
        [ApiExplorerSettings(IgnoreApi = true)]
        public async Task<TransferOderOut> GetTransferOder(SearchTransferOder param)
        {
@@ -280,15 +282,19 @@
                    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");
                SearchList= SearchList.And(x =>( x.FailNum >0||x.BatchStatus!= "FINISHED")||(x.BatchStatus==null&&x.ErrorCode== "NOT_ENOUGH")||x.FailAmount>0); //NOT_ENOUGH 是账户没有钱
            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
@@ -328,10 +334,627 @@
        }
        /// <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== "对应单号已超出重试期,请查单确认后决定是否换单请求")|| (TOrder.ErrorCode == "NOT_ENOUGH")||(TOrder.FailAmount>0)))
            {
                //不满足冲洗支付要求
                throw Oops.Oh("不满足重新支付要求");
            }
            var rs = new BaseRepository<UserWorker>();
            var userid = TOrder.UserID;
            decimal Money = 0;
            if (TOrder.FailAmount==null)
            {
                decimal overTotal = 0;
                if (TOrder.BatchId == null)
                {
                    overTotal = 0;//没有支付单,证明没有支付
                }
                else
                    overTotal = (TOrder.SuccessAmount??0)/100m;
                //这个是没有创建提交单 按原价重新支付
                Money = ((TOrder.TotalAmount??0)/100m)-overTotal;
            }
            else
             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) && Money<= (uw.TiXianZonge ?? 0))
                    {
                        //满足条件,发起支付 这里不判断支付金额大鱼可提现余额
                        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>
        /// <returns></returns>
        [HttpPost]
        [AllowAnonymous]
        public async Task<RetPageData<WeChatTransferOrder>> GetTransferOrder(SSPageByWhereOrder Param)
        {
            if (Param.Page == null)
                throw Oops.Oh("参数错误");
            Expression<Func<WeChatTransferOrder, bool>> where = null;
            if (!string.IsNullOrEmpty( Param.Where as string))
            {
              //where =   CommonHelper.FormatWhereExpression<WeChatTransferOrder>(Param.Where);
 where =   CommonHelper.FormatWhereExpression<WeChatTransferOrder>(Param.Where as string);
            }
            Expression<Func<WeChatTransferOrder, object>> order = null;
            if (Param.Order?.Name!=null)
            {
                 order = CommonHelper.FormatPropertyExpression<WeChatTransferOrder>(Param.Order.Name);
            }
            RefAsync<int> title = 0;
            var BR = new BaseRepository<WeChatTransferOrder>();
          var data=  await BR.AsQueryable().Includes(x=>x.user,u=>u.Worek).Select(x=>new WeChatTransferOrder
          {
               UserIDCode= x.user.Worek.IdCode,
                UserName=x.user.Worek.name,
                 TotalAmount=x.TotalAmount,
               TotalNum=x.TotalNum,
              BatchId=x.BatchId,
               SuccessNum=x.SuccessNum,
              OutBatchNumber=x.OutBatchNumber,
              BatchName = x.BatchName,
              BatchStatus=x.BatchStatus,
              UserID= x.UserID,
              UpDataTime=x.UpDataTime,
              YiTiXianGz=x.user.Worek.YiTiXianJine,
               ZhongGz=x.user.Worek.TiXianZonge,
              ItCode=x.user.ItCode,
              SuccessAmount= x.SuccessAmount,
              FailAmount=x.FailAmount
          }).MergeTable().WhereIF(where != null, where).OrderByIF(order!=null,order,Param.Order?.Des?? OrderByType.Asc).ToPageListAsync(Param.Page.PageIndex,Param.Page.PageSize, title);
            Param.Page.TotalCount = title;
            return new RetPageData<WeChatTransferOrder>()
            {
                 data= data,
                  Page=Param.Page,
             };
;        }
    }
    /// <summary>
    ///
    /// 收索
    /// </summary>
    public class SearchTransferOder
    {
@@ -357,6 +980,11 @@
        /// </summary>
        public int PageSize { get; set; }
        /// <summary>
        /// 是否特殊处理比如支付失败后已经处理为其他情况
        /// </summary>
        public bool? IsSetOK { get; set; }
    }
    public class TransferOderOut
@@ -364,6 +992,45 @@
        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; }
    }
}