using ATS.NonCustodial.Application.Base; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Unitcode; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Unitcode.Input; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Unitcode.Output; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.MaterialManager.Template.Input; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.MaterialManager.Template.Output; using ATS.NonCustodial.Domain.Entities.Admins; using ATS.NonCustodial.Domain.Entities.Business.MaterialManager; using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos; using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore; using ATS.NonCustodial.DynamicApi; using ATS.NonCustodial.DynamicApi.Attributes; using ATS.NonCustodial.Shared.Common.Attributes; using ATS.NonCustodial.Shared.Common.Enums; using ATS.NonCustodial.Shared.Common.UnifiedResults; using ATS.NonCustodial.Shared.Extensions; using ATS.NonCustodial.Shared.Extensions.AdvancedQuery; using AutoMapper.QueryableExtensions; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq; using Yitter.IdGenerator; namespace ATS.NonCustodial.Application.Impl.Admins { /// /// 单位服务 /// /// Author:mxg /// CreatedTimed:2022-05-15 10:08 PM [DynamicApi(Area = "admin")] public class UnitcodeService : AdminAppServiceBase, IUnitcodeService, IDynamicApi { #region Identity private readonly IEfRepository _appUnitcodeRepository; private readonly IEfRepository _appDeptcodeRepository; private readonly IEfRepository _userRepository; public UnitcodeService(IEfRepository appUnitcodeRepository, IEfRepository appDeptcodeRepository, IEfRepository userRepository) { _appUnitcodeRepository = appUnitcodeRepository; _appDeptcodeRepository = appDeptcodeRepository; _userRepository = userRepository; } #endregion Identity /// /// 查询接口 /// /// /// public async Task GetAsync(long id) { var rtn = await base.GetAsync(_appUnitcodeRepository, id); return ResultOutput.Ok(rtn); } /// /// 查询单位----列表---stat: 0-监管机构 1-单位管理 /// /// /// [HttpGet] public async Task GetlistAsync(long stat,long mechanismId) { var express =await _appUnitcodeRepository.AsQueryable(false, true).WhereIf(mechanismId>0,a=>a.mechanismId== mechanismId).Where(q=>q.Stat==stat).ToListAsync(); var rtnlist = new List();//返回结果 //foreach (var item in express.Where(q => q.ParentUnitCode == 0||q.ParentUnitCode == null)) //{ // rtnlist.Add(new // { // Id = item.Id, // ParentUnitCode = item.ParentUnitCode, // UnitCode = item.UnitCode, // NameEntity = item.NameEntity, // children = pidlist(express.Where(q => q.ParentUnitCode != 0 || q.ParentUnitCode != null).ToList(), item.Id) // }); //} return ResultOutput.Ok(express); } /// /// 查询单位列表---树 /// /// /// [HttpPost] public async Task GetPageAsync(UnitcodeGetPageDto input) { var rtnlist = new List();//五条件返回结果 var express = GetExpression(input, _appUnitcodeRepository.AsQueryable(false, true).WhereIf(input.mechanismId.IsNotEmptyOrNull(), a=>a.mechanismId==input.mechanismId).Where(q => q.Stat == 1)); if(express.Count()==0) return ResultOutput.Ok(rtnlist); if (!string.IsNullOrEmpty(input.name)) return ResultOutput.Ok(express);//有条件返回结果 foreach (var item in await express.Where(q => q.ParentUnitCode == null|| q.ParentUnitCode == 0).ToArrayAsync()) { rtnlist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, UnitCode = item.UnitCode, NameEntity = item.NameEntity, dw = false, children = pidlist(express.Where(q => q.ParentUnitCode != 0||q.ParentUnitCode != null).ToList(),item.Id) }); } return ResultOutput.Ok(rtnlist); } /// /// 角色管理查询监管机构-单位列表---树 /// /// /// [HttpPost] public async Task GettreedwAsync(UnitcodeGetPageDto input) { var rtnlist = new List();//五条件返回结果 //监管机构 var express = GetExpression(input, _appUnitcodeRepository.AsQueryable(false, true).WhereIf(input.mechanismId.IsNotEmptyOrNull(), a => a.mechanismId == input.mechanismId).Where(q => q.Stat == 0)); if (express.Count() == 0) return ResultOutput.Ok(rtnlist); if (!string.IsNullOrEmpty(input.name)) return ResultOutput.Ok(express);//有条件返回结果 //单位集合 var dwgllist = _appUnitcodeRepository.AsQueryable(false, true).Where(q => q.Stat == 1).ToList(); foreach (var item in await express.Where(q => q.ParentUnitCode == null || q.ParentUnitCode == 0).ToArrayAsync()) { rtnlist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, UnitCode = item.UnitCode, NameEntity = item.NameEntity, dw = true, children = pidlist(express.Where(q => q.ParentUnitCode != null || q.ParentUnitCode != 0).ToList(), item.Id, dwgllist) }); } return ResultOutput.Ok(rtnlist); } /// /// 角色管理查询监管机构-单位-部门列表---树 /// /// /// [HttpPost] public async Task GettreeAsync(UnitcodeGetPageDto input) { var rtnlist = new List();//五条件返回结果 //监管机构 var express = GetExpression(input, _appUnitcodeRepository.AsQueryable(false, true).WhereIf(input.mechanismId.IsNotEmptyOrNull(), a => a.mechanismId == input.mechanismId).Where(q => q.Stat == 0)); if (express.Count() == 0) return ResultOutput.Ok(rtnlist); if (!string.IsNullOrEmpty(input.name)) return ResultOutput.Ok(express);//有条件返回结果 //单位集合 var dwgllist = _appUnitcodeRepository.AsQueryable(false, true).Where(q => q.Stat == 1).ToList(); //部门集合 var Deptlist = _appDeptcodeRepository.AsQueryable(false, true).ToList(); foreach (var item in await express.Where(q => q.ParentUnitCode == null || q.ParentUnitCode == 0).ToArrayAsync()) { rtnlist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, UnitCode = item.UnitCode, NameEntity = item.NameEntity, dw = true, children = pidlist(express.Where(q => q.ParentUnitCode != null || q.ParentUnitCode != 0).ToList(), item.Id, dwgllist, Deptlist) }); } return ResultOutput.Ok(rtnlist); } /// /// 查询监管机构列表 /// /// /// [HttpPost] public async Task GetjgPageAsync(UnitcodeGetPageDto input) { var rtnlist = new List();//五条件返回结果 var express = GetExpression(input, _appUnitcodeRepository.AsQueryable(false, true).Where(q=>q.Stat==0)); if (express.Count() == 0) return ResultOutput.Ok(rtnlist); if (!string.IsNullOrEmpty(input.name)) return ResultOutput.Ok(express);//有条件返回结果 foreach (var item in await express.Where(q => q.ParentUnitCode == null || q.ParentUnitCode == 0).ToArrayAsync()) { rtnlist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, UnitCode = item.UnitCode, NameEntity = item.NameEntity, dw = true, children = pidlist(express.Where(q => q.ParentUnitCode != 0 || q.ParentUnitCode != null).ToList(), item.Id) }); } return ResultOutput.Ok(rtnlist); } /// /// 循环获取子级 /// /// /// /// public static List pidlist(List list,long pid, List dwgllist=null,List Deptlist = null) { var plist = new List(); var dwgllist1 = new List(); //通过监管机构查询查询单位 if (dwgllist!=null) dwgllist1 = dwgllist.Where(q => q.mechanismId == pid).ToList(); //通过单位查询部门 var Deptcode = new List(); if (Deptlist != null) Deptcode = Deptlist.Where(q => q.UnitId == pid).ToList(); //监管机构查询下级 foreach (var item in list.Where(q=>q.ParentUnitCode==pid).ToList()) { plist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, NameEntity = item.NameEntity, UnitCode = item.UnitCode, dw = item.Stat == 0 ? true : false, children = pidlist(list, item.Id, dwgllist, Deptlist) }); } //单位查找下级 if (dwgllist1 != null) { foreach (var item in dwgllist1.Where(q => q.ParentUnitCode == 0 || q.ParentUnitCode == null).ToList()) { plist.Add(new { Id = item.Id, ParentUnitCode = item.ParentUnitCode, NameEntity = item.NameEntity, UnitCode = item.UnitCode, dw =false, children = pidlist(dwgllist.Where(q => q.ParentUnitCode != 0 || q.ParentUnitCode != null).ToList(), item.Id,null, Deptlist) }); } } //部门查找下级 if (Deptlist != null) { var datalist= Deptcode.Where(q => q.pid == 0 || q.pid == null).ToList(); foreach (var item in datalist) { plist.Add(new { Id = item.Id, ParentUnitCode = item.pid, NameEntity = item.DeptName, UnitCode = item.DeptCode, dep = true, children = deptpidlist(Deptlist.Where(q => q.pid != 0 || q.pid != null).ToList(), item.Id) }); } } return plist; } /// /// 部门循环获取子级 /// /// /// /// public static List deptpidlist(List list, long pid) { var plist = new List(); //部门查询下级 foreach (var item in list.Where(q => q.pid == pid).ToList()) { plist.Add(new { Id = item.Id, ParentUnitCode = item.pid, NameEntity = item.DeptName, UnitCode = item.DeptCode, dep = true, children = deptpidlist(list, item.Id) }); } return plist; } /// /// 添加 /// /// /// public async Task AddAsync(UnitcodeAddInput input) { if (_appUnitcodeRepository.AsQueryable(false, true).Where(q => q.UnitCode == input.UnitCode).Any()) { if (input.Stat == 0) return ResultOutput.NotOk("机构编码已存在"); else return ResultOutput.NotOk("单位编码已存在"); } var entity = Mapper.Map(input); entity.Id = YitIdHelper.NextId(); var App_Unitcode = await _appUnitcodeRepository.InsertAsync(entity); return ResultOutput.Result(App_Unitcode.Id > 0); } /// /// 修改 /// /// /// public async Task UpdateAsync(UnitcodeUpdateInput input) { if (!(input?.Id > 0)) return ResultOutput.NotOk(); var unitlist = _appUnitcodeRepository.AsQueryable(false, true).Where(q => q.Id == input.Id).ToList(); foreach (var item in unitlist) { if (item.ParentUnitCode != input.ParentUnitCode) { return ResultOutput.NotOk("单位父级无法修改"); } } var entity = await _appUnitcodeRepository.FindAsync((long)input.Id); if (!(entity?.Id > 0)) return ResultOutput.NotOk("编辑失败"); Mapper.Map(input, entity); await _appUnitcodeRepository.UpdateAsync(entity); return ResultOutput.Ok(); } /// /// 批量彻底删除 /// /// /// public async Task DeleteAsync(BatchIdsInput input) { Uow.BeginTransaction(); { for (int i = 0; i < input.Ids.Count; i++) { var idlist= GetUnitIdList(input.Ids[i]); //校验该单位下是否存在用户账户 if (_userRepository.AsQueryable(false, true).Where(q => idlist.Contains(q.UnitId??-1)).Any()) { return ResultOutput.NotOk("该单位下存在用户账户,无法删除"); } //删除 await _appUnitcodeRepository.DeleteAsync(w => idlist.Contains(w.Id)); } //删除 // await _appUnitcodeRepository.DeleteAsync(w => input.Ids.Contains(w.Id)); //删除 // await _appUnitcodeRepository.DeleteAsync(w => input.Ids.Contains((long)w.ParentUnitCode)); } await Uow.CommitAsync(); return ResultOutput.Ok(); } /// /// 递归查找该单位下的所有单位 /// /// 单位id /// 单位id集合 private List GetUnitIdList(long unitId) { List idList=new List(); idList.Add(unitId); var unitlist=_appUnitcodeRepository.AsQueryable(false, true).Where(q => q.ParentUnitCode == unitId).ToList() ; foreach (var item in unitlist) { idList.Add(item.Id); var idlist = GetUnitIdList(item.Id); idList.AddRange(idlist); } return idList; } #region Private /// /// 查询条件 /// /// /// /// private IQueryable GetExpression(UnitcodeGetPageDto pageInput, IQueryable query) { var key = pageInput?.name; query = query .WhereIf(key.NotNull(), a => a.NameEntity.Contains(key) || a.UnitIsReferToAs.Contains(key)); return query; } #endregion Private } }