Browse Source

增加行政区域管理

zuohuaijun 4 years ago
parent
commit
c742485f27

+ 126 - 126
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -511,51 +511,6 @@
             备注
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.SysDataResource">
-             <summary>
-              数据资源表
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Pid">
-             <summary>
-             父节点Id 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Name">
-             <summary>
-             名称 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Value">
-             <summary>
-             值 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Code">
-             <summary>
-             节点编码 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Order">
-             <summary>
-             排序 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Remark">
-             <summary>
-             备注 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Status">
-             <summary>
-             状态:是否启用 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysDataResource.Children">
-            <summary>
-            数据资源子项
-            </summary>
-        </member>
         <member name="T:Admin.NET.Core.SysDictData">
             <summary>
             系统字典值表
@@ -621,6 +576,51 @@
             状态
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.SysDistrict">
+             <summary>
+             系统行政区域表
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Pid">
+             <summary>
+             父节点Id 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Name">
+             <summary>
+             名称 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Value">
+             <summary>
+             值 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Code">
+             <summary>
+             节点编码 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Order">
+             <summary>
+             排序 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Remark">
+             <summary>
+             备注 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Status">
+             <summary>
+             状态
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysDistrict.Children">
+            <summary>
+            数据资源子项
+            </summary>
+        </member>
         <member name="T:Admin.NET.Core.SysFile">
             <summary>
             系统文件表
@@ -2119,7 +2119,7 @@
         </member>
         <member name="F:Admin.NET.Core.ErrorCodeEnum.D1602">
             <summary>
-            已有相同数据资源,编码或名称相同
+            已有相同行政区域,编码或名称相同
             </summary>
         </member>
         <member name="F:Admin.NET.Core.ErrorCodeEnum.xg1000">
@@ -2790,7 +2790,7 @@
         </member>
         <member name="T:Admin.NET.Core.SeedData.SysDataResourceSeedData">
             <summary>
-            系统数据资源种子数据
+            系统行政区域种子数据
             </summary>
         </member>
         <member name="M:Admin.NET.Core.SeedData.SysDataResourceSeedData.HasData">
@@ -3959,85 +3959,6 @@
              </summary>
              <example>Magic.Application</example>
         </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Pid">
-            <summary>
-            父Id
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Name">
-            <summary>
-            名称
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Value">
-             <summary>
-             值 
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Code">
-            <summary>
-            编码
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Order">
-            <summary>
-            排序
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Remark">
-            <summary>
-            备注
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.DataResourceInput.Status">
-            <summary>
-            状态
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.Service.DataResources.Dto.AddDataResourceInput.Name">
-            <summary>
-            名称
-            </summary>
-        </member>
-        <member name="T:Admin.NET.Core.Service.DataResource.SysDataResourceService">
-            <summary>
-            系统数据资源服务
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.Service.DataResource.SysDataResourceService.GetDataResourceList(Admin.NET.Core.Service.DataResources.Dto.DataResourceInput)">
-            <summary>
-            获取数据资源列表
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.DataResource.SysDataResourceService.AddDataResource(Admin.NET.Core.Service.DataResources.Dto.AddDataResourceInput)">
-            <summary>
-            增加数据资源
-            </summary>
-            <param name="input"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.DataResource.SysDataResourceService.UpdateDataResource(Admin.NET.Core.Service.DataResources.Dto.UpdateDataResourceInput)">
-            <summary>
-            更新数据资源
-            </summary>
-            <param name="input"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.DataResource.SysDataResourceService.DeleteDataResource(Admin.NET.Core.Service.DataResources.Dto.DeleteDataResourceInput)">
-            <summary>
-            删除数据资源
-            </summary>
-            <param name="input"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.DataResource.SysDataResourceService.GetChildIdListWithSelfById(System.Int64)">
-            <summary>
-            根据节点Id获取子节点Id集合(包含自己)
-            </summary>
-            <param name="pid"></param>
-            <returns></returns>
-        </member>
         <member name="P:Admin.NET.Core.Service.GetDataDictDataInput.DictTypeId">
             <summary>
             字典类型Id
@@ -4329,6 +4250,85 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Pid">
+            <summary>
+            父Id
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Name">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Value">
+             <summary>
+             值 
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Order">
+            <summary>
+            排序
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Remark">
+            <summary>
+            备注
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.DistrictInput.Status">
+            <summary>
+            状态
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.Service.AddDistrictInput.Name">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="T:Admin.NET.Core.Service.SysDistrictService">
+            <summary>
+            系统行政区域服务
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysDistrictService.GetDistrictList(Admin.NET.Core.Service.DistrictInput)">
+            <summary>
+            获取行政区域列表
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysDistrictService.AddDistrict(Admin.NET.Core.Service.AddDistrictInput)">
+            <summary>
+            增加行政区域
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysDistrictService.UpdateDistrict(Admin.NET.Core.Service.UpdateDistrictInput)">
+            <summary>
+            更新行政区域
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysDistrictService.DeleteDistrict(Admin.NET.Core.Service.DeleteDistrictInput)">
+            <summary>
+            删除行政区域
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.NET.Core.Service.SysDistrictService.GetChildIdListWithSelfById(System.Int64)">
+            <summary>
+            根据节点Id获取子节点Id集合(包含自己)
+            </summary>
+            <param name="pid"></param>
+            <returns></returns>
+        </member>
         <member name="P:Admin.NET.Core.Service.PageFileInput.FileName">
             <summary>
             原始名称

+ 66 - 0
Admin.NET/Admin.NET.Core/Entity/SysDistrict.cs

@@ -0,0 +1,66 @@
+using SqlSugar;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+
+namespace Admin.NET.Core
+{
+    /// <summary>
+    /// 系统行政区域表
+    ///</summary>
+    [SugarTable("sys_district", "系统行政区域表")]
+    [SqlSugarEntity]
+    public class SysDistrict : EntityBase
+    {
+        /// <summary>
+        /// 父节点Id 
+        ///</summary>
+        [SugarColumn(ColumnName = "pid", ColumnDescription = "父Id")]
+        public long Pid { get; set; }
+
+        /// <summary>
+        /// 名称 
+        ///</summary>
+        [SugarColumn(ColumnName = "name", ColumnDescription = "名称", Length = 200)]
+        [MaxLength(200)]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 值 
+        ///</summary>
+        [SugarColumn(ColumnName = "value", ColumnDescription = "值", Length = 200)]
+        [MaxLength(200)]
+        public string Value { get; set; }
+
+        /// <summary>
+        /// 节点编码 
+        ///</summary>
+        [SugarColumn(ColumnName = "code", ColumnDescription = "节点编码", Length = 100)]
+        [MaxLength(100)]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 排序 
+        ///</summary>
+        [SugarColumn(ColumnName = "order", ColumnDescription = "排序")]
+        public int Order { get; set; }
+
+        /// <summary>
+        /// 备注 
+        ///</summary>
+        [SugarColumn(ColumnName = "remark", ColumnDescription = "备注", Length = 200)]
+        [MaxLength(200)]
+        public string Remark { get; set; }
+
+        /// <summary>
+        /// 状态
+        ///</summary>
+        [SugarColumn(ColumnName = "status", ColumnDescription = "状态")]
+        public StatusEnum Status { get; set; } = StatusEnum.Enable;
+
+        /// <summary>
+        /// 数据资源子项
+        /// </summary>
+        [SugarColumn(IsIgnore = true)]
+        public List<SysDistrict> Children { get; set; }
+    }
+}

+ 2 - 2
Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs

@@ -441,9 +441,9 @@ namespace Admin.NET.Core
         D1601,
 
         /// <summary>
-        /// 已有相同数据资源,编码或名称相同
+        /// 已有相同行政区域,编码或名称相同
         /// </summary>
-        [ErrorCodeItemMetadata("已有相同数据资源,编码或名称相同")]
+        [ErrorCodeItemMetadata("已有相同编码或名称行政区域")]
         D1602,
 
         /// <summary>

+ 6 - 11
Admin.NET/Admin.NET.Core/SeedData/SysDataResourceSeedData.cs

@@ -1,30 +1,25 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace Admin.NET.Core.SeedData
 {
     /// <summary>
-    /// 系统数据资源种子数据
+    /// 系统行政区域种子数据
     /// </summary>
-    public class SysDataResourceSeedData : ISqlSugarEntitySeedData<SysDataResource>
+    public class SysDataResourceSeedData : ISqlSugarEntitySeedData<SysDistrict>
     {
         /// <summary>
         /// 种子数据
         /// </summary>
         /// <returns></returns>
-        public IEnumerable<SysDataResource> HasData()
+        public IEnumerable<SysDistrict> HasData()
         {
             return new[]
             {
-                new SysDataResource{ Id=243848612100001, Pid=0, Name="行政区",Value="district", Code="1001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行政区"},
-                new SysDataResource{ Id=243848612100002, Pid=243848612100001, Name="北京市",Value="110000", Code="1001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="北京市"},
-                new SysDataResource{ Id=243848612100003, Pid=243848612100002, Name="东城区",Value="110101", Code="1001001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="东城区"},
-
+                new SysDistrict{ Id=243848612100001, Pid=0, Name="行政区",Value="district", Code="1001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="行政区"},
+                new SysDistrict{ Id=243848612100002, Pid=243848612100001, Name="北京市",Value="110000", Code="1001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="北京市"},
+                new SysDistrict{ Id=243848612100003, Pid=243848612100002, Name="东城区",Value="110101", Code="1001001001", CreateTime=DateTime.Parse("2022-05-30 00:00:00"), Remark="东城区"},
             };
         }
-
     }
 }

+ 5 - 5
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -99,11 +99,11 @@ namespace Admin.NET.Core
                 new SysMenu{ Id=252885263003881, Pid=252885263003880, Title="缓存查询", Permission="cache:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
                 new SysMenu{ Id=252885263003882, Pid=252885263003880, Title="缓存删除", Permission="cache:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
 
-                new SysMenu{ Id=252885263003890, Pid=252885263003780, Title="数据资源管理", Path="dataResource", Name="DataResourceManagement", Component="/sys/admin/dataResource/index", Icon="ant-design:funnel-plot-filled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003891, Pid=252885263003890, Title="数据资源查询", Permission="sysDataResource:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003892, Pid=252885263003890, Title="数据资源编辑", Permission="sysDataResource:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003893, Pid=252885263003890, Title="数据资源增加", Permission="sysDataResource:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
-                new SysMenu{ Id=252885263003894, Pid=252885263003890, Title="数据资源删除", Permission="sysDataResource:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003890, Pid=252885263003780, Title="行政区域", Path="district", Name="DistrictManagement", Component="/sys/admin/district/index", Icon="ant-design:pushpin-outlined", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003891, Pid=252885263003890, Title="区域查询", Permission="sysDistrict:page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003892, Pid=252885263003890, Title="区域编辑", Permission="sysDistrict:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003893, Pid=252885263003890, Title="区域增加", Permission="sysDistrict:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
+                new SysMenu{ Id=252885263003894, Pid=252885263003890, Title="区域删除", Permission="sysDistrict:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-05-30 00:00:00"), OrderNo=100 },
 
                 new SysMenu{ Id=252885263003900, Pid=0, Title="日志管理", Path="/log", Name="log", Component="LAYOUT", Redirect="", Icon="ant-design:carry-out-outlined", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=300 },
                 new SysMenu{ Id=252885263003910, Pid=252885263003900, Title="访问日志", Path="vislog", Name="VislogManagement", Component="/sys/admin/log/vislog/index", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

+ 59 - 0
Admin.NET/Admin.NET.Core/Service/District/Dto/DistrictInput.cs

@@ -0,0 +1,59 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Admin.NET.Core.Service
+{
+    public class DistrictInput : BaseIdInput
+    {
+        /// <summary>
+        /// 父Id
+        /// </summary>
+        public virtual long Pid { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public virtual string Name { get; set; }
+
+        /// <summary>
+        /// 值 
+        ///</summary>
+        public virtual string Value { get; set; }
+
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public virtual string Code { get; set; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public virtual int Order { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public virtual string Remark { get; set; }
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public virtual int Status { get; set; }
+    }
+
+    public class AddDistrictInput : DistrictInput
+    {
+        /// <summary>
+        /// 名称
+        /// </summary>
+        [Required(ErrorMessage = "资源名称不能为空")]
+        public override string Name { get; set; }
+    }
+
+    public class UpdateDistrictInput : AddDistrictInput
+    {
+    }
+
+    public class DeleteDistrictInput : BaseIdInput
+    {
+    }
+}

+ 125 - 0
Admin.NET/Admin.NET.Core/Service/District/SysDistrictService.cs

@@ -0,0 +1,125 @@
+using Furion.DependencyInjection;
+using Furion.DynamicApiController;
+using Furion.FriendlyException;
+using Mapster;
+using Microsoft.AspNetCore.Mvc;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Admin.NET.Core.Service
+{
+    /// <summary>
+    /// 系统行政区域服务
+    /// </summary>
+    [ApiDescriptionSettings(Name = "行政区域", Order = 201)]
+    public class SysDistrictService : IDynamicApiController, ITransient
+    {
+        private readonly SqlSugarRepository<SysDistrict> _districtRep;
+
+        public SysDistrictService(SqlSugarRepository<SysDistrict> districtRep,
+            ISysCacheService sysCacheService)
+        {
+            _districtRep = districtRep;
+        }
+
+        /// <summary>
+        /// 获取行政区域列表
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("/sysDistrict/list")]
+        public async Task<List<SysDistrict>> GetDistrictList([FromQuery] DistrictInput input)
+        {
+            var idList = input.Id > 0 ? await GetChildIdListWithSelfById(input.Id) : new List<long>();
+
+            var iSugarQueryable = _districtRep.AsQueryable().OrderBy(u => u.Order)
+                .WhereIF(idList.Count > 0, u => idList.Contains(u.Id)); // 非超级管理员限制
+
+            if (!string.IsNullOrWhiteSpace(input.Name) || !string.IsNullOrWhiteSpace(input.Code) || !string.IsNullOrWhiteSpace(input.Value) || input.Id > 0)
+            {
+                return await iSugarQueryable
+                    .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
+                    .WhereIF(!string.IsNullOrWhiteSpace(input.Value), u => u.Value.Contains(input.Value))
+                    .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
+                    .ToListAsync();
+            }
+            return await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, input.Id > 0 ? input.Id : 0);
+        }
+
+        /// <summary>
+        /// 增加行政区域
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost("/sysDistrict/add")]
+        public async Task<long> AddDistrict(AddDistrictInput input)
+        {
+            var isExist = await _districtRep.IsAnyAsync(u => u.Code == input.Code && u.Name == input.Name);
+            if (isExist)
+                throw Oops.Oh(ErrorCodeEnum.D1602);
+
+            var sysDistrict = input.Adapt<SysDistrict>();
+            var newDistrict = await _districtRep.AsInsertable(sysDistrict).ExecuteReturnEntityAsync();
+            return newDistrict.Id;
+        }
+
+        /// <summary>
+        /// 更新行政区域
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost("/sysDistrict/update")]
+        [SqlSugarUnitOfWork]
+        public async Task UpdateDistrict(UpdateDistrictInput input)
+        {
+            if (input.Pid != 0)
+            {
+                var pDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Pid);
+                _ = pDistrict ?? throw Oops.Oh(ErrorCodeEnum.D1600);
+            }
+            if (input.Id == input.Pid)
+                throw Oops.Oh(ErrorCodeEnum.D1601);
+
+            var sysDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Id);
+            var isExist = await _districtRep.IsAnyAsync(u => (u.Name == input.Name && u.Code == input.Code) && u.Id != sysDistrict.Id);
+            if (isExist)
+                throw Oops.Oh(ErrorCodeEnum.D1602);
+
+            // 父Id不能为自己的子节点
+            var childIdList = await GetChildIdListWithSelfById(input.Id);
+            if (childIdList.Contains(input.Pid))
+                throw Oops.Oh(ErrorCodeEnum.D1601);
+
+            var district = input.Adapt<SysDistrict>();
+            await _districtRep.AsUpdateable(district).IgnoreColumns(true).ExecuteCommandAsync();
+        }
+
+        /// <summary>
+        /// 删除行政区域
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost("/sysDistrict/delete")]
+        public async Task DeleteDistrict(DeleteDistrictInput input)
+        {
+            // 获取本节点对应所有子节点id列表
+            var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id);
+            var idList = treeList.Select(u => u.Id).ToList();
+
+            // 级联删除行政区域子节点
+            await _districtRep.DeleteAsync(u => idList.Contains(u.Id));
+        }
+
+        /// <summary>
+        /// 根据节点Id获取子节点Id集合(包含自己)
+        /// </summary>
+        /// <param name="pid"></param>
+        /// <returns></returns>
+        [NonAction]
+        public async Task<List<long>> GetChildIdListWithSelfById(long pid)
+        {
+            var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, pid);
+            return treeList.Select(u => u.Id).ToList();
+        }
+    }
+}

+ 16 - 17
Vben2/src/api/sys/admin.ts

@@ -125,11 +125,11 @@ enum Api {
   TenantOwnMenuList = '/sysTenant/ownMenu',
   ResetTenantPwd = '/sysTenant/resetPwd',
 
-  // 数据资源接口
-  DataResourceList = '/sysDataResource/list',
-  AddDataResource = '/sysDataResource/add',
-  DeleteDataResource = '/sysDataResource/delete',
-  UpdateDataResource = '/sysDataResource/update',
+  // 行政区域接口
+  DistrictList = '/sysDistrict/list',
+  AddDistrict = '/sysDistrict/add',
+  DeleteDistrict = '/sysDistrict/delete',
+  UpdateDistrict = '/sysDistrict/update',
 }
 
 ////////// 账号管理接口 //////////
@@ -434,15 +434,14 @@ export function resetTenantPwd(id: number) {
   return defHttp.post<any>({ url: Api.ResetTenantPwd, params: { id } });
 }
 
-////////// 数据资源管理接口 //////////
-// 获取数据资源列表
-export const getDataResourceList = (params?: any) =>
-  defHttp.get<any>({ url: Api.DataResourceList, params });
-// 增加数据资源
-export const addDataResource = (params: any) => defHttp.post({ url: Api.AddDataResource, params });
-// 删除数据资源
-export const deleteDataResource = (id: number) =>
-  defHttp.post({ url: Api.DeleteDataResource, params: { id } });
-// 更新数据资源
-export const updateDataResource = (params: any) =>
-  defHttp.post({ url: Api.UpdateDataResource, params });
+////////// 行政区域管理接口 //////////
+// 获取行政区域列表
+export const getDistrictList = (params?: any) =>
+  defHttp.get<any>({ url: Api.DistrictList, params });
+// 增加行政区域
+export const addDistrict = (params: any) => defHttp.post({ url: Api.AddDistrict, params });
+// 删除行政区域
+export const deleteDistrict = (id: number) =>
+  defHttp.post({ url: Api.DeleteDistrict, params: { id } });
+// 更新行政区域
+export const updateDistrict = (params: any) => defHttp.post({ url: Api.UpdateDistrict, params });

+ 8 - 26
Vben2/src/views/sys/admin/dataResource/DataResourceModal.vue → Vben2/src/views/sys/admin/district/DistrictModal.vue

@@ -1,11 +1,3 @@
-<!--
- * @Author: kenny 362270511@qq.com
- * @Date: 2022-05-30 11:36:19
- * @LastEditors: kenny 362270511@qq.com
- * @LastEditTime: 2022-05-30 16:00:49
- * @FilePath: \frontend\src\views\sys\admin\dataResource\org\DataResourceModal.vue
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--->
 <template>
   <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit">
     <BasicForm @register="registerForm" />
@@ -16,11 +8,11 @@
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, useForm } from '/@/components/Form/index';
 
-  import { formSchema } from './dataResource.data';
-  import { getDataResourceList, addDataResource, updateDataResource } from '/@/api/sys/admin';
+  import { formSchema } from './district.data';
+  import { getDistrictList, addDistrict, updateDistrict } from '/@/api/sys/admin';
 
   export default defineComponent({
-    name: 'DataResourceModal',
+    name: 'DistrictModal',
     components: { BasicModal, BasicForm },
     emits: ['success', 'register'],
     setup(_, { emit }) {
@@ -38,17 +30,7 @@
         setModalProps({ confirmLoading: false });
         isUpdate.value = !!data?.isUpdate;
 
-        const treeData = await getDataResourceList({ id: data.parentId || 0 });
-        debugger;
-        if (!data.parentId) {
-          treeData.push({
-            id: 0,
-            name: '根节点',
-            pid: 0,
-            remark: '根节点',
-            children: [],
-          });
-        }
+        const treeData = await getDistrictList({ id: data.record?.pid || 0 });
         updateSchema({
           field: 'pid',
           componentProps: { treeData },
@@ -60,11 +42,11 @@
             ...data.record,
           });
         } else {
-          setFieldsValue({ pid: data.parentId });
+          setFieldsValue({ pid: data.searchInfo.pId }); // 以当前选择父节点新增
         }
       });
 
-      const getTitle = computed(() => (!unref(isUpdate) ? '新增数据资源' : '编辑数据资源'));
+      const getTitle = computed(() => (!unref(isUpdate) ? '新增区域' : '编辑区域'));
 
       async function handleSubmit() {
         try {
@@ -73,9 +55,9 @@
 
           if (unref(isUpdate)) {
             values.id = rowId;
-            await updateDataResource(values);
+            await addDistrict(values);
           } else {
-            rowId = await addDataResource(values);
+            rowId = await updateDistrict(values);
           }
 
           closeModal();

+ 6 - 13
Vben2/src/views/sys/admin/dataResource/DataResourceTree.vue → Vben2/src/views/sys/admin/district/DistrictTree.vue

@@ -1,15 +1,7 @@
-<!--
- * @Author: kenny 362270511@qq.com
- * @Date: 2022-05-30 14:35:51
- * @LastEditors: kenny 362270511@qq.com
- * @LastEditTime: 2022-05-30 14:41:06
- * @FilePath: \frontend\src\views\sys\admin\dataResource\DataResourceTree.vue
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--->
 <template>
   <div class="m-4 mr-0 overflow-hidden bg-white">
     <BasicTree
-      title="数据资源列表"
+      title="区域列表"
       toolbar
       search
       :clickRowToExpand="true"
@@ -24,10 +16,10 @@
   import { defineComponent, onMounted, ref, unref, nextTick } from 'vue';
   import { BasicTree, TreeActionType, TreeItem } from '/@/components/Tree/index';
 
-  import { getDataResourceList } from '/@/api/sys/admin';
+  import { getDistrictList } from '/@/api/sys/admin';
 
   export default defineComponent({
-    name: 'DataResourceTree',
+    name: 'OrgTree',
     components: { BasicTree },
 
     emits: ['select'],
@@ -55,14 +47,15 @@
       };
 
       async function fetch() {
-        treeData.value = (await getDataResourceList()) as unknown as TreeItem[];
+        treeData.value = (await getDistrictList()) as unknown as TreeItem[];
         nextTick(() => {
           unref(treeAction)?.filterByLevel(2);
         });
       }
 
       function handleSelect(keys, obj) {
-        emit('select', keys[0], obj.selectedNodes[0]);
+        if (obj == undefined) return;
+        else emit('select', keys[0], obj.selectedNodes[0]);
       }
 
       onMounted(() => {

+ 11 - 15
Vben2/src/views/sys/admin/dataResource/dataResource.data.ts → Vben2/src/views/sys/admin/district/district.data.ts

@@ -5,22 +5,18 @@ import { Tag } from 'ant-design-vue';
 
 export const columns: BasicColumn[] = [
   {
-    title: '资源名称',
+    title: '名称',
     dataIndex: 'name',
     width: 200,
     align: 'left',
   },
   {
-    title: '资源值',
+    title: '值',
     dataIndex: 'value',
-    width: 200,
-    align: 'left',
   },
   {
     title: '编码',
     dataIndex: 'code',
-    width: 200,
-    align: 'left',
   },
   {
     title: '状态',
@@ -53,28 +49,28 @@ export const columns: BasicColumn[] = [
 export const searchFormSchema: FormSchema[] = [
   {
     field: 'name',
-    label: '资源名称',
+    label: '名称',
     component: 'Input',
-    colProps: { span: 8 },
+    colProps: { span: 6 },
   },
   {
     field: 'value',
-    label: '资源值',
+    label: '值',
     component: 'Input',
-    colProps: { span: 8 },
+    colProps: { span: 6 },
   },
   {
     field: 'code',
-    label: '资源编码',
+    label: '编码',
     component: 'Input',
-    colProps: { span: 8 },
+    colProps: { span: 6 },
   },
 ];
 
 export const formSchema: FormSchema[] = [
   {
     field: 'pid',
-    label: '上级资源',
+    label: '上级',
     component: 'TreeSelect',
     defaultValue: 0,
     componentProps: {
@@ -90,14 +86,14 @@ export const formSchema: FormSchema[] = [
   },
   {
     field: 'name',
-    label: '资源名称',
+    label: '名称',
     component: 'Input',
     required: true,
     colProps: { span: 24 },
   },
   {
     field: 'value',
-    label: '资源值',
+    label: '值',
     component: 'Input',
     required: true,
     colProps: { span: 24 },

+ 30 - 48
Vben2/src/views/sys/admin/dataResource/index.vue → Vben2/src/views/sys/admin/district/index.vue

@@ -1,26 +1,19 @@
 <template>
   <PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
-    <DataResourceTree
+    <DistrictTree
       class="w-1/4 xl:w-1/5"
       style="overflow: auto"
       @select="handleSelect"
-      ref="DataResourceTreeChild"
+      ref="DistrictTreeChild"
     />
     <BasicTable @register="registerTable" class="w-3/4 xl:w-4/5" :searchInfo="searchInfo">
       <template #toolbar>
         <a-button
           type="primary"
-          @click="handleCreatebrother"
-          :disabled="!hasPermission('sysDataResource:add')"
+          @click="handleCreate"
+          :disabled="!hasPermission('sysDistrict:add')"
         >
-          添加同级资源
-        </a-button>
-        <a-button
-          type="primary"
-          @click="handleCreatechild()"
-          :disabled="!hasPermission('sysDataResource:add')"
-        >
-          添加下级资源
+          新增区域
         </a-button>
       </template>
       <template #action="{ record }">
@@ -29,14 +22,14 @@
             {
               icon: 'clarity:note-edit-line',
               label: '编辑',
-              disabled: !hasPermission('sysDataResource:update'),
+              disabled: !hasPermission('sysDistrict:update'),
               onClick: handleEdit.bind(null, record),
             },
             {
               icon: 'ant-design:delete-outlined',
               label: '删除',
               color: 'error',
-              ifShow: hasPermission('sysDataResource:delete'),
+              ifShow: hasPermission('sysDistrict:delete'),
               popConfirm: {
                 title: '是否确认删除',
                 confirm: handleDelete.bind(null, record),
@@ -46,7 +39,7 @@
         />
       </template>
     </BasicTable>
-    <DataResourceModal @register="registerModal" @success="handleSuccess" />
+    <DistrictModal @register="registerModal" @success="handleSuccess" />
   </PageWrapper>
 </template>
 <script lang="ts">
@@ -56,24 +49,24 @@
   import { usePermission } from '/@/hooks/web/usePermission';
 
   import { PageWrapper } from '/@/components/Page';
-  import DataResourceTree from './DataResourceTree.vue';
+  import DistrictTree from './DistrictTree.vue';
 
-  import DataResourceModal from './DataResourceModal.vue';
+  import DistrictModal from './DistrictModal.vue';
 
-  import { columns, searchFormSchema } from './dataResource.data';
-  import { getDataResourceList, deleteDataResource } from '/@/api/sys/admin';
+  import { columns, searchFormSchema } from './district.data';
+  import { getDistrictList, deleteDistrict } from '/@/api/sys/admin';
 
   export default defineComponent({
-    name: 'DataResourceManagement',
-    components: { BasicTable, DataResourceModal, TableAction, PageWrapper, DataResourceTree },
+    name: 'DistrictManagement',
+    components: { BasicTable, DistrictModal, TableAction, PageWrapper, DistrictTree },
     setup() {
       const { hasPermission } = usePermission();
-      const DataResourceTreeChild = ref(null);
+      const OrgTreeChild = ref(null);
       const [registerModal, { openModal }] = useModal();
       const searchInfo = reactive<Recordable>({});
       const [registerTable, { reload, updateTableDataRecord }] = useTable({
-        title: '数据资源列表',
-        api: getDataResourceList,
+        title: '区域列表',
+        api: getDistrictList,
         columns,
         formConfig: {
           labelWidth: 120,
@@ -88,16 +81,15 @@
         showIndexColumn: false,
         canResize: true,
         actionColumn: {
-          width: 150,
+          width: 170,
           title: '操作',
           dataIndex: 'action',
           slots: { customRender: 'action' },
-          fixed: undefined,
         },
       });
 
       function getTree() {
-        const tree = unref(DataResourceTreeChild);
+        const tree = unref(OrgTreeChild);
         if (!tree) {
           throw new Error('Tree is null!');
         }
@@ -109,7 +101,7 @@
       }
 
       function updateNodeByKey(key, values) {
-        getTree().updateNodeByKey(key, values); // 子组件里的方法
+        getTree().updateNodeByKey(key, values);
       }
 
       function deleteNodeByKey(key) {
@@ -118,24 +110,11 @@
 
       function handleCreate() {
         openModal(true, {
+          searchInfo,
           isUpdate: false,
         });
       }
 
-      function handleCreatechild() {
-        openModal(true, {
-          isUpdate: false,
-          parentId: searchInfo.Id,
-        });
-      }
-
-      function handleCreatebrother() {
-        openModal(true, {
-          isUpdate: false,
-          parentId: searchInfo.pId,
-        });
-      }
-
       function handleEdit(record: Recordable) {
         openModal(true, {
           record,
@@ -144,15 +123,20 @@
       }
 
       async function handleDelete(record: Recordable) {
-        await deleteDataResource(record.id);
+        await deleteDistrict(record.id);
         deleteNodeByKey(record.id);
         searchInfo.Id = record.pid;
         reload();
       }
 
       function handleSelect(orgId: number, obj) {
-        searchInfo.Id = orgId;
-        searchInfo.pId = obj.pid ? obj.pid : 0;
+        if (obj == undefined) {
+          searchInfo.Id = 0;
+          searchInfo.pId = 0;
+        } else {
+          searchInfo.Id = orgId;
+          searchInfo.pId = obj.pid ? obj.pid : 0;
+        }
         reload();
       }
 
@@ -171,14 +155,12 @@
         registerTable,
         registerModal,
         searchInfo,
-        DataResourceTreeChild,
+        OrgTreeChild,
         handleSelect,
         updateNodeByKey,
         appendNodeByKey,
         deleteNodeByKey,
         handleCreate,
-        handleCreatebrother,
-        handleCreatechild,
         handleEdit,
         handleDelete,
         handleSuccess,

+ 1 - 1
Vben2/src/views/sys/admin/org/OrgModal.vue

@@ -30,7 +30,7 @@
         setModalProps({ confirmLoading: false });
         isUpdate.value = !!data?.isUpdate;
 
-        const treeData = await getOrgList({ id: data.record.pid || 0 });
+        const treeData = await getOrgList({ id: data.record?.pid || 0 });
         updateSchema({
           field: 'pid',
           componentProps: { treeData },