diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs new file mode 100644 index 00000000..8e313589 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackNode/TrackNodeInput.cs @@ -0,0 +1,29 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackNode; + +public class EditTrackNodeInput +{ + /// + /// 操作类型 + /// + public OptionType Options { get; set; } + + /// + /// 轨迹节点id,创建不用填 + /// + public long Id { get; set; } + + /// + /// 系统id + /// + public int SystemId { get; set; } + + /// + /// 节点名称 + /// + public string Name { get; set; } + + /// + /// 节点英文名称 + /// + public string EnName { get; set; } +} diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/EditTrackPullConfigInput.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/EditTrackPullConfigInput.cs index f60beeb4..3a6b51dc 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/EditTrackPullConfigInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/EditTrackPullConfigInput.cs @@ -70,7 +70,11 @@ public class EditTrackPullConfigInput public string? OrderPath { get; set; } /// - /// 轨迹明细路径 /// public string? TrackDetailsPath { get; set; } + + /// + /// 轨迹内容code + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackStatus/QueryTrackNodeRequest.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackStatus/QueryTrackNodeRequest.cs new file mode 100644 index 00000000..f7903f71 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackStatus/QueryTrackNodeRequest.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackStatus; + +public class QueryTrackNodeRequest:PageInfoInput +{ + /// + /// 关键字,节点中文和英文 + /// + public string? KeyWord { get; set; } + + /// + /// 子系统id + /// + public long? SystemId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs b/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs new file mode 100644 index 00000000..af8699e0 --- /dev/null +++ b/src/SJZY.Track.Application/AutoMapper/TrackNodeMapperProfile.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using SJZY.Track.Application.Contract.Dtos.TrackNode; +using SJZY.Track.Application.Contract.Dtos.TrackStatus; +using SJZY.Track.Domain.Aggregates.TrackNodeAggregate; +using SJZY.Track.Domain.Dtos.TrackNode; + +namespace SJZY.Track.Application.AutoMapper; + +public class TrackNodeMapperProfile :Profile +{ + public TrackNodeMapperProfile() + { + CreateMap(); + CreateMap(MemberList.None) + .ForMember(val => val.NodeName, opt => opt.MapFrom(src => src.Name)) + .ForMember(val => val.NodeEnName, opt => opt.MapFrom(src => src.EnName)) + .ForMember(val => val.SubSystemId, opt => opt.MapFrom(src => src.SystemId)); + + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs b/src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs new file mode 100644 index 00000000..7b8f3d3a --- /dev/null +++ b/src/SJZY.Track.Application/Services/TrackNodeServices/TrackNodeService.cs @@ -0,0 +1,132 @@ +using Microsoft.Extensions.Localization; +using SJZY.Track.Application.Contract.Dtos.TrackNode; +using SJZY.Track.Application.Contract.Dtos.TrackStatus; +using SJZY.Track.Application.Localization; +using SJZY.Track.Domain.Aggregates.TrackNodeAggregate; +using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; +using SJZY.Track.Domain.Dtos.TrackNode; +using Volo.Abp.DependencyInjection; + +namespace SJZY.Track.Application.Services.TrackNodeServices +{ + /// + /// 轨迹节点服务 + /// + [ApiExplorerSettings(GroupName = "轨迹节点")] + [Route("/Track/Node")] + public class TrackNodeService : ApplicationService, ITransientDependency + { + private readonly ITrackStatusRepository _trackStatusRepository; + private readonly ITrackNodeRepository _trackNodeRepository; + + public TrackNodeService( + ITrackNodeRepository trackNodeRepository, ITrackStatusRepository trackStatusRepository) + { + this._trackNodeRepository = trackNodeRepository; + _trackStatusRepository = trackStatusRepository; + } + + /// + /// 轨迹节点编辑 + /// + /// + [HttpPost("Edit")] + public async Task EditAsync(EditTrackNodeInput input) + { + return input.Options switch + { + OptionType.新增 => await AddAsync(input), + OptionType.修改 => await UpdateAsync(input), + OptionType.删除 => await DeleteAsync(input), + _ => throw new BusinessException(message: "当前操作动作不合法") + }; + } + + /// + /// 获取分页轨迹节点 + /// + /// + /// + [HttpPost("GetList")] + public async Task> GetPageTrackNode(QueryTrackNodeRequest input) + { + var queryParam = ObjectMapper.Map(input); + var resultDto = await _trackNodeRepository.GetPageList(queryParam); + return resultDto; + } + + /// + /// 获取分页轨迹字典,下拉框用的 + /// + /// + /// + [HttpPost("GetTrackNodeOption")] + public async Task> GetTrackNodeOption(QueryTrackNodeRequest input) + { + var queryParam = ObjectMapper.Map(input); + var resultDto = await _trackNodeRepository.GetPageDicList(queryParam); + return resultDto; + } + + #region 私有方法 + + private async Task AddAsync(EditTrackNodeInput input) + { + #region 业务校验 + var trackNodesEntitys = await _trackNodeRepository.GetListAsync(a => + a.SubSystemId == input.SystemId && (a.NodeName == input.Name || a.NodeEnName == input.EnName)); + if (trackNodesEntitys.Any()) + { + var trackNodeName = trackNodesEntitys.FirstOrDefault(a => a.NodeName == input.Name); + if (trackNodeName != null) + { + throw new BusinessException(message: "该子系统下节点名称已存在"); + } + var trackNodeEnName = trackNodesEntitys.FirstOrDefault(a => a.NodeEnName == input.EnName); + if (trackNodeEnName != null) + { + throw new BusinessException(message: "该子系统下节点英文名称已存在"); + } + } + #endregion + + var entity = ObjectMapper.Map(input); + var isTrue = await _trackNodeRepository.InsertAsync(entity); + + return new UnifyResultDto("200", "新增成功", isTrue); + } + + private async Task UpdateAsync(EditTrackNodeInput input) + { + #region 业务校验 + + var trackNodesEntitys = await _trackNodeRepository.GetFirstAsync(a => a.Id == input.Id); + if (trackNodesEntitys == null) + { + return new UnifyResultDto("200", "没有找到数据,更新失败", false); + } + + #endregion + + trackNodesEntitys.NodeEnName = input.EnName; + trackNodesEntitys.NodeName = input.Name; + var isTrue = await _trackNodeRepository.UpdateAsync(trackNodesEntitys); + + return new UnifyResultDto("200", "修改成功", isTrue); + } + + private async Task DeleteAsync(EditTrackNodeInput input) + { + var trackStatus = await _trackStatusRepository.GetFirstAsync(val => val.Node == input.Id && val.SubSystemId == input.SystemId); + if(trackStatus!=null) + { + return new UnifyResultDto("200", "删除失败,该节点已被使用", false); + } + + var rows = await _trackNodeRepository.DeleteById(input.Id); + return new UnifyResultDto("200", "删除成功", rows>0); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs new file mode 100644 index 00000000..10d1cb70 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/ITrackNodeRepository.cs @@ -0,0 +1,27 @@ +using SJZY.Track.Domain.Dtos.TrackNode; + +namespace SJZY.Track.Domain.Aggregates.TrackNodeAggregate; + +public interface ITrackNodeRepository:IBasicRepository +{ + /// + /// 分页查询 + /// + /// + /// + Task> GetPageList(TrackNodePageDto queryParam); + + /// + /// 分页查询字典 + /// + /// + /// + Task> GetPageDicList(TrackNodePageDto queryParam); + + /// + /// 删除 + /// + /// + /// + Task DeleteById(long inputId); +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/TrackNodeEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/TrackNodeEntity.cs new file mode 100644 index 00000000..c17ef2c2 --- /dev/null +++ b/src/SJZY.Track.Domain/Aggregates/TrackNodeAggregate/TrackNodeEntity.cs @@ -0,0 +1,32 @@ +namespace SJZY.Track.Domain.Aggregates.TrackNodeAggregate; + +/// +/// 轨迹节点主表 +/// +[SugarTable("t_track_node", TableDescription = "轨迹节点主表")] +public class TrackNodeEntity : IFullAuditedBasicEntitys, IAggregateRoot +{ + /// + /// 自增主键 + /// + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "自增主键")] + public long Id { get; set; } + + /// + /// 子系统id + /// + [SugarColumn(ColumnName = "SubSystemId", ColumnDescription = "子系统id")] + public int SubSystemId { get; set; } + + /// + /// 节点名称 + /// + [SugarColumn(ColumnName = "NodeName", Length = 32, ColumnDescription = "节点名称")] + public string? NodeName { get; set; } + + /// + /// 节点英文名称 + /// + [SugarColumn(ColumnName = "NodeEnName", Length = 32, ColumnDescription = "节点英文名称")] + public string? NodeEnName { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs index 4c6d7ed7..4e016b17 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPullConfigEntity.cs @@ -35,4 +35,9 @@ public class TrackPullConfigEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "SubSystemId")] public int SubSystemId { get; set; } + + /// + /// 轨迹内容code + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDicDto.cs b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDicDto.cs new file mode 100644 index 00000000..8402e103 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDicDto.cs @@ -0,0 +1,19 @@ +namespace SJZY.Track.Domain.Dtos.TrackNode; + +public class TrackNodeDicDto +{ + /// + /// 节点id + /// + public long Id { get; set; } + + /// + /// 名称 + /// + public string NodeName { get; set; } + + /// + /// 名称 + /// + public string EnName { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs new file mode 100644 index 00000000..185f432f --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodeDto.cs @@ -0,0 +1,56 @@ +namespace SJZY.Track.Domain.Dtos.TrackNode; + +/// +/// 轨迹节点主表 DTO +/// +public class TrackNodeDto +{ + /// + /// 自增主键 + /// + public long Id { get; set; } + + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 节点名称 + /// + public string? NodeName { get; set; } + + /// + /// 节点英文名称 + /// + public string? NodeEnName { get; set; } + + /// + /// 是否删除 + /// + public bool IsDeleted { get; set; } + + /// + /// 创建人id + /// + public int CreateUserId { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 更新人 + /// + public int? UpdateUserId { get; set; } + + /// + /// 更新时间 + /// + public DateTime? UpdateTime { get; set; } + + public string? CreateUserName { get; set; } + + public string? UpdateUserName { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodePageDto.cs b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodePageDto.cs new file mode 100644 index 00000000..059e92f2 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/TrackNode/TrackNodePageDto.cs @@ -0,0 +1,14 @@ +namespace SJZY.Track.Domain.Dtos.TrackNode; + +public class TrackNodePageDto:PageInfoInput +{ + /// + /// 关键字,节点中文和英文 + /// + public string? KeyWord { get; set; } + + /// + /// 子系统id + /// + public long? SystemId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs new file mode 100644 index 00000000..be340230 --- /dev/null +++ b/src/SJZY.Track.Repository/Repositories/TrackNodeRepository.cs @@ -0,0 +1,53 @@ +using SJZY.Track.Domain.Aggregates.TrackNodeAggregate; +using SJZY.Track.Domain.Dtos.TrackNode; +using SJZY.Track.Domain.VEntities; + +namespace SJZY.Track.Repository.Repositories; + +public class TrackNodeRepository: BasicRepository,ITrackNodeRepository,IScopedDependency +{ + public async Task> GetPageList(TrackNodePageDto queryParam) + { + var result = await Context.Queryable() + .LeftJoin((t,u1)=>t.CreateUserId==u1.Id) + .LeftJoin((t,u1,u2)=>t.UpdateUserId==u2.Id) + .Where((t,u1,u2)=>!t.IsDeleted&&!u1.IsDeleted&&!u2.IsDeleted) + .WhereIF(!string.IsNullOrEmpty(queryParam.KeyWord), (t,u1,u2)=>t.NodeName!.Contains(queryParam.KeyWord)||t.NodeEnName!.Contains(queryParam.KeyWord)) + .WhereIF(queryParam.SystemId.HasValue,(t,u1,u2)=>t.SubSystemId == queryParam.SystemId.Value) + .Select((t, u1, u2) =>new TrackNodeDto() + { + Id = t.Id, + NodeName = t.NodeName, + NodeEnName = t.NodeEnName, + SubSystemId = t.SubSystemId, + UpdateTime = t.UpdateTime, + CreateTime = t.CreateTime, + UpdateUserId = t.UpdateUserId, + UpdateUserName = u2.Name, + CreateUserName = u1.Name + }).ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize); + + return result; + } + + public async Task> GetPageDicList(TrackNodePageDto queryParam) + { + var result = await Context.Queryable() + .Where((t)=>!t.IsDeleted) + .WhereIF(!string.IsNullOrEmpty(queryParam.KeyWord), (t)=>t.NodeName!.Contains(queryParam.KeyWord)||t.NodeEnName!.Contains(queryParam.KeyWord)) + .WhereIF(queryParam.SystemId.HasValue,(t)=>t.SubSystemId == queryParam.SystemId.Value) + .Select(t =>new TrackNodeDicDto() + { + Id = t.Id, + NodeName = t.NodeName, + EnName = t.NodeEnName, + }).ToPagedListAsync(queryParam.PageIndex, queryParam.PageSize); + + return result; + } + + public Task DeleteById(long inputId) + { + return Context.Deleteable().Where(val=>val.Id==inputId).ExecuteCommandAsync(); + } +} \ No newline at end of file