Browse Source

1126

master
wxd 5 months ago
parent
commit
c3eff6c3f2
  1. 41
      src/Shentun.ProjectManager.Application.Contracts/Customers/CreateCustomerDtoInputDto.cs
  2. 42
      src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerDto.cs
  3. 11
      src/Shentun.ProjectManager.Application.Contracts/Customers/CustomerIdInputDto.cs
  4. 14
      src/Shentun.ProjectManager.Application.Contracts/Customers/GetCustomerListInputDto.cs
  5. 43
      src/Shentun.ProjectManager.Application.Contracts/Customers/UpdateCustomerDtoInputDto.cs
  6. 29
      src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs
  7. 5
      src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs
  8. 35
      src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs
  9. 37
      src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs
  10. 26
      src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs
  11. 182
      src/Shentun.ProjectManager.Application/Customers/CustomerAppService.cs
  12. 4
      src/Shentun.ProjectManager.Application/ProjectManagerApplicationAutoMapperProfile.cs
  13. 195
      src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs
  14. 15
      src/Shentun.ProjectManager.Domain/Projects/Project.cs
  15. 3
      src/Shentun.ProjectManager.EntityFrameworkCore/Configures/ProjectConfigure.cs
  16. 2380
      src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs
  17. 67
      src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.cs
  18. 2399
      src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.Designer.cs
  19. 52
      src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.cs
  20. 107
      src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/ProjectManagerDbContextModelSnapshot.cs

41
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
{
/// <summary>
/// 名称
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 简称
/// </summary>
public string ShortName { get; set; }
/// <summary>
/// 负责人
/// </summary>
public string PersonInCharge { get; set; }
/// <summary>
/// 联系电话
/// </summary>
public string ContactNumber { get; set; }
/// <summary>
/// 联系地址
/// </summary>
public string ContactAddress { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public char IsActive { get; set; }
}
}

42
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
{
/// <summary>
/// 名称
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 简称
/// </summary>
public string ShortName { get; set; }
/// <summary>
/// 负责人
/// </summary>
public string PersonInCharge { get; set; }
/// <summary>
/// 联系电话
/// </summary>
public string ContactNumber { get; set; }
/// <summary>
/// 联系地址
/// </summary>
public string ContactAddress { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public char IsActive { get; set; }
}
}

11
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; }
}
}

14
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
{
/// <summary>
/// 名称
/// </summary>
public string DisplayName { get; set; }
}
}

43
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; }
/// <summary>
/// 名称
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 简称
/// </summary>
public string ShortName { get; set; }
/// <summary>
/// 负责人
/// </summary>
public string PersonInCharge { get; set; }
/// <summary>
/// 联系电话
/// </summary>
public string ContactNumber { get; set; }
/// <summary>
/// 联系地址
/// </summary>
public string ContactAddress { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public char IsActive { get; set; }
}
}

29
src/Shentun.ProjectManager.Application.Contracts/Projects/CreateProjectInputDto.cs

@ -52,5 +52,34 @@ namespace Shentun.ProjectManager.Projects
/// 是否启用
/// </summary>
public char IsActive { get; set; }
/// <summary>
/// 完成状态 0=未完成 1=已完成 2=中止
/// </summary>
public char CompleteFlag { get; set; } = '0';
/// <summary>
/// 客户id
/// </summary>
public Guid CustomerId { get; set; }
/// <summary>
/// 负责人
/// </summary>
public Guid LeaderId { get; set; }
/// <summary>
/// 计划时间
/// </summary>
public decimal PlanTime { get; set; }
/// <summary>
/// 计划时间单位 0-天 1-小时
/// </summary>
public char PlanUnit { get; set; }
}
}

5
src/Shentun.ProjectManager.Application.Contracts/Projects/GetProjectListInputDto.cs

@ -10,5 +10,10 @@ namespace Shentun.ProjectManager.Projects
/// 名称 模糊查找
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 客户Id
/// </summary>
public Guid? CustomerId { get; set; }
}
}

35
src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectDto.cs

@ -55,5 +55,40 @@ namespace Shentun.ProjectManager.Projects
public char IsActive { get; set; }
/// <summary>
/// 完成状态 0=未完成 1=已完成 2=中止
/// </summary>
public char CompleteFlag { get; set; }
/// <summary>
/// 客户id
/// </summary>
public Guid CustomerId { get; set; }
/// <summary>
/// 客户id
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 负责人Id
/// </summary>
public Guid LeaderId { get; set; }
/// <summary>
/// 计划时间
/// </summary>
public decimal PlanTime { get; set; }
/// <summary>
/// 计划时间单位 0-天 1-小时
/// </summary>
public char PlanUnit { get; set; }
}
}

37
src/Shentun.ProjectManager.Application.Contracts/Projects/ProjectTreeDto.cs

@ -53,6 +53,43 @@ namespace Shentun.ProjectManager.Projects
/// </summary>
public char IsActive { get; set; }
/// <summary>
/// 完成状态 0=未完成 1=已完成 2=中止
/// </summary>
public char CompleteFlag { get; set; }
/// <summary>
/// 客户id
/// </summary>
public Guid CustomerId { get; set; }
/// <summary>
/// 客户id
/// </summary>
public string CustomerName { get; set; }
/// <summary>
/// 负责人Id
/// </summary>
public Guid LeaderId { get; set; }
/// <summary>
/// 负责人名称
/// </summary>
public string LeaderName { get; set; }
/// <summary>
/// 计划时间
/// </summary>
public decimal PlanTime { get; set; }
/// <summary>
/// 计划时间单位 0-天 1-小时
/// </summary>
public string PlanUnit { get; set; }
public List<ProjectTreeDto> TreeChildren { get; set; }
}
}

26
src/Shentun.ProjectManager.Application.Contracts/Projects/UpdateProjectInputDto.cs

@ -53,5 +53,31 @@ namespace Shentun.ProjectManager.Projects
/// 是否启用
/// </summary>
public char IsActive { get; set; }
/// <summary>
/// 完成状态 0=未完成 1=已完成 2=中止
/// </summary>
public char CompleteFlag { get; set; } = '0';
/// <summary>
/// 客户id
/// </summary>
public Guid CustomerId { get; set; }
/// <summary>
/// 负责人
/// </summary>
public Guid LeaderId { get; set; }
/// <summary>
/// 计划时间
/// </summary>
public decimal PlanTime { get; set; }
/// <summary>
/// 计划时间单位 0-天 1-小时
/// </summary>
public char PlanUnit { get; set; }
}
}

182
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
{
/// <summary>
/// 客户管理
/// </summary>
[ApiExplorerSettings(GroupName = "Bus")]
[Authorize]
public class CustomerAppService : ApplicationService
{
private readonly CacheService _cacheService;
private readonly IRepository<Customer, Guid> _customerRepository;
private readonly IRepository<Project, Guid> _projectRepository;
private readonly IRepository<IdentityUser, Guid> _identityUserRepository;
private readonly CurrentUser _currentUser;
public CustomerAppService(
CacheService cacheService,
IRepository<Project, Guid> projectRepository,
CurrentUser currentUser,
IRepository<IdentityUser, Guid> identityUserRepository,
IRepository<Customer, Guid> customerRepository)
{
_cacheService = cacheService;
_projectRepository = projectRepository;
_currentUser = currentUser;
_identityUserRepository = identityUserRepository;
_customerRepository = customerRepository;
}
/// <summary>
/// 查询单个详细信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/Customer/Get")]
public async Task<CustomerDto> GetAsync(CustomerIdInputDto input)
{
var customerEnt = await _customerRepository.FirstOrDefaultAsync(f => f.Id == input.CustomerId);
var entDto = ObjectMapper.Map<Customer, CustomerDto>(customerEnt);
entDto.CreatorName = await _cacheService.GetNameAsync(entDto.CreatorId);
entDto.LastModifierName = await _cacheService.GetNameAsync(entDto.LastModifierId);
return entDto;
}
/// <summary>
/// 查询客户列表记录
/// </summary>
/// <returns></returns>
[HttpPost("api/app/Customer/GetList")]
public async Task<List<CustomerDto>> 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;
}
/// <summary>
/// 创建客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 修改客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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);
}
/// <summary>
/// 删除客户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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);
}
}
}

4
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<UpdateMenuInfoDto, MenuInfo>();
CreateMap<Customer, CustomerDto>();
}
}

195
src/Shentun.ProjectManager.Application/Projects/ProjectAppService.cs

@ -28,17 +28,19 @@ namespace Shentun.ProjectManager.Projects
private readonly CacheService _cacheService;
private readonly IRepository<ProjectFolder, Guid> _projectFolderRepository;
private readonly IRepository<ProjectStaff, Guid> _projectStaffRepository;
private readonly IRepository<Customer, Guid> _customerRepository;
public ProjectAppService(
IRepository<Project, Guid> projectRepository,
CacheService cacheService,
IRepository<ProjectFolder, Guid> projectFolderRepository,
IRepository<ProjectStaff, Guid> projectStaffRepository
)
IRepository<ProjectStaff, Guid> projectStaffRepository,
IRepository<Customer, Guid> customerRepository)
{
_projectRepository = projectRepository;
_cacheService = cacheService;
_projectFolderRepository = projectFolderRepository;
_projectStaffRepository = projectStaffRepository;
_customerRepository = customerRepository;
}
/// <summary>
@ -57,79 +59,109 @@ namespace Shentun.ProjectManager.Projects
}
/// <summary>
/// 查询项目列表
/// </summary>
/// <returns></returns>
[HttpPost("api/app/Project/GetList")]
public async Task<List<ProjectDto>> 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;
}
///// <summary>
///// 查询项目列表
///// </summary>
///// <returns></returns>
//[HttpPost("api/app/Project/GetList")]
//public async Task<List<ProjectDto>> 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;
//}
/// <summary>
/// 查询项目列表 树型结构
/// 查询项目列表 树型结构 带客户id
/// </summary>
/// <returns></returns>
[HttpPost("api/app/Project/GetThreeList")]
public async Task<List<ProjectTreeDto>> 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);
}

15
src/Shentun.ProjectManager.Domain/Projects/Project.cs

@ -87,6 +87,21 @@ namespace Shentun.ProjectManager.Models
public Guid CustomerId { get; set; }
/// <summary>
/// 负责人
/// </summary>
public Guid LeaderId { get; set; }
/// <summary>
/// 计划时间
/// </summary>
public decimal PlanTime { get; set; }
/// <summary>
/// 计划时间单位 0-天 1-小时
/// </summary>
public char PlanUnit { get; set; }
public string ConcurrencyStamp { get; set; }

3
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'");
}
}
}

2380
src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.Designer.cs
File diff suppressed because it is too large
View File

67
src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20250828030313_insert_customer.cs

@ -0,0 +1,67 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Shentun.ProjectManager.Migrations
{
public partial class insert_customer : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<char>(
name: "complete_flag",
table: "project",
type: "character(1)",
maxLength: 1,
nullable: false,
defaultValueSql: "'0'",
comment: "完成状态 0=未完成 1=已完成 2=中止");
migrationBuilder.AddColumn<Guid>(
name: "customer_id",
table: "project",
type: "uuid",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
comment: "客户id");
migrationBuilder.CreateTable(
name: "customer",
columns: table => new
{
id = table.Column<Guid>(type: "uuid", nullable: false),
display_name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: false, comment: "名称"),
short_name = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true, comment: "简称"),
person_in_charge = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true, comment: "负责人"),
contact_number = table.Column<string>(type: "character varying(20)", maxLength: 20, nullable: true, comment: "联系电话"),
contact_address = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: true, comment: "联系地址"),
is_active = table.Column<char>(type: "character(1)", maxLength: 1, nullable: false, defaultValueSql: "'Y'", comment: "是否启用"),
concurrency_stamp = table.Column<string>(type: "character varying(40)", maxLength: 40, nullable: true),
creation_time = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
creator_id = table.Column<Guid>(type: "uuid", nullable: true),
last_modification_time = table.Column<DateTime>(type: "timestamp without time zone", nullable: true),
last_modifier_id = table.Column<Guid>(type: "uuid", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("pk_customer", x => x.id);
},
comment: "客户表");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "customer");
migrationBuilder.DropColumn(
name: "complete_flag",
table: "project");
migrationBuilder.DropColumn(
name: "customer_id",
table: "project");
}
}
}

2399
src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.Designer.cs
File diff suppressed because it is too large
View File

52
src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/20251125115551_update_project_add_plan.cs

@ -0,0 +1,52 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Shentun.ProjectManager.Migrations
{
public partial class update_project_add_plan : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<Guid>(
name: "leader_id",
table: "project",
type: "uuid",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
comment: "负责人id");
migrationBuilder.AddColumn<decimal>(
name: "plan_time",
table: "project",
type: "numeric",
nullable: false,
defaultValue: 0m,
comment: "计划时间");
migrationBuilder.AddColumn<char>(
name: "plan_unit",
table: "project",
type: "character(1)",
nullable: false,
defaultValueSql: "'0'",
comment: "计划时间单位 0-天 1-小时");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "leader_id",
table: "project");
migrationBuilder.DropColumn(
name: "plan_time",
table: "project");
migrationBuilder.DropColumn(
name: "plan_unit",
table: "project");
}
}
}

107
src/Shentun.ProjectManager.EntityFrameworkCore/Migrations/ProjectManagerDbContextModelSnapshot.cs

@ -24,6 +24,81 @@ namespace Shentun.ProjectManager.Migrations
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("Shentun.ProjectManager.Models.Customer", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("concurrency_stamp");
b.Property<string>("ContactAddress")
.HasMaxLength(200)
.HasColumnType("character varying(200)")
.HasColumnName("contact_address")
.HasComment("联系地址");
b.Property<string>("ContactNumber")
.HasMaxLength(20)
.HasColumnType("character varying(20)")
.HasColumnName("contact_number")
.HasComment("联系电话");
b.Property<DateTime>("CreationTime")
.HasColumnType("timestamp without time zone")
.HasColumnName("creation_time");
b.Property<Guid?>("CreatorId")
.HasColumnType("uuid")
.HasColumnName("creator_id");
b.Property<string>("DisplayName")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("display_name")
.HasComment("名称");
b.Property<char>("IsActive")
.ValueGeneratedOnAdd()
.HasMaxLength(1)
.HasColumnType("character(1)")
.HasColumnName("is_active")
.HasDefaultValueSql("'Y'")
.HasComment("是否启用");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("timestamp without time zone")
.HasColumnName("last_modification_time");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uuid")
.HasColumnName("last_modifier_id");
b.Property<string>("PersonInCharge")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("person_in_charge")
.HasComment("负责人");
b.Property<string>("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<Guid>("Id")
@ -118,6 +193,14 @@ namespace Shentun.ProjectManager.Migrations
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<char>("CompleteFlag")
.ValueGeneratedOnAdd()
.HasMaxLength(1)
.HasColumnType("character(1)")
.HasColumnName("complete_flag")
.HasDefaultValueSql("'0'")
.HasComment("完成状态 0=未完成 1=已完成 2=中止");
b.Property<short>("CompletionProgress")
.ValueGeneratedOnAdd()
.HasColumnType("smallint")
@ -139,6 +222,11 @@ namespace Shentun.ProjectManager.Migrations
.HasColumnType("uuid")
.HasColumnName("creator_id");
b.Property<Guid>("CustomerId")
.HasColumnType("uuid")
.HasColumnName("customer_id")
.HasComment("客户id");
b.Property<string>("DemandContent")
.HasMaxLength(2000)
.HasColumnType("character varying(2000)")
@ -173,6 +261,11 @@ namespace Shentun.ProjectManager.Migrations
.HasColumnType("uuid")
.HasColumnName("last_modifier_id");
b.Property<Guid>("LeaderId")
.HasColumnType("uuid")
.HasColumnName("leader_id")
.HasComment("负责人id");
b.Property<Guid?>("ParentId")
.HasColumnType("uuid")
.HasColumnName("parent_id")
@ -188,6 +281,20 @@ namespace Shentun.ProjectManager.Migrations
.HasColumnName("plan_start_time")
.HasComment("计划开始时间");
b.Property<decimal>("PlanTime")
.ValueGeneratedOnAdd()
.HasColumnType("numeric")
.HasDefaultValue(0m)
.HasColumnName("plan_time")
.HasComment("计划时间");
b.Property<char>("PlanUnit")
.ValueGeneratedOnAdd()
.HasColumnType("character(1)")
.HasColumnName("plan_unit")
.HasDefaultValueSql("'0'")
.HasComment("计划时间单位 0-天 1-小时");
b.Property<string>("ShortName")
.HasMaxLength(50)
.HasColumnType("character varying(50)")

Loading…
Cancel
Save