From 65c143397772e0c2458a243f4110863854478ddc Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期三, 20 八月 2025 15:58:19 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Entities/CommonEntity.cs                                                          |   18 
 FlexJobApi.Core/Enums/Users/EnumContractTemplateStatus.cs                                         |   23 
 FlexJobApi.Core/Entities/UserServer/Enterprises/Enterprise.cs                                     |    6 
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SetIsDisabledContractTemplateCommand.cs  |   16 
 FlexJobApi.UserServer.Application/ElectronSign/Queries/ContractTemplateQueryHandler.cs            |  301 +++
 FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs         |  100 +
 FlexJobApi.Core/Enums/Users/EnumContractTemplateValueType.cs                                      |   28 
 FlexJobApi.Core/Enums/Users/EnumElectronSignAccess.cs                                             |   24 
 FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.Designer.cs          | 2784 +++++++++++++++++++++++++++++++++
 FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplateValue.cs                        |   55 
 FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.cs                   |  101 +
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplateLogsQuery.cs |   86 +
 FlexJobApi.Core/Utils/DbUtils/DbUtils.cs                                                          |   51 
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SaveContractTemplateCommand.cs           |  103 +
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateEnterprisesQuery.cs    |   71 
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateQuery.cs               |  113 +
 FlexJobApi.Core/FlexJobApi.Core.xml                                                               |  575 +++++++
 FlexJobApi.EntityFramework.Core/DbContexts/LogDbContext.cs                                        |   15 
 FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml                           |   68 
 FlexJobApi.Database.Migrations/REDEME.MD                                                          |    2 
 FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplate.cs                             |   77 
 FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplatesQuery.cs    |  115 +
 FlexJobApi.Core/Enums/Users/EnumContractTemplateValueRecorder.cs                                  |   24 
 FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs                        |  153 +
 24 files changed, 4,886 insertions(+), 23 deletions(-)

diff --git a/FlexJobApi.Core/Entities/CommonEntity.cs b/FlexJobApi.Core/Entities/CommonEntity.cs
index 1728392..581872d 100644
--- a/FlexJobApi.Core/Entities/CommonEntity.cs
+++ b/FlexJobApi.Core/Entities/CommonEntity.cs
@@ -2,6 +2,7 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -45,6 +46,13 @@
     public abstract class CommonEntity : Entity<Guid>, IPrivateEntity
     {
         /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        [Key]
+        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+        public override Guid Id { get; set; }
+
+        /// <summary>
         /// 鎺掑簭
         /// </summary>
         public virtual int Sort { get; set; }
@@ -55,6 +63,11 @@
         public virtual string TraceId { get; set; }
 
         /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public override DateTimeOffset CreatedTime { get; set; }
+
+        /// <summary>
         /// 鍒涘缓鎿嶄綔浜�
         /// </summary>
         public virtual Guid? CreatedUserId { get; set; }
@@ -65,6 +78,11 @@
         public virtual Guid? CreatedEnterpriseId { get; set; }
 
         /// <summary>
+        /// 鏈�鍚庢洿鏂版椂闂�
+        /// </summary>
+        public override DateTimeOffset? UpdatedTime { get; set; }
+
+        /// <summary>
         /// 鏈�鍚庢洿鏂版搷浣滀汉
         /// </summary>
         public virtual Guid? UpdatedUserId { get; set; }
diff --git a/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplate.cs b/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplate.cs
new file mode 100644
index 0000000..e9cfce6
--- /dev/null
+++ b/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplate.cs
@@ -0,0 +1,77 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍚堝悓鍒剁増
+    /// </summary>
+    public class ContractTemplate : CommonEntity, IIsDisabled
+    {
+        public ContractTemplate()
+        {
+            Values = [];
+        }
+
+        /// <summary>
+        /// 浼佷笟Id
+        /// </summary>
+        public Guid EnterpriseId { get; set; }
+
+        /// <summary>
+        /// 浼佷笟
+        /// </summary>
+        public Enterprise Enterprise { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍚嶇О
+        /// </summary>
+        [Required]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 妯℃澘
+        /// </summary>
+        [Required]
+        public string File { get; set; }
+
+        /// <summary>
+        /// 涓氬姟缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 閫氶亾
+        /// </summary>
+        public EnumElectronSignAccess? Access { get; set; }
+
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鐘舵��
+        /// </summary>
+        public EnumContractTemplateStatus Status { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鏃堕棿
+        /// </summary>
+        public DateTime? CompletedTime { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸茬鐢�
+        /// </summary>
+        public bool IsDisabled { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺
+        /// </summary>
+        public List<ContractTemplateValue> Values { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplateValue.cs b/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplateValue.cs
new file mode 100644
index 0000000..2223615
--- /dev/null
+++ b/FlexJobApi.Core/Entities/UserServer/ElectronSigns/ContractTemplateValue.cs
@@ -0,0 +1,55 @@
+锘縰sing FlexJobApi.Core.Enums.Users;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍚堝悓妯℃澘鍙橀噺
+    /// </summary>
+    public class ContractTemplateValue : CommonEntity, IPhysicalDeletion
+    {
+        /// <summary>
+        /// 鍚堝悓妯℃澘Id
+        /// </summary>
+        public Guid TemplateId { get; set; }
+
+        /// <summary>
+        /// 鍚堝悓妯℃澘
+        /// </summary>
+        public ContractTemplate Template { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺绫诲瀷
+        /// </summary>
+        public EnumContractTemplateValueType Type { get; set; }
+
+        /// <summary>
+        /// 鍐呭濉啓浜�
+        /// </summary>
+        public EnumContractTemplateValueRecorder Recorder { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛绫诲瀷
+        /// </summary>
+        public EnumUserType? UserType { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺鍚嶇О
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺浠g爜
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鏄惁蹇呭~
+        /// </summary>
+        public bool Required { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Entities/UserServer/Enterprises/Enterprise.cs b/FlexJobApi.Core/Entities/UserServer/Enterprises/Enterprise.cs
index 05a5113..7fad3c1 100644
--- a/FlexJobApi.Core/Entities/UserServer/Enterprises/Enterprise.cs
+++ b/FlexJobApi.Core/Entities/UserServer/Enterprises/Enterprise.cs
@@ -20,6 +20,7 @@
         {
             Users = [];
             Departments = [];
+            ContractTemplates = [];
         }
 
         /// <summary>
@@ -206,6 +207,11 @@
         /// </summary>
         public List<User> Users { get; set; }
 
+        /// <summary>
+        /// 鍚堝悓妯℃澘
+        /// </summary>
+        public List<ContractTemplate> ContractTemplates { get; set; }
+
         public void Configure(EntityTypeBuilder<Enterprise> entityBuilder, DbContext dbContext, Type dbContextLocator)
         {
             entityBuilder
diff --git a/FlexJobApi.Core/Enums/Users/EnumContractTemplateStatus.cs b/FlexJobApi.Core/Enums/Users/EnumContractTemplateStatus.cs
new file mode 100644
index 0000000..3fec685
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Users/EnumContractTemplateStatus.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 EnumContractTemplateStatus
+    {
+        /// <summary>
+        /// 寰呭埗鐗�
+        /// </summary>
+        Wait = 10,
+        /// <summary>
+        /// 宸插畬鎴�
+        /// </summary>
+        Completed = 20
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueRecorder.cs b/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueRecorder.cs
new file mode 100644
index 0000000..6642c14
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueRecorder.cs
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍚堝悓妯℃澘鍙橀噺
+    /// </summary>
+    public enum EnumContractTemplateValueRecorder
+    {
+        /// <summary>
+        /// 鍙戜欢浜�
+        /// </summary>
+        Creator = 10,
+        /// <summary>
+        /// 绛剧讲浜�
+        /// </summary>
+        Signer = 20,
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueType.cs b/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueType.cs
new file mode 100644
index 0000000..ad5dd17
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Users/EnumContractTemplateValueType.cs
@@ -0,0 +1,28 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core.Enums.Users
+{
+    /// <summary>
+    /// 鍚堝悓妯℃澘鍙橀噺绫诲瀷
+    /// </summary>
+    public enum EnumContractTemplateValueType
+    {
+        /// <summary>
+        /// 鏂囨湰
+        /// </summary>
+        Text = 10,
+        /// <summary>
+        /// 绛剧讲
+        /// </summary>
+        Sign = 20,
+        /// <summary>
+        /// 鏃ユ湡
+        /// </summary>
+        Date = 30,
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Users/EnumElectronSignAccess.cs b/FlexJobApi.Core/Enums/Users/EnumElectronSignAccess.cs
new file mode 100644
index 0000000..dd00f6f
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Users/EnumElectronSignAccess.cs
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鐢靛瓙绛�
+    /// </summary>
+    public enum EnumElectronSignAccess
+    {
+        /// <summary>
+        /// 涓婁笂绛�
+        /// </summary>
+        BestSign = 10,
+        /// <summary>
+        /// 鏀粯瀹濅俊浠荤
+        /// </summary>
+        AlipaySign = 20
+    }
+}
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 8c6841d..5235b06 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -44,6 +44,11 @@
             鏄惁鍒犻櫎
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.CommonEntity.Id">
+            <summary>
+            涓婚敭Id
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.CommonEntity.Sort">
             <summary>
             鎺掑簭
@@ -54,6 +59,11 @@
             璺熻釜Id
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.CommonEntity.CreatedTime">
+            <summary>
+            鍒涘缓鏃堕棿
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.CommonEntity.CreatedUserId">
             <summary>
             鍒涘缓鎿嶄綔浜�
@@ -62,6 +72,11 @@
         <member name="P:FlexJobApi.Core.CommonEntity.CreatedEnterpriseId">
             <summary>
             鍒涘缓浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.CommonEntity.UpdatedTime">
+            <summary>
+            鏈�鍚庢洿鏂版椂闂�
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.CommonEntity.UpdatedUserId">
@@ -1139,6 +1154,111 @@
             鏄惁鍚敤
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.ContractTemplate">
+            <summary>
+            鍚堝悓鍒剁増
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.EnterpriseId">
+            <summary>
+            浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Enterprise">
+            <summary>
+            浼佷笟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Name">
+            <summary>
+            妯℃澘鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.File">
+            <summary>
+            妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Code">
+            <summary>
+            涓氬姟缂栫爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Access">
+            <summary>
+            閫氶亾
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.TemplateId">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Status">
+            <summary>
+            鍒剁増鐘舵��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.CompletedTime">
+            <summary>
+            鍒剁増鏃堕棿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.IsDisabled">
+            <summary>
+            鏄惁宸茬鐢�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplate.Values">
+            <summary>
+            鍙橀噺
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.ContractTemplateValue">
+            <summary>
+            鍚堝悓妯℃澘鍙橀噺
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.TemplateId">
+            <summary>
+            鍚堝悓妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Template">
+            <summary>
+            鍚堝悓妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Type">
+            <summary>
+            鍙橀噺绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Recorder">
+            <summary>
+            鍐呭濉啓浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.UserType">
+            <summary>
+            鐢ㄦ埛绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Label">
+            <summary>
+            鍙橀噺鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Name">
+            <summary>
+            鍙橀噺浠g爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContractTemplateValue.Required">
+            <summary>
+            鏄惁蹇呭~
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.Department">
             <summary>
             閮ㄩ棬
@@ -1367,6 +1487,11 @@
         <member name="P:FlexJobApi.Core.Enterprise.Users">
             <summary>
             鐢ㄦ埛淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Enterprise.ContractTemplates">
+            <summary>
+            鍚堝悓妯℃澘
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.EnterpriseAuth">
@@ -2427,6 +2552,26 @@
             闃块噷浜慜SS
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.Enums.Users.EnumContractTemplateValueType">
+            <summary>
+            鍚堝悓妯℃澘鍙橀噺绫诲瀷
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.Enums.Users.EnumContractTemplateValueType.Text">
+            <summary>
+            鏂囨湰
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.Enums.Users.EnumContractTemplateValueType.Sign">
+            <summary>
+            绛剧讲
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.Enums.Users.EnumContractTemplateValueType.Date">
+            <summary>
+            鏃ユ湡
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.EnumFileType">
             <summary>
             鏂囦欢绫诲瀷
@@ -3055,6 +3200,51 @@
         <member name="F:FlexJobApi.Core.EnumClientType.Wxmp">
             <summary>
             寰俊灏忕▼搴�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumContractTemplateStatus">
+            <summary>
+            鍚堝悓鍒剁増鐘舵��
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumContractTemplateStatus.Wait">
+            <summary>
+            寰呭埗鐗�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumContractTemplateStatus.Completed">
+            <summary>
+            宸插畬鎴�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumContractTemplateValueRecorder">
+            <summary>
+            鍚堝悓妯℃澘鍙橀噺
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumContractTemplateValueRecorder.Creator">
+            <summary>
+            鍙戜欢浜�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumContractTemplateValueRecorder.Signer">
+            <summary>
+            绛剧讲浜�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnumElectronSignAccess">
+            <summary>
+            鐢靛瓙绛�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumElectronSignAccess.BestSign">
+            <summary>
+            涓婁笂绛�
+            </summary>
+        </member>
+        <member name="F:FlexJobApi.Core.EnumElectronSignAccess.AlipaySign">
+            <summary>
+            鏀粯瀹濅俊浠荤
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.EnumEnterpriseRealMethod">
@@ -6777,6 +6967,86 @@
             楠岃瘉鐮�
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.SaveContractTemplateCommand">
+            <summary>
+            淇濆瓨鍚堝悓妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.EnterpriseId">
+            <summary>
+            浼佷笟Id锛堣繍钀ョ淇濆瓨鏃讹級
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.Name">
+            <summary>
+            妯℃澘鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.File">
+            <summary>
+            妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.Code">
+            <summary>
+            涓氬姟缂栫爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.Access">
+            <summary>
+            閫氶亾
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.TemplateId">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommand.Values">
+            <summary>
+            鍙橀噺
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.SaveContractTemplateCommandValue">
+            <summary>
+            淇濆瓨鍚堝悓妯℃澘鍙橀噺
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Type">
+            <summary>
+            鍙橀噺绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Recorder">
+            <summary>
+            鍐呭濉啓浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.UserType">
+            <summary>
+            鐢ㄦ埛绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Label">
+            <summary>
+            鍙橀噺鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Name">
+            <summary>
+            鍙橀噺浠g爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.SaveContractTemplateCommandValue.Required">
+            <summary>
+            鏄惁蹇呭~
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.SendPersonalUserIdentity3RealSmsCommand">
             <summary>
             鍙戦�佷釜浜轰笁瑕佺礌瀹炲悕鐭俊
@@ -6798,6 +7068,311 @@
             韬唤璇佸彿
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.SetIsDisabledContractTemplateCommand">
+            <summary>
+            绂佺敤鍚堝悓妯℃澘
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetContractTemplateEnterprisesQuery">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垎椤靛垪琛ㄦ暟鎹�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQuery.Keywords">
+            <summary>
+            鍏抽敭瀛�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQuery.Status">
+            <summary>
+            鍒剁増鐘舵��
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResult">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.Id">
+            <summary>
+            浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.EnterpriseName">
+            <summary>
+            浼佷笟鍏ㄧО
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.Contacts">
+            <summary>
+            鑱旂郴浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.ContactPhoneNumber">
+            <summary>
+            鑱旂郴鐢佃瘽
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.Total">
+            <summary>
+            鍚堝悓鏁�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateEnterprisesQueryResultItem.WaitCount">
+            <summary>
+            寰呭埗鐗�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetContractTemplateQuery">
+            <summary>
+            鏌ヨ鍚堝悓妯℃澘璇︽儏
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQuery.Id">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.EnterpriseId">
+            <summary>
+            浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.Name">
+            <summary>
+            妯℃澘鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.File">
+            <summary>
+            妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.Code">
+            <summary>
+            涓氬姟缂栫爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.Access">
+            <summary>
+            閫氶亾
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.TemplateId">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResult.Values">
+            <summary>
+            鍙橀噺
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetContractTemplateQueryResultValue">
+            <summary>
+            鏌ヨ鍚堝悓妯℃澘鍙橀噺
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Type">
+            <summary>
+            鍙橀噺绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Recorder">
+            <summary>
+            鍐呭濉啓浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.UserType">
+            <summary>
+            鐢ㄦ埛绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Label">
+            <summary>
+            鍙橀噺鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Name">
+            <summary>
+            鍙橀噺浠g爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetContractTemplateQueryResultValue.Required">
+            <summary>
+            鏄惁蹇呭~
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQuery">
+            <summary>
+            鏌ヨ浼佷笟鍚堝悓妯℃澘鏃ュ織鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQuery.Id">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResult">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.TraceId">
+            <summary>
+            璺熻釜Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.CreatedUserId">
+            <summary>
+            鎿嶄綔浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.CreatedUser">
+            <summary>
+            鎿嶄綔浜�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.CreatedTime">
+            <summary>
+            鎿嶄綔鏃堕棿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.Operate">
+            <summary>
+            鎿嶄綔
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.OldValues">
+            <summary>
+            鏃у��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.NewValues">
+            <summary>
+            鏂板��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplateLogsQueryResultItem.Content">
+            <summary>
+            鎿嶄綔鍐呭
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery">
+            <summary>
+            鏌ヨ浼佷笟鍚堝悓妯℃澘鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.EnterpriseId">
+            <summary>
+            浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.Keywords">
+            <summary>
+            鍏抽敭瀛�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.Status">
+            <summary>
+            鍒剁増鐘舵��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.CreatedTimeBegin">
+            <summary>
+            瀹㈡埛涓婁紶鏃堕棿-璧峰
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.CreatedTimeEnd">
+            <summary>
+            瀹㈡埛涓婁紶鏃堕棿-鎴
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.CompletedTimeBegin">
+            <summary>
+            鍒剁増鏃堕棿-璧峰
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQuery.CompletedTimeEnd">
+            <summary>
+            鍒剁増鏃堕棿-鎴
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResult">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Id">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Name">
+            <summary>
+            妯℃澘鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.CreatedTime">
+            <summary>
+            瀹㈡埛涓婁紶鏃堕棿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.TemplateId">
+            <summary>
+            妯℃澘Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Access">
+            <summary>
+            閫氶亾
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Code">
+            <summary>
+            涓氬姟缂栫爜
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.File">
+            <summary>
+            妯℃澘
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Status">
+            <summary>
+            鍒剁増鐘舵��
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.CompletedTime">
+            <summary>
+            鍒剁増鏃堕棿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.GetEnterpriseContractTemplatesQueryResultItem.Operator">
+            <summary>
+            鎿嶄綔浜�
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.EditEnterpriseEmployeeCommand">
             <summary>
             缂栬緫鐏靛伐淇℃伅
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SaveContractTemplateCommand.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SaveContractTemplateCommand.cs
new file mode 100644
index 0000000..861be8a
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SaveContractTemplateCommand.cs
@@ -0,0 +1,103 @@
+锘縰sing FlexJobApi.Core.Enums.Users;
+using Mapster;
+using 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.UserServerElectronSign])]
+    public class SaveContractTemplateCommand : SaveDataCommand
+    {
+        public SaveContractTemplateCommand()
+        {
+            Values = [];
+        }
+
+        /// <summary>
+        /// 浼佷笟Id锛堣繍钀ョ淇濆瓨鏃讹級
+        /// </summary>
+        public Guid? EnterpriseId { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍚嶇О
+        /// </summary>
+        [Required]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 妯℃澘
+        /// </summary>
+        [Required]
+        public string File { get; set; }
+
+        /// <summary>
+        /// 涓氬姟缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 閫氶亾
+        /// </summary>
+        public EnumElectronSignAccess? Access { get; set; }
+
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺
+        /// </summary>
+        [AdaptIgnore]
+        public List<SaveContractTemplateCommandValue> Values { get; set; }
+    }
+
+    /// <summary>
+    /// 淇濆瓨鍚堝悓妯℃澘鍙橀噺
+    /// </summary>
+    public class SaveContractTemplateCommandValue
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public Guid? Id { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺绫诲瀷
+        /// </summary>
+        public EnumContractTemplateValueType Type { get; set; }
+
+        /// <summary>
+        /// 鍐呭濉啓浜�
+        /// </summary>
+        public EnumContractTemplateValueRecorder Recorder { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛绫诲瀷
+        /// </summary>
+        public EnumUserType? UserType { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺鍚嶇О
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺浠g爜
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鏄惁蹇呭~
+        /// </summary>
+        public bool Required { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SetIsDisabledContractTemplateCommand.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SetIsDisabledContractTemplateCommand.cs
new file mode 100644
index 0000000..4703a93
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Commands/SetIsDisabledContractTemplateCommand.cs
@@ -0,0 +1,16 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 绂佺敤鍚堝悓妯℃澘
+    /// </summary>
+    [Resource([EnumResourceController.UserServerElectronSign])]
+    public class SetIsDisabledContractTemplateCommand : SetIsDisabledCommand
+    {
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateEnterprisesQuery.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateEnterprisesQuery.cs
new file mode 100644
index 0000000..79d11f3
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateEnterprisesQuery.cs
@@ -0,0 +1,71 @@
+锘縰sing 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.UserServerElectronSign])]
+    public class GetContractTemplateEnterprisesQuery : PagedListQuery<GetContractTemplateEnterprisesQueryResult, GetContractTemplateEnterprisesQueryResultItem>
+    {
+        /// <summary>
+        /// 鍏抽敭瀛�
+        /// </summary>
+        public string Keywords { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鐘舵��
+        /// </summary>
+        public EnumContractTemplateStatus? Status { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+    /// </summary>
+    public class GetContractTemplateEnterprisesQueryResult : PagedListQueryResult<GetContractTemplateEnterprisesQueryResultItem>
+    {
+
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+    /// </summary>
+    public class GetContractTemplateEnterprisesQueryResultItem
+    {
+        /// <summary>
+        /// 浼佷笟Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 浼佷笟鍏ㄧО
+        /// </summary>
+        public string EnterpriseName { get; set; }
+
+        /// <summary>
+        /// 鑱旂郴浜�
+        /// </summary>
+        public string Contacts { get; set; }
+
+        /// <summary>
+        /// 鑱旂郴鐢佃瘽
+        /// </summary>
+        public string ContactPhoneNumber { get; set; }
+
+        /// <summary>
+        /// 鍚堝悓鏁�
+        /// </summary>
+        public int Total { get; set; }
+
+        /// <summary>
+        /// 寰呭埗鐗�
+        /// </summary>
+        public int WaitCount { get; set; }
+    }
+
+}
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateQuery.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateQuery.cs
new file mode 100644
index 0000000..8651e1f
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetContractTemplateQuery.cs
@@ -0,0 +1,113 @@
+锘縰sing FlexJobApi.Core.Enums.Users;
+using Mapster;
+using 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.UserServerElectronSign])]
+    public class GetContractTemplateQuery : IRequest<GetContractTemplateQueryResult>
+    {
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public Guid Id { get; set; }
+    }
+
+    public class GetContractTemplateQueryResult
+    {
+        public GetContractTemplateQueryResult()
+        {
+            Values = [];
+        }
+
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 浼佷笟Id
+        /// </summary>
+        public Guid EnterpriseId { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 妯℃澘
+        /// </summary>
+        public string File { get; set; }
+
+        /// <summary>
+        /// 涓氬姟缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 閫氶亾
+        /// </summary>
+        public EnumElectronSignAccess? Access { get; set; }
+
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺
+        /// </summary>
+        public List<GetContractTemplateQueryResultValue> Values { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ鍚堝悓妯℃澘鍙橀噺
+    /// </summary>
+    public class GetContractTemplateQueryResultValue
+    {
+        /// <summary>
+        /// 鍙橀噺Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺绫诲瀷
+        /// </summary>
+        public EnumContractTemplateValueType Type { get; set; }
+
+        /// <summary>
+        /// 鍐呭濉啓浜�
+        /// </summary>
+        public EnumContractTemplateValueRecorder Recorder { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛绫诲瀷
+        /// </summary>
+        public EnumUserType? UserType { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺鍚嶇О
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 鍙橀噺浠g爜
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鏄惁蹇呭~
+        /// </summary>
+        public bool Required { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplateLogsQuery.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplateLogsQuery.cs
new file mode 100644
index 0000000..cde2c0a
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplateLogsQuery.cs
@@ -0,0 +1,86 @@
+锘縰sing Mapster;
+using Newtonsoft.Json;
+using Swashbuckle.AspNetCore.Annotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ浼佷笟鍚堝悓妯℃澘鏃ュ織鍒嗛〉鍒楄〃鏁版嵁
+    /// </summary>
+    [Resource([EnumResourceController.UserServerElectronSign])]
+    public class GetEnterpriseContractTemplateLogsQuery : PagedListQuery<GetEnterpriseContractTemplateLogsQueryResult, GetEnterpriseContractTemplateLogsQueryResultItem>
+    {
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public Guid Id { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+    /// </summary>
+    public class GetEnterpriseContractTemplateLogsQueryResult : PagedListQueryResult<GetEnterpriseContractTemplateLogsQueryResultItem>
+    {
+
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+    /// </summary>
+    public class GetEnterpriseContractTemplateLogsQueryResultItem
+    {
+        public GetEnterpriseContractTemplateLogsQueryResultItem()
+        {
+            Content = [];
+        }
+
+        /// <summary>
+        /// 璺熻釜Id
+        /// </summary>
+        public string TraceId { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔浜�
+        /// </summary>
+        [JsonIgnore, SwaggerIgnore]
+        public Guid? CreatedUserId { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔浜�
+        /// </summary>
+        public string CreatedUser { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔鏃堕棿
+        /// </summary>
+        public DateTimeOffset CreatedTime { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔
+        /// </summary>
+        public EnumDbAuditOperate Operate { get; set; }
+
+        /// <summary>
+        /// 鏃у��
+        /// </summary>
+        [JsonIgnore, SwaggerIgnore]
+        public string OldValues { get; set; }
+
+        /// <summary>
+        /// 鏂板��
+        /// </summary>
+        [JsonIgnore, SwaggerIgnore]
+        public string NewValues { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔鍐呭
+        /// </summary>
+        [AdaptIgnore]
+        public List<string> Content { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplatesQuery.cs b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplatesQuery.cs
new file mode 100644
index 0000000..0af87f3
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/ElectronSigns/Queries/GetEnterpriseContractTemplatesQuery.cs
@@ -0,0 +1,115 @@
+锘縰sing 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.UserServerElectronSign])]
+    public class GetEnterpriseContractTemplatesQuery : PagedListQuery<GetEnterpriseContractTemplatesQueryResult, GetEnterpriseContractTemplatesQueryResultItem>
+    {
+        /// <summary>
+        /// 浼佷笟Id
+        /// </summary>
+        public Guid? EnterpriseId { get; set; }
+
+        /// <summary>
+        /// 鍏抽敭瀛�
+        /// </summary>
+        public string Keywords { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鐘舵��
+        /// </summary>
+        public EnumContractTemplateStatus? Status { get; set; }
+
+        /// <summary>
+        /// 瀹㈡埛涓婁紶鏃堕棿-璧峰
+        /// </summary>
+        public DateTime? CreatedTimeBegin { get; set; }
+
+        /// <summary>
+        /// 瀹㈡埛涓婁紶鏃堕棿-鎴
+        /// </summary>
+        public DateTime? CreatedTimeEnd { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鏃堕棿-璧峰
+        /// </summary>
+        public DateTime? CompletedTimeBegin { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鏃堕棿-鎴
+        /// </summary>
+        public DateTime? CompletedTimeEnd { get; set; }
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉
+    /// </summary>
+    public class GetEnterpriseContractTemplatesQueryResult : PagedListQueryResult<GetEnterpriseContractTemplatesQueryResultItem>
+    {
+
+    }
+
+    /// <summary>
+    /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�-缁撴灉-椤�
+    /// </summary>
+    public class GetEnterpriseContractTemplatesQueryResultItem
+    {
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 妯℃澘鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 瀹㈡埛涓婁紶鏃堕棿
+        /// </summary>
+        public DateTimeOffset CreatedTime { get; set; }
+
+        /// <summary>
+        /// 妯℃澘Id
+        /// </summary>
+        public string TemplateId { get; set; }
+
+        /// <summary>
+        /// 閫氶亾
+        /// </summary>
+        public EnumElectronSignAccess? Access { get; set; }
+
+        /// <summary>
+        /// 涓氬姟缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 妯℃澘
+        /// </summary>
+        public string File { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鐘舵��
+        /// </summary>
+        public EnumContractTemplateStatus Status { get; set; }
+
+        /// <summary>
+        /// 鍒剁増鏃堕棿
+        /// </summary>
+        public DateTime? CompletedTime { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔浜�
+        /// </summary>
+        public string Operator { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
index d06c426..156ecab 100644
--- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
+++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -568,37 +568,44 @@
                     continue;
                 }
 
-                Db.GetRepository<DbAuditLog, LogDbContextLocator>().InsertNow(new DbAuditLog
+                var log = new DbAuditLog
                 {
                     Id = IDGen.NextID(),
                     TableName = entityType.Name,
                     PrimaryKey = (Guid)entity.Property("Id").CurrentValue,
-                    NewValues = entity.State == EntityState.Added || entity.State == EntityState.Modified
-                        ? GetPropertyValuesAsJson(entity)
-                        : null,
-                    OldValues = entity.State == EntityState.Deleted || entity.State == EntityState.Modified
-                        ? GetPropertyValuesAsJson(entity, entity.State == EntityState.Modified)
-                        : null,
-                    Operate = entity.State == EntityState.Added
-                        ? EnumDbAuditOperate.Added
-                        : entity.State == EntityState.Modified
-                        ? EnumDbAuditOperate.Modified
-                        : EnumDbAuditOperate.Deleted,
                     TraceId = App.GetTraceId(),
                     CreatedTime = DateTime.Now,
                     CreatedUserId = logier?.Id,
                     CreatedEnterpriseId = logier?.EnterpriseId
-                });
+                };
+                log.Operate =
+                    entity.State == EntityState.Added
+                    ? EnumDbAuditOperate.Added
+                    : entity.State == EntityState.Modified
+                    ? EnumDbAuditOperate.Modified
+                    : EnumDbAuditOperate.Deleted;
+                if (entity.Property(nameof(CommonEntity.IsDeleted)).CurrentValue is bool isDeleted && isDeleted == true)
+                {
+                    log.Operate = EnumDbAuditOperate.Deleted;
+                }
+                log.NewValues =
+                    log.Operate == EnumDbAuditOperate.Deleted
+                    ? null
+                    : JsonConvert.SerializeObject(entity.Properties
+                        .Where(p => log.Operate == EnumDbAuditOperate.Modified
+                            ? p.IsModified
+                            : true)
+                        .ToDictionary(p => p.Metadata.Name, p => p.CurrentValue));
+                log.OldValues =
+                    log.Operate == EnumDbAuditOperate.Added
+                    ? null
+                    : JsonConvert.SerializeObject(entity.Properties
+                        .Where(p => log.Operate == EnumDbAuditOperate.Modified
+                            ? p.IsModified
+                            : true)
+                        .ToDictionary(p => p.Metadata.Name, p => p.OriginalValue));
+                Db.GetRepository<DbAuditLog, LogDbContextLocator>().InsertNow(log);
             }
-        }
-
-        private static string GetPropertyValuesAsJson(EntityEntry entry, bool getOldValues = false)
-        {
-            var properties = entry.Properties
-                .Where(p => getOldValues ? p.IsModified : true)
-                .ToDictionary(p => p.Metadata.Name, p => getOldValues ? p.OriginalValue : p.CurrentValue);
-
-            return JsonConvert.SerializeObject(properties);
         }
     }
 }
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.Designer.cs b/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.Designer.cs
new file mode 100644
index 0000000..542d937
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.Designer.cs
@@ -0,0 +1,2784 @@
+锘�// <auto-generated />
+using System;
+using FlexJobApi.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    [DbContext(typeof(DefaultDbContext))]
+    [Migration("20250820052049_AddContractTemplate")]
+    partial class AddContractTemplate
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("Access")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Code")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CompletedTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("File")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TemplateId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.ToTable("ContractTemplate");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplateValue", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Label")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Recorder")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("Required")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TemplateId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("UserType")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TemplateId");
+
+                    b.ToTable("ContractTemplateValue");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("Department");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryCategory", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("FieldNames")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("DictionaryCategory");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("CategoryId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Deep")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Field1")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Field2")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Field3")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Field4")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Field5")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CategoryId");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("DictionaryData");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Address")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("BankBranchName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("BankName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("CityCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("ContactEmail")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ContactPhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<string>("Contacts")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("EnterpriseName")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("EnterpriseType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("EstablishmentDate")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("IndustrialParkId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("IndustryTypeCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<bool>("IsCheckedBankCard")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsReal")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("LegalIdentity")
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)");
+
+                    b.Property<string>("LegalPerson")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("LicenseImage")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("MainBusiness")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<decimal?>("MergeSignCost")
+                        .HasColumnType("decimal(18,2)");
+
+                    b.Property<int?>("PayAccess")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ProvinceCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<int?>("RealAccess")
+                        .HasColumnType("int");
+
+                    b.Property<decimal?>("RealVerifyCost")
+                        .HasColumnType("decimal(18,2)");
+
+                    b.Property<string>("RegisteredCapital")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<decimal?>("SignCost")
+                        .HasColumnType("decimal(18,2)");
+
+                    b.Property<int?>("SmsAccess")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("SmsCost")
+                        .HasColumnType("decimal(18,2)");
+
+                    b.Property<string>("SocietyCreditCode")
+                        .IsRequired()
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityCode");
+
+                    b.HasIndex("IndustryTypeCode");
+
+                    b.HasIndex("ProvinceCode");
+
+                    b.ToTable("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseAuth", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("BankCardImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("EnterpriseName")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<int?>("EnterpriseRealMethod")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Identity")
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)");
+
+                    b.Property<string>("IdentityBackImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("IdentityImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("LegalIdentity")
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)");
+
+                    b.Property<string>("LegalPerson")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("LicenseImage")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<int?>("PersonalRealMethod")
+                        .HasColumnType("int");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<bool?>("Proxy")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("ProxyPowerAttorneyUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("SocietyCreditCode")
+                        .IsRequired()
+                        .HasMaxLength(18)
+                        .HasColumnType("nvarchar(18)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("EnterpriseAuth");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseEmployee", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("Age")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("Birthday")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ContactPhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<string>("ContractUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("EnterpriseSignContractStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("EnterpriseSignContractTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("Gender")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Identity")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("IdentityBackImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("IdentityImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("UserSignContractStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UserSignContractTime")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("EnterpriseEmployee");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseUserCollect", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTime?>("CollectedTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("ContactedTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsCollected")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsContacted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("EnterpriseUserCollect");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("ClientType")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Group")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Icon")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsCache")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Location")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<Guid?>("ParentId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Path")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("UserType")
+                        .HasColumnType("int");
+
+                    b.Property<int>("VisitLevel")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Width")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ParentId");
+
+                    b.ToTable("Menu");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Resource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("ActionName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ActionSummary")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("AllowAnonymous")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("ApplicationName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ControllerName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ControllerSummary")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("DynamicAssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("FileUpload")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsExpired")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Method")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RequestTypeFullName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RequestTypeName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseTypeFullName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseTypeName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Route")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RouteArea")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ServiceName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Resource");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Role", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("ClientType")
+                        .HasColumnType("int");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("DataPower")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("MinLevel")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("UserType")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid>("MenuId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("MenuId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleMenu");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("DataPower")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid>("ResourceId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ResourceId");
+
+                    b.HasIndex("RoleId");
+
+                    b.ToTable("RoleResource");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ScheduleJobDetail", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("AssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("Concurrent")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("GroupName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IncludeAnnotations")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("JobId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("JobType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Properties")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ScheduleJobDetail");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ScheduleJobTrigger", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Args")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("AssemblyName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<long>("ElapsedTime")
+                        .HasColumnType("bigint");
+
+                    b.Property<DateTime?>("EndTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("JobId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("LastRunTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("MaxNumberOfErrors")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("MaxNumberOfRuns")
+                        .HasColumnType("bigint");
+
+                    b.Property<DateTime?>("NextRunTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("NumRetries")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("NumberOfErrors")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("NumberOfRuns")
+                        .HasColumnType("bigint");
+
+                    b.Property<bool>("ResetOnlyOnce")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Result")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("RetryTimeout")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("RunOnStart")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("StartNow")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("StartTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("Status")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TriggerId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TriggerType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("ScheduleJobTrigger");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("AddressDetail")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("AddressName")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("AgeMaxLimit")
+                        .HasColumnType("int");
+
+                    b.Property<int>("AgeMinLimit")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("BeginTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("BillingMethod")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("CheckReceiveStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CheckReceiveTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CityCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("Code")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTime>("EndTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("GenderLimit")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("LastCheckReceiveTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("LastSubmitTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal?>("Latitude")
+                        .HasColumnType("decimal(18,6)");
+
+                    b.Property<decimal?>("Longitude")
+                        .HasColumnType("decimal(18,6)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ProvinceCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<int>("RecommendStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("RecommendTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("ReleaseStatus")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("ServiceFee")
+                        .HasColumnType("decimal(18,2)");
+
+                    b.Property<int>("SettlementCycle")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("SettlementStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("SettlementTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityCode");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("ProvinceCode");
+
+                    b.ToTable("TaskInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("BenefitCode")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("BenefitCode");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.ToTable("TaskInfoBenefit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TypeCode")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("TypeCode");
+
+                    b.ToTable("TaskInfoCredentialLimit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("ArrangeStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("ArrangeTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("CheckReceiveStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CheckReceiveTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseEmployeeId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("HireStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("HireTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("LastCheckReceiveTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("LastSubmitTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseEmployeeId");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.ToTable("TaskInfoUser");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUserSubmit", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("CheckReceiveStatus")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CheckReceiveTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTime>("Date")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TaskInfoUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoUserId");
+
+                    b.ToTable("TaskInfoUserSubmit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUserSubmitFile", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("File")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("SubmitId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("SubmitId");
+
+                    b.ToTable("TaskInfoUserSubmitFile");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskUserCollect", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TaskInfoId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TaskInfoId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("TaskUserCollect");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.User", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("Age")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Avatar")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("Birthday")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CityCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("ContactPhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("DataSource")
+                        .HasColumnType("int");
+
+                    b.Property<Guid?>("DataSourceId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("EducationalBackgroundCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<Guid?>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("FreeTime")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("Gender")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("Height")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Identity")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsCheckPhoneNumber")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsReal")
+                        .HasColumnType("bit");
+
+                    b.Property<int?>("JobSeekingStatus")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Level")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("Password")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("PersonalIdentityCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<string>("ProvinceCode")
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<int?>("RealMethod")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("RealTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Remark")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("UserName")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<int?>("Weight")
+                        .HasColumnType("int");
+
+                    b.Property<string>("WorkExperience")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("WorkSeniority")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("WxmpOpenId")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("CityCode");
+
+                    b.HasIndex("EducationalBackgroundCode");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.HasIndex("PersonalIdentityCode");
+
+                    b.HasIndex("ProvinceCode");
+
+                    b.ToTable("User");
+
+                    b.HasData(
+                        new
+                        {
+                            Id = new Guid("11111111-1111-1111-1111-111111111111"),
+                            CreatedTime = new DateTimeOffset(new DateTime(2000, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 8, 0, 0, 0)),
+                            IsCheckPhoneNumber = false,
+                            IsDeleted = false,
+                            IsReal = false,
+                            Level = 999,
+                            Name = "绠$悊鍛�",
+                            Password = "iEYggKrMhQ3ASUGLobra1w==:fn/DsMJUbD9FGpvBvR3moMpMPptdxzZlourPVhU479I=",
+                            Sort = 0,
+                            Status = 10,
+                            Type = 100,
+                            UserName = "system"
+                        });
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("Age")
+                        .HasColumnType("int");
+
+                    b.Property<string>("BankCard")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("BankCardImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("Birthday")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("ElectronSignUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("FaceRealUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("Gender")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Identity")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("IdentityBackImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("IdentityImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("PhoneNumber")
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<int?>("RealAccess")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RealFailMessage")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("RealStatus")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.ToTable("UserAuth");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserBankCard", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Bank")
+                        .IsRequired()
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("PhoneNumber")
+                        .IsRequired()
+                        .HasMaxLength(11)
+                        .HasColumnType("nvarchar(11)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserBankCard");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserCredential", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("BackImg")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Code")
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTime?>("EndDate")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Img")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsForever")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("IssueUnit")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("StartDate")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TypeCode")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TypeCode");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserCredential");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserDepartment", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("DepartmentId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("DepartmentId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserDepartment");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserExpectJob", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("ExpectJobCode")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("ExpectJobCode");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserExpectJob");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserManageIndustrialPark", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("IndustrialParkId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserManageIndustrialPark");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserPhoto", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Img")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserPhoto");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserRole", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<Guid>("RoleId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("UserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("RoleId");
+
+                    b.HasIndex("UserId");
+
+                    b.ToTable("UserRole");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("ContractTemplates")
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplateValue", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.ContractTemplate", "Template")
+                        .WithMany("Values")
+                        .HasForeignKey("TemplateId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Template");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("Departments")
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Department", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryCategory", "Category")
+                        .WithMany()
+                        .HasForeignKey("CategoryId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Category");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "IndustryType")
+                        .WithMany()
+                        .HasForeignKey("IndustryTypeCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Province")
+                        .WithMany()
+                        .HasForeignKey("ProvinceCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("City");
+
+                    b.Navigation("IndustryType");
+
+                    b.Navigation("Province");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseAuth", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithOne("EnterpriseAuth")
+                        .HasForeignKey("FlexJobApi.Core.EnterpriseAuth", "Id")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseEmployee", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany()
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("EnterpriseEmployees")
+                        .HasForeignKey("UserId");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseUserCollect", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany()
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("EnterpriseUserCollects")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentId");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleMenu", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Menu", "Menu")
+                        .WithMany()
+                        .HasForeignKey("MenuId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleMenus")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Menu");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.RoleResource", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Resource", "Resource")
+                        .WithMany()
+                        .HasForeignKey("ResourceId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("RoleResources")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Resource");
+
+                    b.Navigation("Role");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany()
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Province")
+                        .WithMany()
+                        .HasForeignKey("ProvinceCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("City");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("Province");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoBenefit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Benefit")
+                        .WithMany()
+                        .HasForeignKey("BenefitCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("Benefits")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Benefit");
+
+                    b.Navigation("TaskInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoCredentialLimit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("CredentialLimits")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("Type");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.EnterpriseEmployee", "EnterpriseEmployee")
+                        .WithMany("TaskInfoUsers")
+                        .HasForeignKey("EnterpriseEmployeeId")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("TaskInfoUsers")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("EnterpriseEmployee");
+
+                    b.Navigation("TaskInfo");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUserSubmit", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfoUser", "TaskInfoUser")
+                        .WithMany("Submits")
+                        .HasForeignKey("TaskInfoUserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("TaskInfoUser");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUserSubmitFile", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfoUserSubmit", "Submit")
+                        .WithMany("Files")
+                        .HasForeignKey("SubmitId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Submit");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskUserCollect", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.TaskInfo", "TaskInfo")
+                        .WithMany("TaskUserCollects")
+                        .HasForeignKey("TaskInfoId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("TaskInfo");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.User", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "City")
+                        .WithMany()
+                        .HasForeignKey("CityCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "EducationalBackground")
+                        .WithMany()
+                        .HasForeignKey("EducationalBackgroundCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("Users")
+                        .HasForeignKey("EnterpriseId");
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "PersonalIdentity")
+                        .WithMany()
+                        .HasForeignKey("PersonalIdentityCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Province")
+                        .WithMany()
+                        .HasForeignKey("ProvinceCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("City");
+
+                    b.Navigation("EducationalBackground");
+
+                    b.Navigation("Enterprise");
+
+                    b.Navigation("PersonalIdentity");
+
+                    b.Navigation("Province");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserAuth", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithOne("UserAuth")
+                        .HasForeignKey("FlexJobApi.Core.UserAuth", "Id")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserBankCard", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("BankCards")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserCredential", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "Type")
+                        .WithMany()
+                        .HasForeignKey("TypeCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("UserCredentials")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Type");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserDepartment", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Department", "Department")
+                        .WithMany()
+                        .HasForeignKey("DepartmentId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("UserDepartments")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Department");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserExpectJob", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.DictionaryData", "ExpectJob")
+                        .WithMany()
+                        .HasForeignKey("ExpectJobCode")
+                        .HasPrincipalKey("Code")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("UserExpectJobs")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("ExpectJob");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserManageIndustrialPark", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("UserManageIndustrialParks")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserPhoto", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("Photos")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.UserRole", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Role", "Role")
+                        .WithMany("UserRoles")
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("FlexJobApi.Core.User", "User")
+                        .WithMany("UserRoles")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Role");
+
+                    b.Navigation("User");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.Navigation("Values");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Department", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.DictionaryData", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
+                {
+                    b.Navigation("ContractTemplates");
+
+                    b.Navigation("Departments");
+
+                    b.Navigation("EnterpriseAuth");
+
+                    b.Navigation("Users");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.EnterpriseEmployee", b =>
+                {
+                    b.Navigation("TaskInfoUsers");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Menu", b =>
+                {
+                    b.Navigation("Children");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.Role", b =>
+                {
+                    b.Navigation("RoleMenus");
+
+                    b.Navigation("RoleResources");
+
+                    b.Navigation("UserRoles");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfo", b =>
+                {
+                    b.Navigation("Benefits");
+
+                    b.Navigation("CredentialLimits");
+
+                    b.Navigation("TaskInfoUsers");
+
+                    b.Navigation("TaskUserCollects");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUser", b =>
+                {
+                    b.Navigation("Submits");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.TaskInfoUserSubmit", b =>
+                {
+                    b.Navigation("Files");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.User", b =>
+                {
+                    b.Navigation("BankCards");
+
+                    b.Navigation("EnterpriseEmployees");
+
+                    b.Navigation("EnterpriseUserCollects");
+
+                    b.Navigation("Photos");
+
+                    b.Navigation("UserAuth");
+
+                    b.Navigation("UserCredentials");
+
+                    b.Navigation("UserDepartments");
+
+                    b.Navigation("UserExpectJobs");
+
+                    b.Navigation("UserManageIndustrialParks");
+
+                    b.Navigation("UserRoles");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.cs b/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.cs
new file mode 100644
index 0000000..df244d4
--- /dev/null
+++ b/FlexJobApi.Database.Migrations/Migrations/20250820052049_AddContractTemplate.cs
@@ -0,0 +1,101 @@
+锘縰sing System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace FlexJobApi.Database.Migrations.Migrations
+{
+    /// <inheritdoc />
+    public partial class AddContractTemplate : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "ContractTemplate",
+                columns: table => new
+                {
+                    Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
+                    EnterpriseId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
+                    Name = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    File = table.Column<string>(type: "nvarchar(max)", nullable: false),
+                    Code = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    Access = table.Column<int>(type: "int", nullable: true),
+                    TemplateId = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    Status = table.Column<int>(type: "int", nullable: false),
+                    CompletedTime = table.Column<DateTime>(type: "datetime2", nullable: true),
+                    IsDisabled = table.Column<bool>(type: "bit", nullable: false),
+                    CreatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
+                    UpdatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
+                    Sort = table.Column<int>(type: "int", nullable: false),
+                    TraceId = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    CreatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    CreatedEnterpriseId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    UpdatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    IsDeleted = table.Column<bool>(type: "bit", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_ContractTemplate", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_ContractTemplate_Enterprise_EnterpriseId",
+                        column: x => x.EnterpriseId,
+                        principalTable: "Enterprise",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateTable(
+                name: "ContractTemplateValue",
+                columns: table => new
+                {
+                    Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
+                    TemplateId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
+                    Type = table.Column<int>(type: "int", nullable: false),
+                    Recorder = table.Column<int>(type: "int", nullable: false),
+                    UserType = table.Column<int>(type: "int", nullable: true),
+                    Label = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    Required = table.Column<bool>(type: "bit", nullable: false),
+                    CreatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: false),
+                    UpdatedTime = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
+                    Sort = table.Column<int>(type: "int", nullable: false),
+                    TraceId = table.Column<string>(type: "nvarchar(max)", nullable: true),
+                    CreatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    CreatedEnterpriseId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    UpdatedUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
+                    IsDeleted = table.Column<bool>(type: "bit", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_ContractTemplateValue", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_ContractTemplateValue_ContractTemplate_TemplateId",
+                        column: x => x.TemplateId,
+                        principalTable: "ContractTemplate",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                });
+
+            migrationBuilder.CreateIndex(
+                name: "IX_ContractTemplate_EnterpriseId",
+                table: "ContractTemplate",
+                column: "EnterpriseId");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_ContractTemplateValue_TemplateId",
+                table: "ContractTemplateValue",
+                column: "TemplateId");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "ContractTemplateValue");
+
+            migrationBuilder.DropTable(
+                name: "ContractTemplate");
+        }
+    }
+}
diff --git a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
index 742a21f..d05d4d2 100644
--- a/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/FlexJobApi.Database.Migrations/Migrations/DefaultDbContextModelSnapshot.cs
@@ -22,6 +22,130 @@
 
             SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
 
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("Access")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Code")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("CompletedTime")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid>("EnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("File")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TemplateId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("EnterpriseId");
+
+                    b.ToTable("ContractTemplate");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplateValue", b =>
+                {
+                    b.Property<Guid>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<Guid?>("CreatedEnterpriseId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<DateTimeOffset>("CreatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("CreatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Label")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Recorder")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("Required")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Sort")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("TemplateId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("TraceId")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<DateTimeOffset?>("UpdatedTime")
+                        .HasColumnType("datetimeoffset");
+
+                    b.Property<Guid?>("UpdatedUserId")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<int?>("UserType")
+                        .HasColumnType("int");
+
+                    b.HasKey("Id");
+
+                    b.HasIndex("TemplateId");
+
+                    b.ToTable("ContractTemplateValue");
+                });
+
             modelBuilder.Entity("FlexJobApi.Core.Department", b =>
                 {
                     b.Property<Guid>("Id")
@@ -2096,6 +2220,28 @@
                     b.ToTable("UserRole");
                 });
 
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
+                        .WithMany("ContractTemplates")
+                        .HasForeignKey("EnterpriseId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Enterprise");
+                });
+
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplateValue", b =>
+                {
+                    b.HasOne("FlexJobApi.Core.ContractTemplate", "Template")
+                        .WithMany("Values")
+                        .HasForeignKey("TemplateId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Template");
+                });
+
             modelBuilder.Entity("FlexJobApi.Core.Department", b =>
                 {
                     b.HasOne("FlexJobApi.Core.Enterprise", "Enterprise")
@@ -2541,6 +2687,11 @@
                     b.Navigation("User");
                 });
 
+            modelBuilder.Entity("FlexJobApi.Core.ContractTemplate", b =>
+                {
+                    b.Navigation("Values");
+                });
+
             modelBuilder.Entity("FlexJobApi.Core.Department", b =>
                 {
                     b.Navigation("Children");
@@ -2553,6 +2704,8 @@
 
             modelBuilder.Entity("FlexJobApi.Core.Enterprise", b =>
                 {
+                    b.Navigation("ContractTemplates");
+
                     b.Navigation("Departments");
 
                     b.Navigation("EnterpriseAuth");
diff --git a/FlexJobApi.Database.Migrations/REDEME.MD b/FlexJobApi.Database.Migrations/REDEME.MD
index 8c38ead..3e2ff92 100644
--- a/FlexJobApi.Database.Migrations/REDEME.MD
+++ b/FlexJobApi.Database.Migrations/REDEME.MD
@@ -1,7 +1,7 @@
 -------------------------------主数据库---------------------------------------
 
 新增迁移文件
-dotnet ef migrations add UpdateUser0820 -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
+dotnet ef migrations add AddContractTemplate -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
 
 删除迁移文件
 dotnet ef migrations remove -s "../FlexJobApi.Web.Entry" -c DefaultDbContext
diff --git a/FlexJobApi.EntityFramework.Core/DbContexts/LogDbContext.cs b/FlexJobApi.EntityFramework.Core/DbContexts/LogDbContext.cs
index 87ec6af..8585d3d 100644
--- a/FlexJobApi.EntityFramework.Core/DbContexts/LogDbContext.cs
+++ b/FlexJobApi.EntityFramework.Core/DbContexts/LogDbContext.cs
@@ -1,8 +1,10 @@
 锘縰sing FlexJobApi.Core;
+using Furion;
 using Furion.DatabaseAccessor;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Diagnostics;
 using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using Microsoft.Extensions.Configuration;
 using System;
 
 namespace FlexJobApi.EntityFramework.Core;
@@ -14,6 +16,19 @@
     {
     }
 
+    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+    {
+        base.OnConfiguring(optionsBuilder);
+        optionsBuilder
+            .UseSqlServer(App.Configuration.GetConnectionString("FlexJobApiLog"), options =>
+            {
+                // 鎸囧畾鐩爣鏁版嵁搴撶増鏈负SQL Server 2014
+                options.UseCompatibilityLevel(120); // 120瀵瑰簲SQL Server 2014
+                // 鍙�夛細璁剧疆鎵归噺鎿嶄綔澶у皬锛堟寜闇�璋冩暣锛�
+                options.MaxBatchSize(1000);
+            });
+    }
+
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);
diff --git a/FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs b/FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs
new file mode 100644
index 0000000..63c0831
--- /dev/null
+++ b/FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs
@@ -0,0 +1,100 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using Furion.FriendlyException;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.UserServer.Application
+{
+    /// <summary>
+    /// 鍚堝悓妯℃澘鍛戒护澶勭悊鍣�
+    /// </summary>
+    public class ContractTemplateCommandHandler(
+            IRepository<ContractTemplate> rep
+        ) :
+        IRequestHandler<SaveContractTemplateCommand, Guid>,
+        IRequestHandler<SetIsDisabledContractTemplateCommand, int>
+    {
+        private readonly IRepository<ContractTemplate> rep = rep;
+
+        /// <summary>
+        /// 淇濆瓨鍚堝悓妯℃澘
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<Guid> Handle(SaveContractTemplateCommand 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, "璇烽�夋嫨浼佷笟");
+
+            return await request.SaveData<ContractTemplate, SaveContractTemplateCommand>(
+                 q => q
+                    .Include(it => it.Values)
+                    .Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
+                 it => it.EnterpriseId == request.EnterpriseId && it.Name == request.Name && !it.IsDisabled && it.Id != request.Id,
+                 entity =>
+                 {
+                     request.Adapt(entity);
+                     if (entity.Values.Count != request.Values.Count
+                        || entity.Values.Any(ov =>
+                                request.Values.Count(nv =>
+                                    ov.Id == nv.Id
+                                    && ov.Type == nv.Type
+                                    && ov.Recorder == nv.Recorder
+                                    && ov.UserType == nv.UserType
+                                    && ov.Label == nv.Label
+                                    && ov.Required == nv.Required) != 1))
+                     {
+                         entity.Values = request.Values.Select(it =>
+                         {
+                             var value = entity.Values.FirstOrDefault(v => v.Id == it.Id);
+                             if (value == null)
+                             {
+                                 value = new ContractTemplateValue();
+                             }
+                             it.Adapt(value);
+                             return value;
+                         }).ToList();
+                         entity.UpdatedUserId = logier.Id;
+                         entity.UpdatedTime = DateTime.Now;
+                     }
+                     if (entity.Access.HasValue && entity.TemplateId.IsNotNull() && entity.Status == EnumContractTemplateStatus.Wait)
+                     {
+                         entity.Status = EnumContractTemplateStatus.Completed;
+                         entity.CompletedTime = DateTime.Now;
+                     }
+                 },
+                 cancellationToken);
+        }
+
+        /// <summary>
+        /// 绂佺敤鍚堝悓妯℃澘
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<int> Handle(SetIsDisabledContractTemplateCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            return await request.SetIsDisabled<ContractTemplate>(q =>
+            {
+                if (logier.Type == EnumUserType.Enterprise)
+                {
+                    q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
+                }
+                return q;
+            }, cancellationToken);
+        }
+    }
+}
diff --git a/FlexJobApi.UserServer.Application/ElectronSign/Queries/ContractTemplateQueryHandler.cs b/FlexJobApi.UserServer.Application/ElectronSign/Queries/ContractTemplateQueryHandler.cs
new file mode 100644
index 0000000..5906423
--- /dev/null
+++ b/FlexJobApi.UserServer.Application/ElectronSign/Queries/ContractTemplateQueryHandler.cs
@@ -0,0 +1,301 @@
+锘縰sing FlexJobApi.Core;
+using FlexJobApi.Core.Models;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using NetTopologySuite.Index.HPRtree;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.UserServer.Application
+{
+    /// <summary>
+    /// 鍚堝悓妯℃澘鏌ヨ澶勭悊鍣�
+    /// </summary>
+    public class ContractTemplateQueryHandler(
+            IRepository<ContractTemplate> rep,
+            IRepository<Enterprise> repEnterprise,
+            IRepository<User> repUser,
+            IRepository<DbAuditLog, LogDbContextLocator> repDbAuditLog
+        ) :
+        IRequestHandler<GetContractTemplateEnterprisesQuery, GetContractTemplateEnterprisesQueryResult>,
+        IRequestHandler<GetEnterpriseContractTemplatesQuery, GetEnterpriseContractTemplatesQueryResult>,
+        IRequestHandler<GetEnterpriseContractTemplateLogsQuery, GetEnterpriseContractTemplateLogsQueryResult>,
+        IRequestHandler<GetContractTemplateQuery, GetContractTemplateQueryResult>
+    {
+        private readonly IRepository<ContractTemplate> rep = rep;
+        private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
+        private readonly IRepository<User> repUser = repUser;
+        private readonly IRepository<DbAuditLog, LogDbContextLocator> repDbAuditLog = repDbAuditLog;
+
+        /// <summary>
+        /// 鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetContractTemplateEnterprisesQueryResult> Handle(GetContractTemplateEnterprisesQuery request, CancellationToken cancellationToken)
+        {
+            var q = repEnterprise.AsQueryable().AsNoTracking();
+            if (request.Keywords.IsNotNull())
+            {
+                q = q.Where(it => it.EnterpriseName.Contains(request.Keywords));
+            }
+            if (request.Status.HasValue)
+            {
+                if (request.Status == EnumContractTemplateStatus.Wait)
+                {
+                    q = q.Where(it => it.ContractTemplates.Any(ct => ct.Status == EnumContractTemplateStatus.Wait));
+                }
+                else
+                {
+                    q = q.Where(it => it.ContractTemplates.Any() && it.ContractTemplates.All(ct => ct.Status == EnumContractTemplateStatus.Completed));
+                }
+            }
+            var s = q
+                .Select(it => new GetContractTemplateEnterprisesQueryResultItem
+                {
+                    Id = it.Id,
+                    EnterpriseName = it.EnterpriseName,
+                    Contacts = it.Contacts,
+                    ContactPhoneNumber = it.ContactPhoneNumber,
+                    Total = it.ContractTemplates.Count(it => !it.IsDisabled),
+                    WaitCount = it.ContractTemplates.Count(it => !it.IsDisabled && it.Status == EnumContractTemplateStatus.Wait),
+                });
+            return await request.PageModel.GetPagedListAsync<GetContractTemplateEnterprisesQueryResult, GetContractTemplateEnterprisesQueryResultItem>(s, cancellationToken);
+        }
+
+        /// <summary>
+        /// 鏌ヨ浼佷笟鍚堝悓妯℃澘
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetEnterpriseContractTemplatesQueryResult> Handle(GetEnterpriseContractTemplatesQuery request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            if (logier.Type == EnumUserType.Enterprise)
+            {
+                request.EnterpriseId = logier.EnterpriseId;
+            }
+            var q = rep.AsQueryable().AsNoTracking()
+                .Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled);
+            if (request.Keywords.IsNotNull())
+            {
+                q = q.Where(it =>
+                    it.Name.Contains(request.Keywords)
+                    || it.TemplateId.Contains(request.Keywords)
+                    || it.Code.Contains(request.Keywords));
+            }
+            if (request.CreatedTimeBegin.HasValue && request.CreatedTimeEnd.HasValue)
+            {
+                q = q.Where(it => request.CreatedTimeBegin <= it.CreatedTime && it.CreatedTime <= request.CreatedTimeEnd);
+            }
+            if (request.CompletedTimeBegin.HasValue && request.CompletedTimeEnd.HasValue)
+            {
+                q = q.Where(it => request.CompletedTimeBegin <= it.CompletedTime && it.CreatedTime <= request.CompletedTimeEnd);
+            }
+            if (request.Status.HasValue)
+            {
+                q = q.Where(it => it.Status == request.Status);
+            }
+            var s = from t in q
+                    join cu in repUser.AsQueryable().AsNoTracking() on t.CreatedUserId equals cu.Id
+                    join uu in repUser.AsQueryable().AsNoTracking() on t.UpdatedUserId equals uu.Id into uug
+                    from uugi in uug.DefaultIfEmpty()
+                    select new GetEnterpriseContractTemplatesQueryResultItem
+                    {
+                        Id = t.Id,
+                        Name = t.Name,
+                        CreatedTime = t.CreatedTime,
+                        TemplateId = t.TemplateId,
+                        Access = t.Access,
+                        Code = t.Code,
+                        File = t.File,
+                        Status = t.Status,
+                        CompletedTime = t.CompletedTime,
+                        Operator = uugi == null
+                           ? cu.Name
+                           : uugi.Name
+                    };
+            return await request.PageModel.GetPagedListAsync<GetEnterpriseContractTemplatesQueryResult, GetEnterpriseContractTemplatesQueryResultItem>(s, cancellationToken);
+        }
+
+        /// <summary>
+        /// 鏌ヨ浼佷笟鍚堝悓妯℃澘鏃ュ織鍒嗛〉鍒楄〃鏁版嵁
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetEnterpriseContractTemplateLogsQueryResult> Handle(GetEnterpriseContractTemplateLogsQuery request, CancellationToken cancellationToken)
+        {
+            var tableName = nameof(ContractTemplate);
+            var q = repDbAuditLog.AsQueryable().AsNoTracking()
+                .Where(it => it.TableName == tableName && it.PrimaryKey == request.Id)
+                .ProjectToType<GetEnterpriseContractTemplateLogsQueryResultItem>();
+            var result = await request.PageModel.GetPagedListAsync<GetEnterpriseContractTemplateLogsQueryResult, GetEnterpriseContractTemplateLogsQueryResultItem>(q, cancellationToken);
+            if (result.Data.IsNotNull())
+            {
+                var type = typeof(ContractTemplate);
+                var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
+                var ignorePropertyNames = new List<string>
+                {
+                    "Id",
+                    "EnterpriseId",
+                    "IsDisabled",
+                    "Sort",
+                    "TraceId",
+                    "CreatedTime",
+                    "CreatedUserId",
+                    "CreatedEnterpriseId",
+                    "UpdatedTime",
+                    "UpdatedUserId",
+                    "IsDeleted",
+                    "Values",
+                    "TemplateId",
+                };
+                var properties = type.GetProperties().Where(it => !ignorePropertyNames.Contains(it.Name)).ToList();
+                var traceIds = result.Data.DistinctSelect(it => it.TraceId);
+                tableName = nameof(ContractTemplateValue);
+                var valueType = typeof(ContractTemplateValue);
+                var valueProperties = valueType.GetProperties().Where(it => !ignorePropertyNames.Contains(it.Name)).ToList();
+                var valueLogs = await repDbAuditLog.AsQueryable().AsNoTracking()
+                    .Where(it => it.TableName == tableName && traceIds.Contains(it.TraceId))
+                    .Select(it => new GetEnterpriseContractTemplateLogsQueryResultItem
+                    {
+                        TraceId = it.TraceId,
+                        Operate = it.Operate,
+                        OldValues = it.OldValues,
+                        NewValues = it.NewValues
+                    })
+                    .ToListAsync();
+                var userIds = result.Data.DistinctSelect(it => it.CreatedUserId);
+                var users = await repUser.AsQueryable().AsNoTracking()
+                    .Where(it => userIds.Contains(it.Id))
+                    .Select(it => new
+                    {
+                        it.Id,
+                        it.Name
+                    })
+                    .ToListAsync();
+                foreach (var item in result.Data)
+                {
+                    item.CreatedUser = users.FirstOrDefault(it => it.Id == item.CreatedUserId)?.Name;
+                    await AddContractTemplateLogsAsync(item, properties, xmlDoc);
+                    var traceValueLogs = valueLogs.Where(it => it.TraceId == item.TraceId).ToList();
+                    await AddContractTemplateValueLogsAsync(item, traceValueLogs, valueProperties, xmlDoc);
+
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鏌ヨ鍚堝悓妯℃澘璇︽儏
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<GetContractTemplateQueryResult> Handle(GetContractTemplateQuery request, CancellationToken cancellationToken)
+        {
+            return await rep.AsQueryable().AsNoTracking()
+                .Where(it => it.Id == request.Id)
+                .GetDetail<ContractTemplate, GetContractTemplateQueryResult>(cancellationToken);
+        }
+
+        private async Task AddContractTemplateLogsAsync(
+            GetEnterpriseContractTemplateLogsQueryResultItem item,
+            List<PropertyInfo> properties,
+            XmlDoc xmlDoc)
+        {
+            var oldEntity = item.OldValues?.JsonTo<ContractTemplate>();
+            var newEntity = item.NewValues?.JsonTo<ContractTemplate>();
+            foreach (var property in properties)
+            {
+                var propertySummary = await property.GetXmlDocMemberAsync(xmlDoc);
+                var oldValue = await GetLogValue(oldEntity, property, xmlDoc);
+                var newValue = await GetLogValue(newEntity, property, xmlDoc);
+                if (item.Operate == EnumDbAuditOperate.Added && newValue != null)
+                {
+                    item.Content.Add($"{propertySummary?.Summary ?? property.Name}锛歿newValue}");
+                }
+                else if (item.Operate == EnumDbAuditOperate.Modified && oldValue != newValue)
+                {
+                    item.Content.Add($"{propertySummary?.Summary ?? property.Name}锛氱敱 {oldValue} 鏀逛负 {newValue}");
+                }
+            }
+        }
+
+        private async Task AddContractTemplateValueLogsAsync(
+            GetEnterpriseContractTemplateLogsQueryResultItem item,
+            List<GetEnterpriseContractTemplateLogsQueryResultItem> traceValueLogs,
+            List<PropertyInfo> properties,
+            XmlDoc xmlDoc)
+        {
+            foreach (var traceValueLog in traceValueLogs)
+            {
+                var oldEntity = traceValueLog.OldValues?.JsonTo<ContractTemplateValue>();
+                var newEntity = traceValueLog.NewValues?.JsonTo<ContractTemplateValue>();
+                if (traceValueLog.Operate == EnumDbAuditOperate.Added)
+                {
+                    item.Content.Add("鏂板鍙橀噺锛�");
+                }
+                else if (traceValueLog.Operate == EnumDbAuditOperate.Modified)
+                {
+                    item.Content.Add("缂栬緫鍙橀噺锛�");
+                }
+                foreach (var property in properties)
+                {
+                    var propertySummary = await property.GetXmlDocMemberAsync(xmlDoc);
+                    var oldValue = await GetLogValue(oldEntity, property, xmlDoc);
+                    var newValue = await GetLogValue(newEntity, property, xmlDoc);
+                    if (traceValueLog.Operate == EnumDbAuditOperate.Added && newValue != null)
+                    {
+                        item.Content.Add($"--{propertySummary?.Summary ?? property.Name}锛歿newValue}");
+                    }
+                    else if (traceValueLog.Operate == EnumDbAuditOperate.Modified && oldValue != newValue)
+                    {
+                        item.Content.Add($"--{propertySummary?.Summary ?? property.Name}锛氱敱 {oldValue} 鏀逛负 {newValue}");
+                    }
+                }
+                if (traceValueLog.Operate == EnumDbAuditOperate.Deleted)
+                {
+                    var property = properties.First(it => it.Name == nameof(ContractTemplateValue.Label));
+                    var oldValue = oldEntity != null ? property.GetValue(oldEntity) : null;
+                    var propertySummary = await property.GetXmlDocMemberAsync(xmlDoc);
+                    item.Content.Add($"鍒犻櫎鍙橀噺锛歿oldValue}");
+                }
+            }
+        }
+
+        private async Task<string?> GetLogValue(object? entity, PropertyInfo property, XmlDoc xmlDoc)
+        {
+            if (entity == null) return null;
+            var propertyType = property.PropertyType;
+            if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
+            {
+                propertyType = propertyType.GetGenericArguments()[0];
+            }
+            var value = property.GetValue(entity);
+            if (propertyType.IsEnum && value != null)
+            {
+                var model = await propertyType.GetModel();
+                var item = model.Items.FirstOrDefault(it => it.Value == (int)value);
+                return item?.Description;
+            }
+            else if (value is bool boolValue)
+            {
+                return boolValue ? "鏄�" : "鍚�";
+            }
+            else
+            {
+                return value?.ToString();
+            }
+        }
+    }
+}
diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
index 18f798d..c39615f 100644
--- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
+++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -156,6 +156,32 @@
             <param name="all"></param>
             <param name="roleMenuIds"></param>
         </member>
+        <member name="T:FlexJobApi.UserServer.Application.ContractTemplateCommandHandler">
+            <summary>
+            鍚堝悓妯℃澘鍛戒护澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ContractTemplate})">
+            <summary>
+            鍚堝悓妯℃澘鍛戒护澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateCommandHandler.Handle(FlexJobApi.Core.SaveContractTemplateCommand,System.Threading.CancellationToken)">
+            <summary>
+            淇濆瓨鍚堝悓妯℃澘
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateCommandHandler.Handle(FlexJobApi.Core.SetIsDisabledContractTemplateCommand,System.Threading.CancellationToken)">
+            <summary>
+            绂佺敤鍚堝悓妯℃澘
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:FlexJobApi.UserServer.Application.ElectronSignCallbackCommandHandler">
             <summary>
             鐢靛瓙绛惧洖浼�
@@ -217,6 +243,48 @@
             涓汉瀹炲悕
             </summary>
         </member>
+        <member name="T:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler">
+            <summary>
+            鍚堝悓妯℃澘鏌ヨ澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.ContractTemplate},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Enterprise},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.DbAuditLog,FlexJobApi.Core.LogDbContextLocator})">
+            <summary>
+            鍚堝悓妯℃澘鏌ヨ澶勭悊鍣�
+            </summary>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler.Handle(FlexJobApi.Core.GetContractTemplateEnterprisesQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ杩愯惀绔崗璁鐞嗗垪琛�
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler.Handle(FlexJobApi.Core.GetEnterpriseContractTemplatesQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ浼佷笟鍚堝悓妯℃澘
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler.Handle(FlexJobApi.Core.GetEnterpriseContractTemplateLogsQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ浼佷笟鍚堝悓妯℃澘鏃ュ織鍒嗛〉鍒楄〃鏁版嵁
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.ContractTemplateQueryHandler.Handle(FlexJobApi.Core.GetContractTemplateQuery,System.Threading.CancellationToken)">
+            <summary>
+            鏌ヨ鍚堝悓妯℃澘璇︽儏
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:FlexJobApi.UserServer.Application.EnterpriseEmployeesCommandHandler">
             <summary>
             鐏靛伐鍛戒护澶勭悊鍣�

--
Gitblit v1.9.1