From aa9198ffa4bf42d96628d4d781e9ef055d65b06e Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 04 九月 2025 15:54:11 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfoUser.cs | 45 + FlexJobApi.Web.Entry/Startup.cs | 4 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTaskQuery.cs | 82 ++ FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfo.cs | 45 + FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml | 50 + FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs | 4 FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementStatus.cs | 4 FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs | 62 + FlexJobApi.Core/Entities/UserServer/Users/UserBankCard.cs | 21 FlexJobApi.Core/FlexJobApi.Core.xml | 563 +++++++++++++++++ FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTasksQuery.cs | 108 +++ FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementOrderCommand.cs | 76 ++ FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs | 143 ++++ FlexJobApi.FlexJobServer.Application/TaskCheckReceives/Commands/TaskCheckReceiveCommandHandler.cs | 4 FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs | 142 ++++ FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs | 2 FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementOrderStatus.cs | 23 FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs | 164 +++++ FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs | 25 FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementCommand.cs | 21 /dev/null | 31 - FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs | 164 +++++ FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs | 4 FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/RevokeTaskSettlementOrderCommand.cs | 21 FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/RechargeEnterpriseWalletCommand.cs | 4 25 files changed, 1,730 insertions(+), 82 deletions(-) diff --git a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfo.cs b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfo.cs index 3828d9c..7bde54c 100644 --- a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfo.cs +++ b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfo.cs @@ -167,16 +167,61 @@ public DateTime? LastCheckReceiveTime { get; set; } /// <summary> + /// 缁撶畻鍗曠姸鎬� + /// </summary> + public EnumTaskSettlementOrderStatus? SettlementOrderStatus { get; set; } + + /// <summary> + /// 缁撶畻鍗曞悕绉� + /// </summary> + public string SettlementOrderName { get; set; } + + /// <summary> + /// 缁撶畻鍗曞湴鍧� + /// </summary> + public string SettlementOrderUrl { get; set; } + + /// <summary> + /// 缁撶畻鍗曚笂浼犳椂闂� + /// </summary> + public DateTime? SettlementOrderTime { get; set; } + + /// <summary> /// 缁撶畻鐘舵�� /// </summary> public EnumTaskSettlementStatus? SettlementStatus { get; set; } /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻浜烘暟 + /// </summary> + public int SettlementUserCount { get; set; } + + /// <summary> + /// 缁撶畻寮�濮嬫椂闂� + /// </summary> + public DateTime? SettlementStartTime { get; set; } + + /// <summary> /// 缁撶畻鏃堕棿 /// </summary> public DateTime? SettlementTime { get; set; } /// <summary> + /// 缁撶畻澶囨敞 + /// </summary> + public string SettlementRemark { get; set; } + + /// <summary> /// 鎺ㄨ崘鐘舵�� /// </summary> public EnumTaskRecommendStatus RecommendStatus { get; set; } diff --git a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfoUser.cs b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfoUser.cs index e277a49..c2b64d0 100644 --- a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfoUser.cs +++ b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskInfoUser.cs @@ -80,6 +80,51 @@ public DateTime? LastCheckReceiveTime { get; set; } /// <summary> + /// 鎵�灞為摱琛� + /// </summary> + public string Bank { get; set; } + + /// <summary> + /// 寮�鎴锋敮琛屽悕绉� + /// </summary> + public string BankBranch { get; set; } + + /// <summary> + /// 鏀舵浜哄鍚� + /// </summary> + public string ReceiveName { get; set; } + + /// <summary> + /// 鏀舵璐︽埛 + /// </summary> + public string ReceiveAccount { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻鐘舵�� + /// </summary> + public EnumTaskSettlementStatus? SettlementStatus { get; set; } + + /// <summary> + /// 缁撶畻鏃堕棿 + /// </summary> + public DateTime? SettlementTime { get; set; } + + /// <summary> + /// 缁撶畻澶囨敞 + /// </summary> + public string SettlementRemark { get; set; } + + /// <summary> /// 鎻愪氦 /// </summary> public List<TaskInfoUserSubmit> Submits { get; set; } diff --git a/FlexJobApi.Core/Entities/UserServer/Users/UserBankCard.cs b/FlexJobApi.Core/Entities/UserServer/Users/UserBankCard.cs index f5a9300..346dd77 100644 --- a/FlexJobApi.Core/Entities/UserServer/Users/UserBankCard.cs +++ b/FlexJobApi.Core/Entities/UserServer/Users/UserBankCard.cs @@ -26,21 +26,32 @@ /// 閾惰鍗″彿 /// </summary> [MaxLength(32)] - [Required] public string Code { get; set; } /// <summary> - /// 寮�鎴疯 + /// 鎵�灞為摱琛� /// </summary> - [MaxLength(128)] - [Required] public string Bank { get; set; } + + /// <summary> + /// 鎵�灞炴敮琛� + /// </summary> + public string BankBranch { get; set; } + + /// <summary> + /// 濮撳悕 + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 韬唤璇� + /// </summary> + public string Identity { get; set; } /// <summary> /// 閾惰棰勭暀鎵嬫満鍙� /// </summary> [MaxLength(11)] - [Required] public string PhoneNumber { get; set; } } } diff --git a/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementOrderStatus.cs b/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementOrderStatus.cs new file mode 100644 index 0000000..e25a7a7 --- /dev/null +++ b/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementOrderStatus.cs @@ -0,0 +1,23 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 浠诲姟缁撶畻鍗曠姸鎬� + /// </summary> + public enum EnumTaskSettlementOrderStatus + { + /// <summary> + /// 寰呬笂浼� + /// </summary> + Wait = 10, + /// <summary> + /// 宸蹭笂浼� + /// </summary> + Completed = 20 + } +} diff --git a/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementStatus.cs b/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementStatus.cs index 0745d45..0c3e3fc 100644 --- a/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementStatus.cs +++ b/FlexJobApi.Core/Enums/Tasks/EnumTaskSettlementStatus.cs @@ -16,6 +16,10 @@ /// </summary> Wait = 10, /// <summary> + /// 缁撶畻涓� + /// </summary> + InProcess = 20, + /// <summary> /// 宸茬粨绠� /// </summary> Completed = 30, diff --git a/FlexJobApi.Core/Enums/Tasks/EnumTaskUserSettlementStatus.cs b/FlexJobApi.Core/Enums/Tasks/EnumTaskUserSettlementStatus.cs deleted file mode 100644 index 2c5910b..0000000 --- a/FlexJobApi.Core/Enums/Tasks/EnumTaskUserSettlementStatus.cs +++ /dev/null @@ -1,31 +0,0 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.Core -{ - /// <summary> - /// 浠诲姟鐢ㄦ埛缁撶畻鐘舵�� - /// </summary> - public enum EnumTaskUserSettlementStatus - { - /// <summary> - /// 寰呯粨绠� - /// </summary> - Wait = 10, - /// <summary> - /// 缁撶畻涓� - /// </summary> - InProcess = 20, - /// <summary> - /// 宸茬粨绠� - /// </summary> - Completed = 30, - /// <summary> - /// 缁撶畻澶辫触 - /// </summary> - Fail = 40 - } -} diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml index 43259c5..e374924 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.xml +++ b/FlexJobApi.Core/FlexJobApi.Core.xml @@ -884,14 +884,59 @@ 鏈�杩戦獙鏀舵椂闂� </summary> </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementOrderStatus"> + <summary> + 缁撶畻鍗曠姸鎬� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementOrderName"> + <summary> + 缁撶畻鍗曞悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementOrderUrl"> + <summary> + 缁撶畻鍗曞湴鍧� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementOrderTime"> + <summary> + 缁撶畻鍗曚笂浼犳椂闂� + </summary> + </member> <member name="P:FlexJobApi.Core.TaskInfo.SettlementStatus"> <summary> 缁撶畻鐘舵�� </summary> </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementUserCount"> + <summary> + 缁撶畻浜烘暟 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementStartTime"> + <summary> + 缁撶畻寮�濮嬫椂闂� + </summary> + </member> <member name="P:FlexJobApi.Core.TaskInfo.SettlementTime"> <summary> 缁撶畻鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfo.SettlementRemark"> + <summary> + 缁撶畻澶囨敞 </summary> </member> <member name="P:FlexJobApi.Core.TaskInfo.RecommendStatus"> @@ -1022,6 +1067,51 @@ <member name="P:FlexJobApi.Core.TaskInfoUser.LastCheckReceiveTime"> <summary> 鏈�杩戦獙鏀舵椂闂� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.Bank"> + <summary> + 鎵�灞為摱琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.BankBranch"> + <summary> + 寮�鎴锋敮琛屽悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.ReceiveName"> + <summary> + 鏀舵浜哄鍚� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.ReceiveAccount"> + <summary> + 鏀舵璐︽埛 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.SettlementStatus"> + <summary> + 缁撶畻鐘舵�� + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.SettlementTime"> + <summary> + 缁撶畻鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.TaskInfoUser.SettlementRemark"> + <summary> + 缁撶畻澶囨敞 </summary> </member> <member name="P:FlexJobApi.Core.TaskInfoUser.Submits"> @@ -3079,7 +3169,22 @@ </member> <member name="P:FlexJobApi.Core.UserBankCard.Bank"> <summary> - 寮�鎴疯 + 鎵�灞為摱琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.UserBankCard.BankBranch"> + <summary> + 鎵�灞炴敮琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.UserBankCard.Name"> + <summary> + 濮撳悕 + </summary> + </member> + <member name="P:FlexJobApi.Core.UserBankCard.Identity"> + <summary> + 韬唤璇� </summary> </member> <member name="P:FlexJobApi.Core.UserBankCard.PhoneNumber"> @@ -3702,6 +3807,21 @@ 宸插仠姝� </summary> </member> + <member name="T:FlexJobApi.Core.EnumTaskSettlementOrderStatus"> + <summary> + 浠诲姟缁撶畻鍗曠姸鎬� + </summary> + </member> + <member name="F:FlexJobApi.Core.EnumTaskSettlementOrderStatus.Wait"> + <summary> + 寰呬笂浼� + </summary> + </member> + <member name="F:FlexJobApi.Core.EnumTaskSettlementOrderStatus.Completed"> + <summary> + 宸蹭笂浼� + </summary> + </member> <member name="T:FlexJobApi.Core.EnumTaskSettlementStatus"> <summary> 浠诲姟缁撶畻鐘舵�� @@ -3710,6 +3830,11 @@ <member name="F:FlexJobApi.Core.EnumTaskSettlementStatus.Wait"> <summary> 寰呯粨绠� + </summary> + </member> + <member name="F:FlexJobApi.Core.EnumTaskSettlementStatus.InProcess"> + <summary> + 缁撶畻涓� </summary> </member> <member name="F:FlexJobApi.Core.EnumTaskSettlementStatus.Completed"> @@ -3765,31 +3890,6 @@ <member name="F:FlexJobApi.Core.EnumTaskUserHireStatus.Refuse"> <summary> 宸茶阿缁� - </summary> - </member> - <member name="T:FlexJobApi.Core.EnumTaskUserSettlementStatus"> - <summary> - 浠诲姟鐢ㄦ埛缁撶畻鐘舵�� - </summary> - </member> - <member name="F:FlexJobApi.Core.EnumTaskUserSettlementStatus.Wait"> - <summary> - 寰呯粨绠� - </summary> - </member> - <member name="F:FlexJobApi.Core.EnumTaskUserSettlementStatus.InProcess"> - <summary> - 缁撶畻涓� - </summary> - </member> - <member name="F:FlexJobApi.Core.EnumTaskUserSettlementStatus.Completed"> - <summary> - 宸茬粨绠� - </summary> - </member> - <member name="F:FlexJobApi.Core.EnumTaskUserSettlementStatus.Fail"> - <summary> - 缁撶畻澶辫触 </summary> </member> <member name="T:FlexJobApi.Core.EnumTaskUserSignContractStatus"> @@ -4476,6 +4576,16 @@ <member name="M:FlexJobApi.Core.CalcUserAgeByIdCardJob.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User})"> <summary> 瀹氭椂鏍规嵁韬唤璇佽绠楃敤鎴峰勾榫� + </summary> + </member> + <member name="T:FlexJobApi.Core.CompleteTaskSettlementT1Job"> + <summary> + 瀹屾垚浠诲姟缁撶畻T+1 + </summary> + </member> + <member name="M:FlexJobApi.Core.CompleteTaskSettlementT1Job.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfoUser},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWalletTransaction},FlexJobApi.Core.AlipayUtils)"> + <summary> + 瀹屾垚浠诲姟缁撶畻T+1 </summary> </member> <member name="T:FlexJobApi.Core.DeleteDictionaryCategoryCommand"> @@ -6666,6 +6776,16 @@ 鍒犻櫎浠诲姟 </summary> </member> + <member name="T:FlexJobApi.Core.RevokeTaskSettlementOrderCommand"> + <summary> + 鎾ゅ洖缁撶畻 + </summary> + </member> + <member name="P:FlexJobApi.Core.RevokeTaskSettlementOrderCommand.TaskInfoId"> + <summary> + 浠诲姟Id + </summary> + </member> <member name="T:FlexJobApi.Core.SaveTaskInfoCommand"> <summary> 淇濆瓨浠诲姟 @@ -6784,6 +6904,76 @@ <member name="P:FlexJobApi.Core.SetTaskInfoReleaseStatusCommand.ReleaseStatus"> <summary> 鍙戝竷鐘舵�� + </summary> + </member> + <member name="T:FlexJobApi.Core.SureTaskSettlementCommand"> + <summary> + 纭缁撶畻 + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementCommand.TaskInfoId"> + <summary> + 浠诲姟Id + </summary> + </member> + <member name="T:FlexJobApi.Core.SureTaskSettlementOrderCommand"> + <summary> + 纭缁撶畻鍗� + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommand.TaskInfoId"> + <summary> + 浠诲姟Id + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommand.SettlementOrderUrl"> + <summary> + 缁撶畻鍗曞湴鍧� + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommand.TaskInfoUsers"> + <summary> + 缁撶畻鍚嶅崟 + </summary> + </member> + <member name="T:FlexJobApi.Core.SureTaskSettlementOrderCommandUser"> + <summary> + 纭缁撶畻鍗� + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.Id"> + <summary> + 浠诲姟鐢ㄦ埛Id + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.Name"> + <summary> + 濮撳悕 + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.Bank"> + <summary> + 鎵�灞為摱琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.BankBranch"> + <summary> + 寮�鎴锋敮琛屽悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.ReceiveAccount"> + <summary> + 鏀舵璐︽埛 + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.SureTaskSettlementOrderCommandUser.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 </summary> </member> <member name="T:FlexJobApi.Core.GetOpenTaskInfosQuery"> @@ -7074,6 +7264,166 @@ <member name="F:FlexJobApi.Core.GetPersonalHireTaskInfosQueryStatus.Completed"> <summary> 宸插畬鎴� + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskQuery"> + <summary> + 鏌ヨ缁撶畻鍗曡鎯� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQuery.Id"> + <summary> + Id + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskQueryResult"> + <summary> + 鏌ヨ缁撶畻鍗曡鎯�-缁撴灉 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.Id"> + <summary> + Id + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.Name"> + <summary> + 浠诲姟鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.Code"> + <summary> + 浠诲姟鍗曞彿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementOrderStatus"> + <summary> + 缁撶畻鍗曠姸鎬� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementOrderName"> + <summary> + 缁撶畻鍗曞悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementOrderTime"> + <summary> + 涓婁紶鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementStatus"> + <summary> + 缁撶畻鐘舵�� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementTime"> + <summary> + 缁撶畻鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskQueryResult.SettlementRemark"> + <summary> + 澶囨敞 + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTasksQuery"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQuery.Keywords"> + <summary> + 鍏抽敭瀛� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQuery.SettlementOrderStatus"> + <summary> + 缁撶畻鍗曠姸鎬� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQuery.SettlementStatus"> + <summary> + 缁撶畻鐘舵�� + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTasksQueryResult"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTasksQueryResultItem"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.Id"> + <summary> + 浠诲姟Id + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.Name"> + <summary> + 浠诲姟鍚嶇О + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.Code"> + <summary> + 浠诲姟鍗曞彿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementOrderStatus"> + <summary> + 缁撶畻鍗曠姸鎬� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementOrderName"> + <summary> + 缁撶畻鍗曞悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementOrderTime"> + <summary> + 涓婁紶鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementStatus"> + <summary> + 缁撶畻鐘舵�� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementTime"> + <summary> + 缁撶畻鏃堕棿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementRemark"> + <summary> + 澶囨敞 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTasksQueryResultItem.SettlementUserCount"> + <summary> + 缁撶畻浜烘暟 </summary> </member> <member name="T:FlexJobApi.Core.GetTaskEnterpriseQuery"> @@ -7839,6 +8189,152 @@ <member name="P:FlexJobApi.Core.GetArrangeTaskUsersQueryResultItem.ArrangeStatus"> <summary> 瀹夋帓鐘舵�� + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQuery"> + <summary> + 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQuery.TaskInfoId"> + <summary> + 浠诲姟Id + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQuery.Keywords"> + <summary> + 鍏抽敭瀛� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQuery.SettlementOrderUrl"> + <summary> + 缁撶畻鍗曞湴鍧� + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQueryResult"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResult.Errors"> + <summary> + 閿欒淇℃伅 + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQueryResultError"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultError.ErrorMessage"> + <summary> + 閿欒淇℃伅 + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.Name"> + <summary> + 濮撳悕 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.Identity"> + <summary> + 韬唤璇佸彿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.ReceiveAccount"> + <summary> + 鏀舵璐︽埛 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.Bank"> + <summary> + 鎵�灞為摱琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.BankBranch"> + <summary> + 寮�鎴锋敮琛屽悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultExcelRow.TaskName"> + <summary> + 浠诲姟鍚嶇О + </summary> + </member> + <member name="T:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.Id"> + <summary> + 浠诲姟鐢ㄦ埛Id + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.Name"> + <summary> + 濮撳悕 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.Identity"> + <summary> + 韬唤璇佸彿 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.ContactPhoneNumber"> + <summary> + 鎵嬫満鍙� + </summary> + <remarks>鑱旂郴鐢佃瘽</remarks> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.CheckReceiveStatus"> + <summary> + 楠屾敹鐘舵�� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.Bank"> + <summary> + 鎵�灞為摱琛� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.BankBranch"> + <summary> + 寮�鎴锋敮琛屽悕绉� + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.ReceiveAccount"> + <summary> + 鏀舵璐︽埛 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.SettlementAmount"> + <summary> + 缁撶畻閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.ActualSettlementAmount"> + <summary> + 瀹炲彂閲戦 + </summary> + </member> + <member name="P:FlexJobApi.Core.GetSettlementTaskUsersQueryResultItem.SettlementTime"> + <summary> + 缁撶畻鏃堕棿 </summary> </member> <member name="T:FlexJobApi.Core.GetTaskUserHireStatusQuery"> @@ -10022,6 +10518,11 @@ 鍏抽棴浼佷笟閽卞寘 </summary> </member> + <member name="P:FlexJobApi.Core.CloseEnterpriseWalletCommand.EnterpriseId"> + <summary> + 浼佷笟Id + </summary> + </member> <member name="P:FlexJobApi.Core.CloseEnterpriseWalletCommand.Access"> <summary> 閫氶亾 @@ -10122,6 +10623,11 @@ 寮�閫氫紒涓氶挶鍖� </summary> </member> + <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommand.EnterpriseId"> + <summary> + 浼佷笟Id + </summary> + </member> <member name="P:FlexJobApi.Core.OpenEnterpriseWalletCommand.Access"> <summary> 閫氶亾 @@ -10142,6 +10648,11 @@ 浼佷笟閽卞寘鍏呭�� </summary> </member> + <member name="P:FlexJobApi.Core.RechargeEnterpriseWalletCommand.EnterpriseId"> + <summary> + 浼佷笟Id + </summary> + </member> <member name="P:FlexJobApi.Core.RechargeEnterpriseWalletCommand.Access"> <summary> 閫氶亾 diff --git a/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs b/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs new file mode 100644 index 0000000..52742c1 --- /dev/null +++ b/FlexJobApi.Core/Jobs/CompleteTaskSettlementT1Job.cs @@ -0,0 +1,164 @@ +锘縰sing Aop.Api.Domain; +using Furion; +using Furion.DatabaseAccessor; +using Furion.DistributedIDGenerator; +using Furion.FriendlyException; +using Furion.Schedule; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using static Microsoft.AspNetCore.Razor.Language.TagHelperMetadata; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 瀹屾垚浠诲姟缁撶畻T+1 + /// </summary> + public class CompleteTaskSettlementT1Job( + IRepository<TaskInfo> rep, + IRepository<TaskInfoUser> repTaskInfoUser, + IRepository<EnterpriseWallet> repEnterpriseWallet, + IRepository<EnterpriseWalletTransaction> repEnterpriseWalletTransaction, + AlipayUtils alipayUtils + ) : IJob + { + private readonly IRepository<TaskInfo> rep = rep; + private readonly IRepository<TaskInfoUser> repTaskInfoUser = repTaskInfoUser; + private readonly IRepository<EnterpriseWallet> repEnterpriseWallet = repEnterpriseWallet; + private readonly AlipayUtils alipayUtils = alipayUtils; + + [UnitOfWork(false)] + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + var now = DateTime.Now; + var env = App.GetConfig<string>("Environment"); + var q = rep.AsQueryable() + .Where(it => it.SettlementStatus == EnumTaskSettlementStatus.InProcess); + var minTime = env == "Local" + ? now.AddMinutes(-1) + : env == "Test" + ? now.AddMinutes(-5) + : now.AddDays(-1); + q = q.Where(it => it.SettlementStartTime.HasValue && it.SettlementStartTime < minTime); + var tasks = await q.ToListAsync(); + var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId); + var taskIds = tasks.DistinctSelect(it => it.Id); + var taskUsers = await repTaskInfoUser + .Where(it => taskIds.Contains(it.TaskInfoId) && it.SettlementStatus == EnumTaskSettlementStatus.InProcess) + .ToListAsync(); + var wallets = await repEnterpriseWallet.AsQueryable() + .Where(it => enterpriseIds.Contains(it.EnterpriseId) && it.Access == EnumEnterpriseWalletAccess.Alipay) + .ToListAsync(); + foreach (var wallet in wallets) + { + var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel + { + AccountBookId = wallet.AccountBookId, + SceneCode = "SATF_FUND_BOOK", + MerchantUserId = wallet.Code, + }); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0; + await repEnterpriseWallet.UpdateNowAsync(wallet); + } + if (tasks.IsNotNull()) + { + foreach (var task in tasks) + { + var wallet = wallets.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId); + task.SettlementStatus = EnumTaskSettlementStatus.Completed; + task.SettlementTime = DateTime.Now; + await rep.UpdateNowAsync(task); + + var users = taskUsers.Where(it => it.TaskInfoId == task.Id).ToList(); + foreach (var user in users) + { + user.SettlementStatus = EnumTaskSettlementStatus.Completed; + user.SettlementTime = DateTime.Now; + await repTaskInfoUser.UpdateNowAsync(user); + + var order = new EnterpriseWalletTransaction(); + order.Type = EnumEnterpriseWalletTransactionType.Recharge; + order.WalletId = wallet.Id; + order.Amount = user.ActualSettlementAmount ?? 0; + order.Remark = user.SettlementRemark; + order.ProductCode = "SINGLE_TRANSFER_NO_PWD"; + order.BizScene = "ENTRUST_TRANSFER"; + order.TransactionStatus = EnumEnterpriseWalletTransactionStatus.WaitSubmit; + order.Balance = wallet.Balance; + await SetCode(order); + await repEnterpriseWalletTransaction.InsertNowAsync(order); + + var response = alipayUtils.FundTransUniTransfer(new AlipayFundTransUniTransferModel + { + OutBizNo = order.Code, + TransAmount = order.Amount.ToString(), + ProductCode = order.ProductCode, + BizScene = order.BizScene, + PayeeInfo = new Participant + { + IdentityType = "ALIPAY_LOGON_ID", + Identity = user.ReceiveAccount, + Name = user.ReceiveName, + }, + PayerInfo = new Participant + { + IdentityType = "ACCOUNT_BOOK_ID", + Identity = wallet.AccountBookId, + ExtInfo = new + { + agreement_no = wallet.AgreementNo, + }.ToJson(), + }, + OrderTitle = order.Remark, + Remark = order.Remark, + BusinessParams = new + { + withdraw_timeliness = "T0" + }.ToJson() + }, "/api/user/enterpriseWallet/alipayFundTransOrderChangedNotify"); + if (response.IsError) + { + order.ErrorCode = response.Code; + order.FailReason = response.SubMsg ?? response.Msg; + } + else + { + order.OrderId = response.OrderId; + order.PayFundOrderId = response.PayFundOrderId; + order.SettleSerialNo = response.SettleSerialNo; + order.TransDate = response.TransDate.ToDateTime(); + order.Link = response.Link; + order.Status = response.Status; + order.SubStatus = response.SubStatus; + order.TransactionStatus = response.Status == "SUCCESS" + ? EnumEnterpriseWalletTransactionStatus.Success + : response.Status == "DEALING" + ? EnumEnterpriseWalletTransactionStatus.Dealing + : response.Status == "REFUND" + ? EnumEnterpriseWalletTransactionStatus.Refund + : EnumEnterpriseWalletTransactionStatus.Fail; + await repEnterpriseWalletTransaction.UpdateNowAsync(order); + } + } + } + } + } + + private async Task SetCode(EnterpriseWalletTransaction entity) + { + entity.Code = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; + var exist = await repEnterpriseWalletTransaction.AsQueryable().AsNoTracking() + .AnyAsync(it => it.Code == entity.Code); + if (exist) + { + await SetCode(entity); + } + } + + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs new file mode 100644 index 0000000..ccdd30a --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Queries/GetSettlementTaskUsersQuery.cs @@ -0,0 +1,164 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + [Resource([EnumResourceController.FlexJobServerTaskUser])] + public class GetSettlementTaskUsersQuery : PagedListQuery<GetSettlementTaskUsersQueryResult, GetSettlementTaskUsersQueryResultItem> + { + /// <summary> + /// 浠诲姟Id + /// </summary> + public Guid TaskInfoId { get; set; } + + /// <summary> + /// 鍏抽敭瀛� + /// </summary> + public string Keywords { get; set; } + + /// <summary> + /// 缁撶畻鍗曞湴鍧� + /// </summary> + public string SettlementOrderUrl { get; set; } + } + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTaskUsersQueryResult : PagedListQueryResult<GetSettlementTaskUsersQueryResultItem> + { + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public List<GetSettlementTaskUsersQueryResultError> Errors { get; set; } + } + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTaskUsersQueryResultError : GetSettlementTaskUsersQueryResultExcelRow + { + /// <summary> + /// 閿欒淇℃伅 + /// </summary> + public string ErrorMessage { get; set; } + } + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTaskUsersQueryResultExcelRow + { + /// <summary> + /// 濮撳悕 + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + public string Identity { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 鏀舵璐︽埛 + /// </summary> + public string ReceiveAccount { get; set; } + + /// <summary> + /// 鎵�灞為摱琛� + /// </summary> + public string Bank { get; set; } + + /// <summary> + /// 寮�鎴锋敮琛屽悕绉� + /// </summary> + public string BankBranch { get; set; } + + /// <summary> + /// 浠诲姟鍚嶇О + /// </summary> + public string TaskName { get; set; } + } + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTaskUsersQueryResultItem + { + /// <summary> + /// 浠诲姟鐢ㄦ埛Id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 濮撳悕 + /// </summary> + [MaxLength(32)] + public string Name { get; set; } + + /// <summary> + /// 韬唤璇佸彿 + /// </summary> + public string Identity { get; set; } + + /// <summary> + /// 鎵嬫満鍙� + /// </summary> + /// <remarks>鑱旂郴鐢佃瘽</remarks> + [MaxLength(11)] + public string ContactPhoneNumber { get; set; } + + /// <summary> + /// 楠屾敹鐘舵�� + /// </summary> + public EnumTaskCheckReceiveStatus? CheckReceiveStatus { get; set; } + + /// <summary> + /// 鎵�灞為摱琛� + /// </summary> + public string Bank { get; set; } + + /// <summary> + /// 寮�鎴锋敮琛屽悕绉� + /// </summary> + public string BankBranch { get; set; } + + /// <summary> + /// 鏀舵璐︽埛 + /// </summary> + public string ReceiveAccount { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻鏃堕棿 + /// </summary> + public DateTime? SettlementTime { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/RevokeTaskSettlementOrderCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/RevokeTaskSettlementOrderCommand.cs new file mode 100644 index 0000000..105b96e --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/RevokeTaskSettlementOrderCommand.cs @@ -0,0 +1,21 @@ +锘縰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.FlexJobServerTask])] + public class RevokeTaskSettlementOrderCommand : IRequest<Guid> + { + /// <summary> + /// 浠诲姟Id + /// </summary> + public Guid TaskInfoId { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementCommand.cs new file mode 100644 index 0000000..3fe534e --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementCommand.cs @@ -0,0 +1,21 @@ +锘縰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.FlexJobServerTask])] + public class SureTaskSettlementCommand : IRequest<Guid> + { + /// <summary> + /// 浠诲姟Id + /// </summary> + public Guid TaskInfoId { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementOrderCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementOrderCommand.cs new file mode 100644 index 0000000..bd1db69 --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/SureTaskSettlementOrderCommand.cs @@ -0,0 +1,76 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 纭缁撶畻鍗� + /// </summary> + [Resource([EnumResourceController.FlexJobServerTask])] + public class SureTaskSettlementOrderCommand : IRequest<Guid> + { + /// <summary> + /// 浠诲姟Id + /// </summary> + public Guid TaskInfoId { get; set; } + + /// <summary> + /// 缁撶畻鍗曞湴鍧� + /// </summary> + public string SettlementOrderUrl { get; set; } + + /// <summary> + /// 缁撶畻鍚嶅崟 + /// </summary> + public List<SureTaskSettlementOrderCommandUser> TaskInfoUsers { get; set; } + } + + /// <summary> + /// 纭缁撶畻鍗� + /// </summary> + public class SureTaskSettlementOrderCommandUser + { + /// <summary> + /// 浠诲姟鐢ㄦ埛Id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 濮撳悕 + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 鎵�灞為摱琛� + /// </summary> + public string Bank { get; set; } + + /// <summary> + /// 寮�鎴锋敮琛屽悕绉� + /// </summary> + public string BankBranch { get; set; } + + /// <summary> + /// 鏀舵璐︽埛 + /// </summary> + [Required] + public string ReceiveAccount { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + [Required] + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + [Required] + public decimal? ActualSettlementAmount { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTaskQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTaskQuery.cs new file mode 100644 index 0000000..bec0cb2 --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTaskQuery.cs @@ -0,0 +1,82 @@ +锘縰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.FlexJobServerTask])] + public class GetSettlementTaskQuery : IRequest<GetSettlementTaskQueryResult> + { + /// <summary> + /// Id + /// </summary> + public Guid Id { get; set; } + } + + /// <summary> + /// 鏌ヨ缁撶畻鍗曡鎯�-缁撴灉 + /// </summary> + public class GetSettlementTaskQueryResult + { + /// <summary> + /// Id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 浠诲姟鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠诲姟鍗曞彿 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 缁撶畻鍗曠姸鎬� + /// </summary> + public EnumTaskSettlementOrderStatus? SettlementOrderStatus { get; set; } + + /// <summary> + /// 缁撶畻鍗曞悕绉� + /// </summary> + public string SettlementOrderName { get; set; } + + /// <summary> + /// 涓婁紶鏃堕棿 + /// </summary> + public DateTime? SettlementOrderTime { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻鐘舵�� + /// </summary> + public EnumTaskSettlementStatus? SettlementStatus { get; set; } + + /// <summary> + /// 缁撶畻鏃堕棿 + /// </summary> + public DateTime? SettlementTime { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string SettlementRemark { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTasksQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTasksQuery.cs new file mode 100644 index 0000000..1abef94 --- /dev/null +++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetSettlementTasksQuery.cs @@ -0,0 +1,108 @@ +锘縰sing MediatR; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FlexJobApi.Core +{ + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + [Resource([EnumResourceController.FlexJobServerTask])] + public class GetSettlementTasksQuery : PagedListQuery<GetSettlementTasksQueryResult, GetSettlementTasksQueryResultItem> + { + /// <summary> + /// 鍏抽敭瀛� + /// </summary> + public string Keywords { get; set; } + + /// <summary> + /// 缁撶畻鍗曠姸鎬� + /// </summary> + public EnumTaskSettlementOrderStatus? SettlementOrderStatus { get; set; } + + /// <summary> + /// 缁撶畻鐘舵�� + /// </summary> + public EnumTaskSettlementStatus? SettlementStatus { get; set; } + + } + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTasksQueryResult : PagedListQueryResult<GetSettlementTasksQueryResultItem> + { + + } + + + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + public class GetSettlementTasksQueryResultItem + { + /// <summary> + /// 浠诲姟Id + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// 浠诲姟鍚嶇О + /// </summary> + public string Name { get; set; } + + /// <summary> + /// 浠诲姟鍗曞彿 + /// </summary> + public string Code { get; set; } + + /// <summary> + /// 缁撶畻鍗曠姸鎬� + /// </summary> + public EnumTaskSettlementOrderStatus? SettlementOrderStatus { get; set; } + + /// <summary> + /// 缁撶畻鍗曞悕绉� + /// </summary> + public string SettlementOrderName { get; set; } + + /// <summary> + /// 涓婁紶鏃堕棿 + /// </summary> + public DateTime? SettlementOrderTime { get; set; } + + /// <summary> + /// 瀹炲彂閲戦 + /// </summary> + public decimal? ActualSettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻閲戦 + /// </summary> + public decimal? SettlementAmount { get; set; } + + /// <summary> + /// 缁撶畻鐘舵�� + /// </summary> + public EnumTaskSettlementStatus? SettlementStatus { get; set; } + + /// <summary> + /// 缁撶畻鏃堕棿 + /// </summary> + public DateTime? SettlementTime { get; set; } + + /// <summary> + /// 澶囨敞 + /// </summary> + public string SettlementRemark { get; set; } + + /// <summary> + /// 缁撶畻浜烘暟 + /// </summary> + public int SettlementUserCount { get; set; } + } +} diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs index af114a2..1a076d7 100644 --- a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs +++ b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/CloseEnterpriseWalletCommand.cs @@ -14,6 +14,10 @@ public class CloseEnterpriseWalletCommand : IRequest<Guid> { /// <summary> + /// 浼佷笟Id + /// </summary> + public Guid? EnterpriseId { get; set; } + /// <summary> /// 閫氶亾 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs index 63695cb..c0dda74 100644 --- a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs +++ b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/OpenEnterpriseWalletCommand.cs @@ -14,6 +14,10 @@ public class OpenEnterpriseWalletCommand : IRequest<OpenEnterpriseWalletCommandResult> { /// <summary> + /// 浼佷笟Id + /// </summary> + public Guid? EnterpriseId { get; set; } + /// <summary> /// 閫氶亾 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/RechargeEnterpriseWalletCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/RechargeEnterpriseWalletCommand.cs index bacade2..e6db612 100644 --- a/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/RechargeEnterpriseWalletCommand.cs +++ b/FlexJobApi.Core/Models/UserServer/EnterpriseWallets/Commands/RechargeEnterpriseWalletCommand.cs @@ -14,6 +14,10 @@ public class RechargeEnterpriseWalletCommand : IRequest<RechargeEnterpriseWalletCommandResult> { /// <summary> + /// 浼佷笟Id + /// </summary> + public Guid? EnterpriseId { get; set; } + /// <summary> /// 閫氶亾 /// </summary> public EnumEnterpriseWalletAccess Access { get; set; } diff --git a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml index c648ea6..8365c12 100644 --- a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml +++ b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml @@ -85,7 +85,7 @@ 浠诲姟鍛戒护澶勭悊鍣� </summary> </member> - <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo})"> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseWallet},FlexJobApi.Core.AlipayUtils)"> <summary> 浠诲姟鍛戒护澶勭悊鍣� </summary> @@ -118,6 +118,30 @@ <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="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.SureTaskSettlementOrderCommand,System.Threading.CancellationToken)"> + <summary> + 纭缁撶畻鍗� + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.RevokeTaskSettlementOrderCommand,System.Threading.CancellationToken)"> + <summary> + 鎾ゅ洖缁撶畻 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.SureTaskSettlementCommand,System.Threading.CancellationToken)"> + <summary> + 纭缁撶畻 </summary> <param name="request"></param> <param name="cancellationToken"></param> @@ -194,6 +218,22 @@ <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoQueryHandler.Handle(FlexJobApi.Core.GetPersonalCancelTaskInfosQuery,System.Threading.CancellationToken)"> <summary> 鎴戠殑宸插彇娑堝垎椤靛垪琛� + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoQueryHandler.Handle(FlexJobApi.Core.GetSettlementTasksQuery,System.Threading.CancellationToken)"> + <summary> + 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskInfoQueryHandler.Handle(FlexJobApi.Core.GetSettlementTaskQuery,System.Threading.CancellationToken)"> + <summary> + 鏌ヨ缁撶畻鍗曡鎯� </summary> <param name="request"></param> <param name="cancellationToken"></param> @@ -293,5 +333,13 @@ <param name="cancellationToken"></param> <returns></returns> </member> + <member name="M:FlexJobApi.FlexJobServer.Application.TaskUserQueryHandler.Handle(FlexJobApi.Core.GetSettlementTaskUsersQuery,System.Threading.CancellationToken)"> + <summary> + 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> </members> </doc> diff --git a/FlexJobApi.FlexJobServer.Application/TaskCheckReceives/Commands/TaskCheckReceiveCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/TaskCheckReceives/Commands/TaskCheckReceiveCommandHandler.cs index a533d6f..97a3f74 100644 --- a/FlexJobApi.FlexJobServer.Application/TaskCheckReceives/Commands/TaskCheckReceiveCommandHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/TaskCheckReceives/Commands/TaskCheckReceiveCommandHandler.cs @@ -148,13 +148,15 @@ var taskUserCheckReceiveStatuses = await repTaskInfoUser.AsQueryable().AsNoTracking() .Where(it => it.TaskInfoId == task.Id - && it.Id != taskUser.Id) + && it.Id != taskUser.Id + && it.ArrangeStatus == EnumTaskUserArrangeStatus.Complete) .Select(it => it.CheckReceiveStatus) .ToListAsync(); taskUserCheckReceiveStatuses.Add(EnumTaskCheckReceiveStatus.Completed); if (taskUserCheckReceiveStatuses.All(it => it == EnumTaskCheckReceiveStatus.Completed)) { task.CheckReceiveStatus = EnumTaskCheckReceiveStatus.Completed; + task.SettlementOrderStatus = EnumTaskSettlementOrderStatus.Wait; } await repTaskInfoUserSubmit.UpdateAsync(submit); diff --git a/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs index 3390865..e051adb 100644 --- a/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/TaskUsers/Queries/TaskUserQueryHandler.cs @@ -1,6 +1,9 @@ -锘縰sing FlexJobApi.Core; +锘縰sing Aop.Api.Domain; +using FlexJobApi.Core; using Furion.DatabaseAccessor; +using Furion.DataValidation; using Furion.FriendlyException; +using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; using System; @@ -18,7 +21,8 @@ IRepository<TaskInfoUser> rep) : IRequestHandler<GetTaskUsersQuery, GetTaskUsersQueryResult>, IRequestHandler<GetArrangeTaskUsersQuery, GetArrangeTaskUsersQueryResult>, - IRequestHandler<GetTaskUserHireStatusQuery, GetTaskUserHireStatusQueryResult> + IRequestHandler<GetTaskUserHireStatusQuery, GetTaskUserHireStatusQueryResult>, + IRequestHandler<GetSettlementTaskUsersQuery, GetSettlementTaskUsersQueryResult> { private readonly IRepository<TaskInfoUser> rep = rep; @@ -145,14 +149,137 @@ { q = q.Where(it => it.EnterpriseEmployee.UserId == request.UserId); } - var model = await q - .Select(it => new GetTaskUserHireStatusQueryResult - { - HireStatus = it.HireStatus - }) - .FirstOrDefaultAsync(cancellationToken); + var model = await q + .Select(it => new GetTaskUserHireStatusQueryResult + { + HireStatus = it.HireStatus + }) + .FirstOrDefaultAsync(cancellationToken); if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "鎶ュ悕淇℃伅"); return model; } + + /// <summary> + /// 鏌ヨ缁撶畻鍚嶅崟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<GetSettlementTaskUsersQueryResult> Handle(GetSettlementTaskUsersQuery request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var q = rep.AsQueryable().AsNoTracking() + .Where(it => it.TaskInfoId == request.TaskInfoId); + var s = q + .Select(it => new GetSettlementTaskUsersQueryResultItem + { + Id = it.Id, + Name = it.EnterpriseEmployee.Name, + Identity = it.EnterpriseEmployee.Identity, + ContactPhoneNumber = it.EnterpriseEmployee.ContactPhoneNumber, + CheckReceiveStatus = it.CheckReceiveStatus, + Bank = it.Bank, + BankBranch = it.BankBranch, + ReceiveAccount = it.ReceiveAccount, + SettlementAmount = it.SettlementAmount, + ActualSettlementAmount = it.ActualSettlementAmount, + SettlementTime = it.SettlementTime + }); + var list = await request.PageModel.GetPagedListAsync<GetSettlementTaskUsersQueryResult, GetSettlementTaskUsersQueryResultItem>(s, cancellationToken); + + var successList = new List<GetSettlementTaskUsersQueryResultExcelRow>(); + if (request.SettlementOrderUrl.IsNotNull()) + { + var models = await ExcelUtils.ImportExcelFromOSS<GetSettlementTaskUsersQueryResultExcelRow>(request.SettlementOrderUrl); + foreach (var model in models) + { + var errors = new List<string>(); + if (model.Name.IsNull()) + { + errors.Add("璇峰~鍐欏鍚�"); + } + if (model.Identity.IsNull()) + { + errors.Add("璇峰~鍐欒韩浠借瘉鍙�"); + } + else if (!model.Identity.TryValidate(EnumValidationTypes.ValiIdentity).IsValid) + { + errors.Add("韬唤璇佸彿鏍煎紡涓嶆纭�"); + } + else if (successList.Any(it => it.Identity == model.Identity)) + { + errors.Add("韬唤璇佸彿閲嶅"); + } + if (model.Bank.IsNull()) + { + errors.Add("璇峰~鍐欐墍灞為摱琛�"); + } + if (model.ReceiveAccount.IsNull()) + { + errors.Add("璇峰~鍐欐敹娆捐处鍙�"); + } + if (model.SettlementAmount == null) + { + errors.Add("璇峰~鍐欑粨绠楅噾棰�"); + } + else if (model.SettlementAmount < 0) + { + errors.Add("缁撶畻閲戦涓嶅彲涓鸿礋鏁�"); + } + if (model.ActualSettlementAmount == null) + { + errors.Add("璇峰~鍐欏疄鍙戦噾棰�"); + } + else if (model.ActualSettlementAmount < 0) + { + errors.Add("瀹炲彂閲戦涓嶅彲涓鸿礋鏁�"); + } + else if (model.ActualSettlementAmount > 0 && model.ActualSettlementAmount < 1) + { + errors.Add("瀹炲彂閲戦涓嶅彲灏忎簬1鍏�"); + } + + var item = list.Data.FirstOrDefault(it => it.Identity == model.Identity); + if (item == null) + { + errors.Add("鐏靛伐涓嶅瓨鍦�"); + } + else if (item.CheckReceiveStatus != EnumTaskCheckReceiveStatus.Completed) + { + errors.Add("鏈畬鎴愰獙鏀�"); + } + else + { + item.SettlementAmount = model.SettlementAmount; + item.ActualSettlementAmount = model.ActualSettlementAmount; + item.ReceiveAccount = model.ReceiveAccount; + item.Bank = model.Bank; + item.BankBranch = model.BankBranch; + } + + if (errors.IsNotNull()) + { + var error = model.Adapt<GetSettlementTaskUsersQueryResultError>(); + error.ErrorMessage = errors.SplitJoin("锛�"); + list.Errors.Add(error); + } + else + { + successList.Add(model); + } + } + } + + var pagedList = await list.Data + .Where(it => successList.Any(s => s.Identity == it.Identity)) + .AsQueryable() + .ToPagedListAsync(request.PageModel.Page, request.PageModel.Rows, cancellationToken); + list.PageModel = request.PageModel.Adapt<PagedListQueryResultPageModel>(); + list.PageModel.TotalCount = pagedList.TotalCount; + list.PageModel.TotalPage = pagedList.TotalPages; + list.Data = pagedList.Items.ToList(); + + return list; + } } } diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs index 724213f..1fa4b10 100644 --- a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs @@ -1,4 +1,5 @@ -锘縰sing FlexJobApi.Core; +锘縰sing Aop.Api.Domain; +using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; @@ -10,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using TaskInfo = FlexJobApi.Core.TaskInfo; namespace FlexJobApi.FlexJobServer.Application { @@ -17,14 +19,21 @@ /// 浠诲姟鍛戒护澶勭悊鍣� /// </summary> public class TaskInfoCommandHandler( - IRepository<TaskInfo> rep + IRepository<TaskInfo> rep, + IRepository<EnterpriseWallet> repEnterpriseWallet, + AlipayUtils alipayUtils ) : IRequestHandler<SaveTaskInfoCommand, Guid>, IRequestHandler<SetTaskInfoReleaseStatusCommand, int>, IRequestHandler<SetTaskInfoRecommendStatusCommand, int>, - IRequestHandler<DeleteTaskInfoCommand, int> + IRequestHandler<DeleteTaskInfoCommand, int>, + IRequestHandler<SureTaskSettlementOrderCommand, Guid>, + IRequestHandler<RevokeTaskSettlementOrderCommand, Guid>, + IRequestHandler<SureTaskSettlementCommand, Guid> { private readonly IRepository<TaskInfo> rep = rep; + private readonly IRepository<EnterpriseWallet> repEnterpriseWallet = repEnterpriseWallet; + private readonly AlipayUtils alipayUtils = alipayUtils; /// <summary> /// 淇濆瓨浠诲姟 @@ -140,6 +149,133 @@ }, cancellationToken); } + /// <summary> + /// 纭缁撶畻鍗� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(SureTaskSettlementOrderCommand request, CancellationToken cancellationToken) + { + var entity = await TaskInfoRepository.GetQueryable(rep, false) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.InProcess) throw Oops.Oh(EnumErrorCodeType.s510, "缁撶畻涓笉鍙慨鏀癸紝璇峰厛鎾ゅ洖"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠椾笉鍙慨鏀�"); + entity.SettlementOrderStatus = EnumTaskSettlementOrderStatus.Completed; + entity.SettlementOrderUrl = request.SettlementOrderUrl; + entity.SettlementOrderName = entity.SettlementOrderUrl.Substring(entity.SettlementOrderUrl.LastIndexOf("/") + 1); + entity.SettlementStatus = EnumTaskSettlementStatus.Wait; + entity.SettlementUserCount = request.TaskInfoUsers.Count; + entity.SettlementAmount = request.TaskInfoUsers.Sum(it => it.SettlementAmount ?? 0); + entity.ActualSettlementAmount = request.TaskInfoUsers.Sum(it => it.ActualSettlementAmount ?? 0); + foreach (var model in request.TaskInfoUsers) + { + var user = entity.TaskInfoUsers.FirstOrDefault(it => it.Id == model.Id); + if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, $"鐏靛伐{model.Name}"); + if (user.SettlementStatus == EnumTaskSettlementStatus.InProcess) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}缁撶畻涓笉鍙慨鏀癸紝璇峰厛鎾ゅ洖"); + if (user.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}宸茬粨绠椾笉鍙慨鏀�"); + if (user.CheckReceiveStatus != EnumTaskCheckReceiveStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}鏈獙鏀�"); + if (model.SettlementAmount < 0) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}缁撶畻閲戦涓嶅彲璐熸暟"); + if (model.ActualSettlementAmount < 0) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}瀹炲彂閲戦涓嶅彲璐熸暟"); + if (model.ActualSettlementAmount > 0 && model.ActualSettlementAmount < 1) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}瀹炲彂閲戦涓嶅彲灏忎簬1鍏�"); + user.Bank = model.Bank; + user.BankBranch = model.BankBranch; + user.ReceiveAccount = model.ReceiveAccount; + user.SettlementAmount = model.SettlementAmount; + user.ActualSettlementAmount = model.ActualSettlementAmount; + user.SettlementStatus = EnumTaskSettlementStatus.Wait; + } + await rep.UpdateAsync(entity); + return entity.Id; + } + + /// <summary> + /// 鎾ゅ洖缁撶畻 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(RevokeTaskSettlementOrderCommand request, CancellationToken cancellationToken) + { + var entity = await TaskInfoRepository.GetQueryable(rep, false) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑濮嬬粨绠楋紝璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠椾笉鍙挙鍥�"); + entity.SettlementStatus = EnumTaskSettlementStatus.Wait; + foreach (var user in entity.TaskInfoUsers) + { + if (user.SettlementStatus == EnumTaskSettlementStatus.InProcess) + { + user.SettlementStatus = EnumTaskSettlementStatus.Wait; + } + } + await rep.UpdateAsync(entity); + return entity.Id; + } + + /// <summary> + /// 纭缁撶畻 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(SureTaskSettlementCommand request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var entity = await TaskInfoRepository.GetQueryable(rep, false, logier) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementOrderStatus != EnumTaskSettlementOrderStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑濮嬬粨绠楋紝璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠�"); + entity.SettlementStatus = EnumTaskSettlementStatus.InProcess; + entity.SettlementStartTime = DateTime.Now; + foreach (var user in entity.TaskInfoUsers) + { + if (user.SettlementStatus == EnumTaskSettlementStatus.Wait) + { + user.SettlementStatus = EnumTaskSettlementStatus.InProcess; + } + } + var wallet = await repEnterpriseWallet.AsQueryable() + .Where(it => it.EnterpriseId == entity.EnterpriseId && it.Access == EnumEnterpriseWalletAccess.Alipay) + .FirstOrDefaultAsync(); + if (wallet == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); + if (wallet.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘鏈绾�"); + if (wallet.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘璁拌处鏈湭寮�閫�"); + var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel + { + AccountBookId = wallet.AccountBookId, + SceneCode = "SATF_FUND_BOOK", + MerchantUserId = wallet.Code, + }); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0; + await repEnterpriseWallet.UpdateAsync(wallet); + + var amount = await TaskInfoRepository.GetQueryable(rep, false, logier) + .Where(it => + it.EnterpriseId == entity.EnterpriseId + && it.Id != request.TaskInfoId + && it.SettlementStatus == EnumTaskSettlementStatus.InProcess + && it.ActualSettlementAmount.HasValue) + .SumAsync(it => it.ActualSettlementAmount!.Value); + amount += entity.ActualSettlementAmount!.Value; + if (wallet.Balance < amount) + throw Oops.Oh(EnumErrorCodeType.s510, "浼佷笟閽卞寘浣欓涓嶈冻"); + + await rep.UpdateAsync(entity); + return entity.Id; + } + 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 ec103d6..3a770be 100644 --- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs @@ -24,7 +24,9 @@ IRequestHandler<GetTaskInfosQuery, GetTaskInfosQueryResult>, IRequestHandler<GetPersonalApplyTaskInfosQuery, GetPersonalApplyTaskInfosQueryResult>, IRequestHandler<GetPersonalHireTaskInfosQuery, GetPersonalHireTaskInfosQueryResult>, - IRequestHandler<GetPersonalCancelTaskInfosQuery, GetPersonalCancelTaskInfosQueryResult> + IRequestHandler<GetPersonalCancelTaskInfosQuery, GetPersonalCancelTaskInfosQueryResult>, + IRequestHandler<GetSettlementTasksQuery, GetSettlementTasksQueryResult>, + IRequestHandler<GetSettlementTaskQuery, GetSettlementTaskQueryResult> { private readonly IRepository<TaskInfo> rep = rep; @@ -381,5 +383,63 @@ return await request.PageModel.GetPagedListAsync<GetPersonalCancelTaskInfosQueryResult, GetPersonalCancelTaskInfosQueryResultItem>(s, cancellationToken); } + /// <summary> + /// 鏌ヨ缁撶畻浠诲姟鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<GetSettlementTasksQueryResult> Handle(GetSettlementTasksQuery request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var q = TaskInfoRepository.GetQueryable(rep, true, logier) + .Where(it => it.SettlementOrderStatus.HasValue && it.SettlementStatus.HasValue); + if (request.Keywords.IsNotNull()) + { + q = q.Where(it => + it.Name.Contains(request.Keywords) + || it.Code.Contains(request.Keywords)); + } + if (request.SettlementOrderStatus.HasValue) + { + q = q.Where(it => it.SettlementOrderStatus == request.SettlementOrderStatus); + } + if (request.SettlementStatus.HasValue) + { + q = q.Where(it => it.SettlementStatus == request.SettlementStatus); + } + var s = q + .Select(it=>new GetSettlementTasksQueryResultItem + { + Id = it.Id, + Name = it.Name, + Code = it.Code, + SettlementOrderStatus = it.SettlementOrderStatus, + SettlementOrderName = it.SettlementOrderName, + SettlementOrderTime = it.SettlementOrderTime, + ActualSettlementAmount = it.ActualSettlementAmount, + SettlementAmount = it.SettlementAmount, + SettlementStatus = it.SettlementStatus, + SettlementTime = it.SettlementTime, + SettlementRemark = it.SettlementRemark, + SettlementUserCount = it.SettlementUserCount + }); + return await request.PageModel.GetPagedListAsync<GetSettlementTasksQueryResult, GetSettlementTasksQueryResultItem>(s, cancellationToken); + } + + /// <summary> + /// 鏌ヨ缁撶畻鍗曡鎯� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<GetSettlementTaskQueryResult> Handle(GetSettlementTaskQuery request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var model = TaskInfoRepository.GetQueryable(rep, true, logier) + .Where(it => it.Id == request.Id) + .GetDetail<TaskInfo, GetSettlementTaskQueryResult>(); + return model; + } } } diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs index 5ae1bbd..26a0f07 100644 --- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs @@ -163,7 +163,7 @@ } } } - if (errors.IsNotNull()) + else { var error = model.Adapt<ImportEnterpriseEmployeesCommandResultError>(); error.ErrorMessage = errors.SplitJoin("锛�"); diff --git a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs index 93fe50d..d40fbc0 100644 --- a/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/EnterpriseWallets/Commands/EnterpriseWalletCommandHandler.cs @@ -41,18 +41,23 @@ public async Task<OpenEnterpriseWalletCommandResult> Handle(OpenEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var enterprise = await repEnterprise.AsQueryable().AsNoTracking() - .Where(it => it.Id == logier.EnterpriseId) + .Where(it => it.Id == request.EnterpriseId) .FirstOrDefaultAsync(); if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟"); if (!enterprise.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛瀹炲悕"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) { entity = new EnterpriseWallet(); - entity.EnterpriseId = logier.EnterpriseId!.Value; + entity.EnterpriseId = request.EnterpriseId!.Value; entity.Access = EnumEnterpriseWalletAccess.Alipay; entity.PersonalProductCode = "FUND_SAFT_SIGN_WITHHOLDING_P"; entity.SignScene = "INDUSTRY|SATF_ACC"; @@ -95,8 +100,13 @@ public async Task<Guid> Handle(CloseEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈绾�"); @@ -122,8 +132,13 @@ public async Task<RechargeEnterpriseWalletCommandResult> Handle(RechargeEnterpriseWalletCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); + if (logier.Type == EnumUserType.Enterprise) + { + request.EnterpriseId = logier.EnterpriseId; + } + if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欎紒涓欼d"); var entity = await rep.AsQueryable() - .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Access == request.Access) + .Where(it => it.EnterpriseId == request.EnterpriseId && it.Access == request.Access) .FirstOrDefaultAsync(); if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); if (entity.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s510, "鏈绾�"); diff --git a/FlexJobApi.Web.Entry/Startup.cs b/FlexJobApi.Web.Entry/Startup.cs index 3c4cdfe..2b71e1b 100644 --- a/FlexJobApi.Web.Entry/Startup.cs +++ b/FlexJobApi.Web.Entry/Startup.cs @@ -1,5 +1,6 @@ 锘縰sing Consul; using FlexJobApi.Core; +using FlexJobApi.Core.Jobs; using Furion; using Furion.EventBus; using Furion.Schedule; @@ -60,6 +61,9 @@ //options.AddPersistence<DbJobPersistence>(); options.AddJob<CalcTaskSatusByDateJob>(Triggers.Hourly()); options.AddJob<CalcUserAgeByIdCardJob>(Triggers.Daily()); + options.AddJob<RefreshEnterpriseWalletStatusJob>(Triggers.PeriodMinutes(5)); + options.AddJob<RefreshEnterpriseWalletTransactionStatusJob>(Triggers.PeriodMinutes(2)); + options.AddJob<CompleteTaskSettlementT1Job>(Triggers.PeriodMinutes(2)); }); services.AddSpecificationDocuments(options => -- Gitblit v1.9.1