using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Core; using iWare.Wms.Core.Enum; using iWare.Wms.Core.Util; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using System.Drawing.Printing; using System.Linq.Dynamic.Core; using System.Text; using System.Web; namespace iWare.Wms.Application { /// /// 在制品监控服务 /// [ApiDescriptionSettings("数据查询服务", Name = "WorkPieceInfo", Order = 100)] [Route("api/[Controller]")] public class WorkPieceInfoService : IWorkPieceInfoService, IDynamicApiController, ITransient { private readonly IRepository _workPieceInfoRep; private readonly IRepository _workPieceInfoLogRep; private readonly IRepository _equipmentCurrentMonitorRep; private readonly IRepository _equipmentBaseInfoRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; /// /// 在制品监控构造 /// /// /// /// /// /// public WorkPieceInfoService( IRepository workPieceInfoRep, IRepository equipmentBaseInfoRep, IRepository equipmentCurrentMonitorRep, IRepository sysDictTypeRep, IRepository sysDictDataRep , IRepository workPieceInfoLogRep ) { _workPieceInfoRep = workPieceInfoRep; _equipmentBaseInfoRep = equipmentBaseInfoRep; _equipmentCurrentMonitorRep = equipmentCurrentMonitorRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _workPieceInfoLogRep = workPieceInfoLogRep; } /// /// 添加字典类型(个别基础信息维护) /// /// /// [HttpPost("SaveBasicInfo")] public async Task SaveBasicInfo(SaveBasicInfoInput input) { var basic = _sysDictTypeRep.Where(u => u.Code == input.Code).FirstOrDefault(); if(basic==null||basic.Id<1) { var dictType = input.Adapt(); dictType.Name = dictType.Code; await _sysDictTypeRep.InsertAsync(dictType); } else { basic.Remark = input.Remark; } } /// /// 添加字典类型(个别基础信息维护) /// /// /// [HttpGet("GetBasicInfo")] public async Task> GetBasicInfo() { List returnlist = new List(); returnlist = _sysDictTypeRep.Entities.ProjectToType().ToList(); return returnlist; } /// /// 分页查询在制品监控 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] WorkPieceInfoSearch input) { //var workPieceInfos = await _workPieceInfoRep.DetachedEntities // .Join(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, b) => new { a, b }) // .Join(_equipmentCurrentMonitorRep.DetachedEntities, c => c.a.EquipmentID, d => d.EquipmentID, (c, d) => new { c, d }) // .Join(_sysDictDataRep.DetachedEntities, e => e.d.EquipmentCurrentState, f => f.Code, (e, f) => new { e, f }) // .Join(_sysDictTypeRep.DetachedEntities, g => g.f.TypeId, h => h.Id, (f, g) => new { f, g }) // .Where(x => (x.g.Code.Equals("equipment_state") && (string.IsNullOrEmpty(input.EquipmentCurrentState) ? true : x.f.f.Code.Equals (input.EquipmentCurrentState)))) // .Where(!string.IsNullOrEmpty(input.WorkPieceID), u => u.f.e.c.a.WorkPieceID.Contains(input.WorkPieceID)) // .Where(!string.IsNullOrEmpty(input.QualityState.ToString()), u => u.f.e.c.a.QualityState == input.QualityState) // .Where(!string.IsNullOrEmpty(input.EquipmentID), u => u.f.e.c.a.EquipmentID.Equals(input.EquipmentID)) // .Where(!string.IsNullOrEmpty(input.WorkingProcedureCurrent), u => u.f.e.c.a.WorkingProcedureCurrent.Equals(input.WorkingProcedureCurrent)) // .Select(s => new WorkPieceInfoOutput // { // Id = s.f.e.c.a.Id, // WorkPieceID = s.f.e.c.a.WorkPieceID, // WorkingProcedureCurrent = s.f.e.c.a.WorkingProcedureCurrent, // WorkPieceCurrentPosition = s.f.e.c.a.WorkPieceCurrentPosition, // WorkingProcedureStartTime = s.f.e.c.a.WorkingProcedureStartTime, // QualityState = s.f.e.c.a.QualityState, // EquipmentID = s.f.e.c.a.EquipmentID, // EquipmentName = s.f.e.c.b.EquipmentName, // EquipmentCurrentState = s.f.e.d.EquipmentCurrentState, // EquipmentCurrentStateName = s.f.f.Value, // }) // .Distinct() // .OrderBy(PageInputOrder.OrderBuilder(input)) // .ProjectToType() // .ToADPagedListAsync(input.PageNo, input.PageSize); var workPieceInfos = await _workPieceInfoRep.DetachedEntities .GroupJoin(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, bGroup) => new { a, bGroup }) .SelectMany(ab => ab.bGroup.DefaultIfEmpty(), (ab, b) => new { ab.a, b }) .GroupJoin(_equipmentCurrentMonitorRep.DetachedEntities, ab => ab.a.EquipmentID, d => d.EquipmentID, (ab, dGroup) => new { ab.a, ab.b, dGroup }) .SelectMany(abd => abd.dGroup.DefaultIfEmpty(), (abd, d) => new { abd.a, abd.b, d }) .Where(x => string.IsNullOrEmpty(input.WorkPieceID) || x.a.WorkPieceID.Contains(input.WorkPieceID)) .Where(x => string.IsNullOrEmpty(input.QualityState.ToString()) || x.a.QualityState == input.QualityState) .Where(x => string.IsNullOrEmpty(input.EquipmentID) || x.a.EquipmentID.Equals(input.EquipmentID)) .Where(x => string.IsNullOrEmpty(input.WorkingProcedureCurrent) || x.a.WorkingProcedureCurrent.Equals(input.WorkingProcedureCurrent)) .Where(x=>x.a.WorkPieceState !=((int)EnumWorkPieceState.FinishedProducts)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Where(!string.IsNullOrEmpty(input.StartTimeBeginTime.ToString()), u => u.a.WorkPieceinitOnlineTime >= input.StartTimeBeginTime) .Where(!string.IsNullOrEmpty(input.StartTimeEndTime.ToString()), u => u.a.WorkPieceinitOnlineTime <= input.StartTimeEndTime) .Select(s => new WorkPieceInfoOutput { Id = s.a.Id, WorkPieceID = s.a.WorkPieceID, WorkingProcedureCurrent = s.a.WorkingProcedureCurrent, WorkPieceCurrentPosition = s.a.WorkPieceCurrentPosition, WorkPieceinitOnlineTime = s.a.WorkPieceinitOnlineTime, WorkingProcedureStartTime = s.a.WorkingProcedureStartTime, WorkingProcedureEndTime = s.a.WorkingProcedureEndTime, QualityState = s.a.QualityState, EquipmentID = s.a.EquipmentID, EquipmentName = s.b.EquipmentName, EquipmentCurrentState = s.d.EquipmentCurrentState, WorkPieceState = s.a.WorkPieceState //EquipmentCurrentStateName = s.f.Value, }) .Distinct() //.OrderBy(PageInputOrder.OrderBuilder(input)) .OrderByDescending(o=>o.WorkingProcedureStartTime) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return workPieceInfos; } /// /// 根据在制品监控信息导出Excel /// /// 在制品监控信息 /// 导出的Excel文件 [HttpGet("toExcel")] public async Task ToExcelAsync([FromQuery] WorkPieceInfoSearch input) { var workPieceInfos = await _workPieceInfoRep.DetachedEntities .GroupJoin(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, bGroup) => new { a, bGroup }) .SelectMany(ab => ab.bGroup.DefaultIfEmpty(), (ab, b) => new { ab.a, b }) .GroupJoin(_equipmentCurrentMonitorRep.DetachedEntities, ab => ab.a.EquipmentID, d => d.EquipmentID, (ab, dGroup) => new { ab.a, ab.b, dGroup }) .SelectMany(abd => abd.dGroup.DefaultIfEmpty(), (abd, d) => new { abd.a, abd.b, d }) .Where(x => string.IsNullOrEmpty(input.WorkPieceID) || x.a.WorkPieceID.Contains(input.WorkPieceID)) .Where(x => string.IsNullOrEmpty(input.QualityState.ToString()) || x.a.QualityState == input.QualityState) .Where(x => string.IsNullOrEmpty(input.EquipmentID) || x.a.EquipmentID.Equals(input.EquipmentID)) .Where(x => string.IsNullOrEmpty(input.WorkingProcedureCurrent) || x.a.WorkingProcedureCurrent.Equals(input.WorkingProcedureCurrent)) .Where(x => x.a.WorkPieceState != ((int)EnumWorkPieceState.FinishedProducts)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Where(!string.IsNullOrEmpty(input.StartTimeBeginTime.ToString()), u => u.a.WorkPieceinitOnlineTime >= input.StartTimeBeginTime) .Where(!string.IsNullOrEmpty(input.StartTimeEndTime.ToString()), u => u.a.WorkPieceinitOnlineTime <= input.StartTimeEndTime) .Select(s => new WorkPieceInfoOutput { Id = s.a.Id, WorkPieceID = s.a.WorkPieceID, WorkingProcedureCurrent = s.a.WorkingProcedureCurrent, WorkPieceinitOnlineTime = s.a.WorkPieceinitOnlineTime, WorkPieceCurrentPosition = s.a.WorkPieceCurrentPosition, WorkingProcedureStartTime = s.a.WorkingProcedureStartTime, WorkingProcedureEndTime = s.a.WorkingProcedureEndTime, QualityState = s.a.QualityState, WorkPieceState = s.a.WorkPieceState }) .Distinct() .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToListAsync(); //foreach (WorkPieceInfoExcelOutput item in workPieceInfos) //{ // //item.WorkingProcedureStartTime = string.IsNullOrEmpty(item.WorkingProcedureStartTime) ? "" : Convert.ToDateTime(item.WorkingProcedureStartTime).ToString("yyyy-MM-dd hh:mm"); // if ("1".Equals(item.QualityStateName)) // { // item.QualityStateName = "合格"; // } // else if ("2".Equals(item.QualityStateName)) // { // item.QualityStateName = "不合格"; // } // else if ("3".Equals(item.QualityStateName)) // { // item.QualityStateName = "疑似"; // } // else // { // item.QualityStateName = ""; // } //} MemoryStream ms = new(); DataConvertUtil.ToExcelData(workPieceInfos, _sysDictTypeRep, _sysDictDataRep, out List headers, out List> data, out string sheetName); ExcelUtil.ToExcel(headers, data, sheetName, ms); ms.Position = 0; var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName }; } /// /// 在制品监控信息批量/单个修改质量状态 /// /// /// [HttpPost("batckUpdate")] public async Task BatckUpdate(UpdQualityStateInput input) { if (input == null || input.WorkPieceInfoLst.Count == 0 ) { throw Oops.Oh("修改工件信息失败:数据不能为空!"); } if(string.IsNullOrEmpty(input.QualityState)&& string.IsNullOrEmpty(input.WorkingProcedureCurrent)) { throw Oops.Oh("修改工件信息失败:质量状态和工序信息 至少要选一个!"); } if (input.Password == null||!input.Password.Equals("123456")) { throw Oops.Oh("修改工件质量状态失败:密码输入错误!"); } if(!string.IsNullOrEmpty(input.QualityState)) { if (!(input.QualityState.Equals("1") || input.QualityState.Equals("2") || input.QualityState.Equals("3"))) { throw Oops.Oh($"修改工件质量状态失败:传入待修改质量状态不对!"); } string QualityHistoryState = string.Empty; foreach (WorkPieceInfoSearch item in input.WorkPieceInfoLst) { if (string.IsNullOrEmpty(QualityHistoryState)) { QualityHistoryState = item.QualityHistoryState; } else { if (!QualityHistoryState.Equals(item.QualityHistoryState.ToString())) { throw Oops.Oh($"只能选中相同的质量状态进行修改!"); } } } } if(!string.IsNullOrEmpty(input.WorkingProcedureCurrent)) { if (input.WorkingProcedureCurrent.Length!=4) { throw Oops.Oh($"修改工件信息失败:传入修改的工序信息【{input.WorkingProcedureCurrent}】不对!"); } string Procedure = string.Empty; foreach (WorkPieceInfoSearch item in input.WorkPieceInfoLst) { if (string.IsNullOrEmpty(Procedure)) { Procedure = item.WorkingProcedureCurrent; } else { if (!Procedure.Equals(item.WorkingProcedureCurrent.ToString())) { throw Oops.Oh($"只能选中相同的工序信息进行修改!"); } } } } List updatelist = new List(); List addloglist = new List(); foreach (WorkPieceInfoSearch item in input.WorkPieceInfoLst) { WorkPieceInfo workPieceInfo = _workPieceInfoRep.Where(w => w.Id == item.Id).FirstOrDefault(); if (workPieceInfo is null) { throw Oops.Oh($"修改工件信息失败:工件主键ID{item.Id}不存在!"); } WorkPieceInfoLog infolog = EntityPropHelper.Mapper(workPieceInfo); infolog.LogAddRemark = $"【{CurrentUserInfo.Name}】 PC端手动修改质量信息或当期工序信息"; if (!string.IsNullOrEmpty(input.QualityState)) { infolog.LogAddRemark+=$"质量信息[{workPieceInfo.QualityState ?? 0}]到[{input.QualityState}]"; workPieceInfo.QualityState = Convert.ToInt32(input.QualityState); } if (input.WorkingProcedureCurrent != null) { infolog.LogAddRemark += $"工序 [{workPieceInfo.WorkingProcedureCurrent}]到[{input.WorkingProcedureCurrent}]"; workPieceInfo.WorkingProcedureCurrent = input.WorkingProcedureCurrent; } updatelist.Add(workPieceInfo); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.WorkPieceInfoID = workPieceInfo.Id; infolog.LogAddTime = DateTime.Now; addloglist.Add(infolog); } await _workPieceInfoLogRep.InsertAsync(addloglist); await _workPieceInfoRep.UpdateAsync((updatelist)); } public async Task AddWorkPieceInfoLogAsync(WorkPieceInfoLog input) { await _workPieceInfoLogRep.InsertNowAsync(input); } } }