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