From 2da5c6be190d8078393eb2df777863931218ad19 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 08 八月 2025 10:16:40 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj         |   33 +++++
 FlexJobApi.Core/Entities/Common/Resource.cs                                |   21 +++
 FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs                       |   53 ++------
 FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs      |   29 ++++
 FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs               |   46 +++++++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs     |   10 +
 FlexJobApi.Core/FlexJobApi.Core.xml                                        |   37 +++++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs    |    9 +
 FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs |    4 
 FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs                        |   29 ++++
 FlexJobApi.FlexJobServer.Test/appsettings.json                             |   33 +++++
 FlexJobApi.sln                                                             |    7 +
 12 files changed, 262 insertions(+), 49 deletions(-)

diff --git a/FlexJobApi.Core/Entities/Common/Resource.cs b/FlexJobApi.Core/Entities/Common/Resource.cs
index 196433f..a412a53 100644
--- a/FlexJobApi.Core/Entities/Common/Resource.cs
+++ b/FlexJobApi.Core/Entities/Common/Resource.cs
@@ -1,7 +1,9 @@
-锘縰sing System;
+锘縰sing Furion.FriendlyException;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
+using System.Net.Http;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -113,5 +115,22 @@
         /// 鏄惁宸茶繃鏈�
         /// </summary>
         public bool IsExpired { get; set; }
+
+        public HttpMethod GetHttpMethod()
+        {
+            switch (Method)
+            {
+                case EnumResourceMethod.Get:
+                    return HttpMethod.Get;
+                case EnumResourceMethod.Post:
+                    return HttpMethod.Post;
+                case EnumResourceMethod.Put:
+                    return HttpMethod.Put;
+                case EnumResourceMethod.Delete:
+                    return HttpMethod.Delete;
+                default:
+                    throw Oops.Oh(EnumErrorCodeType.s400, "涓嶆敮鎸佺殑璇锋眰绫诲瀷");
+            }
+        }
     }
 }
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index bae2665..6f33937 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -3110,6 +3110,16 @@
             浠诲姟鍦扮偣璇︾粏鍦板潃
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Longitude">
+            <summary>
+            缁忓害
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Latitude">
+            <summary>
+            绾害
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.BeginTime">
             <summary>
             浠诲姟寮�濮嬫椂闂�
@@ -3140,9 +3150,14 @@
             鍏抽敭瀛楋紙浠诲姟鍚嶇О锛�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.Time">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.BeginTime">
             <summary>
-            鍙戝竷鏃堕棿
+            鍙戝竷鏃堕棿-寮�濮�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.EndTime">
+            <summary>
+            鍙戝竷鏃堕棿-缁撴潫
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.GetTaskInfosQuery.CityCode">
@@ -4893,6 +4908,21 @@
             鏄惁閫変腑
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.GetUserResumeQuery">
+            <summary>
+            鏌ヨ鐢ㄦ埛绠�鍘�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetUserResumeQuery.UserId">
+            <summary>
+            鐢ㄦ埛Id
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetUserResumeQueryResult">
+            <summary>
+            鏌ヨ鐢ㄦ埛绠�鍘�-缁撴灉
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.AliyunOptions">
             <summary>
             闃块噷浜戦厤缃�
@@ -5760,13 +5790,14 @@
             璧勬簮宸ュ叿
             </summary>
         </member>
-        <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0)">
+        <member name="M:FlexJobApi.Core.ResourceUtils.SendHttpAsync``2(``0,FlexJobApi.Core.IResourceHttpProvider)">
             <summary>
             鍙戦�丠TTP璇锋眰
             </summary>
             <typeparam name="TRequest"></typeparam>
             <typeparam name="TResponse"></typeparam>
             <param name="request"></param>
+            <param name="provider"></param>
             <returns></returns>
         </member>
         <member name="M:FlexJobApi.Core.ResourceUtils.GetHealthyServiceDomain(FlexJobApi.Core.Resource)">
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
index 78bd9a3..273ed6f 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
@@ -129,6 +129,16 @@
         public string AddressDetail { get; set; }
 
         /// <summary>
+        /// 缁忓害
+        /// </summary>
+        public decimal? Longitude { get; set; }
+
+        /// <summary>
+        /// 绾害
+        /// </summary>
+        public decimal? Latitude { get; set; }
+
+        /// <summary>
         /// 浠诲姟寮�濮嬫椂闂�
         /// </summary>
         public DateTime BeginTime { get; set; }
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
index 57f3d30..ce1fffd 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
@@ -24,9 +24,14 @@
         public string Keywords { get; set; }
 
         /// <summary>
-        /// 鍙戝竷鏃堕棿
+        /// 鍙戝竷鏃堕棿-寮�濮�
         /// </summary>
-        public DateTime? Time { get; set; }
+        public DateTime? BeginTime { get; set; }
+
+        /// <summary>
+        /// 鍙戝竷鏃堕棿-缁撴潫
+        /// </summary>
+        public DateTime? EndTime { get; set; }
 
         /// <summary>
         /// 浠诲姟鍦扮偣鎵�灞炲煄甯傜紪鍙�
diff --git a/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs b/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs
new file mode 100644
index 0000000..eeb4c87
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserResumeQuery.cs
@@ -0,0 +1,29 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ鐢ㄦ埛绠�鍘�
+    /// </summary>
+    [Resource([EnumResourceController.User])]
+    public class GetUserResumeQuery : IRequest<GetUserResumeQueryResult>
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid? UserId { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ鐢ㄦ埛绠�鍘�-缁撴灉
+    /// </summary>
+    public class GetUserResumeQueryResult
+    {
+
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs b/FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs
new file mode 100644
index 0000000..8cf27e5
--- /dev/null
+++ b/FlexJobApi.Core/Utils/ResourceUtils/IResourceHttpProvider.cs
@@ -0,0 +1,46 @@
+锘縰sing Furion;
+using Furion.FriendlyException;
+using Furion.HttpRemote;
+using Furion.Shapeless;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public interface IResourceHttpProvider
+    {
+        HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder);
+        Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder);
+    }
+
+    public class DefaultResourceHttpProvider : IResourceHttpProvider
+    {
+        public HttpRequestBuilder AddAuthentication(HttpRequestBuilder builder)
+        {
+            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
+            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
+            return builder
+                .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
+                .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken));
+        }
+
+        public async Task<TResponse> SendAsAsync<TResponse>(IHttpRemoteService httpRemoteService, HttpRequestBuilder builder)
+        {
+            var response = await httpRemoteService.SendAsAsync<TResponse>(builder);
+            dynamic clay = Clay.Parse(response);
+            if (clay.Code == 401)
+            {
+                Console.WriteLine();
+                throw new Exception();
+            }
+            else
+            {
+                return response;
+            }
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
index 9b51203..d1749ca 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceUtils.cs
@@ -42,8 +42,11 @@
         /// <typeparam name="TRequest"></typeparam>
         /// <typeparam name="TResponse"></typeparam>
         /// <param name="request"></param>
+        /// <param name="provider"></param>
         /// <returns></returns>
-        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(TRequest request)
+        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(
+            TRequest request,
+            IResourceHttpProvider provider = null)
             where TRequest : class, new()
         {
             var requestTypeFullName = typeof(TRequest).FullName;
@@ -52,46 +55,14 @@
                 .FirstOrDefaultAsync();
             var domain = await GetHealthyServiceDomain(resource);
             var httpRemoteService = App.GetRequiredService<IHttpRemoteService>();
-            var token = App.HttpContext.Request.Headers["Authorization"].ToString();
-            var refreshToken = App.HttpContext.Request.Headers["X-Authorization"].ToString();
-            TResponse response;
-            switch (resource.Method)
-            {
-                case EnumResourceMethod.Get:
-                    response = await httpRemoteService.GetAsAsync<TResponse>(
-                        $"{domain}{resource.Route}",
-                        it =>
-                            it.WithQueryParameters(request)
-                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
-                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
-                    break;
-                case EnumResourceMethod.Post:
-                    response = await httpRemoteService.PostAsAsync<TResponse>(
-                        $"{domain}{resource.Route}",
-                        it =>
-                            it.SetJsonContent(request)
-                            .WithHeader("Authorization", token)
-                            .WithHeader("X-Authorization", refreshToken));
-                    break;
-                case EnumResourceMethod.Put:
-                    response = await httpRemoteService.PutAsAsync<TResponse>(
-                        $"{domain}{resource.Route}",
-                        it =>
-                            it.SetJsonContent(request)
-                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
-                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
-                    break;
-                case EnumResourceMethod.Delete:
-                    response = await httpRemoteService.DeleteAsAsync<TResponse>(
-                        $"{domain}{resource.Route}",
-                        it =>
-                            it.SetJsonContent(request)
-                            .AddAuthentication(new AuthenticationHeaderValue("Authorization", token))
-                            .AddAuthentication(new AuthenticationHeaderValue("X-Authorization", refreshToken)));
-                    break;
-                default:
-                    throw Oops.Oh(EnumErrorCodeType.s400, $"涓嶆敮鎸佽姹傛柟寮弡resource.Method}");
-            }
+            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), $"{domain}{resource.Route}");
+            if (resource.Method == EnumResourceMethod.Get)
+                builder = builder.WithQueryParameters(request);
+            else
+                builder = builder.SetJsonContent(request);
+            provider = provider ?? new DefaultResourceHttpProvider();
+            builder = provider.AddAuthentication(builder);
+            var response = await provider.SendAsAsync<TResponse>(httpRemoteService, builder);
             return response;
         }
 
diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
index 50cd830..bf22bf4 100644
--- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
@@ -55,9 +55,9 @@
             {
                 q = q.Where(it => it.Name.Contains(request.Keywords));
             }
-            if (request.Time.HasValue)
+            if (request.BeginTime.HasValue && request.EndTime.HasValue)
             {
-                q = q.Where(it => it.BeginTime <= request.Time && request.Time <= it.EndTime);
+                q = q.Where(it => request.BeginTime <= it.BeginTime && it.BeginTime <= request.EndTime);
             }
             if (request.CityCode.IsNotNull())
             {
diff --git a/FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj b/FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj
new file mode 100644
index 0000000..38469f4
--- /dev/null
+++ b/FlexJobApi.FlexJobServer.Test/FlexJobApi.FlexJobServer.Test.csproj
@@ -0,0 +1,33 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net9.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Include="appsettings.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
+      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
+    </Content>
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="coverlet.collector" Version="6.0.2" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="xunit" Version="2.9.2" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\FlexJobApi.Core\FlexJobApi.Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Using Include="Xunit" />
+  </ItemGroup>
+
+</Project>
diff --git a/FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs b/FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs
new file mode 100644
index 0000000..3a93b69
--- /dev/null
+++ b/FlexJobApi.FlexJobServer.Test/Tasks/TaskUnitTest.cs
@@ -0,0 +1,29 @@
+锘縰sing FlexJobApi.Core;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.FlexJobServer.Test
+{
+    public class TaskUnitTest
+    {
+        [Fact]
+        public async Task Test1()
+        {
+            var categories = await ResourceUtils.SendHttpAsync<
+                GetDictionaryCategorySelectQuery,
+                FriendlyResult<SelectOption<Guid, GetDictionaryCategorySelectQueryOption>>>(
+                new GetDictionaryCategorySelectQuery());
+            Console.WriteLine();
+            var result = await ResourceUtils.SendHttpAsync<SaveTaskInfoCommand, Guid>(new SaveTaskInfoCommand
+            {
+                Name = "娴嬭瘯浠诲姟",
+                BillingMethod = EnumBillingMethod.Month,
+                ServiceFee = 100,
+                SettlementCycle = EnumSettlementCycle.Month,
+                Benefits = new List<string>
+                {
+
+                }
+            });
+        }
+    }
+}
diff --git a/FlexJobApi.FlexJobServer.Test/appsettings.json b/FlexJobApi.FlexJobServer.Test/appsettings.json
new file mode 100644
index 0000000..9c3686e
--- /dev/null
+++ b/FlexJobApi.FlexJobServer.Test/appsettings.json
@@ -0,0 +1,33 @@
+{
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+  "ConnectionStrings": {
+    "FlexJobApi": "Server=120.26.58.240; Database=Dev_FlexJobApi; User=bole;Password=Bole1472589;Encrypt=false;",
+    "FlexJobApiLog": "Server=120.26.58.240; Database=Dev_FlexJobApiLog; User=bole;Password=Bole1472589;Encrypt=false;",
+    "HumanResources": "Server=120.26.58.240; Database=Dev_12333; User=bole;Password=Bole1472589;Encrypt=false;"
+  },
+  "Consul": {
+    "Address": "http://localhost:8500/",
+    "ServiceName": "Local_FlexJobApi",
+    "ServiceIP": "localhost",
+    "ServicePort": 53780,
+    "ServiceHealthCheck": "/healthz"
+  },
+  "DistributedCache": {
+    "Access": "Redis",
+    "Configuration": "118.178.252.28:5390,password=Bole123!"
+  },
+  "Aliyun": {
+    "OSS": {
+      "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS",
+      "AccessSecret": "NX3AmjOcGkJ8bncQfIVxqmifBWkI0E",
+      "RegionId": "cn-hangzhou",
+      "Endpoint": "http://oss-cn-hangzhou.aliyuncs.com",
+      "BucketName": "waterdroptest2",
+      "Url": "https://waterdroptest2.oss-cn-hangzhou.aliyuncs.com/",
+      "RoleArn": "acs:ram::1483797030072898:role/boleoss",
+      "RoleSessionName": "SessionTest",
+      "Policy": "{\"Version\":\"1\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":\"oss:PutObject\",\"Resource\":[\"acs:oss:*:*:waterdroptest2/*\",\"acs:oss:*:*:parkmanagement/*\",\"acs:oss:*:*:jurenlian/*\"]}]}",
+      "DurationSeconds": 3600
+    }
+  }
+}
\ No newline at end of file
diff --git a/FlexJobApi.sln b/FlexJobApi.sln
index 4801498..24a73e4 100644
--- a/FlexJobApi.sln
+++ b/FlexJobApi.sln
@@ -19,6 +19,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlexJobApi.FlexJobServer.Application", "FlexJobApi.FlexJobServer.Application\FlexJobApi.FlexJobServer.Application.csproj", "{6D8B1CA5-5859-491D-8E16-027ED8E44BDE}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FlexJobApi.FlexJobServer.Test", "FlexJobApi.FlexJobServer.Test\FlexJobApi.FlexJobServer.Test.csproj", "{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -49,6 +51,10 @@
 		{6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6D8B1CA5-5859-491D-8E16-027ED8E44BDE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -56,6 +62,7 @@
 	GlobalSection(NestedProjects) = preSolution
 		{BAC3E134-8D84-4F6D-8C25-AD6FD8A95697} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
 		{6D8B1CA5-5859-491D-8E16-027ED8E44BDE} = {39E37108-90DA-4908-B04C-B5A06591326D}
+		{1D9D054D-B5D4-4F5B-B1D1-0354CD0F322F} = {39E37108-90DA-4908-B04C-B5A06591326D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {B2073C2C-0FD3-452B-8047-8134D68E12CE}

--
Gitblit v1.9.1