.gitignore
@@ -27,3 +27,11 @@ cylsg/EzUpFile/bin/ cylsg/cylsg.Web.Entry/wwwroot/wechartKey/ cylsg/cylsg.Web.Entry/wwwroot/1669018589_20240820_cert.zip cylsg/Cylsg.Filter/bin/ cylsg/Cylsg.Filter/obj/ cylsg/EzInitQ/bin/ cylsg/EzInitQ/obj/ cylsg/EzInitqMessageDef/bin/ cylsg/EzInitqMessageDef/obj/ cylsg/EzJob/bin/ cylsg/EzJob/obj/ cylsg/Cylsg.Filter/Cylsg.Filter.csproj
New file @@ -0,0 +1,14 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" /> </ItemGroup> </Project> cylsg/Cylsg.Filter/LimitFilterAttribute.cs
New file @@ -0,0 +1,121 @@ using EzCoreNet.Redis; using Furion; using Furion.FriendlyException; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace Cylsg.Filter { public enum Limttype { /// <summary> ///共用限流 /// </summary> All, /// <summary> /// 用户级限流 /// </summary> User } /// <summary> /// 限流 /// </summary> public class LimitFilterAttribute : Attribute,IAsyncActionFilter { /// <summary> /// redis限流文件夹名称 /// </summary> private const string DirKey = "UserRateLimit:"; /// <summary> /// 限流发生时 返回的提示 /// </summary> public string ResponseMeg { get; set; } = "请不要在短时间内重复访问该资源"; /// <summary> /// 限流时长 单位秒 默认为1秒 /// </summary> public int timespan { get; set; } = 1; /// <summary> /// 限流次数 默认为1次 /// </summary> public int InCount { get; set; } = 1; /// <summary> /// 默认为用户级 /// </summary> public Limttype LimiType { get; set; }= Limttype.All; public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var redisHelper = App.GetService<IEzCoreNetRedisService>(); if(redisHelper == null) { throw Oops.Oh("内存服务异常,请求终止"); } var path = context.HttpContext?.Request?.Path.Value; if (string.IsNullOrEmpty(path)) { //非API控制器,直接放行 没有找到路径 await next.Invoke(); return; } string key = ""; if (LimiType == Limttype.User) { if (App.User?.FindFirstValue("UserID") == null) { //没有用户直接放行 await next.Invoke(); return; } key = $"{DirKey}:{path}:{App.User?.FindFirstValue("UserID")}"; } else if(LimiType == Limttype.All) { key = $"{DirKey}:{path}:All"; } else { await next.Invoke(); return; } long? count = redisHelper.Get<int>(key); if (count == null || count == 0) { redisHelper.Incrby(key); redisHelper.SetTtl(key, timespan); } else if (count >= (InCount)) { throw Oops.Oh(ResponseMeg); } else { redisHelper.Incrby(key); } await next.Invoke(); } } } cylsg/EzInitQ/EzInitQ.csproj
New file @@ -0,0 +1,24 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> <ProjectReference Include="..\cylsg.Model\cylsg.Model.csproj" /> <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" /> <ProjectReference Include="..\cylsg.services\cylsg.services.csproj" /> <ProjectReference Include="..\EzInitqMessageDef\EzInitqMessageDef.csproj" /> <ProjectReference Include="..\EzWechat\EzWechat.csproj" /> </ItemGroup> <ItemGroup> <None Update="InitQConfig.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> </Project> cylsg/EzInitQ/InitQConfig.json
New file @@ -0,0 +1,8 @@ { //请保持redis为正常可用 "InitQRedisConfig": { // 如果采用容器化部署Service 要写成redis的服务名,否则写地址 "ConnectionString": "127.0.0.1:6379,password=,connectTimeout=30000,responseTimeout=30000,abortConnect=false,connectRetry=1,syncTimeout=10000,DefaultDatabase=3" //redis数据库连接字符串 } } cylsg/EzInitQ/Mapper.cs
New file @@ -0,0 +1,21 @@ using cylsg.Model.TransferOrder; using cylsg.Model.UserModel; using Mapster; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzInitQ { public class Mapper : IRegister { public void Register(TypeAdapterConfig config) { config.ForType<CreateTransferBatchRequest, WeChatTransferOrder>(); } } } cylsg/EzInitQ/PayServiceMessageQ.cs
New file @@ -0,0 +1,195 @@ using cylsg.Core; using cylsg.Model.TransferOrder; using cylsg.Model.UserModel; using cylsg.utility.Extend; using EzCoreNet.Redis; using EzInitqMessageDef; using EzWechat; using Furion; using Furion.DatabaseAccessor; using Furion.FriendlyException; using InitQ.Abstractions; using InitQ.Attributes; using Mapster; using MapsterMapper; using Newtonsoft.Json; using SKIT.FlurlHttpClient.Wechat.TenpayV3.Models; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzInitQ { public class PayServiceMessageQ: IRedisSubscribe { private IEzCoreNetRedisService _ezCoreNetRedisService; private IWecharPayServicecs _wecharPayServicecs; private IMapper _mapper; //public PayServiceMessageQ(IEzCoreNetRedisService ezCoreNetRedisService,IWecharPayServicecs wecharPayServicecs,IMapper mapper) { // _ezCoreNetRedisService = ezCoreNetRedisService; // _wecharPayServicecs = wecharPayServicecs; // _mapper = mapper; //} /// <summary> /// 微信转账队列处理 /// </summary> [Subscribe(InitQMessages.WxTransferMSQ)] public async void WxTransferMSQInit(string msg) { _ezCoreNetRedisService = App.GetService<IEzCoreNetRedisService>(); _wecharPayServicecs = App.GetService<IWecharPayServicecs>(); _mapper = App.GetService<IMapper>(); var userdata= JsonConvert.DeserializeObject<WxTransferMsqModels>(msg); if( userdata != null ) { throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到用户信息+++++++++{msg}"); } var UserRs = new BaseRepository<User>(); var user = await UserRs.GetByIdAsync(userdata.UserID); if(user !=null) { throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到用户信息++++++++{msg}"); } if(string.IsNullOrEmpty( user.WxOpenId)) { throw Oops.Oh($"队列WxTransferMSQInit 处理失败,没有获取到openID+++++++++{msg}"); } var uWorkRs = new BaseRepository<UserWorker>(); var UserTiXianDetailwork = new BaseRepository<UserTiXianDetail>(); var WeChatTransferOrderwork = new BaseRepository<WeChatTransferOrder>(); var uWork = await uWorkRs.GetFirstAsync(x=>x.UserId==user.Id); if((uWork != null)& ((uWork.TiXianZonge - uWork.YiTiXianJine) > userdata.money)) { var TransferOrder = new WeChatTransferOrder { CreateBy = uWork.UserId.ToString(), CreateTime = DateTime.Now, BatchId = _ezCoreNetRedisService.Get32sn(), OutBatchNumber = _ezCoreNetRedisService.Get32sn(), Remake = "川印工资支付", TransferDetailList = new List<WeChatTransferItem>() }; try { //满足条件,发起支付 await UserTiXianDetailwork.AsTenant().BeginTranAsync(); var moneylist= userdata.money; if(moneylist<=0.3m) { //放弃处理,低于0.3毛不能发起转账 throw Oops.Oh($"队列WxTransferMSQInit 处理失败,转账金额低于0.3元+++++++++{msg}"); } var maxPayItem = Convert.ToDecimal(App.Configuration["WechartPay:PayMoneyMax"].toInt()); ; while ((moneylist > maxPayItem)) { TransferOrder.TransferDetailList.Add(new WeChatTransferItem { CreateBy = uWork.UserId.ToString(), CreateTime = TransferOrder.CreateTime, IsEn = true, OpenId = user.WxOpenId, OutDetailNumber = _ezCoreNetRedisService.Get32sn(), TransferAmount = (int )maxPayItem * 100, TransferRemark="川印工资支付", }); moneylist -= maxPayItem; } if (moneylist <= 0.3m) { //如果这里低于0.3毛,将社区预检,留下次处理 userdata.money -= moneylist; } else { TransferOrder.TransferDetailList.Add(new WeChatTransferItem { CreateBy = uWork.UserId.ToString(), CreateTime = TransferOrder.CreateTime, IsEn = true, OpenId = user.WxOpenId, OutDetailNumber = _ezCoreNetRedisService.Get32sn(), TransferAmount = (int)(moneylist * 100), TransferRemark = "川印工资支付", }); } TransferOrder = await WeChatTransferOrderwork.AsSugarClient().InsertNav(TransferOrder).Include(x=>x.TransferDetailList).ExecuteReturnEntityAsync(); await UserTiXianDetailwork.InsertAsync(new UserTiXianDetail { CreateBy = uWork.UserId.ToString(), CreateTime = DateTime.Now, UserId = user.Id, ZhiChuShouRu= 0, YiTiXianJine=userdata.money, WeChatTransferOrderID= TransferOrder.Id, }); //钱包余额调整 uWork.YiTiXianJine += userdata.money; uWork.UpDataBy = uWork.UserId.ToString(); uWork.UpDataTime = DateTime.Now; await uWorkRs.UpdateAsync(uWork); await UserTiXianDetailwork.AsTenant().CommitTranAsync(); } catch (Exception) { await UserTiXianDetailwork.AsTenant().RollbackTranAsync(); throw; } // 发起支付 var requit = _mapper.Map<CreateTransferBatchRequest>(TransferOrder); 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 throw Oops.Oh($"微信请求付款失败+++++++++++++{ret.ToString()}+++++++++++msg{msg}"); } } } } cylsg/EzInitQ/Startup.cs
New file @@ -0,0 +1,36 @@ using Furion; using InitQ; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzInitQ { public class Startup : AppStartup { public void ConfigureServices(IServiceCollection services) { services.AddInitQ(m => { m.SuspendTime = 1000; m.IntervalTime = 1000; m.ConnectionString = App.Configuration["InitQRedisConfig:ConnectionString"]; m.ListSubscribe = new List<Type>() { typeof(PayServiceMessageQ) }; m.ShowLog = false; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } } } cylsg/EzInitqMessageDef/EzInitqMessageDef.csproj
New file @@ -0,0 +1,17 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="InitQ" Version="1.0.0.19" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> </ItemGroup> </Project> cylsg/EzInitqMessageDef/InitQMessages.cs
New file @@ -0,0 +1,46 @@ using Furion; using InitQ.Cache; using Newtonsoft.Json; using StackExchange.Redis; namespace EzInitqMessageDef { /// <summary> /// 队列消息定义 /// </summary> public static class InitQMessages { /// <summary> /// 转账 /// </summary> public const string WxTransferMSQ = "WxTransferMSQ"; /// <summary> /// 向堆栈中压入一个消息 /// </summary> /// <typeparam name="T"> 类型</typeparam> /// <param name="MessageName"> 消息名称</param> /// <param name="msg">类型</param> /// <returns></returns> public static async Task<bool> SendMessageAsync<T>(string MessageName,T msg) { var _redis= App.GetService<ICacheService>(); await _redis.ListRightPushAsync(MessageName, JsonConvert.SerializeObject(msg)); return true; } /// <summary> /// 向堆栈中压入一个消息 /// </summary> /// <param name="MessageName"></param> /// <param name="msg"></param> /// <returns></returns> public static async Task<bool> SendMessageAsync(string MessageName, string msg) { var _redis = App.GetService<ICacheService>(); await _redis.ListRightPushAsync(MessageName, msg); return true; } } } cylsg/EzInitqMessageDef/MsqModels.cs
New file @@ -0,0 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzInitqMessageDef { /// <summary> /// 微信提现请求 /// </summary> public class WxTransferMsqModels { /// <summary> /// 体现金额 /// </summary> public decimal money { get; set; } /// <summary> /// 提现用户 /// </summary> public int UserID { get; set; } } } cylsg/EzJob/EzJob.csproj
New file @@ -0,0 +1,17 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> <ProjectReference Include="..\cylsg.Model\cylsg.Model.csproj" /> <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" /> <ProjectReference Include="..\cylsg.services\cylsg.services.csproj" /> <ProjectReference Include="..\EzWechat\EzWechat.csproj" /> </ItemGroup> </Project> cylsg/EzJob/StartUpcs.cs
New file @@ -0,0 +1,30 @@ using Furion; using Furion.Schedule; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzJob { public class Startup : AppStartup { public void ConfigureServices(IServiceCollection services) { services.AddSchedule(options => { options.AddJob<WeChatJob>(concurrent: false, Triggers.Hourly()); // 串行 }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } } } cylsg/EzJob/WeChatJob.cs
New file @@ -0,0 +1,100 @@ using cylsg.Core; using cylsg.Model.TransferOrder; using EzWechat; using Furion; using Furion.FriendlyException; using Furion.Schedule; using Microsoft.AspNetCore.Http.HttpResults; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EzJob { public class WeChatJob : IJob { /// <summary> /// 查询订单完成情况 /// </summary> /// <param name="context"></param> /// <param name="stoppingToken"></param> /// <returns></returns> public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) { var payServices= App.GetService<IWecharPayServicecs>(); if(payServices == null) { throw Oops.Oh($"定时任务WeChatJob 处理失败,未能获取IWecharPayServicecs 服务"); } 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(); foreach( var o in OderList ) { var ret = await payServices.TransferBatches(new SKIT.FlurlHttpClient.Wechat.TenpayV3.Models.GetTransferBatchByBatchIdRequest { BatchId = o.BatchId }); if(ret != null) { if(ret.IsSuccessful()) { if (ret.TransferBatch.BatchStatus == "FINISHED") { //已经全部完成 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; foreach (var item in o.TransferDetailList) { var del =ret.TransferDetailList.Where(x=>x.OutDetailNumber==item.OutDetailNumber).FirstOrDefault(); 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"; break; default: item.DetailStatus = del?.DetailStatus; break; } } } } } } } } } cylsg/EzUpFile/UpFileController.cs
@@ -78,7 +78,7 @@ public async Task<object> IaiAddPersoBase64([FromServices] IEzFileUploadService fileUploadService, UpDataFileData param) { if (string.IsNullOrEmpty(param.imgBase64)) throw Oops.Oh("没有文件类容"); throw Oops.Oh("没有文件内容"); if (string.IsNullOrEmpty(param.Name)) throw Oops.Oh("没有姓名"); if (string.IsNullOrEmpty(param.CordId)) cylsg/EzWechat/IWecharPayServicecs.cs
@@ -14,6 +14,18 @@ /// </summary> /// <param name="request"></param> /// <returns></returns> Task<CreateTransferBatchResponse> PayOderAsync(CreateTransferBatchRequest request); Task<CreateTransferBatchResponse> Transfer(CreateTransferBatchRequest request); /// <summary> /// 通过微信 BatchId 查询支付状态 /// </summary> /// <param name="request"></param> /// <returns></returns> Task<GetTransferBatchByBatchIdResponse> TransferBatches(GetTransferBatchByBatchIdRequest request); /// <summary> /// 根据Detail id 查询名单详细 /// </summary> /// <param name="request"></param> /// <returns></returns> Task<GetTransferBatchDetailByDetailIdResponse> TransferBatchesDetails(GetTransferBatchDetailByDetailIdRequest request); } } cylsg/EzWechat/WecharPayServicecs.cs
@@ -32,12 +32,26 @@ _V3Client = WechatTenpayClientBuilder.Create(options).Build(); } public async Task<CreateTransferBatchResponse> PayOderAsync(CreateTransferBatchRequest request) public async Task<CreateTransferBatchResponse> Transfer(CreateTransferBatchRequest request) { var response = await _V3Client.ExecuteCreateTransferBatchAsync(request); var response = await _V3Client.ExecuteCreateTransferBatchAsync(request); return response; } public async Task<GetTransferBatchByBatchIdResponse> TransferBatches(GetTransferBatchByBatchIdRequest request) { var response = await _V3Client.ExecuteGetTransferBatchByBatchIdAsync(request); return response; } public async Task<GetTransferBatchDetailByDetailIdResponse> TransferBatchesDetails(GetTransferBatchDetailByDetailIdRequest request) { var response = await _V3Client.ExecuteGetTransferBatchDetailByDetailIdAsync(request); return response; } } } cylsg/EzWechat/WechatConfig.json
@@ -10,7 +10,10 @@ "MerchantV3Secret": "lojdhuqyt5648dikunm623ddsl2543a5", "MerchantId": "1669018589", "MerchantCertificateSerialNumber": "49FFE8CB27B5EDD026BFF23C41F0DAA83405EB10", "apiclient_keyFile": "wwwroot\\wechartKey\\apiclient_key.pem" "apiclient_keyFile": "wwwroot\\wechartKey\\apiclient_key.pem", "PayMoneyMax": 200 } } cylsg/cylsg.Application/LogoInController.cs
@@ -105,7 +105,7 @@ } var jwt = new EzJwtModel() { ITCode = user.ItCode, // ITCode = user.ItCode, NickName = user.Nickname, UserID = user.Id, cylsg/cylsg.Application/Orders/Dtos/OrderDto.cs
@@ -225,6 +225,12 @@ public string CheckPhoto { get; set; } /// <summary> /// 人脸图片 /// </summary> public string FaceImg { get; set; } } cylsg/cylsg.Application/Orders/OrderWorkerAppService.cs
@@ -3,9 +3,11 @@ using cylsg.Core; using cylsg.Model.OrderModel; using cylsg.Model.UserModel; using EzTencentCloud; using Furion.LinqBuilder; using MapsterMapper; using Org.BouncyCastle.Asn1.X509; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Linq; @@ -26,11 +28,13 @@ private readonly ISystemService _systemService; private ISqlSugarClient _sqlSugarClient; private IMapper _mapper; public OrderWorkerAppService(ISystemService systemService, ISqlSugarClient sqlSugarClient, IMapper mapper) private readonly ITencentCloudService _tencentCloudService; public OrderWorkerAppService(ISystemService systemService, ISqlSugarClient sqlSugarClient, IMapper mapper,ITencentCloudService tencentCloudService) { _systemService = systemService; _sqlSugarClient = sqlSugarClient; _mapper = mapper; _tencentCloudService = tencentCloudService; } @@ -176,6 +180,7 @@ return result; } @@ -420,6 +425,30 @@ { throw Oops.Oh("该打卡记录已经审批,不能打卡!"); } //人脸识别 if (App.Configuration["VerifyFace:Enable"].ObjToBool()) { if (string.IsNullOrWhiteSpace(dakaDto.FaceImg)) { throw Oops.Oh("未识别人脸"); } var UserWorkRes = await new BaseRepository<UserWorker>().GetFirstAsync(x => x.UserId == userid); if (UserWorkRes == null) { throw Oops.Oh("员工未注册成工人"); } var faseres = _tencentCloudService.VerifyFace(dakaDto.FaceImg, UserWorkRes.IAIPersonId); if (faseres.IsMatch != true) { throw Oops.Oh("不是本人"); } } if(orderBiddingDetail == null) { orderBiddingDetail = new OrderBiddingDetail(); cylsg/cylsg.Application/Transfer/UserTransfer.cs
New file @@ -0,0 +1,58 @@ using cylsg.Core; using cylsg.Model.UserModel; using Cylsg.Filter; using EzInitqMessageDef; using SKIT.FlurlHttpClient.Wechat.Api.Models; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace cylsg.Application.Transfer { /// <summary> /// 提现服务程序 /// </summary> /// [DynamicApiController] [Authorize] public class UserTransfer { public UserTransfer() { } /// <summary> /// 提现 /// </summary> /// <param name="Money"></param> [LimitFilter(LimiType = Limttype.User,timespan =10,ResponseMeg ="请勿在10秒内重复请求")] public async Task GetTransferMoney( [FromQuery]decimal Money) { var rs= new BaseRepository<UserWorker>(); var UserID = App.User?.FindFirstValue("UserID"); int userid = 0; if (!string.IsNullOrEmpty(UserID)) { userid = int.Parse(UserID); } else { throw Oops.Oh("没有识别到用户收入"); } var uw= await rs.GetByIdAsync(userid); if((uw.TiXianZonge-uw.YiTiXianJine)< Money) { throw Oops.Oh("用户余额不足"); } var b = await InitQMessages.SendMessageAsync(InitQMessages.WxTransferMSQ, Money.ToString()); if (b) return; else throw Oops.Oh("请求失败"); } } } cylsg/cylsg.Application/Users/UserAppService.cs
@@ -284,5 +284,7 @@ return userDto; } } } cylsg/cylsg.Application/applicationsettings.json
@@ -21,6 +21,11 @@ } ] }, "VerifyFace": { "Enable": true }, "CorsAccessorSettings": { "WithExposedHeaders": [ "access-token", cylsg/cylsg.Application/cylsg.Application.csproj
@@ -24,9 +24,11 @@ <ItemGroup> <ProjectReference Include="..\cylsg.Authorization\cylsg.Authorization.csproj" /> <ProjectReference Include="..\cylsg.Core\cylsg.Core.csproj" /> <ProjectReference Include="..\Cylsg.Filter\Cylsg.Filter.csproj" /> <ProjectReference Include="..\cylsg.Model\cylsg.Model.csproj" /> <ProjectReference Include="..\cylsg.redis\cylsg.redis.csproj" /> <ProjectReference Include="..\cylsg.utility\cylsg.utility.csproj" /> <ProjectReference Include="..\EzInitqMessageDef\EzInitqMessageDef.csproj" /> <ProjectReference Include="..\EzTencentCloud\EzTencentCloud.csproj" /> <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" /> <ProjectReference Include="..\EzWechat\EzWechat.csproj" /> cylsg/cylsg.Application/cylsg.Application.xml
@@ -62,6 +62,586 @@ jscode </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.Id"> <summary> 招工Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.OrderUserId"> <summary> 招工用户id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.OrderName"> <summary> 招工名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WordStartTime"> <summary> 工作开始时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WordEndTime"> <summary> 工作结束时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.Demand"> <summary> 需求 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WorderCount"> <summary> 招工人数 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WorderCounted"> <summary> 已招工人数 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WorderAddress"> <summary> 工作地点 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.ContactPhone"> <summary> 联系电话 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WorkerType"> <summary> 工作方式 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.WorkPrice"> <summary> 工价 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.OrderStatus"> <summary> 招工状态 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.OrderStatusName"> <summary> 是否选中 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.IsSelected"> <summary> 是否选中 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.IsSelectedName"> <summary> 是否选中 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDto.orderBidding"> <summary> 招工明细 </summary> </member> <member name="T:cylsg.Application.Orders.Dtos.OrderBiddingDto"> <summary> 招工明细 </summary> </member> <member name="M:cylsg.Application.Orders.Dtos.OrderBiddingDto.#ctor"> <summary> 招工明细 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.Id"> <summary> 工人投递Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.WorkerUserId"> <summary> 用户id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.WorkerName"> <summary> 用户昵称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.WorkerAvatar"> <summary> 用户昵称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.OrderId"> <summary> 招工id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.IsSelected"> <summary> 是否选中 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.IsSelectedName"> <summary> 是否选中 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.Selectedtime"> <summary> 选中时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.Remark"> <summary> 备注 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDto.Salary"> <summary> 工资总额 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.BaoMingDto.OrderId"> <summary> 招工OrderId </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.QueRenDto.OrderBiddingId"> <summary> 招工明细OrderBiddingId </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaDetailDto.OrderBiddingDetailId"> <summary> 招工明细OrderBiddingId </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaDto.OrderBiddingId"> <summary> 招工明细OrderBiddingId </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaDto.CheckPhoto"> <summary> 打卡照片 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaDto.FaceImg"> <summary> 人脸图片 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.OrderBiddingDetailId"> <summary> 工人工作明细表Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.OrderBiddingId"> <summary> 工人投递id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.WorkDate"> <summary> 工作日期 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.WorkTime"> <summary> 工作时长 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.WorkCount"> <summary> 计件数量 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.TodaySalary"> <summary> 当日工资 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.IsShenPi"> <summary> 审批状态 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.ShenPitime"> <summary> 审批时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.IsTiXian"> <summary> 是否提现 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.TiXiantime"> <summary> 提现时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailDto.orderBiddingDetailCheck"> <summary> 打卡明细 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailCheckDto.OrderBiddingDetailCheckId"> <summary> 打卡记录表Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailCheckDto.OrderBiddingDetailId"> <summary> 工人工作明细表Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailCheckDto.CheckPhoto"> <summary> 打卡照片 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderBiddingDetailCheckDto.Checktime"> <summary> 打卡时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.OrderBiddingDetailId"> <summary> 招工打卡Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.OrderName"> <summary> 招工名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkDate"> <summary> 工作日期 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkTime"> <summary> 工作时长 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkerType"> <summary> 工作方式 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkerTypeName"> <summary> 工作方式名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkPrice"> <summary> 工价 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.WorkCount"> <summary> 计件数量 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.TodaySalary"> <summary> 当日工资 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.IsShenPi"> <summary> 审批状态 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.IsShenPiName"> <summary> 审批状态名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaDto.DakaMingxi"> <summary> 打卡明细 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.OrderBiddingDetailId"> <summary> 招工打卡Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.OrderName"> <summary> 招工名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkDate"> <summary> 工作日期 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkTime"> <summary> 工作时长 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkerType"> <summary> 工作方式 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkerTypeName"> <summary> 工作方式名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkPrice"> <summary> 工价 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkCount"> <summary> 计件数量 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.TodaySalary"> <summary> 当日工资 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.IsShenPi"> <summary> 审批状态 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.IsShenPiName"> <summary> 审批状态名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkerUserId"> <summary> 用户id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkerUserName"> <summary> 用户昵称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.WorkerUserAvatar"> <summary> 用户头像 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaMingxiDto.orderBiddingDetailCheck"> <summary> 打卡明细 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaQuerenDetailDto.OrderBiddingDetailId"> <summary> 招工打卡Id </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaQuerenDetailDto.WorkTime"> <summary> 工作时长 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaQuerenDetailDto.WorkCount"> <summary> 计件数量 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.DakaQuerenDetailDto.TodaySalary"> <summary> 当日工资 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageBaseSearch.PageIndex"> <summary> 页码 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageBaseSearch.PageSize"> <summary> 分页大小 </summary> </member> <member name="T:cylsg.Application.Orders.Dtos.PageResult`1"> <summary> 分页数据信息 </summary> <typeparam name="T"></typeparam> </member> <member name="P:cylsg.Application.Orders.Dtos.PageResult`1.PageIndex"> <summary> 页码 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageResult`1.PageSize"> <summary> 分页大小 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageResult`1.TotalCount"> <summary> 记录总数 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageResult`1.Items"> <summary> 记录集合 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.PageResult`1.TotalPage"> <summary> 总页数 </summary> </member> <member name="T:cylsg.Application.Orders.Dtos.OrderPageSearch"> <summary> 招工订单分页查询 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderPageSearch.OrderName"> <summary> 招工名称 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderPageSearch.WordStartTime"> <summary> 工作开始时间 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderPageSearch.WordEndTime"> <summary> 工作结束时间 </summary> </member> <member name="T:cylsg.Application.Orders.Dtos.OrderDakaPageSearch"> <summary> 招工订单分页查询 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaPageSearch.WordDate"> <summary> 工作日期 </summary> </member> <member name="P:cylsg.Application.Orders.Dtos.OrderDakaPageSearch.IsJieSuan"> <summary> 是否结算 </summary> </member> <member name="T:cylsg.Application.Orders.OrderCompanyAppService"> <summary> 订单公司接口 </summary> </member> <member name="M:cylsg.Application.Orders.OrderCompanyAppService.PostMyListPage(cylsg.Application.Orders.Dtos.OrderPageSearch)"> <summary> 查询公司已经发布的招工订单 </summary> <param name="page"></param> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderCompanyAppService.saveOrder(cylsg.Application.Orders.Dtos.OrderDto)"> <summary> 保存招工信息(新增/修改) </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderCompanyAppService.saveQueRen(cylsg.Application.Orders.Dtos.QueRenDto)"> <summary> 公司选择工人 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderCompanyAppService.PostMyComDakaListPage(cylsg.Application.Orders.Dtos.OrderDakaPageSearch)"> <summary> 查询公司下工人的打卡记录 </summary> <param name="page"></param> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderCompanyAppService.saveDakaDetail(cylsg.Application.Orders.Dtos.DakaQuerenDetailDto)"> <summary> 公司确认工人当天打卡详情 </summary> <returns></returns> </member> <member name="T:cylsg.Application.Orders.OrderWorkerAppService"> <summary> 订单工人接口 </summary> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.PostListPage(cylsg.Application.Orders.Dtos.OrderPageSearch)"> <summary> 查询工人可以投递的招工订单 </summary> <param name="page"></param> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.PostMyListPage(cylsg.Application.Orders.Dtos.OrderPageSearch)"> <summary> 查询工人已经投递的招工订单 </summary> <param name="page"></param> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.getOrder(System.Int32)"> <summary> 根据Id查询招工明细 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.saveBaoMing(cylsg.Application.Orders.Dtos.BaoMingDto)"> <summary> 工人投递 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.getDaka(cylsg.Application.Orders.Dtos.BaoMingDto)"> <summary> 进入打卡页面 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.saveDaka(cylsg.Application.Orders.Dtos.DakaDto)"> <summary> 工人打卡 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.PostMyDakaListPage(cylsg.Application.Orders.Dtos.OrderDakaPageSearch)"> <summary> 查询工人的打卡记录 </summary> <param name="page"></param> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.getDakaDetail(cylsg.Application.Orders.Dtos.DakaDetailDto)"> <summary> 进入填写/审批工价页面 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Orders.OrderWorkerAppService.saveDakaDetail(cylsg.Application.Orders.Dtos.DakaQuerenDetailDto)"> <summary> 工人确认当天打卡详情 </summary> <returns></returns> </member> <member name="T:cylsg.Application.SystemAppService"> <summary> 系统服务接口 @@ -73,5 +653,211 @@ </summary> <returns></returns> </member> <member name="T:cylsg.Application.Transfer.UserTransfer"> <summary> 提现服务程序 </summary> </member> <member name="M:cylsg.Application.Transfer.UserTransfer.GetTransferMoney(System.Decimal)"> <summary> 提现 </summary> <param name="Money"></param> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.Id"> <summary> 用户Id </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.Phone"> <summary> 电话 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.name"> <summary> 名称 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.ItCode"> <summary> 电话号码 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.Nickname"> <summary> 昵称 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.PassWord"> <summary> 密码 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.Avatar"> <summary> 头像地址 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.WxOpenId"> <summary> 微信WxOpenId </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.userWorker"> <summary> 用户工人信息 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserDto.userCompany"> <summary> 用户公司信息 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.Id"> <summary> 用户工人Id </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.UserId"> <summary> 用户id </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.IdCardFace"> <summary> 身份证正面路径 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.IdCardBack"> <summary> 身份证反面路径 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.name"> <summary> 姓名 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.Phone"> <summary> 电话号码 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.IdCode"> <summary> 身份证号 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.Address"> <summary> 联系地址 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.Resume"> <summary> 简历描述 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.TiXianZonge"> <summary> 提现总额 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserWorkerDto.YiTiXianJine"> <summary> 已提现金额 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Id"> <summary> 用户公司Id </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.UserId"> <summary> 用户id </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.BusinessLicense"> <summary> 营业执照路径 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Suppliername"> <summary> 企业名称 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Regtime"> <summary> 注册时间 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Address"> <summary> 联系地址 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Suppliercode"> <summary> 企业注册号 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Contact"> <summary> 联系人 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Phone"> <summary> 联系电话 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.Resume"> <summary> 公司简介 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.ChongZhiYue"> <summary> 充值余额 </summary> </member> <member name="P:cylsg.Application.Users.Dtos.UserCompanyDto.IsTiXian"> <summary> 是否可以充值,工人提现 </summary> </member> <member name="T:cylsg.Application.Users.UserAppService"> <summary> 用户接口 </summary> </member> <member name="M:cylsg.Application.Users.UserAppService.getUser"> <summary> 查询当前用户 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Users.UserAppService.saveUserWorker(cylsg.Application.Users.Dtos.UserWorkerDto)"> <summary> 保存用户工人信息 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Users.UserAppService.saveUserCompany(cylsg.Application.Users.Dtos.UserCompanyDto)"> <summary> 保存用户公司信息 </summary> <returns></returns> </member> <member name="M:cylsg.Application.Users.UserAppService.getUser(System.Int32)"> <summary> 根据Id查询用户 </summary> <returns></returns> </member> </members> </doc> cylsg/cylsg.Core/Attributes/CoderFirstAttribute.cs
@@ -12,5 +12,6 @@ [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class CoderFirstAttribute : Attribute { } } cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs
New file @@ -0,0 +1,249 @@ using cylsg.Core; using cylsg.Core.Attributes; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks; namespace cylsg.Model.TransferOrder { /// <summary> /// 转账单账模型 /// </summary> [SugarTable(TableDescription = "转账单账模型")] [CoderFirst] public class WeChatTransferOrder: BaseModel { /// <summary> /// ID /// </summary> [SugarColumn(ColumnDescription = "ID", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } /// <summary> /// 获取或设置商户批次单号。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置商户批次单号")] public string OutBatchNumber { get; set; } /// <summary> /// 获取或设置微信批次单号。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置微信批次单号")] public string BatchId { get; set; } /// <summary> /// 获取或设置批次状态。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置批次状态")] public string? BatchStatus { get; set; } /// <summary> /// 获取或设置批次的名称。 /// 示例: "2019年1月深圳分部报销单" /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次的名称", IsNullable = true)] public string? BatchName { get; set; } /// <summary> /// 获取或设置批次的备注。 /// 示例: "2019年1月深圳分部报销单" /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次的备注", IsNullable = true)] public string? BatchRemark { get; set; } /// <summary> /// 获取或设置关闭批次的原因。 /// 示例: "OVERDUE_CLOSE" /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置关闭批次的原因", IsNullable = true)] public string? CloseReason { get; set; } /// <summary> /// 获取或设置批次中的总金额。 /// 示例: 4000000 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的总金额", IsNullable = true)] public int? TotalAmount { get; set; } /// <summary> /// 获取或设置批次中的项目总数。 /// 示例: 200 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的项目总数", IsNullable = true)] public int? TotalNum { get; set; } /// <summary> /// 获取或设置批次中的成功总金额。 /// 示例: 3900000 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的成功总金额", IsNullable = true)] public int? SuccessAmount { get; set; } /// <summary> /// 获取或设置批次中的成功项目数。 /// 示例: 199 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的成功项目数", IsNullable = true)] public int? SuccessNum { get; set; } /// <summary> /// 获取或设置批次中的失败总金额。 /// 示例: 100000 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的失败总金额", IsNullable = true)] public int? FailAmount { get; set; } /// <summary> /// 获取或设置批次中的失败项目数。 /// 示例: 1 /// </summary> /// [SugarColumn(ColumnDescription = "获取或设置批次中的失败项目数", IsNullable = true)] public int? FailNum { get; set; } /// <summary> /// 获取或设置转账场景标识符。 /// 示例: "1000" /// </summary> [SugarColumn(ColumnDescription = "获取或设置转账场景标识符", IsNullable = true)] public string? TransferSceneId { get; set; } /// <summary> /// 获取或设置批次中的详细转账列表。 /// </summary> [Navigate(NavigateType.OneToMany,nameof(WeChatTransferItem.WeChatTransferOrderID))] public List<WeChatTransferItem> TransferDetailList { get; set; } } /// <summary> /// 转账单列表 /// </summary> [SugarTable(TableDescription = "转账单账详细列表模型")] public class WeChatTransferItem:BaseModel { /// <summary> /// ID /// </summary> [SugarColumn(ColumnDescription = "ID", IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } /// <summary> /// WeChatTransferOrderID /// </summary> [SugarColumn(ColumnDescription = "获取或设置批次状态")] public int WeChatTransferOrderID { get; set; } /// <summary> /// 获取或设置商户明细单号。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置批次状态")] public string OutDetailNumber { get; set; } /// <summary> /// 获取或设置转账金额(单位:分)。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置批次状态")] public int TransferAmount { get; set; } /// <summary> /// 获取或设置转账备注。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置批次状态")] public string TransferRemark { get; set; } /// <summary> /// 获取或设置收款用户的 OpenId。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置收款用户的 OpenId")] public string OpenId { get; set; } /// <summary> /// 获取或设置收款用户姓名(需使用平台公钥/证书加密)。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置收款用户姓名",IsNullable =true)] public string? UserName { get; set; } /// <summary> /// 获取或设置收款用户身份证号(需使用平台公钥/证书加密)。 /// </summary> [SugarColumn(ColumnDescription = "获取或设置收款用户身份证号",IsNullable =true)] public string? UserIdCardNumber { get; set; } /// <summary> /// 获取或设置明细状态。 /// INIT: 初始态。系统转账校验中 /// WAIT_PAY: 待确认。待商户确认, 符合免密条件时, 系统会自动扭转为转账中 /// PROCESSING: 转账中。正在处理中,转账结果尚未明确 /// SUCCESS: 转账成功 /// FAIL: 转账失败。需要确认失败原因后,再决定是否重新发起对该笔明细单的转账(并非整个转账批次单) /// 最大长度: 32 /// </summary> [SugarColumn(ColumnDescription = "获取或设置明细状态", IsNullable = true)] public string? DetailStatus { get; set; } /// <summary> /// 获取或设置明细失败原因。 /// 如果转账失败则有失败原因。 /// 可选取值: /// ACCOUNT_FROZEN: 该用户账户被冻结 /// REAL_NAME_CHECK_FAIL: 收款人未实名认证,需要用户完成微信实名认证 /// NAME_NOT_CORRECT: 收款人姓名校验不通过,请核实信息 /// OPENID_INVALID: Openid格式错误或者不属于商家公众账号 /// TRANSFER_QUOTA_EXCEED: 超过用户单笔收款额度,核实产品设置是否准确 /// DAY_RECEIVED_QUOTA_EXCEED: 超过用户单日收款额度,核实产品设置是否准确 /// MONTH_RECEIVED_QUOTA_EXCEED: 超过用户单月收款额度,核实产品设置是否准确 /// DAY_RECEIVED_COUNT_EXCEED: 超过用户单日收款次数,核实产品设置是否准确 /// PRODUCT_AUTH_CHECK_FAIL: 未开通该权限或权限被冻结,请核实产品权限状态 /// OVERDUE_CLOSE: 超过系统重试期,系统自动关闭 /// ID_CARD_NOT_CORRECT: 收款人身份证校验不通过,请核实信息 /// ACCOUNT_NOT_EXIST: 该用户账户不存在 /// TRANSFER_RISK: 该笔转账可能存在风险,已被微信拦截 /// OTHER_FAIL_REASON_TYPE: 其它失败原因 /// REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED: 用户账户收款受限,请引导用户在微信支付查看详情 /// RECEIVE_ACCOUNT_NOT_PERMMIT: 未配置该用户为转账收款人,请在产品设置中调整,添加该用户为收款人 /// PAYEE_ACCOUNT_ABNORMAL: 用户账户收款异常,请联系用户完善其在微信支付的身份信息以继续收款 /// PAYER_ACCOUNT_ABNORMAL: 商户账户付款受限,可前往商户平台获取解除功能限制指引 /// TRANSFER_SCENE_UNAVAILABLE: 该转账场景暂不可用,请确认转账场景ID是否正确 /// TRANSFER_SCENE_INVALID: 你尚未获取该转账场景,请确认转账场景ID是否正确 /// TRANSFER_REMARK_SET_FAIL: 转账备注设置失败, 请调整后重新再试 /// RECEIVE_ACCOUNT_NOT_CONFIGURE: 请前往商户平台-商家转账到零钱-前往功能-转账场景中添加 /// BLOCK_B2C_USERLIMITAMOUNT_BSRULE_MONTH: 超出用户单月转账收款20w限额,本月不支持继续向该用户付款 /// BLOCK_B2C_USERLIMITAMOUNT_MONTH: 用户账户存在风险收款受限,本月不支持继续向该用户付款 /// MERCHANT_REJECT: 商户员工(转账验密人)已驳回转账 /// MERCHANT_NOT_CONFIRM: 商户员工(转账验密人)超时未验密 /// </summary> [SugarColumn(ColumnDescription = "获取或设置明细失败原因", IsNullable = true)] public string? FailReason { get; set; } } } cylsg/cylsg.Model/UserModel/UserTiXianDetail.cs
@@ -1,5 +1,6 @@ using cylsg.Core; using cylsg.Core.Attributes; using cylsg.Model.TransferOrder; using SqlSugar; using System; using System.Collections.Generic; @@ -52,6 +53,17 @@ public string Remark { get; set; } /// <summary> /// 微信支付记录 /// </summary> [SugarColumn(ColumnDescription = "备注",IsNullable = true)] public int? WeChatTransferOrderID { get; set; } /// <summary> /// /// </summary> [Navigate(NavigateType.OneToOne, nameof( WeChatTransferOrderID))] public WeChatTransferOrder? WeChatTransferOrderInfo { get; set; } } /// <summary> cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj
@@ -16,7 +16,11 @@ <ItemGroup> <ProjectReference Include="..\cylsg.Application\cylsg.Application.csproj" /> <ProjectReference Include="..\cylsg.Authorization\cylsg.Authorization.csproj" /> <ProjectReference Include="..\EzInitqMessageDef\EzInitqMessageDef.csproj" /> <ProjectReference Include="..\EzInitQ\EzInitQ.csproj" /> <ProjectReference Include="..\EzJob\EzJob.csproj" /> <ProjectReference Include="..\EzUpFile\EzUpFile.csproj" /> <ProjectReference Include="..\EzWechat\EzWechat.csproj" /> </ItemGroup> </Project> cylsg/cylsg.redis/EzCoreNetRedisService.cs
@@ -1,5 +1,6 @@ using Furion; using Furion.DependencyInjection; using Microsoft.AspNetCore.DataProtection.KeyManagement; using SqlSugar; using System; using System.Collections.Generic; @@ -99,6 +100,25 @@ return Data; } public long Incrby(string key) { return RedisHelper.IncrBy(key); } public string Get32sn() { string formattedDate = DateTime.Now.ToString("yyyyMMdd"); var sn = Incrby($"CreatSnKey:{formattedDate}"); if(sn<1) { //设置有效期限为24小时 SetTtl($"CreatSnKey:{formattedDate}", 24 * 60 * 60); } string re = "Ez" + formattedDate + sn.ToString(); return re; } } } cylsg/cylsg.redis/IEzCoreNetRedisService.cs
@@ -76,5 +76,16 @@ /// <param name="Prefix"></param> /// <returns></returns> Task<long> delegateAllKeyWith(string Prefix); /// <summary> /// 加一 /// </summary> /// <param name="key"></param> long Incrby(string key); /// <summary> /// 获取32位sn /// </summary> string Get32sn(); } } cylsg/cylsg.sln
@@ -23,9 +23,17 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "cylsg.Authorization", "cylsg.Authorization\cylsg.Authorization.csproj", "{1197C9BB-C73D-42FB-A114-AFB0A7466615}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzTencentCloud", "EzTencentCloud\EzTencentCloud.csproj", "{8E2530EC-45FE-4EC6-A29A-1B8F25E0F94B}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EzTencentCloud", "EzTencentCloud\EzTencentCloud.csproj", "{8E2530EC-45FE-4EC6-A29A-1B8F25E0F94B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzUpFile", "EzUpFile\EzUpFile.csproj", "{040F7EE0-B57B-4134-8538-20B9599FB898}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EzUpFile", "EzUpFile\EzUpFile.csproj", "{040F7EE0-B57B-4134-8538-20B9599FB898}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EzInitQ", "EzInitQ\EzInitQ.csproj", "{5C84DC88-9B0E-475F-9D20-C7608FDF6B37}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EzInitqMessageDef", "EzInitqMessageDef\EzInitqMessageDef.csproj", "{A17A010E-238D-4C7C-B1F5-5F2B0DFCC619}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cylsg.Filter", "Cylsg.Filter\Cylsg.Filter.csproj", "{2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EzJob", "EzJob\EzJob.csproj", "{EB4CED81-7245-4477-9541-8167BD522CC6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -81,6 +89,22 @@ {040F7EE0-B57B-4134-8538-20B9599FB898}.Debug|Any CPU.Build.0 = Debug|Any CPU {040F7EE0-B57B-4134-8538-20B9599FB898}.Release|Any CPU.ActiveCfg = Release|Any CPU {040F7EE0-B57B-4134-8538-20B9599FB898}.Release|Any CPU.Build.0 = Release|Any CPU {5C84DC88-9B0E-475F-9D20-C7608FDF6B37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C84DC88-9B0E-475F-9D20-C7608FDF6B37}.Debug|Any CPU.Build.0 = Debug|Any CPU {5C84DC88-9B0E-475F-9D20-C7608FDF6B37}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C84DC88-9B0E-475F-9D20-C7608FDF6B37}.Release|Any CPU.Build.0 = Release|Any CPU {A17A010E-238D-4C7C-B1F5-5F2B0DFCC619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A17A010E-238D-4C7C-B1F5-5F2B0DFCC619}.Debug|Any CPU.Build.0 = Debug|Any CPU {A17A010E-238D-4C7C-B1F5-5F2B0DFCC619}.Release|Any CPU.ActiveCfg = Release|Any CPU {A17A010E-238D-4C7C-B1F5-5F2B0DFCC619}.Release|Any CPU.Build.0 = Release|Any CPU {2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A3AF5AA-E3BE-4C98-A3A7-185ED6F938FE}.Release|Any CPU.Build.0 = Release|Any CPU {EB4CED81-7245-4477-9541-8167BD522CC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB4CED81-7245-4477-9541-8167BD522CC6}.Debug|Any CPU.Build.0 = Debug|Any CPU {EB4CED81-7245-4477-9541-8167BD522CC6}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB4CED81-7245-4477-9541-8167BD522CC6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE