From 446957fb241cd6489576281c28050062aa6df073 Mon Sep 17 00:00:00 2001 From: username@email.com <yzy2002yzy@163.com> Date: 星期三, 25 九月 2024 14:56:11 +0800 Subject: [PATCH] Merge branch 'master' of http://47.108.235.38:8080/r/cylsg --- cylsg/EzInitQ/Mapper.cs | 4 .gitignore | 1 cylsg/cylsg.utility/StaticStringDef.cs | 24 + cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs | 34 + cylsg/cylsg.redis/IEzCoreNetRedisService.cs | 17 + cylsg/cylsg.Web.Core/Startup.cs | 1 cylsg/EzInitQ/PayServiceMessageQ.cs | 119 ++++++++ cylsg/EzInitqMessageDef/InitQMessages.cs | 12 cylsg/EzJob/ClearWorkOnDay.cs | 29 ++ cylsg/cylsg.Application/LogoInController.cs | 21 + cylsg/cylsg.Web.Entry/appsettings.json | 10 cylsg/EzWechat/WecharPayServicecs.cs | 8 cylsg/EzWechat/EzWechat.csproj | 2 cylsg/EzWechat/IWecharPayServicecs.cs | 2 cylsg/EzJob/WeChatJob.cs | 76 ++++- cylsg/cylsg.Application/Transfer/UserTransfer.cs | 327 ++++++++++++++++++++++++- cylsg/cylsg.redis/EzCoreNetRedisService.cs | 54 +++ cylsg/EzJob/StartUpcs.cs | 3 18 files changed, 663 insertions(+), 81 deletions(-) diff --git a/.gitignore b/.gitignore index 173bcf1..016b75c 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ cylsg/EzJob/bin/ cylsg/EzJob/obj/ cylsg/cylsg.Application/cylsg.Application.xml +cylsg/cylsg.Web.Entry/application.log diff --git a/cylsg/EzInitQ/Mapper.cs b/cylsg/EzInitQ/Mapper.cs index 51ef636..c49e11b 100644 --- a/cylsg/EzInitQ/Mapper.cs +++ b/cylsg/EzInitQ/Mapper.cs @@ -14,8 +14,8 @@ { public void Register(TypeAdapterConfig config) { - config.ForType<CreateTransferBatchRequest, WeChatTransferOrder>(); - + config.ForType<CreateTransferBatchRequest, WeChatTransferOrder>().Map(x=>x.TotalNum,x=>x.TotalNumber); + config.ForType<WeChatTransferOrder,CreateTransferBatchRequest>().Map(x => x.TotalNumber, x => x.TotalNum); } } } diff --git a/cylsg/EzInitQ/PayServiceMessageQ.cs b/cylsg/EzInitQ/PayServiceMessageQ.cs index a4224b7..1b98ba1 100644 --- a/cylsg/EzInitQ/PayServiceMessageQ.cs +++ b/cylsg/EzInitQ/PayServiceMessageQ.cs @@ -8,6 +8,7 @@ using Furion; using Furion.DatabaseAccessor; using Furion.FriendlyException; +using Furion.Logging; using InitQ.Abstractions; using InitQ.Attributes; using Mapster; @@ -29,14 +30,7 @@ { private IEzCoreNetRedisService _ezCoreNetRedisService; private IWecharPayServicecs _wecharPayServicecs; - private IMapper _mapper; - //public PayServiceMessageQ(IEzCoreNetRedisService ezCoreNetRedisService,IWecharPayServicecs wecharPayServicecs,IMapper mapper) { - - // _ezCoreNetRedisService = ezCoreNetRedisService; - // _wecharPayServicecs = wecharPayServicecs; - // _mapper = mapper; - - //} + private IMapper _mapper; /// <summary> /// 寰俊杞处闃熷垪澶勭悊 @@ -191,5 +185,114 @@ } + + [Subscribe(InitQMessages.WxTransfer)] + public async void WxTransfer(string msg) + { + _ezCoreNetRedisService = App.GetService<IEzCoreNetRedisService>(); + _wecharPayServicecs = App.GetService<IWecharPayServicecs>(); + _mapper = App.GetService<IMapper>(); + + + var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); + var TransferOrder = await WeChatTransferOrderwork.AsQueryable().Includes(x => x.TransferDetailList).Where(x=>x.Id==msg.toInt()).FirstAsync(); + if(TransferOrder == null) + { + Log.Error($"WxTransfer寰俊鏀粯澶勭悊 澶辫触锛屽師鍥犳槸娌℃湁鎵惧埌TransferOrder 锛屼紶閫扞d涓簕msg}"); + + return; + } + if(!string.IsNullOrEmpty(TransferOrder.BatchStatus)) + { + + return; + } + + // 鍙戣捣鏀粯 + var requit = _mapper.Map<CreateTransferBatchRequest>(TransferOrder); + requit.AppId = App.Configuration["WechatAPP:AppId"]; + requit.BatchName = "灏忛晣涓存椂宸ュ伐璧勮浆璐�"; + requit.BatchRemark = "宸濆嵃涓存椂宸ュ伐璧勶紝鎿嶈繃200鐨勫绗旀敮浠�"; + + 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; + 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寰俊鏀粯澶勭悊 澶辫触锛屼紶閫扞d涓簕msg} 閿欒鍘熷洜:{retdata.ErrorMsg}"); + return; + } + + + } + + + [Subscribe(InitQMessages.WxTransferAg)] + public async void WxTransferAg(string msg) + { + _ezCoreNetRedisService = App.GetService<IEzCoreNetRedisService>(); + _wecharPayServicecs = App.GetService<IWecharPayServicecs>(); + _mapper = App.GetService<IMapper>(); + + + var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); + var TransferOrder = await WeChatTransferOrderwork.AsQueryable().Includes(x => x.TransferDetailList).Where(x => x.Id == msg.toInt()).FirstAsync(); + if (TransferOrder == null) + { + Log.Error($" 鍐嶆璋冪敤WxTransfer寰俊鏀粯澶勭悊 澶辫触锛屽師鍥犳槸娌℃湁鎵惧埌TransferOrder 锛屼紶閫扞d涓簕msg}"); + + return; + } + if (!string.IsNullOrEmpty(TransferOrder.BatchStatus)) + { + + return; + } + + // 鍙戣捣鏀粯 + var requit = _mapper.Map<CreateTransferBatchRequest>(TransferOrder); + requit.AppId = App.Configuration["WechatAPP:AppId"]; + requit.BatchName = "灏忛晣涓存椂宸ュ伐璧勮浆璐�"; + requit.BatchRemark = "宸濆嵃涓存椂宸ュ伐璧勶紝鎿嶈繃200鐨勫绗旀敮浠�"; + + 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; + 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寰俊鏀粯澶勭悊 澶辫触锛屼紶閫扞d涓簕msg} 閿欒鍘熷洜:{retdata.ErrorMsg}"); + return; + } + + + } } } diff --git a/cylsg/EzInitqMessageDef/InitQMessages.cs b/cylsg/EzInitqMessageDef/InitQMessages.cs index 531a373..53d333a 100644 --- a/cylsg/EzInitqMessageDef/InitQMessages.cs +++ b/cylsg/EzInitqMessageDef/InitQMessages.cs @@ -14,7 +14,14 @@ /// 杞处 /// </summary> public const string WxTransferMSQ = "WxTransferMSQ"; - + /// <summary> + ///寰俊鎻愮幇鍙紶閫扞D + /// </summary> + public const string WxTransfer = "WxTransfer"; + /// <summary> + ///閲嶆柊鏀粯 + /// </summary> + public const string WxTransferAg = "WxTransferAg"; /// <summary> /// 鍚戝爢鏍堜腑鍘嬪叆涓�涓秷鎭� /// </summary> @@ -22,7 +29,7 @@ /// <param name="MessageName"> 娑堟伅鍚嶇О</param> /// <param name="msg">绫诲瀷</param> /// <returns></returns> - public static async Task<bool> SendMessageAsync<T>(string MessageName,T msg) + public static async Task<bool> SendMessageAsync<T>(string MessageName,T msg) { var _redis= App.GetService<ICacheService>(); @@ -40,6 +47,7 @@ var _redis = App.GetService<ICacheService>(); await _redis.ListRightPushAsync(MessageName, msg); + return true; } } diff --git a/cylsg/EzJob/ClearWorkOnDay.cs b/cylsg/EzJob/ClearWorkOnDay.cs new file mode 100644 index 0000000..e2c862d --- /dev/null +++ b/cylsg/EzJob/ClearWorkOnDay.cs @@ -0,0 +1,29 @@ +锘縰sing cylsg.utility; +using EzCoreNet.Redis; +using Furion.Schedule; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EzJob +{ + /// <summary> + /// 娓呴櫎姣忔棩鎻愮幇缁熻key + /// </summary> + public class ClearWorkOnDay : IJob + { + private readonly IEzCoreNetRedisService _redisService; + + public ClearWorkOnDay(IEzCoreNetRedisService ezCoreNetRedis) + { + _redisService = ezCoreNetRedis; + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + await _redisService.delegateAllKeyWith(StaticStringDef.TransferMoneyManKey); + } + } +} diff --git a/cylsg/EzJob/StartUpcs.cs b/cylsg/EzJob/StartUpcs.cs index 8659fdd..dec56c5 100644 --- a/cylsg/EzJob/StartUpcs.cs +++ b/cylsg/EzJob/StartUpcs.cs @@ -18,7 +18,8 @@ services.AddSchedule(options => { - options.AddJob<WeChatJob>(concurrent: false, Triggers.Hourly()); // 涓茶 + options.AddJob<WeChatJob>(concurrent: false, Triggers.PeriodMinutes(1)); // 涓茶Triggers.PeriodMinutes(1) + options.AddJob<ClearWorkOnDay>(concurrent: false, Triggers.DailyAt(0)); }); } diff --git a/cylsg/EzJob/WeChatJob.cs b/cylsg/EzJob/WeChatJob.cs index 60c5e9a..3003768 100644 --- a/cylsg/EzJob/WeChatJob.cs +++ b/cylsg/EzJob/WeChatJob.cs @@ -5,6 +5,7 @@ using Furion.FriendlyException; using Furion.Schedule; using Microsoft.AspNetCore.Http.HttpResults; +using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; using System; using System.Collections.Generic; using System.Linq; @@ -32,20 +33,21 @@ } var WeChatTransferOrderRs = new BaseRepository<WeChatTransferOrder>(); - var OderList = await WeChatTransferOrderRs.AsQueryable().Includes(x=>x.TransferDetailList).Where(x => (x.BatchId != null && x.BatchId != "") || x.BatchStatus == "ACCEPTED" || x.BatchStatus == "PROCESSING").ToListAsync(); + var OderList = await WeChatTransferOrderRs.AsQueryable().Includes(x=>x.TransferDetailList).Where(x => (x.BatchId != null && x.BatchId != "")&&(x.BatchStatus==null|| x.BatchStatus == "ACCEPTED" || x.BatchStatus == "PROCESSING")).ToListAsync(); foreach( var o in OderList ) { - var ret = await payServices.TransferBatches(new SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.GetTransferBatchByBatchIdRequest + var ret = await payServices.TransferBatches(new GetTransferBatchByOutBatchNumberRequest { - BatchId = o.BatchId + OutBatchNumber = o.OutBatchNumber + + - }); + }); ; if(ret != null) { if(ret.IsSuccessful()) - { - + { if (ret.TransferBatch.BatchStatus == "FINISHED") { @@ -61,28 +63,32 @@ foreach (var item in o.TransferDetailList) { var del =ret.TransferDetailList.Where(x=>x.OutDetailNumber==item.OutDetailNumber).FirstOrDefault(); - item.DetailStatus = del?.DetailStatus; - switch (item.DetailStatus) + if (del != null) + { - case "FAIL": - //澶辫触锛岃幏鍙栧け璐ュ師鍥� - var retde = await payServices.TransferBatchesDetails(new SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.GetTransferBatchDetailByDetailIdRequest - { - BatchId = o.BatchId, - DetailId = del.DetailId, + item.DetailStatus = del?.DetailStatus; + switch (item.DetailStatus) + { + case "FAIL": + //澶辫触锛岃幏鍙栧け璐ュ師鍥� + var retde = await payServices.TransferBatchesDetails(new SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.GetTransferBatchDetailByDetailIdRequest + { + BatchId = o.BatchId, + DetailId = del.DetailId, - }); + }); - item.FailReason = retde?.FailReason; - break; - case "SUCCESS": - item.DetailStatus = "SUCCESS"; + item.FailReason = retde?.FailReason; + break; + case "SUCCESS": + item.DetailStatus = "SUCCESS"; - break; + break; - default: - item.DetailStatus = del?.DetailStatus; - break; + default: + item.DetailStatus = del?.DetailStatus; + break; + } } @@ -92,7 +98,31 @@ } + else + if(ret.TransferBatch.BatchStatus== "PROCESSING") + { + o.BatchStatus = ret.TransferBatch.BatchStatus; + o.UpDataBy = "ExecuteAsync"; + o.UpDataTime = DateTime.Now; + o.CloseReason = ret.TransferBatch.CloseReason; + o.FailAmount = ret.TransferBatch.FailAmount; + o.FailNum = ret.TransferBatch.FailNumber; + o.SuccessNum = ret.TransferBatch.SuccessNumber; + o.SuccessAmount = ret.TransferBatch.SuccessAmount; + } } + else + { + //澶勭悊澶辫触 + o.ErrorCode = ret.ErrorCode; + o.ErrorMsg = ret.ErrorMessage; + o.UpDataBy = "ExecuteAsync"; + o.UpDataTime = DateTime.Now; + + + } + + await WeChatTransferOrderRs.UpdateRangeAsync(OderList); } } } diff --git a/cylsg/EzWechat/EzWechat.csproj b/cylsg/EzWechat/EzWechat.csproj index ed480b7..d1092ad 100644 --- a/cylsg/EzWechat/EzWechat.csproj +++ b/cylsg/EzWechat/EzWechat.csproj @@ -7,7 +7,7 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.4.0" /> + <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.5.0" /> <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.7.0" /> </ItemGroup> diff --git a/cylsg/EzWechat/IWecharPayServicecs.cs b/cylsg/EzWechat/IWecharPayServicecs.cs index 6f973fa..f1c337e 100644 --- a/cylsg/EzWechat/IWecharPayServicecs.cs +++ b/cylsg/EzWechat/IWecharPayServicecs.cs @@ -20,7 +20,7 @@ /// </summary> /// <param name="request"></param> /// <returns></returns> - Task<GetTransferBatchByBatchIdResponse> TransferBatches(GetTransferBatchByBatchIdRequest request); + Task<GetTransferBatchByOutBatchNumberResponse> TransferBatches(GetTransferBatchByOutBatchNumberRequest request); /// <summary> /// 鏍规嵁Detail id 鏌ヨ鍚嶅崟璇︾粏 /// </summary> diff --git a/cylsg/EzWechat/WecharPayServicecs.cs b/cylsg/EzWechat/WecharPayServicecs.cs index a679bee..2c871c1 100644 --- a/cylsg/EzWechat/WecharPayServicecs.cs +++ b/cylsg/EzWechat/WecharPayServicecs.cs @@ -1,5 +1,6 @@ 锘縰sing Furion; using Furion.DependencyInjection; +using Microsoft.Extensions.FileSystemGlobbing; using SKIT.FlurlHttpClient.Wechat.TenpayV3; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Settings; @@ -8,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using static SKIT.FlurlHttpClient.Wechat.Api.Events.TransferCustomerServiceReply.Types; using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinOpenApiRequestIdGetResponse.Types; namespace EzWechat @@ -40,10 +42,10 @@ } - public async Task<GetTransferBatchByBatchIdResponse> TransferBatches(GetTransferBatchByBatchIdRequest request) + public async Task<GetTransferBatchByOutBatchNumberResponse> TransferBatches(GetTransferBatchByOutBatchNumberRequest request) { - - var response = await _V3Client.ExecuteGetTransferBatchByBatchIdAsync(request); + + var response = await _V3Client.ExecuteGetTransferBatchByOutBatchNumberAsync(request); return response; } diff --git a/cylsg/cylsg.Application/LogoInController.cs b/cylsg/cylsg.Application/LogoInController.cs index b3a843a..0ee4cfd 100644 --- a/cylsg/cylsg.Application/LogoInController.cs +++ b/cylsg/cylsg.Application/LogoInController.cs @@ -84,6 +84,9 @@ //娌℃湁鐢ㄦ埛 锛岄渶瑕佹柊寤虹敤鎴� var phone = await _wechatService.GetPhone(Param.Bindgetphonenumber); + + user = await UserRes.GetFirstAsync(x => x.ItCode == phone); + if(user == null) { user = new User { @@ -94,14 +97,22 @@ ItCode = phone, PassWord = "123456", WxOpenId = opeid, - + CreateBy="寰俊娉ㄥ唽鐧诲綍", + CreateTime = DateTime.UtcNow, }; - user.Id = await UserRes.EzInsertReturnIdentityAsync(user); - + user= await UserRes.InsertReturnEntityAsync(user); + } + else + { + user.WxOpenId = opeid; + await UserRes.EzUpdateAsync(user); + } + + } var jwt = new EzJwtModel() { @@ -123,9 +134,7 @@ } - - - + } /// <summary> diff --git a/cylsg/cylsg.Application/Transfer/UserTransfer.cs b/cylsg/cylsg.Application/Transfer/UserTransfer.cs index a5dcbdf..0aaf219 100644 --- a/cylsg/cylsg.Application/Transfer/UserTransfer.cs +++ b/cylsg/cylsg.Application/Transfer/UserTransfer.cs @@ -1,14 +1,25 @@ 锘縰sing 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 { @@ -21,16 +32,30 @@ public class UserTransfer { - - public UserTransfer() { } + private readonly IEzCoreNetRedisService _redisService; + private readonly IWecharPayServicecs _wecharPayServicecs; + + public UserTransfer(IEzCoreNetRedisService ezCoreNetRedisService,IWecharPayServicecs wecharPayServicecs) { + + _redisService = ezCoreNetRedisService; + _wecharPayServicecs = wecharPayServicecs; + } + + /// <summary> /// 鎻愮幇 /// </summary> /// <param name="Money"></param> - [LimitFilter(LimiType = Limttype.User,timespan =10,ResponseMeg ="璇峰嬁鍦�10绉掑唴閲嶅璇锋眰")] - public async Task GetTransferMoney( [FromQuery]decimal Money) + [LimitFilter(LimiType = Limttype.User, timespan = 10, ResponseMeg = "璇峰嬁鍦�10绉掑唴閲嶅璇锋眰")] + public async Task GetTransferMoney([FromQuery] decimal Money) { - var rs= new BaseRepository<UserWorker>(); + + if (Money < 0.3m) + throw Oops.Oh("蹇呴』澶т簬0.3鍏�"); + if (Money > 2000) + throw Oops.Oh("姣忎汉姣忓ぉ鏈�澶氬彧鑳芥彁鍙�2000鍏�"); + + var rs = new BaseRepository<UserWorker>(); var UserID = App.User?.FindFirstValue("UserID"); int userid = 0; if (!string.IsNullOrEmpty(UserID)) @@ -42,17 +67,293 @@ throw Oops.Oh("娌℃湁璇嗗埆鍒扮敤鎴锋敹鍏�"); } - var uw= await rs.GetByIdAsync(userid); - if((uw.TiXianZonge-uw.YiTiXianJine)< Money) + + if (await _redisService.TryLock(StaticStringDef.TransferMoneyLockKey + userid.ToString(), 300)) { - throw Oops.Oh("鐢ㄦ埛浣欓涓嶈冻"); + + 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("璇ョ敤鎴锋病鏈夋敹鍏�"); + } + if ((uw.TiXianZonge - uw.YiTiXianJine) < Money) + { + 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 - uw.YiTiXianJine) >= 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, + + + + + }; + 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()); + } + + + + + + + + + + + + + } - var b = await InitQMessages.SendMessageAsync(InitQMessages.WxTransferMSQ, Money.ToString()); - if (b) - return; - else - throw Oops.Oh("璇锋眰澶辫触"); + else + throw Oops.Oh("璇蜂笉瑕侀绻侀噸澶嶇敵璇�"); + + + + + } + /// <summary> + /// 鑾峰彇涓烘敮浠樺垪琛� + /// </summary> + [AllowAnonymous] + [HttpPost] + [ApiExplorerSettings(IgnoreApi = true)] + public async Task<TransferOderOut> GetTransferOder(SearchTransferOder param) + { + + var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); + PageModel pageModel = new PageModel + { PageIndex = param.PageIndex, PageSize = param.PageSize }; + + + Expression<Func<WeChatTransferOrder, bool>> 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, + }; + } + /// <summary> + /// 閲嶆柊鏀粯 + /// </summary> + /// <param name="Id"> 鎸夎鍗曟壒娆℃搷浣�</param> + /// <returns></returns> + [AllowAnonymous] + [HttpGet] + [ApiExplorerSettings(IgnoreApi = true)] + public async Task<bool> ReSendTransferOder([FromQuery] string ids) + { + var itmsRes = new BaseRepository<WeChatTransferOrder>(); + 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; + + + + + } + + } + /// <summary> + /// + /// </summary> + public class SearchTransferOder + { + + /// <summary> + /// 鎼滅储鐘舵�佸�� 妯$硦鏌ヨ + /// </summary> + public string BatchStatus { get; set; } + /// <summary> + /// 鎺掗櫎鎼滅储鍊肩姸鎬� 瑕佹帓闄ょ殑鐘舵�佸�煎繀椤绘槸鍏ㄧО锛屽涓箣闂寸敤 鈥渱鈥濋棿闅� + /// </summary> + public string NoTBatchStatus { get; set; } + /// <summary> + /// 鏄惁宸茬粡鎴愬姛鍙戣捣浜� + /// </summary> + public bool HasSendOk { get; set; } = false; + /// <summary> + /// 褰撳墠椤电爜 + /// </summary> + public int PageIndex { get; set; } + /// <summary> + /// 椤甸潰澶у皬 + /// </summary> + public int PageSize { get; set; } + + } + + public class TransferOderOut + { + public List<WeChatTransferOrder> listdata { get; set; } + public int TotalCount { get; set; } + } + + } diff --git a/cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs b/cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs index 697153d..36193e0 100644 --- a/cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs +++ b/cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs @@ -33,18 +33,22 @@ /// <summary> /// 鑾峰彇鎴栬缃井淇℃壒娆″崟鍙枫�� /// </summary> - [SugarColumn(ColumnDescription = "鑾峰彇鎴栬缃井淇℃壒娆″崟鍙�")] - public string BatchId { get; set; } + [SugarColumn(ColumnDescription = "鑾峰彇鎴栬缃井淇℃壒娆″崟鍙�",IsNullable =true)] + public string? BatchId { get; set; } /// <summary> /// 鑾峰彇鎴栬缃壒娆$姸鎬併�� /// </summary> - [SugarColumn(ColumnDescription = "鑾峰彇鎴栬缃壒娆$姸鎬�")] + [SugarColumn(ColumnDescription = "鑾峰彇鎴栬缃壒娆$姸鎬�",IsNullable =true)] public string? BatchStatus { get; set; } - + /// <summary> + /// 鐢ㄦ埛ID銆� + /// </summary> + [SugarColumn(ColumnDescription = "鐢ㄦ埛ID")] + public int UserID { get; set; } @@ -130,14 +134,21 @@ /// </summary> [SugarColumn(ColumnDescription = "鑾峰彇鎴栬缃浆璐﹀満鏅爣璇嗙", IsNullable = true)] public string? TransferSceneId { get; set; } - + /// <summary> + /// 閿欒娑堟伅 + /// </summary> + [SugarColumn(ColumnDescription = "閿欒娑堟伅", IsNullable = true)] + public string? ErrorMsg { get; set; } - - - /// <summary> - /// 鑾峰彇鎴栬缃壒娆′腑鐨勮缁嗚浆璐﹀垪琛ㄣ�� - /// </summary> - [Navigate(NavigateType.OneToMany,nameof(WeChatTransferItem.WeChatTransferOrderID))] + /// <summary> + /// 閿欒鏍囪瘑 + /// </summary> + [SugarColumn(ColumnDescription = "閿欒鏍囪瘑", IsNullable = true)] + public string? ErrorCode { get; set; } + /// <summary> + /// 鑾峰彇鎴栬缃壒娆′腑鐨勮缁嗚浆璐﹀垪琛ㄣ�� + /// </summary> + [Navigate(NavigateType.OneToMany,nameof(WeChatTransferItem.WeChatTransferOrderID))] public List<WeChatTransferItem> TransferDetailList { get; set; } } @@ -146,6 +157,7 @@ /// 杞处鍗曞垪琛� /// </summary> [SugarTable(TableDescription = "杞处鍗曡处璇︾粏鍒楄〃妯″瀷")] + [CoderFirst] public class WeChatTransferItem:BaseModel { /// <summary> diff --git a/cylsg/cylsg.Web.Core/Startup.cs b/cylsg/cylsg.Web.Core/Startup.cs index 17e5e41..2a5ead3 100644 --- a/cylsg/cylsg.Web.Core/Startup.cs +++ b/cylsg/cylsg.Web.Core/Startup.cs @@ -47,6 +47,7 @@ services.AddControllersWithViews() .AddInjectWithUnifyResult<EzCoreRESTFulResultProvider>(); + services.AddFileLogging(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/cylsg/cylsg.Web.Entry/appsettings.json b/cylsg/cylsg.Web.Entry/appsettings.json index bb50097..6982c20 100644 --- a/cylsg/cylsg.Web.Entry/appsettings.json +++ b/cylsg/cylsg.Web.Entry/appsettings.json @@ -5,6 +5,14 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning", "Microsoft.EntityFrameworkCore": "Information" + }, + + "File": { + "FileName": "application.log", // 鏃ュ織鏂囦欢瀹屾暣璺緞鎴栨枃浠跺悕锛屾帹鑽� .log 浣滀负鎷撳睍鍚� + "Append": true, // 杩藉姞鍒板凡瀛樺湪鏃ュ織鏂囦欢鎴栬鐩栧畠浠� + "MinimumLevel": "Information", // 鏈�浣庢棩蹇楄褰曠骇鍒� + "FileSizeLimitBytes": 0, // 鎺у埗姣忎竴涓棩蹇楁枃浠舵渶澶у瓨鍌ㄥぇ灏忥紝鍗曚綅鏄� B锛屼篃灏辨槸 1024 鎵嶇瓑浜� 1KB锛岄粯璁ゆ棤闄愬埗锛屽鏋滄寚瀹氫簡璇ュ�硷紝閭d箞鏃ュ織鏂囦欢澶у皬瓒呭嚭浜嗚閰嶇疆灏变細鍒涘缓鏂扮殑鏃ュ織鏂囦欢锛屾柊鍒涘缓鐨勬棩蹇楁枃浠跺懡鍚嶈鍒欙細鏂囦欢鍚�+[閫掑搴忓彿].log + "MaxRollingFiles": 0 // 鎺у埗鏈�澶у垱寤虹殑鏃ュ織鏂囦欢鏁伴噺锛岄粯璁ゆ棤闄愬埗锛岄厤鍚� FileSizeLimitBytes 浣跨敤锛屽鏋滄寚瀹氫簡璇ュ�硷紝閭d箞瓒呭嚭璇ュ�煎皢浠庢渶鍒濇棩蹇楁枃浠朵腑浠庡ご鍐欏叆瑕嗙洊 } }, "AllowedHosts": "*", @@ -39,7 +47,7 @@ "ValidateAudience": true, // 鏄惁楠岃瘉绛炬敹鏂癸紝bool 绫诲瀷锛岄粯璁rue "ValidAudience": "www.51zhengcai.com", // 绛炬敹鏂癸紝string 绫诲瀷 "ValidateLifetime": true, // 鏄惁楠岃瘉杩囨湡鏃堕棿锛宐ool 绫诲瀷锛岄粯璁rue锛屽缓璁畉rue - "ExpiredTime": 20, // 杩囨湡鏃堕棿锛宭ong 绫诲瀷锛屽崟浣嶅垎閽燂紝榛樿20鍒嗛挓 + "ExpiredTime": 1440, // 杩囨湡鏃堕棿锛宭ong 绫诲瀷锛屽崟浣嶅垎閽燂紝榛樿20鍒嗛挓 "ClockSkew": 5, // 杩囨湡鏃堕棿瀹归敊鍊硷紝long 绫诲瀷锛屽崟浣嶇锛岄粯璁� 5绉� "Algorithm": "HS256", // 鍔犲瘑绠楁硶锛宻tring 绫诲瀷锛岄粯璁� HS256 "RefreshTokenExpires": 1440 //鍒嗛挓 1澶� 1440鍒嗛挓 diff --git a/cylsg/cylsg.redis/EzCoreNetRedisService.cs b/cylsg/cylsg.redis/EzCoreNetRedisService.cs index 5137422..5ce6426 100644 --- a/cylsg/cylsg.redis/EzCoreNetRedisService.cs +++ b/cylsg/cylsg.redis/EzCoreNetRedisService.cs @@ -10,7 +10,7 @@ namespace EzCoreNet.Redis { - public class EzCoreNetRedisService : IEzCoreNetRedisService,IScoped + public class EzCoreNetRedisService : IEzCoreNetRedisService, IScoped { public bool Add(string key, object value, int expireSeconds) { @@ -35,9 +35,9 @@ return RedisHelper.Ttl(key); } - public bool SetTtl(string key, int ttl) + public bool SetTtl(string key, int ttl) { - return RedisHelper.Expire(key, ttl); + return RedisHelper.Expire(key, ttl); } /// <summary> @@ -70,7 +70,7 @@ { return RedisHelper.Keys(Prefix + "*"); } - + /// <summary> /// 鍚庡幓涓�涓紦瀛橈紝濡傛灉娌℃湁锛屽垯浠庢暟鎹簱涓幏鍙栵紝 /// </summary> @@ -102,23 +102,61 @@ public long Incrby(string key) { - return RedisHelper.IncrBy(key); + return RedisHelper.IncrBy(key); } public string Get32sn() { string formattedDate = DateTime.Now.ToString("yyyyMMdd"); - + var sn = Incrby($"CreatSnKey:{formattedDate}"); - if(sn<1) + if (sn < 1) { //璁剧疆鏈夋晥鏈熼檺涓�24灏忔椂 SetTtl($"CreatSnKey:{formattedDate}", 24 * 60 * 60); } - string re = "Ez" + formattedDate + sn.ToString(); + string re = "EZCoreCanYinLingShiGon" + formattedDate + sn.ToString(); return re; } + + /// <summary> + /// + /// </summary> + /// <param name="LockKey"></param> + /// <param name="expireSeconds"></param> + /// <param name="value"></param> + /// <returns></returns> + + public async Task<bool> TryLock(string LockKey, int expireSeconds = 600, string value = "Lock") + { + if (await RedisHelper.SetNxAsync(LockKey, value) == true) + { + if( await RedisHelper.ExpireAsync(LockKey, expireSeconds)==false) + return false; + return true; + } + else + return false; + + + } + + + /// <summary> + /// + /// </summary> + /// <param name="LockKey"></param> + /// <returns></returns> + public async Task<bool > TryUnLock(string LockKey) + { + var b= await RedisHelper.DelAsync(LockKey); + if(b>0) + return true; + else + return false; + + } } } diff --git a/cylsg/cylsg.redis/IEzCoreNetRedisService.cs b/cylsg/cylsg.redis/IEzCoreNetRedisService.cs index e92bb05..e7ae2af 100644 --- a/cylsg/cylsg.redis/IEzCoreNetRedisService.cs +++ b/cylsg/cylsg.redis/IEzCoreNetRedisService.cs @@ -86,6 +86,21 @@ /// 鑾峰彇32浣峴n /// </summary> string Get32sn(); - + /// <summary> + /// 璁剧疆閿� + /// </summary> + /// <param name="LockKey"> 閿並ey</param> + /// <param name="value"> 鍊� 榛樿lock</param> + /// <param name="expireSeconds"> 鏈�闀块攣瀹氭椂闂� 榛樿600</param> + /// <returns></returns> + Task<bool> TryLock(string LockKey, int expireSeconds = 600,string value = "Lock"); + + /// <summary> + /// 瑙i攣 + /// </summary> + /// <param name="LockKey"></param> + /// <returns></returns> + Task<bool> TryUnLock(string LockKey); + } } diff --git a/cylsg/cylsg.utility/StaticStringDef.cs b/cylsg/cylsg.utility/StaticStringDef.cs new file mode 100644 index 0000000..ffccbdb --- /dev/null +++ b/cylsg/cylsg.utility/StaticStringDef.cs @@ -0,0 +1,24 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cylsg.utility +{ + /// <summary> + /// 甯哥敤瀛楃涓插畾涔� + /// </summary> + public static class StaticStringDef + { + /// <summary> + /// 鎻愮幇鑷攣KeY + /// </summary> + public static string TransferMoneyLockKey = "TransferMoneyLockKey:"; + + /// <summary> + /// 鎻愮幇缁熻绱閿� + /// </summary> + public static string TransferMoneyManKey = "TransferMoneyManKey:"; + } +} -- Gitblit v1.9.1