From 27076e2f1c080e6d8a86a7bd2120d9f2839b13e7 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期五, 08 八月 2025 17:12:31 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/ApiFlexJob

---
 FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs                                                  |   49 +++++++
 FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs                                                |   40 +++++
 FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml                 |    8 +
 FlexJobApi.Core/Models/FlexJobServer/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs |    2 
 FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs                 |   23 +++
 FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs                    |    4 
 FlexJobApi.Core/Models/UserServer/Roles/Commands/DeleteRoleCommand.cs                         |    2 
 FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs                           |    2 
 FlexJobApi.Core/Utils/DbUtils/DeleteDataCommand.cs                                            |    5 
 FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs                              |   17 ++
 FlexJobApi.Web.Entry/appsettings.json                                                         |   16 ++
 FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs                                             |    5 
 FlexJobApi.Core/FlexJobApiCoreStartup.cs                                                      |    1 
 FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs                                                    |    4 
 FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs                          |   11 +
 FlexJobApi.Core/FlexJobApi.Core.xml                                                           |   65 ++++++++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/DeleteTaskInfoCommand.cs                  |   17 ++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs                       |    4 
 FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs                    |   26 +++
 FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml                       |   18 ++
 FlexJobApi.Core/Models/UserServer/Menus/Commands/DeleteMenuCommand.cs                         |    2 
 FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs                       |   77 ++++++++++
 22 files changed, 373 insertions(+), 25 deletions(-)

diff --git a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
index 31eede6..9fb8daf 100644
--- a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs
@@ -16,6 +16,11 @@
         [ErrorCodeItemMetadata("{0}")]
         s400 = 400,
         /// <summary>
+        /// 褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁�
+        /// </summary>
+        [ErrorCodeItemMetadata("褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁�")]
+        s401 = 401,
+        /// <summary>
         /// {0}涓嶅瓨鍦�
         /// </summary>
         [ErrorCodeItemMetadata("{0}涓嶅瓨鍦�")]
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 66b892c..fe5904b 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -1749,6 +1749,11 @@
             鍙傛暟閿欒
             </summary>
         </member>
+        <member name="F:FlexJobApi.Core.EnumErrorCodeType.s401">
+            <summary>
+            褰撳墠鐧诲綍鐢ㄦ埛宸插け鏁�
+            </summary>
+        </member>
         <member name="F:FlexJobApi.Core.EnumErrorCodeType.s404">
             <summary>
             {0}涓嶅瓨鍦�
@@ -2985,6 +2990,11 @@
             鍚嶇О
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.DeleteTaskInfoCommand">
+            <summary>
+            鍒犻櫎浠诲姟
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.SaveTaskInfoCommand">
             <summary>
             淇濆瓨浠诲姟
@@ -3350,27 +3360,27 @@
             鎺ㄨ崘鐘舵��
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.Count">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.ObjectData">
             <summary>
             缁熻
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.WaitAssignCount">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.WaitAssignCount">
             <summary>
             寰呭畨鎺掓暟閲�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.CompletedAssignCount">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.CompletedAssignCount">
             <summary>
             宸插畨鎺掓暟閲�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.InProcessReleaseCount">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.InProcessReleaseCount">
             <summary>
             鍙戝竷涓暟閲�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultCount.StoppedReleaseCount">
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultObjectData.StoppedReleaseCount">
             <summary>
             宸插仠姝㈡暟閲�
             </summary>
@@ -3524,6 +3534,21 @@
             <param name="logier"></param>
             <returns></returns>
         </member>
+        <member name="T:FlexJobApi.Core.BindPhoneNumberCommand">
+            <summary>
+            缁戝畾鎵嬫満鍙�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.PhoneNumber">
+            <summary>
+            鎵嬫満鍙风爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.BindPhoneNumberCommand.VerifyCode">
+            <summary>
+            楠岃瘉鐮�
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.PasswordLoginCommand">
             <summary>
             瀵嗙爜鐧诲綍
@@ -3607,6 +3632,11 @@
         <member name="P:FlexJobApi.Core.WxmpLoginCommand.Code">
             <summary>
             鐢ㄦ埛鐧诲綍鍑瘉
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.WxmpLoginCommand.Type">
+            <summary>
+            鐢ㄦ埛绫诲瀷
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.GetAliyunOSSAcsQuery">
@@ -6257,6 +6287,31 @@
             <param name="singularName"></param>
             <returns></returns>
         </member>
+        <member name="T:FlexJobApi.Core.WxmpOptions">
+            <summary>
+            寰俊灏忕▼搴忛厤缃�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.WxmpOptionsItem.Code">
+            <summary>
+            缂栧彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppId">
+            <summary>
+            灏忕▼搴廔D
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.WxmpOptionsItem.AppSecret">
+            <summary>
+            灏忕▼搴忓瘑閽�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.WxmpUtils">
+            <summary>
+            寰俊灏忕▼搴忓伐鍏�
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.XmlDoc">
             <summary>
             娉ㄩ噴鏂囨。
diff --git a/FlexJobApi.Core/FlexJobApiCoreStartup.cs b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
index dcc3bed..de3bf71 100644
--- a/FlexJobApi.Core/FlexJobApiCoreStartup.cs
+++ b/FlexJobApi.Core/FlexJobApiCoreStartup.cs
@@ -52,6 +52,7 @@
             services.AddHttpRemote();
             services.AddSingleton<ResourceHttpUtils>();
             services.AddSingleton<AliyunSmsUtils>();
+            services.AddSingleton<WxmpUtils>();
             services.AddScoped<SmsUtils>();
 
             services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(App.Assemblies.ToArray()));
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
index 2cef291..ea17206 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Dictionaries/Commands/DeleteDictionaryCategoryCommand.cs
@@ -11,7 +11,7 @@
     /// 鍒犻櫎鏁版嵁瀛楀吀绫诲埆
     /// </summary>
     [Resource([EnumResourceController.Dictionary])]
-    public class DeleteDictionaryCategoryCommand : DeleteDataCommand, IRequest<int>
+    public class DeleteDictionaryCategoryCommand : DeleteDataCommand
     {
 
     }
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/DeleteTaskInfoCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/DeleteTaskInfoCommand.cs
new file mode 100644
index 0000000..defdff9
--- /dev/null
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/DeleteTaskInfoCommand.cs
@@ -0,0 +1,17 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍒犻櫎浠诲姟
+    /// </summary>
+    [Resource([EnumResourceController.Task])]
+    public class DeleteTaskInfoCommand : DeleteDataCommand
+    {
+
+    }
+}
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
index 0c3cea9..61955a8 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
@@ -79,10 +79,10 @@
         /// <summary>
         /// 缁熻
         /// </summary>
-        public GetTaskInfosQueryResultCount Count { get; set; }
+        public GetTaskInfosQueryResultObjectData ObjectData { get; set; }
     }
 
-    public class GetTaskInfosQueryResultCount
+    public class GetTaskInfosQueryResultObjectData
     {
         /// <summary>
         /// 寰呭畨鎺掓暟閲�
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
new file mode 100644
index 0000000..edb04bd
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/BindPhoneNumberCommand.cs
@@ -0,0 +1,26 @@
+锘縰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.Auth])]
+    public class BindPhoneNumberCommand : IRequest<bool>
+    {
+        /// <summary>
+        /// 鎵嬫満鍙风爜
+        /// </summary>
+        public string PhoneNumber { get; set; }
+
+        /// <summary>
+        /// 楠岃瘉鐮�
+        /// </summary>
+        public string VerifyCode { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs
index be2f9b2..f1d6aa7 100644
--- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/SmsLoginCommand.cs
@@ -17,13 +17,11 @@
         /// <summary>
         /// 鎵嬫満鍙风爜
         /// </summary>
-        [Required]
         public string PhoneNumber { get; set; }
 
         /// <summary>
         /// 楠岃瘉鐮�
         /// </summary>
-        [Required]
         public string VerifyCode { get; set; }
 
         /// <summary>
diff --git a/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs b/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs
index 8ce3492..70f9933 100644
--- a/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Auths/Commands/WxmpLoginCommand.cs
@@ -1,4 +1,5 @@
-锘縰sing System;
+锘縰sing MediatR;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -10,12 +11,18 @@
     /// <summary>
     /// 寰俊灏忕▼搴忕櫥褰�
     /// </summary>
-    public class WxmpLoginCommand
+    [Resource([EnumResourceController.Auth], AllowAnonymous = true)]
+    public class WxmpLoginCommand : IRequest<LoginCommandCallback>
     {
         /// <summary>
         /// 鐢ㄦ埛鐧诲綍鍑瘉
         /// </summary>
         [Required]
         public string Code { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛绫诲瀷
+        /// </summary>
+        public EnumUserType Type { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/UserServer/Menus/Commands/DeleteMenuCommand.cs b/FlexJobApi.Core/Models/UserServer/Menus/Commands/DeleteMenuCommand.cs
index e924512..82d0187 100644
--- a/FlexJobApi.Core/Models/UserServer/Menus/Commands/DeleteMenuCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Menus/Commands/DeleteMenuCommand.cs
@@ -12,7 +12,7 @@
     /// 鍒犻櫎鑿滃崟
     /// </summary>
     [Resource([EnumResourceController.Menu])]
-    public class DeleteMenuCommand : DeleteDataCommand, IRequest<int>
+    public class DeleteMenuCommand : DeleteDataCommand
     {
 
     }
diff --git a/FlexJobApi.Core/Models/UserServer/Roles/Commands/DeleteRoleCommand.cs b/FlexJobApi.Core/Models/UserServer/Roles/Commands/DeleteRoleCommand.cs
index 2607022..007fc71 100644
--- a/FlexJobApi.Core/Models/UserServer/Roles/Commands/DeleteRoleCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/Roles/Commands/DeleteRoleCommand.cs
@@ -11,7 +11,7 @@
     /// 鍒犻櫎瑙掕壊
     /// </summary>
     [Resource([EnumResourceController.Role])]
-    public class DeleteRoleCommand : DeleteDataCommand, IRequest<int>
+    public class DeleteRoleCommand : DeleteDataCommand
     {
 
     }
diff --git a/FlexJobApi.Core/Utils/DbUtils/DeleteDataCommand.cs b/FlexJobApi.Core/Utils/DbUtils/DeleteDataCommand.cs
index a5e8a26..f926e84 100644
--- a/FlexJobApi.Core/Utils/DbUtils/DeleteDataCommand.cs
+++ b/FlexJobApi.Core/Utils/DbUtils/DeleteDataCommand.cs
@@ -1,4 +1,5 @@
-锘縰sing System;
+锘縰sing MediatR;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
@@ -10,7 +11,7 @@
     /// <summary>
     /// 鍒犻櫎鍛戒护
     /// </summary>
-    public abstract class DeleteDataCommand
+    public abstract class DeleteDataCommand : IRequest<int>
     {
         protected DeleteDataCommand()
         {
diff --git a/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs b/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
index fa3b0fa..e280385 100644
--- a/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
+++ b/FlexJobApi.Core/Utils/SmsUtils/SmsUtils.cs
@@ -18,11 +18,11 @@
     /// </summary>
     public class SmsUtils
     {
-        private readonly IRepository<SmsLog> rep;
+        private readonly IRepository<SmsLog, LogDbContextLocator> rep;
         private readonly AliyunSmsUtils aliyunSmsUtils;
 
         public SmsUtils(
-            IRepository<SmsLog> rep,
+            IRepository<SmsLog, LogDbContextLocator> rep,
             AliyunSmsUtils aliyunSmsUtils)
         {
             this.rep = rep;
diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs
new file mode 100644
index 0000000..0e60ecf
--- /dev/null
+++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpOptions.cs
@@ -0,0 +1,40 @@
+锘縰sing Furion.ConfigurableOptions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 寰俊灏忕▼搴忛厤缃�
+    /// </summary>
+    public class WxmpOptions : IConfigurableOptions
+    {
+        public WxmpOptions()
+        {
+            Items = [];
+        }
+
+        public List<WxmpOptionsItem> Items { get; set; }
+    }
+
+    public class WxmpOptionsItem
+    {
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴廔D
+        /// </summary>
+        public string AppId { get; set; }
+
+        /// <summary>
+        /// 灏忕▼搴忓瘑閽�
+        /// </summary>
+        public string AppSecret { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs
new file mode 100644
index 0000000..7080916
--- /dev/null
+++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpSnsJscode2sessionCallback.cs
@@ -0,0 +1,17 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    public class WxmpSnsJscode2sessionCallback
+    {
+        public string session_key { get; set; }
+        public string unionid { get; set; }
+        public string errmsg { get; set; }
+        public string openid { get; set; }
+        public int errcode { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs b/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs
new file mode 100644
index 0000000..0a200da
--- /dev/null
+++ b/FlexJobApi.Core/Utils/WxmpUtils/WxmpUtils.cs
@@ -0,0 +1,49 @@
+锘縰sing Furion.FriendlyException;
+using Furion.HttpRemote;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 寰俊灏忕▼搴忓伐鍏�
+    /// </summary>
+    public class WxmpUtils
+    {
+        private readonly IOptions<WxmpOptions> options;
+        private readonly IHttpRemoteService httpRemoteService;
+
+        public WxmpUtils(
+            IOptions<WxmpOptions> options,
+            IHttpRemoteService httpRemoteService)
+        {
+            this.options = options;
+            this.httpRemoteService = httpRemoteService;
+        }
+
+        public async Task<WxmpSnsJscode2sessionCallback> SnsJscode2sessionAsync(EnumUserType userType, string code, CancellationToken cancellationToken = default)
+        {
+            var option = options.Value.Items.FirstOrDefault(it => it.Code == userType.ToString());
+            if (option == null || option.AppId.IsNull() || option.AppSecret.IsNull())
+                throw Oops.Oh(EnumErrorCodeType.s400, "鐧诲綍澶辫触锛岀己澶遍厤缃細WxmpOptions");
+            if (code.IsNull())
+                throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐橶xmpCode");
+            var callback = await httpRemoteService.GetAsAsync<WxmpSnsJscode2sessionCallback>("https://api.weixin.qq.com/sns/jscode2session",
+                builder => builder.WithQueryParameters(new Dictionary<string, string>
+                {
+                    { "appid", option.AppId },
+                    { "secret", option.AppSecret },
+                    { "js_code", code },
+                    { "grant_type", "authorization_code" }
+                }));
+            if (callback == null || callback.errcode != 0)
+                throw Oops.Oh(EnumErrorCodeType.s510, $"鐧诲綍澶辫触锛歿callback.errmsg}锛岃鑱旂郴绠$悊鍛�");
+            return callback;
+        }
+    }
+}
diff --git a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
index 4927d0b..4ca909d 100644
--- a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
+++ b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
@@ -161,6 +161,14 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.DeleteTaskInfoCommand,System.Threading.CancellationToken)">
+            <summary>
+            鍒犻櫎浠诲姟
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:FlexJobApi.FlexJobServer.Application.TaskInfoQueryHandler">
             <summary>
             浠诲姟鏌ヨ澶勭悊鍣�
diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs
index 29b7036..0d67047 100644
--- a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs
@@ -21,7 +21,8 @@
         ) :
         IRequestHandler<SaveTaskInfoCommand, Guid>,
         IRequestHandler<SetTaskInfoReleaseStatusCommand, int>,
-        IRequestHandler<SetTaskInfoRecommendStatusCommand, int>
+        IRequestHandler<SetTaskInfoRecommendStatusCommand, int>,
+        IRequestHandler<DeleteTaskInfoCommand, int>
     {
         private readonly IRepository<TaskInfo> rep = rep;
 
@@ -111,6 +112,26 @@
             return entities.Count;
         }
 
+        /// <summary>
+        /// 鍒犻櫎浠诲姟
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public Task<int> Handle(DeleteTaskInfoCommand request, CancellationToken cancellationToken)
+        {
+            return request.DeleteData<TaskInfo>(
+                q =>
+                {
+                    q = TaskInfoRepository.GetQueryable(rep, false);
+                    if (q.AsNoTracking().Any(it => it.Status == EnumTaskStatus.Complete))
+                    {
+                        throw Oops.Oh(EnumErrorCodeType.s510, "宸插畨鎺掔殑浠诲姟鏃犳硶鍒犻櫎");
+                    }
+                    return q;
+                }, cancellationToken);
+        }
+
         private async Task BuildCode(TaskInfo entity)
         {
             entity.Code = $"{DateTime.Now:yyyyMMddHHmm}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
index 418cb1d..717210b 100644
--- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
@@ -82,7 +82,7 @@
                 q = q.Where(it => it.GenderLimit == request.GenderLimit);
             }
 
-            var count = new GetTaskInfosQueryResultCount
+            var count = new GetTaskInfosQueryResultObjectData
             {
                 WaitAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Wait),
                 CompletedAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Complete),
@@ -141,7 +141,7 @@
                         SettlementStatus = t.SettlementStatus
                     };
             var result = await request.PageModel.GetPagedListAsync<GetTaskInfosQueryResult, GetTaskInfosQueryResultItem>(s, cancellationToken);
-            result.Count = count;
+            result.ObjectData = count;
             return result;
         }
     }
diff --git a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
index dad1665..11c64e3 100644
--- a/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/Auths/Commands/LoginCommandHandler.cs
@@ -19,12 +19,16 @@
     /// </summary>
     public class LoginCommandHandler(
         IRepository<User> rep,
-        SmsUtils smsUtils) :
+        SmsUtils smsUtils,
+        WxmpUtils wxmpUtils) :
         IRequestHandler<PasswordLoginCommand, LoginCommandCallback>,
-        IRequestHandler<SmsLoginCommand, LoginCommandCallback>
+        IRequestHandler<SmsLoginCommand, LoginCommandCallback>,
+        IRequestHandler<WxmpLoginCommand, LoginCommandCallback>,
+        IRequestHandler<BindPhoneNumberCommand, bool>
     {
         private readonly IRepository<User> rep = rep;
         private readonly SmsUtils smsUtils = smsUtils;
+        private readonly WxmpUtils wxmpUtils = wxmpUtils;
 
         /// <summary>
         /// 瀵嗙爜鐧诲綍
@@ -62,6 +66,19 @@
             var user = await rep.AsQueryable().AsNoTracking()
                 .Where(it => it.UserName == request.PhoneNumber && it.Type == request.Type)
                 .FirstOrDefaultAsync(cancellationToken);
+            if (user == null && request.Type == EnumUserType.Personal)
+            {
+                user = new User
+                {
+                    Type = request.Type,
+                    UserName = request.PhoneNumber,
+                    PhoneNumber = request.PhoneNumber,
+                    IsCheckPhoneNumber = true,
+                    Level = 1,
+                    Status = EnumUserStatus.Normal
+                };
+                await rep.InsertAsync(user);
+            }
             if (user == null)
                 throw Oops.Oh(EnumUserErrorCodeType.u1000);
             if (user.Status == EnumUserStatus.Disabled)
@@ -70,6 +87,62 @@
         }
 
         /// <summary>
+        /// 寰俊灏忕▼搴忕櫥褰�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<LoginCommandCallback> Handle(WxmpLoginCommand request, CancellationToken cancellationToken)
+        {
+            var snsJscode2session = await wxmpUtils.SnsJscode2sessionAsync(request.Type, request.Code, cancellationToken);
+            var user = await rep.AsQueryable().AsNoTracking()
+                .Where(it => it.WxmpOpenId == snsJscode2session.openid && it.Type == request.Type)
+                .FirstOrDefaultAsync(cancellationToken);
+            if (user == null && request.Type == EnumUserType.Personal)
+            {
+                user = new User
+                {
+                    Type = request.Type,
+                    UserName = snsJscode2session.openid,
+                    WxmpOpenId = snsJscode2session.openid,
+                    Level = 1,
+                    Status = EnumUserStatus.Normal
+                };
+                await rep.InsertAsync(user);
+            }
+            if (user == null)
+                throw Oops.Oh(EnumUserErrorCodeType.u1000);
+            if (user.Status == EnumUserStatus.Disabled)
+                throw Oops.Oh(EnumUserErrorCodeType.u1001);
+            return GetCurrentLogier(user, EnumClientType.Wxmp);
+        }
+
+        /// <summary>
+        /// 缁戝畾鎵嬫満鍙�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<bool> Handle(BindPhoneNumberCommand request, CancellationToken cancellationToken)
+        {
+            await smsUtils.CheckVerifyCode(new CheckVerifyCodeModel
+            {
+                PhoneNumber = request.PhoneNumber,
+                VerifyCode = request.VerifyCode,
+                TemplateCode = EnumSmsTemplateCode.LoginOrRegister
+            });
+            var logier = JwtUtils.GetCurrentLogier();
+            var user = await rep.AsQueryable()
+                .FirstOrDefaultAsync(it => it.Id == logier.Id);
+            if (user == null)
+                throw Oops.Oh(EnumErrorCodeType.s404, "褰撳墠璐﹀彿涓嶅瓨鍦�");
+            user.UserName = request.PhoneNumber;
+            user.PhoneNumber = request.PhoneNumber;
+            user.IsCheckPhoneNumber = true;
+            return true;
+        }
+
+        /// <summary>
         /// 鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
         /// </summary>
         /// <param name="user"></param>
diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
index e4ba09c..92ae932 100644
--- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
+++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -9,7 +9,7 @@
             鐧诲綍鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils)">
+        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},FlexJobApi.Core.SmsUtils,FlexJobApi.Core.WxmpUtils)">
             <summary>
             鐧诲綍鍛戒护澶勭悊鍣�
             </summary>
@@ -30,6 +30,22 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.WxmpLoginCommand,System.Threading.CancellationToken)">
+            <summary>
+            寰俊灏忕▼搴忕櫥褰�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.Handle(FlexJobApi.Core.BindPhoneNumberCommand,System.Threading.CancellationToken)">
+            <summary>
+            缁戝畾鎵嬫満鍙�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="M:FlexJobApi.UserServer.Application.LoginCommandHandler.GetCurrentLogier(FlexJobApi.Core.User,FlexJobApi.Core.EnumClientType)">
             <summary>
             鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛
diff --git a/FlexJobApi.Web.Entry/appsettings.json b/FlexJobApi.Web.Entry/appsettings.json
index 02ec129..f265ac3 100644
--- a/FlexJobApi.Web.Entry/appsettings.json
+++ b/FlexJobApi.Web.Entry/appsettings.json
@@ -16,6 +16,20 @@
     "Access": "Redis",
     "Configuration": "118.178.252.28:5390,password=Bole123!"
   },
+  "Wxmp": {
+    "Items": [
+      {
+        "Code": "Personal",
+        "AppId": "wxb9e0baf4f87aa0de",
+        "AppSecret": "24abded2cd32b677b1f14ea9ec5767f0"
+      },
+      {
+        "Code": "Enterprise",
+        "AppId": "wx3669dd12a0915f7d ",
+        "AppSecret": "c03a62ad6822f1c925532c34183e7f7f"
+      }
+    ]
+  },
   "Aliyun": {
     "OSS": {
       "AccessKeyId": "LTAI4GAdJ88mUMMFBHHiyDmS",
@@ -31,7 +45,7 @@
     }
   },
   "SMS": {
-    "Enable": false,
+    "Enable": true,
     "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H",
     "AccessSecret": "TEHSXK6f6Njg0v0MSFkrjURofdjuKQ",
     "Version": "2017-05-25",

--
Gitblit v1.9.1