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
}
}