using Furion.DatabaseAccessor; using Furion.FriendlyException; using iWare.Wms.Core.Util; using iWare.Wms.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Furion.DependencyInjection; using Furion.DynamicApiController; using System.Text; using iWare.Wms.Core.Enum; namespace iWare.Wms.Application.Service.Pda { /// /// 设备基础信息管理服务 /// //[Route("api")] [ApiDescriptionSettings("Pda相关接口", Name = "PdaService", Order = 100)] [Route("api/[Controller]")] [DisableOpLog] public class PdaService : IDynamicApiController, ITransient { private readonly IRepository _equipmentBaseInfoRep; private readonly IRepository _v_GetEquipmentAlertRep; private readonly IRepository _equipmentCurrentMonitorRep; private readonly IRepository _workPieceProcessRep; private readonly IRepository _workPieceInfo; private readonly IRepository _workPieceInfoRep; private readonly IRepository _sysDictDataRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _workPieceInfoLogRep; private readonly IRepository _workPieceOutboundRep; /// /// 设备基础信息构造函数 /// /// public PdaService( IRepository equipmentBaseInfoRep, IRepository v_GetEquipmentAlert, IRepository equipmentCurrentMonitorRep, IRepository workPieceProcess, IRepository workPieceInfo, IRepository workPieceInfoRep, IRepository sysDictDataRep, IRepository sysDictTypeRep, IRepository workPieceInfoLogRep, IRepository workPieceOutboundRep ) { _equipmentBaseInfoRep = equipmentBaseInfoRep; _v_GetEquipmentAlertRep = v_GetEquipmentAlert; _equipmentCurrentMonitorRep = equipmentCurrentMonitorRep; _workPieceProcessRep = workPieceProcess; _workPieceInfo = workPieceInfo; _workPieceInfoRep = workPieceInfoRep; _sysDictDataRep = sysDictDataRep; _sysDictTypeRep = sysDictTypeRep; _workPieceInfoLogRep = workPieceInfoLogRep; _workPieceOutboundRep = workPieceOutboundRep; } /// /// 查询工件号获取工件信息 /// /// [HttpGet("getOneWorkPiece")] public async Task getOneWorkPiece([FromQuery] WorkPieceProcessPdaSearch input) { if (string.IsNullOrEmpty(input.WorkPieceID)) { throw Oops.Oh($"请输入待查询工件号!"); } var workPieceInfo = 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"))) .Where(!string.IsNullOrEmpty(input.WorkPieceID), u => u.c.a.WorkPieceID == input.WorkPieceID) //.Where(u => u.f.e.c.a.IsDeleted == false) .Select(s => new WorkPieceInfoOutput { Id = s.c.a.Id, WorkPieceID = s.c.a.WorkPieceID, WorkPieceState = s.c.a.WorkPieceState, WorkingProcedureCurrent = s.c.a.WorkingProcedureCurrent, WorkingProcedureStartTime = s.c.a.WorkingProcedureStartTime, WorkingProcedureEndTime = s.c.a.WorkingProcedureEndTime, QualityState = s.c.a.QualityState, QualityErrorInfo = s.c.a.QualityErrorInfo, EquipmentID = s.c.a.EquipmentID, EquipmentName = s.c.b.EquipmentName, EquipmentCurrentState = s.d.EquipmentCurrentState, //EquipmentCurrentStateName = s.f.f.Value, WorkPieceCurrentPosition = s.c.a.WorkPieceCurrentPosition, WorkPieceinitOnlineTime = s.c.a.WorkPieceinitOnlineTime, WorkPieceLastOfflineTime = s.c.a.WorkPieceLastOfflineTime, WorkingProcedureCompleted = s.c.a.WorkingProcedureCompleted, OP80NewCode = s.c.a.OP80NewCode, }) .ProjectToType().FirstOrDefaultAsync(); if (workPieceInfo == null) { throw Oops.Oh($"工件号【{input.WorkPieceID}】没有找到相关信息!"); } return workPieceInfo; } /// /// 查询非合格工件信息 /// /// [HttpGet("getNoOkWorkPiece")] public async Task> Page(string queryStr) { 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"))) .Where(u => u.a.QualityState != (int)EnumQualityState.OK) .Where(u => u.a.IsDeleted == false) .Where(o => o.a.WorkPieceID.Contains(queryStr ?? "") || o.a.QualityErrorInfo.Contains(queryStr ?? "")) //.Where(o => (o.a.QualityStateUpdateTime.HasValue ? o.a.QualityStateUpdateTime.Value : DateTime.MinValue) > DateTime.Now.AddDays(-7)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Select(s => new WorkPieceInfoOutput { Id = s.a.Id, WorkPieceID = s.a.WorkPieceID, WorkPieceState = s.a.WorkPieceState, WorkingProcedureCurrent = s.a.WorkingProcedureCurrent, WorkPieceCurrentPosition = s.a.WorkPieceCurrentPosition, WorkingProcedureStartTime = s.a.WorkingProcedureStartTime, WorkingProcedureEndTime = s.a.WorkingProcedureEndTime, WorkingProcedureCompleted = s.a.WorkingProcedureCompleted, WorkPieceinitOnlineTime = s.a.WorkPieceinitOnlineTime, QualityState = s.a.QualityState, QualityErrorInfo = s.a.QualityErrorInfo, QualityStateUpdateTime = (s.a.QualityStateUpdateTime.HasValue ? s.a.QualityStateUpdateTime.Value : DateTime.MinValue), EquipmentID = s.a.EquipmentID, EquipmentName = s.b.EquipmentName, //EquipmentCurrentState = s.d.EquipmentCurrentState, //EquipmentCurrentStateName = s.f.f.Value, WorkPieceLastOfflineTime = s.a.WorkPieceLastOfflineTime, }) .OrderByDescending(o => o.QualityStateUpdateTime) .ProjectToType().ToListAsync(); return workPieceInfos; } /// /// 关闭设备告警信息 /// /// /// [HttpPost("UpdateAlertStatus")] public async Task UpdateAlertStatus(EquipmentAlertClose input) { var equipmentBaseInfo = await _equipmentBaseInfoRep.FirstOrDefaultAsync(u => u.EquipmentId == input.EquipmentId && u.IsDeleted == false); if (equipmentBaseInfo == null) { throw Oops.Oh($"设备{input.EquipmentId}不存在,不能关闭!"); } if (string.IsNullOrEmpty(input.AlertType)) { throw Oops.Oh($"未传入需关闭的告警类型,不能关闭!"); } if (input.AlertType.Equals("1")) { equipmentBaseInfo.Detergentchangetime = DateTime.Now; } else if (input.AlertType.Equals("2")) { equipmentBaseInfo.KnifeToolChangeTime = DateTime.Now; } else if (input.AlertType.Equals("3")) { equipmentBaseInfo.CuttingFluidChangeTime = DateTime.Now; } else if (input.AlertType.Equals("4")) { var equipmentCurrentMonitor = await _equipmentCurrentMonitorRep.FirstOrDefaultAsync(u => u.EquipmentID == input.EquipmentId && u.IsDeleted == false); if (equipmentCurrentMonitor != null) { equipmentCurrentMonitor.IsCloseAlert = true; } } else { throw Oops.Oh($"设备{input.EquipmentId}传入告警类型{input.AlertType}不存在,不能关闭!"); } return 0; } /// /// 查询设备告警信息 /// /// /// [HttpGet("getAlert")] public async Task> Page([FromQuery] EquipmentAlertSearch input) { var equipmentAlertInfos = await _v_GetEquipmentAlertRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.EquipmentId), u => u.EquipmentId == input.EquipmentId) .Where(!string.IsNullOrEmpty(input.EquipmentName), u => EF.Functions.Like(u.EquipmentName, $"%{input.EquipmentName.Trim()}%")) .Where(!string.IsNullOrEmpty(input.WorkingProcedure), u => u.WorkingProcedure.Equals(input.WorkingProcedure)) .Where(!string.IsNullOrEmpty(input.AlertType), u => (input.AlertType.Equals("1") && u.IsAlertDetergent) || (input.AlertType.Equals("2") && u.IsAlertKnifeTool) || (input.AlertType.Equals("3") && u.IsAlertCuttingFluid) || (input.AlertType.Equals("4") && u.IsAlert)) .ProjectToType().ToListAsync(); return equipmentAlertInfos; } /// /// 查询工件加工追溯 /// /// /// [HttpGet("getWorkPieceProcess")] [DisableOpLog] public async Task getWorkPieceProcess([FromQuery] WorkPieceProcessPdaSearch input) { var workPieceProcesss = await _workPieceProcessRep.DetachedEntities .Join(_equipmentBaseInfoRep.DetachedEntities, a => a.EquipmentID, b => b.EquipmentId, (a, b) => new { a, b }) .Where(!string.IsNullOrEmpty(input.WorkPieceID), u => u.a.WorkPieceID.Equals(input.WorkPieceID)) .Where(o => !string.IsNullOrEmpty(o.a.WorkPieceID)) .Select(s => new WorkPieceProcessOutput { Id = s.a.Id, WorkPieceID = s.a.WorkPieceID, WorkingProcedureCurrent = s.a.WorkingProcedureCurrent, EquipmentID = s.a.EquipmentID, EquipmentName = s.b.EquipmentName, StartTime = s.a.StartTime, EndTime = s.a.EndTime, QualityState = s.a.QualityState, OperationType = s.a.OperationType, //QualityStateName = s.f.f.Value }) .OrderByDescending(o => o.StartTime) .ProjectToType() .ToListAsync(); WorkPieceProcessPdaOutput returenlist = new WorkPieceProcessPdaOutput(); returenlist.WorkPieceID = workPieceProcesss.FirstOrDefault()?.WorkPieceID; returenlist.WorkPieceProcessList = workPieceProcesss; if (workPieceProcesss == null || workPieceProcesss.Count == 0) { throw Oops.Oh($"工件号【{input.WorkPieceID}】没有找到相关信息!"); } return returenlist; } /// /// 修改工件质量状态 /// /// /// [HttpPost("updateWorkPieceQualityState")] public async Task updateWorkPieceQualityState([FromBody] UpdateQualityStateInput input) { if (input == null || input.WorkPieceIDList.Count == 0 || input.QualityState == null || input.Password == null) { throw Oops.Oh("修改工件质量状态失败:数据不能为空!"); } if (!input.Password.Equals("123456")) { throw Oops.Oh("修改工件质量状态失败:密码输入错误!"); } if (!(input.QualityState.Equals("1") || input.QualityState.Equals("2") || input.QualityState.Equals("3"))) { throw Oops.Oh($"修改工件质量状态失败:传入待修改质量状态不对!"); } List workPieceInfolist = await _workPieceInfo.DetachedEntities.Where(w => input.WorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync(); List updateworkPieceInfo = new List(); List addloglist = new List(); foreach (var item in input.WorkPieceIDList) { WorkPieceInfo workPieceInfo = workPieceInfolist.Where(w => w.WorkPieceID == item).FirstOrDefault(); if (workPieceInfo is null) { throw Oops.Oh($"修改工件质量状态失败:工件{item}不存在!"); } if (int.Parse(input.QualityState) == (int)EnumQualityState.OK) { workPieceInfo.QualityErrorInfo = ""; } else { workPieceInfo.QualityErrorInfo = input.QualityErrorInfo; } workPieceInfo.QualityState = int.Parse(input.QualityState); workPieceInfo.QualityStateUpdateMode = EnumQualityStateUpdateMode.Manual.ToString(); workPieceInfo.QualityStateUpdateUser = CurrentUserInfo.Name; workPieceInfo.QualityStateUpdateTime = DateTime.Now; updateworkPieceInfo.Add(workPieceInfo); WorkPieceInfoLog infolog = EntityPropHelper.Mapper(workPieceInfo); infolog.LogAddRemark = $"【{CurrentUserInfo.Name}】 PDA端手动修改质量信息[{workPieceInfo.QualityState ?? 0}]到[{input.QualityState}]"; infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.WorkPieceInfoID = workPieceInfo.Id; infolog.LogAddTime = DateTime.Now; addloglist.Add(infolog); } await _workPieceInfoLogRep.InsertAsync(addloglist); await _workPieceInfo.UpdateAsync(updateworkPieceInfo); return "修改成功"; } /// /// 修改工件信息 /// /// /// [HttpPost("updateWorkPieceInfo")] public async Task updateWorkPieceInfo([FromBody] UpdateQualityStateInput input) { if (input == null || input.WorkPieceIDList.Count == 0 || input.Password == null) { throw Oops.Oh("修改工件信息失败:传参不能为空!"); } if (string.IsNullOrEmpty(input.QualityState) || string.IsNullOrEmpty(input.WorkPieceState) || string.IsNullOrEmpty(input.WorkingProcedure)) { throw Oops.Oh("修改工件信息失败:质量状态、工件状态、工序信息 必须传值!"); } if (!input.Password.Equals("123456")) { throw Oops.Oh("修改工件信息失败:密码输入错误!"); } if (!(input.QualityState.Equals("1") || input.QualityState.Equals("2") || input.QualityState.Equals("3"))) { throw Oops.Oh($"修改工件信息失败:传入质量状态[{input.QualityState}]不对!"); } if (!(input.WorkPieceState.Equals("1") || input.WorkPieceState.Equals("2") || input.WorkPieceState.Equals("3") || input.WorkPieceState.Equals("4") || input.WorkPieceState.Equals("10"))) { throw Oops.Oh($"修改工件信息失败:传入工件状态[{input.WorkPieceState}]不对!"); } if (input.WorkingProcedure.Length != 4 || !input.WorkingProcedure.Contains("OP")) { throw Oops.Oh($"修改工件信息失败:传入工序[{input.WorkingProcedure}]不对!"); } List workPieceInfolist = await _workPieceInfo.DetachedEntities.Where(w => input.WorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync(); List updateworkPieceInfo = new List(); List addloglist = new List(); foreach (var item in input.WorkPieceIDList) { WorkPieceInfo workPieceInfo = workPieceInfolist.Where(w => w.WorkPieceID == item).FirstOrDefault(); if (workPieceInfo is null) { throw Oops.Oh($"修改工件质量状态失败:工件{item}不存在!"); } string LogAddRemark = ""; if (workPieceInfo.QualityState != int.Parse(input.QualityState)) { LogAddRemark += $"质量信息[{workPieceInfo.QualityState ?? 0}]到[{input.QualityState}]"; workPieceInfo.QualityState = int.Parse(input.QualityState); workPieceInfo.QualityStateUpdateMode = EnumQualityStateUpdateMode.Manual.ToString(); workPieceInfo.QualityStateUpdateUser = CurrentUserInfo.Name; workPieceInfo.QualityStateUpdateTime = DateTime.Now; if (int.Parse(input.QualityState) == (int)EnumQualityState.OK) { workPieceInfo.QualityErrorInfo = ""; } else { workPieceInfo.QualityErrorInfo = input.QualityErrorInfo; } } if (workPieceInfo.WorkingProcedureCurrent != input.WorkingProcedure) { LogAddRemark += $"工序 [{workPieceInfo.WorkingProcedureCurrent}]到[{input.WorkingProcedure}]"; workPieceInfo.WorkingProcedureCurrent = input.WorkingProcedure; } if (workPieceInfo.WorkPieceState != int.Parse(input.WorkPieceState)) { LogAddRemark += $"工件状态 [{workPieceInfo.WorkPieceState}]到[{input.WorkPieceState}]"; workPieceInfo.WorkPieceState = int.Parse(input.WorkPieceState); if (workPieceInfo.WorkPieceState == (int)EnumWorkPieceState.FinishedProducts) { workPieceInfo.WorkPieceLastOfflineTime = DateTime.Now; } else { workPieceInfo.WorkPieceLastOfflineTime = null; } } WorkPieceInfoLog infolog = EntityPropHelper.Mapper(workPieceInfo); infolog.LogAddRemark = $"【{CurrentUserInfo.Name}】 PDA端手动修改工件信息: {LogAddRemark}"; infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.WorkPieceInfoID = workPieceInfo.Id; infolog.LogAddTime = DateTime.Now; addloglist.Add(infolog); updateworkPieceInfo.Add(workPieceInfo); } await _workPieceInfo.UpdateAsync(updateworkPieceInfo); await _workPieceInfoLogRep.InsertAsync(addloglist); return "修改成功"; } /// /// 查询OP80工件号获取工件信息 /// /// [HttpGet("getWorkPieceByOP80NewCode")] [DisableOpLog] public async Task getWorkPieceByOP80NewCode([FromQuery] WorkPieceByOP80NewCodeInputSearch input) { if (string.IsNullOrEmpty(input.OP80NewCode)) { throw Oops.Oh($"请输入成品码或工件码!"); } if (input.OP80NewCode.Length > 22) { throw Oops.Oh($"工件码或成品码{input.OP80NewCode}长度不正确!"); } string OP80NewCode = input.OP80NewCode.Trim(); var workPieceInfo = await _workPieceInfoRep.DetachedEntities .Where(!string.IsNullOrEmpty(OP80NewCode), u => u.OP80NewCode == OP80NewCode || u.WorkPieceID == OP80NewCode) .Select(s => new WorkPieceInfoOutput { Id = s.Id, WorkPieceID = s.WorkPieceID, OP80NewCode = s.OP80NewCode, WorkPieceState = s.WorkPieceState, WorkingProcedureCurrent = s.WorkingProcedureCurrent, WorkingProcedureStartTime = s.WorkingProcedureStartTime, WorkingProcedureEndTime = s.WorkingProcedureEndTime, QualityState = s.QualityState, QualityErrorInfo = s.QualityErrorInfo, EquipmentID = s.EquipmentID, WorkPieceCurrentPosition = s.WorkPieceCurrentPosition, WorkPieceinitOnlineTime = s.WorkPieceinitOnlineTime, WorkPieceLastOfflineTime = s.WorkPieceLastOfflineTime, WorkingProcedureCompleted = s.WorkingProcedureCompleted, }).FirstOrDefaultAsync(); if (workPieceInfo == null) { //throw Oops.Oh($"OP80打印成品码或工件二维码【{OP80NewCode}】没有找到相关工件信息!"); workPieceInfo = new WorkPieceInfoOutput { WorkPieceID = OP80NewCode, OP80NewCode = OP80NewCode, }; } //判断是否已经出库 List db_itemModelList = await _workPieceOutboundRep.DetachedEntities.Where(w => (w.WorkPieceID == OP80NewCode || w.OP80NewCode == OP80NewCode) && w.IsDeleted == false).ToListAsync(); if (db_itemModelList != null && db_itemModelList.Count > 0) { var itemModel = db_itemModelList.First(); var createitme = itemModel.CreatedTime == null ? "" : (((DateTimeOffset)itemModel.CreatedTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss")); throw Oops.Oh($"工件{itemModel.WorkPieceID}已出库,出库时间:{createitme}"); } return workPieceInfo; } /// /// 出库执行 /// /// /// [HttpPost("outBoundWorkPiece")] [UnitOfWork] public async Task outBoundWorkPiece([FromBody] OutBoundInput input) { if (input.Password == null || !input.Password.Equals("123456")) { throw Oops.Oh("修改工件质量状态失败:密码输入错误!"); } if (input.WorkPieceInfoLst.Count < 1) { throw Oops.Oh("工件出库失败:数据不能为空!"); } List WorkPieceInfoLst = input.WorkPieceInfoLst; var addOutBoundList = new List(); var queryWorkPieceIDList = WorkPieceInfoLst.Select(x => x.WorkPieceID).ToList(); List db_itemModelList = await _workPieceOutboundRep.Where(w => queryWorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync(); List db_WorkPieceInfoList = await _workPieceInfoRep.Where(w => queryWorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync(); foreach (var item in WorkPieceInfoLst) { var itemModel = db_itemModelList.FirstOrDefault(w => w.WorkPieceID == item.WorkPieceID); if (itemModel != null) { //itemModel.IsDeleted = true; //itemModel.Remark = itemModel.Remark ?? "" + "二次发货自动撤销发货"; //await _workPieceOutboundRep.UpdateAsync(itemModel); var createitme = itemModel.CreatedTime == null ? "" : (((DateTimeOffset)itemModel.CreatedTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss")); throw Oops.Oh($"工件{itemModel.WorkPieceID}已出库,出库时间:{createitme}"); } var outBoundLog = new WorkPieceOutbound { WorkPieceID = item.WorkPieceID, OP80NewCode = item.OP80NewCode, WorkPieceOutboundTime = DateTime.Now, WorkPieceOutboundUserId = CurrentUserInfo.UserId, WorkPieceOutboundUserName = CurrentUserInfo.Name, CreatedUserId = CurrentUserInfo.UserId, CreatedUserName = CurrentUserInfo.Name, }; addOutBoundList.Add(outBoundLog); var workPiece = db_WorkPieceInfoList.FirstOrDefault(w => w.WorkPieceID == item.WorkPieceID); if (workPiece != null) { workPiece.OutPerson = CurrentUserInfo.Name; workPiece.OutRemark = "撤销工件出库"; workPiece.OutTime = DateTime.Now; workPiece.IsOut = false; await _workPieceInfoRep.UpdateAsync(workPiece); } } await _workPieceOutboundRep.InsertAsync(addOutBoundList); return "出库成功"; } /// /// 出库统计 /// /// /// [HttpPost("getOutBoundWorkPieceInfoCount")] public async Task GetOutBoundWorkPieceInfoCount() { DateTimeOffset now = DateTimeOffset.Now; // 获取当前时间,包括时区偏移量 DateTimeOffset startOfDay = new DateTimeOffset(now.Year, now.Month, now.Day, 0, 0, 0, now.Offset); // 当天开始时间 DateTimeOffset endOfDay = new DateTimeOffset(now.Year, now.Month, now.Day, 23, 59, 59, now.Offset); // 当天结束时间 List db_itemModelList = await _workPieceOutboundRep.Where(w => w.CreatedTime >= startOfDay && w.CreatedTime <= endOfDay && w.IsDeleted == false).ToListAsync(); return db_itemModelList.Count().ToString(); } } }