Jason 1 жил өмнө
parent
commit
e29ca39e92

+ 37 - 1
src/Hotline.Api/Controllers/SysController.cs

@@ -26,6 +26,7 @@ namespace Hotline.Api.Controllers
         private readonly ISysDicTypeRepository _sysDicTypeRepository;
         private readonly ISysDicTypeRepository _sysDicTypeRepository;
         private readonly ISysDicDataRepository _sysDicDataRepository;
         private readonly ISysDicDataRepository _sysDicDataRepository;
         private readonly ISystemAreaDomainService _systemAreaDomainService;
         private readonly ISystemAreaDomainService _systemAreaDomainService;
+        private readonly ISystemAreaRepository _systemAreaRepository;
 
 
 
 
         /// <summary>
         /// <summary>
@@ -42,7 +43,8 @@ namespace Hotline.Api.Controllers
             ISystemMenuRepository systemMenuRepository,
             ISystemMenuRepository systemMenuRepository,
             ISysDicTypeRepository sysDicTypeRepository,
             ISysDicTypeRepository sysDicTypeRepository,
             ISysDicDataRepository sysDicDataRepository,
             ISysDicDataRepository sysDicDataRepository,
-            ISystemAreaDomainService systemAreaDomainService
+            ISystemAreaDomainService systemAreaDomainService,
+            ISystemAreaRepository systemAreaRepository
             )
             )
         {
         {
             _mapper = mapper;
             _mapper = mapper;
@@ -51,6 +53,7 @@ namespace Hotline.Api.Controllers
             _sysDicTypeRepository = sysDicTypeRepository;
             _sysDicTypeRepository = sysDicTypeRepository;
             _sysDicDataRepository = sysDicDataRepository;
             _sysDicDataRepository = sysDicDataRepository;
             _systemAreaDomainService = systemAreaDomainService;
             _systemAreaDomainService = systemAreaDomainService;
+            _systemAreaRepository = systemAreaRepository;
         }
         }
 
 
         #region 菜单管理
         #region 菜单管理
@@ -326,6 +329,31 @@ namespace Hotline.Api.Controllers
         public async Task AddArea([FromBody] AddAreaDto dto)
         public async Task AddArea([FromBody] AddAreaDto dto)
         {
         {
             var model = _mapper.Map<SystemArea>(dto);
             var model = _mapper.Map<SystemArea>(dto);
+            if (!string.IsNullOrEmpty(model.ParentId) || model.ParentId.Length > 6)
+            {
+                throw UserFriendlyException.SameMessage("只允许添加乡镇、街道数据,请选择区县");
+            }
+            if(model.ParentId.Substring(4,2) == "00")
+            {
+                throw UserFriendlyException.SameMessage("只允许添加乡镇、街道数据,请选择区县");
+            }
+            //验证重复
+            var area = await _systemAreaRepository.GetAsync(x => x.ParentId == dto.ParentId && x.AreaName == dto.AreaName);
+            if (area!=null)
+            {
+                if (area.IsDeleted)
+                {
+                    area.IsDeleted = false;
+                    await _systemAreaRepository.UpdateAsync(area, HttpContext.RequestAborted);
+                    throw UserFriendlyException.SameMessage("同目录下已存在被删除的相同数据,已重新启用");
+                }
+                else
+                {
+                    throw UserFriendlyException.SameMessage("同目录下已存在相同数据,不能重复添加");
+                }
+            }
+            //生成新Code
+            model.Id = await _systemAreaDomainService.GenerateNewAreaCodeAsync(dto.ParentId, HttpContext.RequestAborted);
             model.IsCanModify = true;
             model.IsCanModify = true;
             await _systemAreaDomainService.AddArea(model, HttpContext.RequestAborted);
             await _systemAreaDomainService.AddArea(model, HttpContext.RequestAborted);
         }
         }
@@ -346,6 +374,14 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("系统数据,不能修改");
                 throw UserFriendlyException.SameMessage("系统数据,不能修改");
 
 
             model = _mapper.Map<SystemArea>(dto);
             model = _mapper.Map<SystemArea>(dto);
+
+            //验证重复
+            var area = await _systemAreaRepository.GetAsync(x => x.ParentId == dto.ParentId && x.AreaName == dto.AreaName);
+            if (area != null)
+            {
+               throw UserFriendlyException.SameMessage("同目录下已存在相同数据,不能修改");
+            }
+
             await _systemAreaDomainService.ModifyArea(model, HttpContext.RequestAborted);
             await _systemAreaDomainService.ModifyArea(model, HttpContext.RequestAborted);
         }
         }
 
 

+ 3 - 0
src/Hotline/Settings/ISystemAreaDomainService.cs

@@ -12,5 +12,8 @@ namespace Hotline.Settings
         Task<SystemArea?> GetArea(string id, CancellationToken cancellationToken);
         Task<SystemArea?> GetArea(string id, CancellationToken cancellationToken);
 
 
         Task DelArea(string id,CancellationToken cancellationToken);
         Task DelArea(string id,CancellationToken cancellationToken);
+
+
+        Task<string> GenerateNewAreaCodeAsync(string parentId, CancellationToken cancellationToken);
     }
     }
 }
 }

+ 19 - 0
src/Hotline/Settings/SystemArea.cs

@@ -1,4 +1,6 @@
 using SqlSugar;
 using SqlSugar;
+using System.Runtime.CompilerServices;
+using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
 
 
 namespace Hotline.Settings
 namespace Hotline.Settings
@@ -30,5 +32,22 @@ namespace Hotline.Settings
 
 
         [SugarColumn(IsIgnore = true)]
         [SugarColumn(IsIgnore = true)]
         public List<SystemArea> Children { get; set; }
         public List<SystemArea> Children { get; set; }
+
+    }
+
+    public static class AreaExtensions
+    {
+        /// <summary>
+        /// 获取最末级区域对应编码(最后2位)
+        /// </summary>
+        /// <param name="areaCode"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        public static string GetLastAreaCode(this string areaCode)
+        {
+            if (areaCode.Length < 6)
+                throw new UserFriendlyException("非法区域编码");
+            return areaCode.Substring(areaCode.Length - 2, 2);
+        }
     }
     }
 }
 }

+ 28 - 0
src/Hotline/Settings/SystemAreaDomainService.cs

@@ -1,4 +1,5 @@
 using XF.Domain.Dependency;
 using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
 
 
 namespace Hotline.Settings
 namespace Hotline.Settings
 {
 {
@@ -35,5 +36,32 @@ namespace Hotline.Settings
         {
         {
             await _systemAreaRepository.RemoveAsync(id, true, cancellationToken);
             await _systemAreaRepository.RemoveAsync(id, true, cancellationToken);
         }
         }
+
+        /// <summary>
+        /// 生成新的区域编码
+        /// </summary>
+        /// <param name="parentId"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        public async Task<string> GenerateNewAreaCodeAsync(string parentId,CancellationToken cancellationToken)
+        {
+            var parentArea = await _systemAreaRepository.GetAsync(parentId, cancellationToken);
+            if (parentArea == null)
+                throw new UserFriendlyException("无效数据");
+
+            var maxCode = await _systemAreaRepository.Queryable()
+                .Where(d => d.ParentId == parentId)
+                .MaxAsync(d => d.Id, cancellationToken);
+
+            if (string.IsNullOrEmpty(maxCode))
+                return $"{parentArea.Id}01";
+
+            if (!int.TryParse(maxCode.GetLastAreaCode(), out var max))
+                throw new UserFriendlyException("无效区域编码");
+
+            return $"{parentArea.Id}{max + 1}";
+
+        }
     }
     }
 }
 }