using Hotline.Caching.Interfaces; using MapsterMapper; using XF.Domain.Authentications; using XF.Domain.Repository; using Hotline.Quality; using Hotline.Permissions; using Hotline.Repository.SqlSugar.Extensions; using Hotline.Settings; using Hotline.Share.Dtos; using Hotline.Share.Dtos.File; using Microsoft.AspNetCore.Mvc; using XF.Domain.Exceptions; using Hotline.Share.Dtos.Quality; using Hotline.Share.Dtos.Order; using Hotline.Share.Enums.Quality; using Hotline.Share.Enums.Order; using XF.Utility.EnumExtensions; using System.Xml.Linq; using System.Threading; namespace Hotline.Api.Controllers { public class QualityController : BaseController { private readonly ISessionContext _sessionContext; private readonly IMapper _mapper; private readonly IQualityRepository _qualitey; private readonly IRepository _qualiteyDetail; private readonly IRepository _qualiteyItem; private readonly IRepository _qualityTemplate; private readonly IRepository _qualiteyTemplateDetail; private readonly IRepository _qualiteyProhibited; private readonly ISystemDicDataCacheManager _systemDicDataCacheManager; public QualityController( ISessionContext sessionContext, IMapper mapper, IQualityRepository qualitey, IRepository qualiteyDetail, IRepository qualiteyItem, IRepository qualityTemplate, IRepository qualiteyTemplateDetail, IRepository qualiteyProhibited, ISystemDicDataCacheManager systemDicDataCacheManager ) { _sessionContext = sessionContext; _mapper = mapper; _qualitey = qualitey; _qualiteyDetail = qualiteyDetail; _qualiteyItem = qualiteyItem; _qualityTemplate = qualityTemplate; _qualiteyTemplateDetail = qualiteyTemplateDetail; _qualiteyProhibited = qualiteyProhibited; _systemDicDataCacheManager = systemDicDataCacheManager; } #region 质检管理 /// /// 删除质检 /// /// /// [HttpDelete] public async Task Delete([FromBody] DeleteQualityDto dto) { foreach (var Id in dto.Ids) { await _qualitey.RemoveAsync(x => x.Id == Id); List details = await _qualiteyDetail.Queryable().Where(x => x.QualityId == Id).ToListAsync(); await _qualiteyDetail.RemoveRangeAsync(details, HttpContext.RequestAborted); } } /// /// 更新质检 /// /// /// [Permission(EPermission.UpdateQuality)] [HttpPut] public async Task Update([FromBody] UpdateQualityDto dto) { await _qualitey.UpdateQualityAsync(dto, HttpContext.RequestAborted); } /// /// 获取质检列表 /// /// /// [HttpGet("list")] public async Task> List([FromQuery] QualityListDto dto) { var (total, items) = await _qualitey.Queryable() .Includes(x => x.Order) .Includes(x => x.Visit) .Includes(x => x.Visit,e=>e.Employee) .Includes(x => x.QualityDetails) .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!)) .WhereIF(dto.State.HasValue, d => d.State == dto.State) .WhereIF(dto.Source.HasValue, d => d.Source == dto.Source) .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取质检实体 /// /// /// [HttpGet("{id}")] public async Task Entity(string id) { return await _qualitey.Queryable() .Includes(x => x.QualityDetails) .FirstAsync(x => x.Id == id); } #endregion #region 质检项管理 /// /// 新增项目 /// /// /// [Permission(EPermission.AddQualityItem)] [HttpPost("item")] public async Task Add([FromBody] QualityItemAddDto dto) { var count = await _qualiteyItem.CountAsync(x => x.Name == dto.Name); if (count > 0) throw UserFriendlyException.SameMessage("质检项目名称已存在"); var model = _mapper.Map(dto); await _qualiteyItem.AddAsync(model, HttpContext.RequestAborted); } ///// ///// 删除项目 ///// ///// ///// //[Permission(EPermission.DeleteQualityItem)] //[HttpDelete("item")] //public async Task Delete([FromBody] QualityItemDeleteDto dto) //{ // await _qualiteyItem.RemoveAsync(x => x.Id == dto.Id); //} /// /// 删除项目 /// /// /// [Permission(EPermission.DeleteQualityItem)] [HttpDelete("itemBatch")] public async Task Delete([FromBody] QualityItemBatchDeleteDto dto) { List items = await _qualiteyItem.Queryable().In(x => x.Id, dto.Ids).ToListAsync(); foreach (var item in items) { var detail = await _qualiteyDetail.Queryable().Where(x => x.Name == item.Name && !x.IsDeleted).AnyAsync(); //质检中已存在 启用状态不可以删 if (item.IsEnable == 0 || detail) items.Remove(item); } if (items.Any()) await _qualiteyItem.RemoveRangeAsync(items,true, HttpContext.RequestAborted); } /// /// 更新项目 /// /// /// [Permission(EPermission.UpdateQualityItem)] [HttpPut("item")] public async Task Update([FromBody] QualityItemUpdateDto dto) { var item = await _qualiteyItem.GetAsync(dto.Id, HttpContext.RequestAborted); if (item is null) throw UserFriendlyException.SameMessage("无效质检项目"); if (item.IsEnable != dto.IsEnable || item.Name != dto.Name) { var detail = await _qualiteyDetail.Queryable().Where(x => x.Name == item.Name && !x.IsDeleted).AnyAsync(); if(detail) throw UserFriendlyException.SameMessage("质检项目在中心质检中已使用,不能修改状态和名称!"); } _mapper.Map(dto, item); item.LastModificationName = _sessionContext.UserName; await _qualiteyItem.UpdateAsync(item, HttpContext.RequestAborted); } /// /// 获取项目列表 /// /// /// [Permission(EPermission.QualityItemList)] [HttpGet("item/list")] public async Task> List([FromQuery] QualityItemListDto dto) { var (total, items) = await _qualiteyItem.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Name), d => d.Name.Contains(dto.Name!)) .WhereIF(!string.IsNullOrEmpty(dto.GroupingName), d => d.GroupingName.Contains(dto.GroupingName!)) .WhereIF(dto.IsEnable.HasValue,d=>d.IsEnable == dto.IsEnable) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取项目实体 /// /// /// [HttpGet("item/{id}")] public async Task ItemEntity(string id) { return await _qualiteyItem.Queryable() .FirstAsync(x => x.Id == id); } #endregion #region 质检模版管理 /// /// 新增模版 /// /// /// [Permission(EPermission.AddQualityTemplate)] [HttpPost("template")] public async Task Add([FromBody] TemplateAddDto dto) { var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.IsEnable == 0); if (groupingCount > 0) throw UserFriendlyException.SameMessage("当前已存在"); var names = dto.TemplateDetails.Select(x => x.ItemId).ToList(); var nameCount= names.GroupBy(x => x).Count(c => c.Count() > 1); if (nameCount > 0) throw UserFriendlyException.SameMessage("质检模版存在重复质检项"); var model = _mapper.Map(dto); var id = await _qualityTemplate.AddAsync(model, HttpContext.RequestAborted); if (!string.IsNullOrEmpty(id)) { foreach (var item in dto.TemplateDetails) { item.TemplateId = id; } List details = _mapper.Map>(dto.TemplateDetails); await _qualiteyTemplateDetail.AddRangeAsync(details, HttpContext.RequestAborted); } } /// /// 删除模版 /// /// /// [Permission(EPermission.DeleteQualityTemplate)] [HttpDelete("template")] public async Task Delete([FromBody] TemplateDeleteDto dto) { await _qualityTemplate.RemoveAsync(x => x.Id == dto.Id); List details = await _qualiteyTemplateDetail.Queryable().Where(x => x.TemplateId == dto.Id).ToListAsync(); await _qualiteyTemplateDetail.RemoveRangeAsync(details, HttpContext.RequestAborted); } /// /// 删除模版 /// /// /// [Permission(EPermission.DeleteQualityTemplate)] [HttpDelete("templateBatch")] public async Task Delete([FromBody] TemplateBatchDeleteDto dto) { List templates = await _qualityTemplate.Queryable().In(x=>x.Id,dto.Ids).ToListAsync(); List details = await _qualiteyTemplateDetail.Queryable().In(x => x.TemplateId,dto.Ids).ToListAsync(); await _qualityTemplate.RemoveRangeAsync(templates, HttpContext.RequestAborted); await _qualiteyTemplateDetail.RemoveRangeAsync(details, HttpContext.RequestAborted); } /// /// 更新模版 /// /// /// [Permission(EPermission.UpdateQualityTemplate)] [HttpPut("template")] public async Task Update([FromBody] TemplateUpdateDto dto) { var template = await _qualityTemplate.GetAsync(dto.Id, HttpContext.RequestAborted); if (template is null) throw UserFriendlyException.SameMessage("无效质检模版"); var groupingCount = await _qualityTemplate.CountAsync(x => x.Grouping == dto.Grouping && x.Id != dto.Id && x.IsEnable == 0); if (groupingCount > 0) throw UserFriendlyException.SameMessage("当前质检分类已存在"); _mapper.Map(dto, template); template.LastModificationName = _sessionContext.UserName; await _qualityTemplate.UpdateAsync(template, HttpContext.RequestAborted); if (dto.TemplateDetails.Any()) { List details = await _qualiteyTemplateDetail.Queryable().Where(x => x.TemplateId == dto.Id).ToListAsync(); await _qualiteyTemplateDetail.RemoveRangeAsync(details, HttpContext.RequestAborted); foreach (var item in dto.TemplateDetails) { item.TemplateId = dto.Id; } List newDetails = _mapper.Map>(dto.TemplateDetails); await _qualiteyTemplateDetail.AddRangeAsync(newDetails, HttpContext.RequestAborted); } } /// /// 获取模版列表 /// /// /// [Permission(EPermission.QualityTemplateList)] [HttpGet("template/list")] public async Task> List([FromQuery] TemplateListDto dto) { var (total, items) = await _qualityTemplate.Queryable() .Includes(x => x.templateDetails) .Includes(x=>x.templateDetails,y=>y.QualityItem) .WhereIF(!string.IsNullOrEmpty(dto.Name), d => d.Name.Contains(dto.Name!)) .WhereIF(dto.Grouping.HasValue, d => d.Grouping == dto.Grouping) .WhereIF(dto.IsEnable.HasValue, d => d.IsEnable == dto.IsEnable) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取模版实体 /// /// /// [HttpGet("template/{id}")] public async Task TemplateEntity(string id) { var template = await _qualityTemplate.Queryable() .Includes(x => x.templateDetails) .Includes(x => x.templateDetails, y => y.QualityItem) .FirstAsync(x => x.Id == id); return _mapper.Map(template); } /// /// 启禁用 /// /// /// [Permission(EPermission.EnableQualityTemplate)] [HttpPut("template/enable")] public async Task Enable([FromBody] TemplateUpdateDto dto) { var template = await _qualityTemplate.GetAsync(dto.Id, HttpContext.RequestAborted); if (template is null) throw UserFriendlyException.SameMessage("无效质检模版"); _mapper.Map(dto, template); await _qualityTemplate.UpdateAsync(template, HttpContext.RequestAborted); } #endregion #region 质检词库管理 /// /// 新增违禁词 /// /// /// [Permission(EPermission.AddQualityProhibited)] [HttpPost("prohibited")] public async Task Add([FromBody] ProhibitedAddDto dto) { var model = _mapper.Map(dto); await _qualiteyProhibited.AddAsync(model, HttpContext.RequestAborted); } /// /// 删除违禁词 /// /// /// [Permission(EPermission.DeleteQualityProhibited)] [HttpDelete("prohibited")] public async Task Delete([FromBody] ProhibitedDeleteDto dto) { await _qualiteyProhibited.RemoveAsync(x => x.Id == dto.Id); } /// /// 删除违禁词 /// /// /// [Permission(EPermission.DeleteQualityProhibited)] [HttpDelete("prohibitedBatch")] public async Task Delete([FromBody] ProhibitedBatchDeleteDto dto) { List prohibiteds = await _qualiteyProhibited.Queryable().In(x=>x.Id,dto.Ids).ToListAsync(); await _qualiteyProhibited.RemoveRangeAsync(prohibiteds, HttpContext.RequestAborted); } /// /// 更新违禁词 /// /// /// [Permission(EPermission.UpdateQualityProhibited)] [HttpPut("prohibited")] public async Task Update([FromBody] ProhibitedUpdateDto dto) { var prohibited = await _qualiteyProhibited.GetAsync(dto.Id, HttpContext.RequestAborted); if (prohibited is null) throw UserFriendlyException.SameMessage("无效质检模版"); _mapper.Map(dto, prohibited); prohibited.LastModificationName = _sessionContext.UserName; await _qualiteyProhibited.UpdateAsync(prohibited, HttpContext.RequestAborted); } /// /// 获取违禁词列表 /// /// /// [Permission(EPermission.QualityProhibitedList)] [HttpGet("prohibited/list")] public async Task> List([FromQuery] ProhibitedListDto dto) { var (total, items) = await _qualiteyProhibited.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Name), d => d.Name.Contains(dto.Name!)) .WhereIF(!string.IsNullOrEmpty(dto.Classify), d => d.Classify.Contains(dto.Classify!)) .WhereIF(!string.IsNullOrEmpty(dto.Type), d => d.Type.Contains(dto.Type!)) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, _mapper.Map>(items)); } /// /// 获取违禁词实体 /// /// /// [HttpGet("prohibited/{id}")] public async Task ProhibitedEntity(string id) { return await _qualiteyProhibited.Queryable() .FirstAsync(x => x.Id == id); } #endregion /// /// 获取质检基本信息 /// /// [HttpGet("base")] public async Task Base() { var rsp = new { QualityState = EnumExts.GetDescriptions(), QualitySource = EnumExts.GetDescriptions() }; return rsp; } /// /// 获取质检项目基本信息 /// /// [HttpGet("item_base")] public async Task ItemBase() { var rsp = new { QualityItemGrouping = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.QualityItemGrouping) }; return rsp; } /// /// 获取质检模版基本信息 /// /// [HttpGet("template_base")] public async Task TemplateBase() { var rsp = new { TemplateGrouping = EnumExts.GetDescriptions() }; return rsp; } /// /// 获取质检违禁词基本信息 /// /// [HttpGet("prohibited_base")] public async Task ProhibitedBase() { var rsp = new { ProhibitedClassify = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ProhibitedClassify), ProhibitedType = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ProhibitedType), }; return rsp; } } }