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/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/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
index f402f3d1..b6632dea 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
@@ -83,7 +83,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
CargoType = order.CargoType,
Month = order.CreateTime.Month,
Area = DetermineAreaBasedOnOrderDetails(order),
- IsTransit = order.IsTransfer,
+ IsTransit = order.IsTransit,
DeparturePort = order.LeavePort,
ProductCode = order.ProductCode
};
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/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