username@email.com
2024-08-27 f2f61fdb9a81fba256b1bd05330fbbac2633149a
Merge branch 'master' of http://47.108.235.38:8080/r/cylsg
18个文件已修改
15个文件已添加
1921 ■■■■■ 已修改文件
.gitignore 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/Cylsg.Filter/Cylsg.Filter.csproj 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/Cylsg.Filter/LimitFilterAttribute.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitQ/EzInitQ.csproj 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitQ/InitQConfig.json 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitQ/Mapper.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitQ/PayServiceMessageQ.cs 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitQ/Startup.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitqMessageDef/EzInitqMessageDef.csproj 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitqMessageDef/InitQMessages.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzInitqMessageDef/MsqModels.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzJob/EzJob.csproj 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzJob/StartUpcs.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzJob/WeChatJob.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzUpFile/UpFileController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzWechat/IWecharPayServicecs.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzWechat/WecharPayServicecs.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/EzWechat/WechatConfig.json 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/LogoInController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Orders/Dtos/OrderDto.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Orders/OrderWorkerAppService.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Transfer/UserTransfer.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Users/UserAppService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/applicationsettings.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/cylsg.Application.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/cylsg.Application.xml 786 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Core/Attributes/CoderFirstAttribute.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/TransferOrder/WeChartTransferOrder.cs 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/UserModel/UserTiXianDetail.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Core/cylsg.Web.Core.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.redis/EzCoreNetRedisService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.redis/IEzCoreNetRedisService.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.sln 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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