From c3eff6c3f20582d721dbfda76f8f699cffd154df Mon Sep 17 00:00:00 2001
From: wxd <123@qq.com>
Date: Wed, 26 Nov 2025 09:27:23 +0800
Subject: [PATCH] 1126
---
.../Customers/CreateCustomerDtoInputDto.cs | 41 +
.../Customers/CustomerDto.cs | 42 +
.../Customers/CustomerIdInputDto.cs | 11 +
.../Customers/GetCustomerListInputDto.cs | 14 +
.../Customers/UpdateCustomerDtoInputDto.cs | 43 +
.../Projects/CreateProjectInputDto.cs | 29 +
.../Projects/GetProjectListInputDto.cs | 5 +
.../Projects/ProjectDto.cs | 35 +
.../Projects/ProjectTreeDto.cs | 37 +
.../Projects/UpdateProjectInputDto.cs | 26 +
.../Customers/CustomerAppService.cs | 182 ++
...jectManagerApplicationAutoMapperProfile.cs | 4 +
.../Projects/ProjectAppService.cs | 195 +-
.../Projects/Project.cs | 15 +
.../Configures/ProjectConfigure.cs | 3 +
...20250828030313_insert_customer.Designer.cs | 2380 ++++++++++++++++
.../20250828030313_insert_customer.cs | 67 +
...115551_update_project_add_plan.Designer.cs | 2399 +++++++++++++++++
.../20251125115551_update_project_add_plan.cs | 52 +
.../ProjectManagerDbContextModelSnapshot.cs | 107 +
20 files changed, 5627 insertions(+), 60 deletions(-)
create mode 100644 src/Shentun.ProjectManager.Application.Contracts/Customers/CreateCustomerDtoInputDto.cs
create mode 100644 src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerDto.cs
create mode 100644 src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerIdInputDto.cs
create mode 100644 src/Shentun.ProjectManager.Application.Contracts/Customers/GetCustomerListInputDto.cs
create mode 100644 src/Shentun.ProjectManager.Application.Contracts/Customers/UpdateCustomerDtoInputDto.cs
create mode 100644 src/Shentun.ProjectManager.Application/Customers/CustomerAppService.cs
create mode 100644 src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs
create mode 100644 src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.cs
create mode 100644 src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.Designer.cs
create mode 100644 src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.cs
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Customers/CreateCustomerDtoInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Customers/CreateCustomerDtoInputDto.cs
new file mode 100644
index 0000000..9b864f9
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application.Contracts/Customers/CreateCustomerDtoInputDto.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Shentun.ProjectManager.Customers
+{
+ public class CreateCustomerDtoInputDto
+ {
+ ///
+ /// 名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 简称
+ ///
+ public string ShortName { get; set; }
+
+
+ ///
+ /// 负责人
+ ///
+ public string PersonInCharge { get; set; }
+
+
+ ///
+ /// 联系电话
+ ///
+ public string ContactNumber { get; set; }
+
+
+ ///
+ /// 联系地址
+ ///
+ public string ContactAddress { get; set; }
+
+ ///
+ /// 是否启用
+ ///
+ public char IsActive { get; set; }
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerDto.cs
new file mode 100644
index 0000000..9af8124
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerDto.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace Shentun.ProjectManager.Customers
+{
+ public class CustomerDto : AuditedEntityDtoName
+ {
+ ///
+ /// 名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 简称
+ ///
+ public string ShortName { get; set; }
+
+
+ ///
+ /// 负责人
+ ///
+ public string PersonInCharge { get; set; }
+
+
+ ///
+ /// 联系电话
+ ///
+ public string ContactNumber { get; set; }
+
+
+ ///
+ /// 联系地址
+ ///
+ public string ContactAddress { get; set; }
+
+ ///
+ /// 是否启用
+ ///
+ public char IsActive { get; set; }
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerIdInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerIdInputDto.cs
new file mode 100644
index 0000000..e53a599
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerIdInputDto.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Shentun.ProjectManager.Customers
+{
+ public class CustomerIdInputDto
+ {
+ public Guid CustomerId { get; set; }
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Customers/GetCustomerListInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Customers/GetCustomerListInputDto.cs
new file mode 100644
index 0000000..5f41222
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application.Contracts/Customers/GetCustomerListInputDto.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Shentun.ProjectManager.Customers
+{
+ public class GetCustomerListInputDto
+ {
+ ///
+ /// 名称
+ ///
+ public string DisplayName { get; set; }
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Customers/UpdateCustomerDtoInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Customers/UpdateCustomerDtoInputDto.cs
new file mode 100644
index 0000000..cde91bf
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application.Contracts/Customers/UpdateCustomerDtoInputDto.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Shentun.ProjectManager.Customers
+{
+ public class UpdateCustomerDtoInputDto
+ {
+ public Guid Id { get; set; }
+
+ ///
+ /// 名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 简称
+ ///
+ public string ShortName { get; set; }
+
+
+ ///
+ /// 负责人
+ ///
+ public string PersonInCharge { get; set; }
+
+
+ ///
+ /// 联系电话
+ ///
+ public string ContactNumber { get; set; }
+
+
+ ///
+ /// 联系地址
+ ///
+ public string ContactAddress { get; set; }
+
+ ///
+ /// 是否启用
+ ///
+ public char IsActive { get; set; }
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs
index 02cf4d7..39c761a 100644
--- a/src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs
+++ b/src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs
@@ -52,5 +52,34 @@ namespace Shentun.ProjectManager.Projects
/// 是否启用
///
public char IsActive { get; set; }
+
+ ///
+ /// 完成状态 0=未完成 1=已完成 2=中止
+ ///
+ public char CompleteFlag { get; set; } = '0';
+
+
+ ///
+ /// 客户id
+ ///
+ public Guid CustomerId { get; set; }
+
+
+ ///
+ /// 负责人
+ ///
+ public Guid LeaderId { get; set; }
+
+ ///
+ /// 计划时间
+ ///
+ public decimal PlanTime { get; set; }
+
+ ///
+ /// 计划时间单位 0-天 1-小时
+ ///
+ public char PlanUnit { get; set; }
+
+
}
}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs
index 555333d..1b79654 100644
--- a/src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs
+++ b/src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs
@@ -10,5 +10,10 @@ namespace Shentun.ProjectManager.Projects
/// 名称 模糊查找
///
public string DisplayName { get; set; }
+
+ ///
+ /// 客户Id
+ ///
+ public Guid? CustomerId { get; set; }
}
}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs
index 2c3297d..8359a0f 100644
--- a/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs
+++ b/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs
@@ -55,5 +55,40 @@ namespace Shentun.ProjectManager.Projects
public char IsActive { get; set; }
+
+ ///
+ /// 完成状态 0=未完成 1=已完成 2=中止
+ ///
+ public char CompleteFlag { get; set; }
+
+
+ ///
+ /// 客户id
+ ///
+ public Guid CustomerId { get; set; }
+
+ ///
+ /// 客户id
+ ///
+ public string CustomerName { get; set; }
+
+ ///
+ /// 负责人Id
+ ///
+ public Guid LeaderId { get; set; }
+
+
+
+ ///
+ /// 计划时间
+ ///
+ public decimal PlanTime { get; set; }
+
+ ///
+ /// 计划时间单位 0-天 1-小时
+ ///
+ public char PlanUnit { get; set; }
+
+
}
}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs
index 7b41675..9c249e5 100644
--- a/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs
+++ b/src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs
@@ -53,6 +53,43 @@ namespace Shentun.ProjectManager.Projects
///
public char IsActive { get; set; }
+ ///
+ /// 完成状态 0=未完成 1=已完成 2=中止
+ ///
+ public char CompleteFlag { get; set; }
+
+
+ ///
+ /// 客户id
+ ///
+ public Guid CustomerId { get; set; }
+
+ ///
+ /// 客户id
+ ///
+ public string CustomerName { get; set; }
+
+
+ ///
+ /// 负责人Id
+ ///
+ public Guid LeaderId { get; set; }
+
+ ///
+ /// 负责人名称
+ ///
+ public string LeaderName { get; set; }
+
+ ///
+ /// 计划时间
+ ///
+ public decimal PlanTime { get; set; }
+
+ ///
+ /// 计划时间单位 0-天 1-小时
+ ///
+ public string PlanUnit { get; set; }
+
public List TreeChildren { get; set; }
}
}
diff --git a/src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs b/src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs
index 4b2337b..bb5a6dd 100644
--- a/src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs
+++ b/src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs
@@ -53,5 +53,31 @@ namespace Shentun.ProjectManager.Projects
/// 是否启用
///
public char IsActive { get; set; }
+
+ ///
+ /// 完成状态 0=未完成 1=已完成 2=中止
+ ///
+ public char CompleteFlag { get; set; } = '0';
+
+
+ ///
+ /// 客户id
+ ///
+ public Guid CustomerId { get; set; }
+
+ ///
+ /// 负责人
+ ///
+ public Guid LeaderId { get; set; }
+
+ ///
+ /// 计划时间
+ ///
+ public decimal PlanTime { get; set; }
+
+ ///
+ /// 计划时间单位 0-天 1-小时
+ ///
+ public char PlanUnit { get; set; }
}
}
diff --git a/src/Shentun.ProjectManager.Application/Customers/CustomerAppService.cs b/src/Shentun.ProjectManager.Application/Customers/CustomerAppService.cs
new file mode 100644
index 0000000..6bc4632
--- /dev/null
+++ b/src/Shentun.ProjectManager.Application/Customers/CustomerAppService.cs
@@ -0,0 +1,182 @@
+using AutoMapper.Internal.Mappers;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Shentun.ProjectManager.Models;
+using Shentun.ProjectManager.ProjectStaffFeedbacks;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Services;
+using Volo.Abp.Domain.Repositories;
+using Volo.Abp.Guids;
+using Volo.Abp.Identity;
+using Volo.Abp.Users;
+using Volo.Abp;
+
+namespace Shentun.ProjectManager.Customers
+{
+
+ ///
+ /// 客户管理
+ ///
+ [ApiExplorerSettings(GroupName = "Bus")]
+ [Authorize]
+ public class CustomerAppService : ApplicationService
+ {
+
+ private readonly CacheService _cacheService;
+ private readonly IRepository _customerRepository;
+ private readonly IRepository _projectRepository;
+ private readonly IRepository _identityUserRepository;
+ private readonly CurrentUser _currentUser;
+
+ public CustomerAppService(
+ CacheService cacheService,
+ IRepository projectRepository,
+ CurrentUser currentUser,
+ IRepository identityUserRepository,
+ IRepository customerRepository)
+ {
+ _cacheService = cacheService;
+ _projectRepository = projectRepository;
+ _currentUser = currentUser;
+ _identityUserRepository = identityUserRepository;
+ _customerRepository = customerRepository;
+ }
+
+
+
+ ///
+ /// 查询单个详细信息
+ ///
+ ///
+ ///
+ [HttpPost("api/app/Customer/Get")]
+ public async Task GetAsync(CustomerIdInputDto input)
+ {
+ var customerEnt = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.CustomerId);
+ var entDto = ObjectMapper.Map(customerEnt);
+ entDto.CreatorName = await _cacheService.GetNameAsync(entDto.CreatorId);
+ entDto.LastModifierName = await _cacheService.GetNameAsync(entDto.LastModifierId);
+
+ return entDto;
+ }
+
+
+ ///
+ /// 查询客户列表记录
+ ///
+ ///
+ [HttpPost("api/app/Customer/GetList")]
+ public async Task> GetListAsync(GetCustomerListInputDto input)
+ {
+ var query = await _customerRepository.GetQueryableAsync();
+
+
+
+ if (!string.IsNullOrWhiteSpace(input.DisplayName))
+ {
+ query = query.Where(m => m.DisplayName == input.DisplayName);
+ }
+
+
+ var entListDto = query.Select(s => new CustomerDto
+ {
+ CreationTime = s.CreationTime,
+ CreatorId = s.CreatorId,
+ Id = s.Id,
+ LastModificationTime = s.LastModificationTime,
+ LastModifierId = s.LastModifierId,
+ CreatorName = _cacheService.GetNameAsync(s.CreatorId).GetAwaiter().GetResult(),
+ LastModifierName = _cacheService.GetNameAsync(s.LastModifierId).GetAwaiter().GetResult(),
+ ContactAddress = s.ContactAddress,
+ DisplayName = s.DisplayName,
+ ContactNumber = s.ContactNumber,
+ IsActive = s.IsActive,
+ PersonInCharge = s.PersonInCharge,
+ ShortName = s.ShortName
+ }).ToList();
+
+
+ return entListDto;
+
+ }
+
+
+ ///
+ /// 创建客户
+ ///
+ ///
+ ///
+ [HttpPost("api/app/Customer/Create")]
+ public async Task CreateAsync(CreateCustomerDtoInputDto input)
+ {
+ if (string.IsNullOrWhiteSpace(input.DisplayName))
+ {
+ throw new UserFriendlyException("名称不能为空");
+ }
+
+ var customerDto = new Customer(GuidGenerator.Create())
+ {
+ ShortName = input.ShortName,
+ PersonInCharge = input.PersonInCharge,
+ IsActive = input.IsActive,
+ ContactNumber = input.ContactNumber,
+ DisplayName = input.DisplayName,
+ ContactAddress = input.ContactAddress
+ };
+
+
+
+ await _customerRepository.InsertAsync(customerDto);
+ }
+
+
+ ///
+ /// 修改客户
+ ///
+ ///
+ ///
+ [HttpPost("api/app/Customer/Update")]
+ public async Task UpdateAsync(UpdateCustomerDtoInputDto input)
+ {
+ var customerEnt = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.Id);
+
+ if (customerEnt == null)
+ {
+ throw new UserFriendlyException("信息不存在");
+ }
+
+
+ customerEnt.ShortName = input.ShortName;
+ customerEnt.PersonInCharge = input.PersonInCharge;
+ customerEnt.IsActive = input.IsActive;
+ customerEnt.ContactNumber = input.ContactNumber;
+ customerEnt.DisplayName = input.DisplayName;
+ customerEnt.ContactAddress = input.ContactAddress;
+
+
+ await _customerRepository.UpdateAsync(customerEnt);
+ }
+
+ ///
+ /// 删除客户
+ ///
+ ///
+ ///
+ [HttpPost("api/app/Customer/Delete")]
+ public async Task DeleteAsync(CustomerIdInputDto input)
+ {
+ var customer = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.CustomerId);
+ if (customer == null)
+ {
+ throw new UserFriendlyException("记录不存在");
+ }
+
+ await _customerRepository.DeleteAsync(customer);
+ }
+
+ }
+}
diff --git a/src/Shentun.ProjectManager.Application/ProjectManagerApplicationAutoMapperProfile.cs b/src/Shentun.ProjectManager.Application/ProjectManagerApplicationAutoMapperProfile.cs
index 213212a..22b0887 100644
--- a/src/Shentun.ProjectManager.Application/ProjectManagerApplicationAutoMapperProfile.cs
+++ b/src/Shentun.ProjectManager.Application/ProjectManagerApplicationAutoMapperProfile.cs
@@ -1,5 +1,6 @@
using AutoMapper;
using Microsoft.Extensions.Configuration.UserSecrets;
+using Shentun.ProjectManager.Customers;
using Shentun.ProjectManager.MenuInfos;
using Shentun.ProjectManager.Models;
using Shentun.ProjectManager.MyUsers;
@@ -47,5 +48,8 @@ public class ProjectManagerApplicationAutoMapperProfile : Profile
CreateMap();
+ CreateMap();
+
+
}
}
diff --git a/src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs b/src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs
index 20b385d..232c98a 100644
--- a/src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs
+++ b/src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs
@@ -28,17 +28,19 @@ namespace Shentun.ProjectManager.Projects
private readonly CacheService _cacheService;
private readonly IRepository _projectFolderRepository;
private readonly IRepository _projectStaffRepository;
+ private readonly IRepository _customerRepository;
public ProjectAppService(
IRepository projectRepository,
CacheService cacheService,
IRepository projectFolderRepository,
- IRepository projectStaffRepository
- )
+ IRepository projectStaffRepository,
+ IRepository customerRepository)
{
_projectRepository = projectRepository;
_cacheService = cacheService;
_projectFolderRepository = projectFolderRepository;
_projectStaffRepository = projectStaffRepository;
+ _customerRepository = customerRepository;
}
///
@@ -57,79 +59,109 @@ namespace Shentun.ProjectManager.Projects
}
- ///
- /// 查询项目列表
- ///
- ///
- [HttpPost("api/app/Project/GetList")]
- public async Task> GetListAsync(GetProjectListInputDto input)
- {
- var query = await _projectRepository.GetQueryableAsync();
- if (!string.IsNullOrWhiteSpace(input.DisplayName))
- {
- query = query.Where(m => m.DisplayName.Contains(input.DisplayName));
- }
-
- var entListDto = query.Select(s => new ProjectDto
- {
- DisplayName = s.DisplayName,
- CompletionProgress = s.CompletionProgress,
- CreationTime = s.CreationTime,
- CreatorId = s.CreatorId,
- FinishTime = DataHelper.ConversionDateToString(s.FinishTime),
- Id = s.Id,
- DemandContent = s.DemandContent,
- IsActive = s.IsActive,
- LastModificationTime = s.LastModificationTime,
- LastModifierId = s.LastModifierId,
- ParentId = s.ParentId,
- PlanEndTime = DataHelper.ConversionDateToString(s.PlanEndTime),
- PlanStartTime = DataHelper.ConversionDateToString(s.PlanStartTime),
- ShortName = s.ShortName,
- CreatorName = _cacheService.GetNameAsync(s.CreatorId).GetAwaiter().GetResult(),
- LastModifierName = _cacheService.GetNameAsync(s.LastModifierId).GetAwaiter().GetResult()
- }).ToList();
-
-
- return entListDto;
-
- }
+ /////
+ ///// 查询项目列表
+ /////
+ /////
+ //[HttpPost("api/app/Project/GetList")]
+ //public async Task> GetListAsync(GetProjectListInputDto input)
+ //{
+ // var query = from project in await _projectRepository.GetQueryableAsync()
+ // join customer in await _customerRepository.GetQueryableAsync() on project.CustomerId equals customer.Id into customerTemp
+ // from customerEmpty in customerTemp.DefaultIfEmpty()
+ // select new
+ // {
+ // customerName = customerEmpty.DisplayName,
+ // project
+ // };
+ // if (!string.IsNullOrWhiteSpace(input.DisplayName))
+ // {
+ // query = query.Where(m => m.project.DisplayName.Contains(input.DisplayName));
+ // }
+ // if (input.CustomerId != null)
+ // {
+ // query = query.Where(m => m.project.CustomerId == input.CustomerId);
+ // }
+
+ // var entListDto = query.Select(s => new ProjectDto
+ // {
+ // DisplayName = s.DisplayName,
+ // CompletionProgress = s.CompletionProgress,
+ // CreationTime = s.CreationTime,
+ // CreatorId = s.CreatorId,
+ // FinishTime = DataHelper.ConversionDateToString(s.FinishTime),
+ // Id = s.Id,
+ // DemandContent = s.DemandContent,
+ // IsActive = s.IsActive,
+ // LastModificationTime = s.LastModificationTime,
+ // LastModifierId = s.LastModifierId,
+ // ParentId = s.ParentId,
+ // PlanEndTime = DataHelper.ConversionDateToString(s.PlanEndTime),
+ // PlanStartTime = DataHelper.ConversionDateToString(s.PlanStartTime),
+ // ShortName = s.ShortName,
+ // CreatorName = _cacheService.GetNameAsync(s.CreatorId).GetAwaiter().GetResult(),
+ // LastModifierName = _cacheService.GetNameAsync(s.LastModifierId).GetAwaiter().GetResult()
+ // }).ToList();
+
+
+ // return entListDto;
+
+ //}
///
- /// 查询项目列表 树型结构
+ /// 查询项目列表 树型结构 带客户id
///
///
[HttpPost("api/app/Project/GetThreeList")]
public async Task> GetThreeListAsync(GetProjectListInputDto input)
{
- var query = await _projectRepository.GetQueryableAsync();
+ var query = from project in await _projectRepository.GetQueryableAsync()
+ join customer in await _customerRepository.GetQueryableAsync() on project.CustomerId equals customer.Id into customerTemp
+ from customerEmpty in customerTemp.DefaultIfEmpty()
+ select new
+ {
+ customerName = customerEmpty.DisplayName,
+ project
+ };
if (!string.IsNullOrWhiteSpace(input.DisplayName))
{
- query = query.Where(m => m.DisplayName.Contains(input.DisplayName));
+ query = query.Where(m => m.project.DisplayName.Contains(input.DisplayName));
+ }
+
+ if (input.CustomerId != null)
+ {
+ query = query.Where(m => m.project.CustomerId == input.CustomerId);
}
var projectList = query.ToList();
- var entListDto = from s in projectList.OrderBy(m => m.Id)
+ var entListDto = from s in projectList.OrderBy(m => m.project.Id)
select new ProjectTreeDto()
{
- DisplayName = s.DisplayName,
- CompletionProgress = s.CompletionProgress,
- CreationTime = s.CreationTime,
- CreatorId = s.CreatorId,
- FinishTime = DataHelper.ConversionDateToString(s.FinishTime),
- Id = s.Id,
- DemandContent = s.DemandContent,
- IsActive = s.IsActive,
- LastModificationTime = s.LastModificationTime,
- LastModifierId = s.LastModifierId,
- ParentId = s.ParentId,
- PlanEndTime = DataHelper.ConversionDateToString(s.PlanEndTime),
- PlanStartTime = DataHelper.ConversionDateToString(s.PlanStartTime),
- ShortName = s.ShortName,
- CreatorName = _cacheService.GetNameAsync(s.CreatorId).GetAwaiter().GetResult(),
- LastModifierName = _cacheService.GetNameAsync(s.LastModifierId).GetAwaiter().GetResult()
+ DisplayName = s.project.DisplayName,
+ CompletionProgress = s.project.CompletionProgress,
+ CreationTime = s.project.CreationTime,
+ CreatorId = s.project.CreatorId,
+ FinishTime = DataHelper.ConversionDateShortToString(s.project.FinishTime),
+ Id = s.project.Id,
+ DemandContent = s.project.DemandContent,
+ IsActive = s.project.IsActive,
+ LastModificationTime = s.project.LastModificationTime,
+ LastModifierId = s.project.LastModifierId,
+ ParentId = s.project.ParentId,
+ PlanEndTime = DataHelper.ConversionDateShortToString(s.project.PlanEndTime),
+ PlanStartTime = DataHelper.ConversionDateShortToString(s.project.PlanStartTime),
+ ShortName = s.project.ShortName,
+ CreatorName = _cacheService.GetNameAsync(s.project.CreatorId).GetAwaiter().GetResult(),
+ LastModifierName = _cacheService.GetNameAsync(s.project.LastModifierId).GetAwaiter().GetResult(),
+ CustomerId = s.project.CustomerId,
+ CompleteFlag = s.project.CompleteFlag,
+ CustomerName = s.customerName,
+ PlanTime = s.project.PlanTime,
+ PlanUnit = s.project.PlanUnit == '0' ? "天" : "小时",
+ LeaderName = _cacheService.GetNameAsync(s.project.LeaderId).GetAwaiter().GetResult(),
+ LeaderId = s.project.LeaderId
};
@@ -169,6 +201,13 @@ namespace Shentun.ProjectManager.Projects
PlanEndTime = p.PlanEndTime,
PlanStartTime = p.PlanStartTime,
ShortName = p.ShortName,
+ CompleteFlag = p.CompleteFlag,
+ CustomerName = p.CustomerName,
+ CustomerId = p.CustomerId,
+ LeaderId = p.LeaderId,
+ LeaderName = p.LeaderName,
+ PlanUnit = p.PlanUnit,
+ PlanTime = p.PlanTime,
TreeChildren = subs.ToList()
}
).ToList();
@@ -224,6 +263,20 @@ namespace Shentun.ProjectManager.Projects
}
}
+ if (input.CompleteFlag != '0' && input.CompleteFlag != '1' && input.CompleteFlag != '2')
+ {
+ throw new UserFriendlyException($"项目完成状态值:{input.CompleteFlag}无效");
+ }
+
+ var isCustomer = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.CustomerId);
+ if (isCustomer == null)
+ {
+ throw new UserFriendlyException($"客户Id:{input.CustomerId}无效");
+ }
+
+
+
+
var project = new Project(GuidGenerator.Create())
{
CompletionProgress = input.CompletionProgress,
@@ -234,7 +287,12 @@ namespace Shentun.ProjectManager.Projects
PlanStartTime = planStartTime,
PlanEndTime = planEndTime,
FinishTime = finishTime,
- DemandContent = input.DemandContent
+ DemandContent = input.DemandContent,
+ CompleteFlag = input.CompleteFlag,
+ CustomerId = input.CustomerId,
+ LeaderId = input.LeaderId,
+ PlanTime = input.PlanTime,
+ PlanUnit = input.PlanUnit
};
await _projectRepository.InsertAsync(project);
@@ -297,6 +355,18 @@ namespace Shentun.ProjectManager.Projects
}
}
+ if (input.CompleteFlag != '0' && input.CompleteFlag != '1' && input.CompleteFlag != '2')
+ {
+ throw new UserFriendlyException($"项目完成状态值:{input.CompleteFlag}无效");
+ }
+
+ var isCustomer = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.CustomerId);
+ if (isCustomer == null)
+ {
+ throw new UserFriendlyException($"客户Id:{input.CustomerId}无效");
+ }
+
+
project.FinishTime = finishTime;
project.PlanStartTime = planStartTime;
project.PlanEndTime = planEndTime;
@@ -305,6 +375,11 @@ namespace Shentun.ProjectManager.Projects
project.IsActive = input.IsActive;
project.ShortName = input.ShortName;
project.DemandContent = input.DemandContent;
+ project.CustomerId = input.CustomerId;
+ project.CompleteFlag = input.CompleteFlag;
+ project.PlanUnit = input.PlanUnit;
+ project.PlanTime = input.PlanTime;
+ project.LeaderId = input.LeaderId;
await _projectRepository.UpdateAsync(project);
}
diff --git a/src/Shentun.ProjectManager.Domain/Projects/Project.cs b/src/Shentun.ProjectManager.Domain/Projects/Project.cs
index d7cb94d..6c78562 100644
--- a/src/Shentun.ProjectManager.Domain/Projects/Project.cs
+++ b/src/Shentun.ProjectManager.Domain/Projects/Project.cs
@@ -87,6 +87,21 @@ namespace Shentun.ProjectManager.Models
public Guid CustomerId { get; set; }
+ ///
+ /// 负责人
+ ///
+ public Guid LeaderId { get; set; }
+
+ ///
+ /// 计划时间
+ ///
+ public decimal PlanTime { get; set; }
+
+ ///
+ /// 计划时间单位 0-天 1-小时
+ ///
+ public char PlanUnit { get; set; }
+
public string ConcurrencyStamp { get; set; }
diff --git a/src/Shentun.ProjectManager.EntityFrameworkCore/Configures/ProjectConfigure.cs b/src/Shentun.ProjectManager.EntityFrameworkCore/Configures/ProjectConfigure.cs
index 2e7e357..595821f 100644
--- a/src/Shentun.ProjectManager.EntityFrameworkCore/Configures/ProjectConfigure.cs
+++ b/src/Shentun.ProjectManager.EntityFrameworkCore/Configures/ProjectConfigure.cs
@@ -25,6 +25,9 @@ namespace Shentun.ProjectManager.Configures
entity.Property(t => t.IsActive).HasComment("是否启用").IsRequired().HasDefaultValueSql("'Y'");
entity.Property(t => t.CompleteFlag).HasComment("完成状态 0=未完成 1=已完成 2=中止").IsRequired().HasDefaultValueSql("'0'");
entity.Property(t => t.CustomerId).HasComment("客户id").IsRequired();
+ entity.Property(t => t.LeaderId).HasComment("负责人id").IsRequired();
+ entity.Property(t => t.PlanTime).HasComment("计划时间").IsRequired().HasDefaultValue(0);
+ entity.Property(t => t.PlanUnit).HasComment("计划时间单位 0-天 1-小时").IsRequired().HasDefaultValueSql("'0'");
}
}
}
diff --git a/src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs b/src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs
new file mode 100644
index 0000000..d5eae11
--- /dev/null
+++ b/src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs
@@ -0,0 +1,2380 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Shentun.ProjectManager.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace Shentun.ProjectManager.Migrations
+{
+ [DbContext(typeof(ProjectManagerDbContext))]
+ [Migration("20250828030313_insert_customer")]
+ partial class insert_customer
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
+ .HasAnnotation("ProductVersion", "6.0.5")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.Customer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("ContactAddress")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)")
+ .HasColumnName("contact_address")
+ .HasComment("联系地址");
+
+ b.Property("ContactNumber")
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)")
+ .HasColumnName("contact_number")
+ .HasComment("联系电话");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("display_name")
+ .HasComment("名称");
+
+ b.Property("IsActive")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("is_active")
+ .HasDefaultValueSql("'Y'")
+ .HasComment("是否启用");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("PersonInCharge")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("person_in_charge")
+ .HasComment("负责人");
+
+ b.Property("ShortName")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("short_name")
+ .HasComment("简称");
+
+ b.HasKey("Id")
+ .HasName("pk_customer");
+
+ b.ToTable("customer", (string)null);
+
+ b.HasComment("客户表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.MenuInfo", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id")
+ .IsFixedLength();
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)")
+ .HasColumnName("display_name")
+ .HasComment("名称");
+
+ b.Property("DisplayOrder")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(999999)
+ .HasColumnName("display_order");
+
+ b.Property("IconName")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("icon_name")
+ .HasComment("菜单图标");
+
+ b.Property("IsActive")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character(1)")
+ .HasColumnName("is_active")
+ .HasDefaultValueSql("'Y'")
+ .HasComment("是否启用");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("MenuType")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character(1)")
+ .HasDefaultValue('1')
+ .HasColumnName("menu_type");
+
+ b.Property("ParentId")
+ .HasColumnType("uuid")
+ .HasColumnName("parent_id")
+ .IsFixedLength()
+ .HasComment("父id");
+
+ b.Property("RouteUrl")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)")
+ .HasColumnName("route_url")
+ .HasComment("路由地址");
+
+ b.Property("SimpleCode")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)")
+ .HasColumnName("simple_code")
+ .HasComment("自定义简码");
+
+ b.HasKey("Id")
+ .HasName("pk_menu_info");
+
+ b.ToTable("menu_info", (string)null);
+
+ b.HasComment("菜单栏目");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.Project", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("CompleteFlag")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("complete_flag")
+ .HasDefaultValueSql("'0'")
+ .HasComment("完成状态 0=未完成 1=已完成 2=中止");
+
+ b.Property("CompletionProgress")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("smallint")
+ .HasDefaultValue((short)0)
+ .HasColumnName("completion_progress")
+ .HasComment("完成进度 0-100 整数");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("CustomerId")
+ .HasColumnType("uuid")
+ .HasColumnName("customer_id")
+ .HasComment("客户id");
+
+ b.Property("DemandContent")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)")
+ .HasColumnName("demand_content")
+ .HasComment("需求内容");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("display_name")
+ .HasComment("名称");
+
+ b.Property("FinishTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("finish_time")
+ .HasComment("实际完成时间");
+
+ b.Property("IsActive")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("is_active")
+ .HasDefaultValueSql("'Y'")
+ .HasComment("是否启用");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("ParentId")
+ .HasColumnType("uuid")
+ .HasColumnName("parent_id")
+ .HasComment("父项目id");
+
+ b.Property("PlanEndTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("plan_end_time")
+ .HasComment("计划结束时间");
+
+ b.Property("PlanStartTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("plan_start_time")
+ .HasComment("计划开始时间");
+
+ b.Property("ShortName")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("short_name")
+ .HasComment("简称");
+
+ b.HasKey("Id")
+ .HasName("pk_project");
+
+ b.ToTable("project", (string)null);
+
+ b.HasComment("项目表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.ProjectFile", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("display_name")
+ .HasComment("名称");
+
+ b.Property("EncryUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("encry_user_id")
+ .HasComment("加密用户Id");
+
+ b.Property("FileData")
+ .HasColumnType("bytea")
+ .HasColumnName("file_data")
+ .HasComment("文件二进制数据");
+
+ b.Property("IsEncry")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("is_encry")
+ .HasDefaultValueSql("'N'")
+ .HasComment("是否加密");
+
+ b.Property("IsLock")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("is_lock")
+ .HasDefaultValueSql("'N'")
+ .HasComment("是否锁定");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("LockUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("lock_user_id")
+ .HasComment("加锁用户id");
+
+ b.Property("ProjectFolderId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_folder_id")
+ .HasComment("项目文件夹id");
+
+ b.Property("SuffixName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("suffix_name")
+ .HasComment("后缀名");
+
+ b.HasKey("Id")
+ .HasName("pk_project_file");
+
+ b.ToTable("project_file", (string)null);
+
+ b.HasComment("项目文件表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.ProjectFolder", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DisplayName")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("display_name")
+ .HasComment("名称");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("ParentId")
+ .HasColumnType("uuid")
+ .HasColumnName("parent_id")
+ .HasComment("父项目文件夹id");
+
+ b.Property("ProjectId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_id")
+ .HasComment("项目id");
+
+ b.HasKey("Id")
+ .HasName("pk_project_folder");
+
+ b.ToTable("project_folder", (string)null);
+
+ b.HasComment("项目文件夹表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.ProjectStaff", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("CompletionProgress")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("smallint")
+ .HasDefaultValue((short)0)
+ .HasColumnName("completion_progress")
+ .HasComment("完成进度 0-100 整数");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DemandContent")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)")
+ .HasColumnName("demand_content")
+ .HasComment("需求内容");
+
+ b.Property("FinishTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("finish_time")
+ .HasComment("实际完成时间");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("PlanEndTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("plan_end_time")
+ .HasComment("计划结束时间");
+
+ b.Property("PlanStartTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("plan_start_time")
+ .HasComment("计划开始时间");
+
+ b.Property("ProjectId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_id")
+ .HasComment("项目id");
+
+ b.Property("RoleId")
+ .HasColumnType("uuid")
+ .HasColumnName("role_id")
+ .HasComment("角色id");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id")
+ .HasComment("用户id");
+
+ b.HasKey("Id")
+ .HasName("pk_project_staff");
+
+ b.ToTable("project_staff", (string)null);
+
+ b.HasComment("项目人员表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.ProjectStaffFeedback", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("FeedbackContent")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)")
+ .HasColumnName("feedback_content")
+ .HasComment("反馈内容");
+
+ b.Property("FeedbackFlag")
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(1)
+ .HasColumnType("character(1)")
+ .HasColumnName("feedback_flag")
+ .HasDefaultValueSql("'0'")
+ .HasComment("反馈类型 (0.反馈 1.建议 2.日志)");
+
+ b.Property("FeedbackTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("feedback_time")
+ .HasComment("反馈时间");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("ProjectStaffId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_staff_id")
+ .HasComment("项目人员id");
+
+ b.HasKey("Id")
+ .HasName("pk_project_staff_feedback");
+
+ b.ToTable("project_staff_feedback", (string)null);
+
+ b.HasComment("人员反馈、建议、日志表");
+ });
+
+ modelBuilder.Entity("Shentun.ProjectManager.Models.RoleMenuInfo", b =>
+ {
+ b.Property("RoleId")
+ .HasColumnType("uuid")
+ .HasColumnName("role_id")
+ .IsFixedLength();
+
+ b.Property("MenuInfoId")
+ .HasColumnType("uuid")
+ .HasColumnName("menu_info_id")
+ .IsFixedLength();
+
+ b.HasKey("RoleId", "MenuInfoId")
+ .HasName("pk_role_menuinfo");
+
+ b.ToTable("role_menu_info", (string)null);
+
+ b.HasComment("角色对应菜单权限");
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("character varying(96)")
+ .HasColumnName("application_name");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("browser_info");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("client_id");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("client_ip_address");
+
+ b.Property("ClientName")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("client_name");
+
+ b.Property("Comments")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("comments");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("correlation_id");
+
+ b.Property("Exceptions")
+ .HasColumnType("text")
+ .HasColumnName("exceptions");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("integer")
+ .HasColumnName("execution_duration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("execution_time");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("HttpMethod")
+ .HasMaxLength(16)
+ .HasColumnType("character varying(16)")
+ .HasColumnName("http_method");
+
+ b.Property("HttpStatusCode")
+ .HasColumnType("integer")
+ .HasColumnName("http_status_code");
+
+ b.Property("ImpersonatorTenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("impersonator_tenant_id");
+
+ b.Property("ImpersonatorTenantName")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("impersonator_tenant_name");
+
+ b.Property("ImpersonatorUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("impersonator_user_id");
+
+ b.Property("ImpersonatorUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("impersonator_user_name");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.Property("TenantName")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("tenant_name");
+
+ b.Property("Url")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("url");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("user_name");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_audit_logs");
+
+ b.HasIndex("TenantId", "ExecutionTime");
+
+ b.HasIndex("TenantId", "UserId", "ExecutionTime");
+
+ b.ToTable("abp_audit_logs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_log_id");
+
+ b.Property("ExecutionDuration")
+ .HasColumnType("integer")
+ .HasColumnName("execution_duration");
+
+ b.Property("ExecutionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("execution_time");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("MethodName")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("method_name");
+
+ b.Property("Parameters")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)")
+ .HasColumnName("parameters");
+
+ b.Property("ServiceName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("service_name");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_audit_log_actions");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime");
+
+ b.ToTable("abp_audit_log_actions", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AuditLogId")
+ .HasColumnType("uuid")
+ .HasColumnName("audit_log_id");
+
+ b.Property("ChangeTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("change_time");
+
+ b.Property("ChangeType")
+ .HasColumnType("smallint")
+ .HasColumnName("change_type");
+
+ b.Property("EntityId")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("entity_id");
+
+ b.Property("EntityTenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("entity_tenant_id");
+
+ b.Property("EntityTypeFullName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("entity_type_full_name");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_entity_changes");
+
+ b.HasIndex("AuditLogId");
+
+ b.HasIndex("TenantId", "EntityTypeFullName", "EntityId");
+
+ b.ToTable("abp_entity_changes", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("EntityChangeId")
+ .HasColumnType("uuid")
+ .HasColumnName("entity_change_id");
+
+ b.Property("NewValue")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("new_value");
+
+ b.Property("OriginalValue")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("original_value");
+
+ b.Property("PropertyName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("property_name");
+
+ b.Property("PropertyTypeFullName")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("property_type_full_name");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_entity_property_changes");
+
+ b.HasIndex("EntityChangeId");
+
+ b.ToTable("abp_entity_property_changes", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("IsAbandoned")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("is_abandoned");
+
+ b.Property("JobArgs")
+ .IsRequired()
+ .HasMaxLength(1048576)
+ .HasColumnType("character varying(1048576)")
+ .HasColumnName("job_args");
+
+ b.Property("JobName")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("job_name");
+
+ b.Property("LastTryTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_try_time");
+
+ b.Property("NextTryTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("next_try_time");
+
+ b.Property("Priority")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("smallint")
+ .HasDefaultValue((byte)15)
+ .HasColumnName("priority");
+
+ b.Property("TryCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("smallint")
+ .HasDefaultValue((short)0)
+ .HasColumnName("try_count");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_background_jobs");
+
+ b.HasIndex("IsAbandoned", "NextTryTime");
+
+ b.ToTable("abp_background_jobs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name");
+
+ b.Property("ProviderKey")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("provider_key");
+
+ b.Property("ProviderName")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("provider_name");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("value");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_feature_values");
+
+ b.HasIndex("Name", "ProviderName", "ProviderKey")
+ .IsUnique();
+
+ b.ToTable("abp_feature_values", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("Description")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("description");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("IsStatic")
+ .HasColumnType("boolean")
+ .HasColumnName("is_static");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name");
+
+ b.Property("Regex")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("regex");
+
+ b.Property("RegexDescription")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("regex_description");
+
+ b.Property("Required")
+ .HasColumnType("boolean")
+ .HasColumnName("required");
+
+ b.Property("ValueType")
+ .HasColumnType("integer")
+ .HasColumnName("value_type");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_claim_types");
+
+ b.ToTable("abp_claim_types", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("SourceTenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("source_tenant_id");
+
+ b.Property("SourceUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("source_user_id");
+
+ b.Property("TargetTenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("target_tenant_id");
+
+ b.Property("TargetUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("target_user_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_link_users");
+
+ b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId")
+ .IsUnique();
+
+ b.ToTable("abp_link_users", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("IsDefault")
+ .HasColumnType("boolean")
+ .HasColumnName("is_default");
+
+ b.Property("IsPublic")
+ .HasColumnType("boolean")
+ .HasColumnName("is_public");
+
+ b.Property("IsStatic")
+ .HasColumnType("boolean")
+ .HasColumnName("is_static");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name");
+
+ b.Property("NormalizedName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("normalized_name");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_roles");
+
+ b.HasIndex("NormalizedName");
+
+ b.ToTable("abp_roles", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("ClaimType")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("claim_type");
+
+ b.Property("ClaimValue")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)")
+ .HasColumnName("claim_value");
+
+ b.Property("RoleId")
+ .HasColumnType("uuid")
+ .HasColumnName("role_id");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_role_claims");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("abp_role_claims", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Action")
+ .HasMaxLength(96)
+ .HasColumnType("character varying(96)")
+ .HasColumnName("action");
+
+ b.Property("ApplicationName")
+ .HasMaxLength(96)
+ .HasColumnType("character varying(96)")
+ .HasColumnName("application_name");
+
+ b.Property("BrowserInfo")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("browser_info");
+
+ b.Property("ClientId")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("client_id");
+
+ b.Property("ClientIpAddress")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("client_ip_address");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CorrelationId")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("correlation_id");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("Identity")
+ .HasMaxLength(96)
+ .HasColumnType("character varying(96)")
+ .HasColumnName("identity");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.Property("TenantName")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("tenant_name");
+
+ b.Property("UserId")
+ .HasColumnType("uuid")
+ .HasColumnName("user_id");
+
+ b.Property("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("user_name");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_security_logs");
+
+ b.HasIndex("TenantId", "Action");
+
+ b.HasIndex("TenantId", "ApplicationName");
+
+ b.HasIndex("TenantId", "Identity");
+
+ b.HasIndex("TenantId", "UserId");
+
+ b.ToTable("abp_security_logs", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AccessFailedCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("access_failed_count");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("character varying(40)")
+ .HasColumnName("concurrency_stamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("creation_time");
+
+ b.Property("CreatorId")
+ .HasColumnType("uuid")
+ .HasColumnName("creator_id");
+
+ b.Property("DeleterId")
+ .HasColumnType("uuid")
+ .HasColumnName("deleter_id");
+
+ b.Property("DeletionTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("deletion_time");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("email");
+
+ b.Property("EmailConfirmed")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("email_confirmed");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("text")
+ .HasColumnName("extra_properties");
+
+ b.Property("IsActive")
+ .HasColumnType("boolean")
+ .HasColumnName("is_active");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("is_deleted");
+
+ b.Property("IsExternal")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("is_external");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("last_modification_time");
+
+ b.Property("LastModifierId")
+ .HasColumnType("uuid")
+ .HasColumnName("last_modifier_id");
+
+ b.Property("LockoutEnabled")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("lockout_enabled");
+
+ b.Property("LockoutEnd")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("lockout_end");
+
+ b.Property("Name")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("name");
+
+ b.Property("NormalizedEmail")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("normalized_email");
+
+ b.Property("NormalizedUserName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("normalized_user_name");
+
+ b.Property("PasswordHash")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("password_hash");
+
+ b.Property("PhoneNumber")
+ .HasMaxLength(16)
+ .HasColumnType("character varying(16)")
+ .HasColumnName("phone_number");
+
+ b.Property("PhoneNumberConfirmed")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("phone_number_confirmed");
+
+ b.Property("SecurityStamp")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("security_stamp");
+
+ b.Property("Surname")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("surname");
+
+ b.Property("TenantId")
+ .HasColumnType("uuid")
+ .HasColumnName("tenant_id");
+
+ b.Property("TwoFactorEnabled")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("two_factor_enabled");
+
+ b.Property("UserName")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("user_name");
+
+ b.HasKey("Id")
+ .HasName("pk_abp_users");
+
+ b.HasIndex("Email");
+
+ b.HasIndex("NormalizedEmail");
+
+ b.HasIndex("NormalizedUserName");
+
+ b.HasIndex("UserName");
+
+ b.ToTable("abp_users", (string)null);
+ });
+
+ modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property