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;
|
using Microsoft.AspNetCore.Authorization;
|
|
namespace iWare.Wms.Application.Service.Pda
|
{
|
/// <summary>
|
/// 设备基础信息管理服务
|
/// </summary>
|
//[Route("api")]
|
[ApiDescriptionSettings("Pda相关接口", Name = "PdaService", Order = 100)]
|
[Route("api/[Controller]")]
|
[DisableOpLog]
|
public class PdaService : IDynamicApiController, ITransient
|
{
|
private readonly IRepository<EquipmentBaseInfo, MasterDbContextLocator> _equipmentBaseInfoRep;
|
private readonly IRepository<V_GetEquipmentAlert, MasterDbContextLocator> _v_GetEquipmentAlertRep;
|
private readonly IRepository<EquipmentCurrentMonitor, MasterDbContextLocator> _equipmentCurrentMonitorRep;
|
private readonly IRepository<WorkPieceProcess, MasterDbContextLocator> _workPieceProcessRep;
|
private readonly IRepository<WorkPieceInfo, MasterDbContextLocator> _workPieceInfo;
|
private readonly IRepository<WorkPieceInfo, MasterDbContextLocator> _workPieceInfoRep;
|
private readonly IRepository<SysDictData, MasterDbContextLocator> _sysDictDataRep;
|
private readonly IRepository<SysDictType, MasterDbContextLocator> _sysDictTypeRep;
|
private readonly IRepository<WorkPieceInfoLog, MasterDbContextLocator> _workPieceInfoLogRep;
|
private readonly IRepository<WorkPieceOutbound, MasterDbContextLocator> _workPieceOutboundRep;
|
private readonly IRepository<WorkPieceOutboundRecord, MasterDbContextLocator> _workPieceOutboundRecordRep;
|
private readonly IRepository<WorkPieceUnLine, MasterDbContextLocator> _workPieceUnLineRep;
|
|
/// <summary>
|
/// 设备基础信息构造函数
|
/// </summary>
|
/// <param name="equipmentBaseInfoRep"></param>
|
public PdaService(
|
IRepository<WorkPieceOutboundRecord, MasterDbContextLocator> workPieceOutboundRecordRep,
|
IRepository<WorkPieceUnLine, MasterDbContextLocator> workPieceUnLineRep,
|
IRepository<EquipmentBaseInfo, MasterDbContextLocator> equipmentBaseInfoRep,
|
IRepository<V_GetEquipmentAlert, MasterDbContextLocator> v_GetEquipmentAlert,
|
IRepository<EquipmentCurrentMonitor, MasterDbContextLocator> equipmentCurrentMonitorRep,
|
IRepository<WorkPieceProcess, MasterDbContextLocator> workPieceProcess,
|
IRepository<WorkPieceInfo, MasterDbContextLocator> workPieceInfo,
|
IRepository<WorkPieceInfo, MasterDbContextLocator> workPieceInfoRep,
|
IRepository<SysDictData, MasterDbContextLocator> sysDictDataRep,
|
IRepository<SysDictType, MasterDbContextLocator> sysDictTypeRep,
|
IRepository<WorkPieceInfoLog, MasterDbContextLocator> workPieceInfoLogRep,
|
IRepository<WorkPieceOutbound, MasterDbContextLocator> workPieceOutboundRep
|
)
|
{
|
_workPieceOutboundRecordRep = workPieceOutboundRecordRep;
|
_workPieceUnLineRep = workPieceUnLineRep;
|
_equipmentBaseInfoRep = equipmentBaseInfoRep;
|
_v_GetEquipmentAlertRep = v_GetEquipmentAlert;
|
_equipmentCurrentMonitorRep = equipmentCurrentMonitorRep;
|
_workPieceProcessRep = workPieceProcess;
|
_workPieceInfo = workPieceInfo;
|
_workPieceInfoRep = workPieceInfoRep;
|
_sysDictDataRep = sysDictDataRep;
|
_sysDictTypeRep = sysDictTypeRep;
|
_workPieceInfoLogRep = workPieceInfoLogRep;
|
_workPieceOutboundRep = workPieceOutboundRep;
|
}
|
|
|
/// <summary>
|
/// 查询工件号获取工件信息
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet("getOneWorkPiece")]
|
public async Task<WorkPieceInfoOutput> 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<WorkPieceInfoOutput>().FirstOrDefaultAsync();
|
if (workPieceInfo == null)
|
{
|
throw Oops.Oh($"工件号【{input.WorkPieceID}】没有找到相关信息!");
|
}
|
return workPieceInfo;
|
}
|
/// <summary>
|
/// 查询非合格工件信息
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet("getNoOkWorkPiece")]
|
public async Task<List<WorkPieceInfoOutput>> 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<WorkPieceInfoOutput>().ToListAsync();
|
return workPieceInfos;
|
}
|
/// <summary>
|
/// 关闭设备告警信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("UpdateAlertStatus")]
|
public async Task<int> 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;
|
}
|
|
/// <summary>
|
/// 查询设备告警信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("getAlert")]
|
public async Task<List<EquipmentAlertInfoOutput>> 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<EquipmentAlertInfoOutput>().ToListAsync();
|
return equipmentAlertInfos;
|
}
|
|
|
/// <summary>
|
/// 查询工件加工追溯
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("getWorkPieceProcess")]
|
[DisableOpLog]
|
public async Task<WorkPieceProcessPdaOutput> 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<WorkPieceProcessOutput>()
|
.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;
|
}
|
|
|
/// <summary>
|
/// 修改工件质量状态
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("updateWorkPieceQualityState")]
|
public async Task<string> 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<WorkPieceInfo> workPieceInfolist = await _workPieceInfo.DetachedEntities.Where(w => input.WorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync();
|
List<WorkPieceInfo> updateworkPieceInfo = new List<WorkPieceInfo>();
|
List<WorkPieceInfoLog> addloglist = new List<WorkPieceInfoLog>();
|
|
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<WorkPieceInfoLog, WorkPieceInfo>(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 "修改成功";
|
}
|
|
|
/// <summary>
|
/// 修改工件信息
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("updateWorkPieceInfo")]
|
public async Task<string> 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<WorkPieceInfo> workPieceInfolist = await _workPieceInfo.DetachedEntities.Where(w => input.WorkPieceIDList.Contains(w.WorkPieceID) && w.IsDeleted == false).ToListAsync();
|
List<WorkPieceInfo> updateworkPieceInfo = new List<WorkPieceInfo>();
|
List<WorkPieceInfoLog> addloglist = new List<WorkPieceInfoLog>();
|
|
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<WorkPieceInfoLog, WorkPieceInfo>(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 "修改成功";
|
}
|
|
/// <summary>
|
/// 查询OP80工件号获取工件信息
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet("getWorkPieceByOP80NewCode")]
|
[DisableOpLog]
|
[AllowAnonymous]
|
public async Task<WorkPieceInfoOutput> 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<WorkPieceOutbound> 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;
|
}
|
|
/// <summary>
|
/// 出库执行
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("outBoundWorkPiece")]
|
[DisableOpLog]
|
[UnitOfWork]
|
public async Task<string> outBoundWorkPiece([FromBody] OutBoundInput input)
|
{
|
|
if (input.Password == null || !input.Password.Equals("123456"))
|
{
|
throw Oops.Oh("修改工件质量状态失败:密码输入错误!");
|
}
|
if (input.WorkPieceInfoLst.Count < 1)
|
{
|
throw Oops.Oh("工件出库失败:数据不能为空!");
|
}
|
|
List<OutBoundDetailsInput> WorkPieceInfoLst = input.WorkPieceInfoLst;
|
|
var addOutBoundList = new List<WorkPieceOutbound>();
|
|
var queryOP80NewCodeList = WorkPieceInfoLst.Select(x => x.OP80NewCode).ToList();
|
List<WorkPieceOutbound> db_itemModelList = await _workPieceOutboundRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
List<WorkPieceInfo> db_WorkPieceInfoList = await _workPieceInfoRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
foreach (var item in WorkPieceInfoLst)
|
{
|
var itemModel = db_itemModelList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
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.OP80NewCode}已出库,出库时间:{createitme}");
|
}
|
var workPiece = db_WorkPieceInfoList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (workPiece != null)
|
{
|
workPiece.OutPerson = CurrentUserInfo.Name;
|
workPiece.OutRemark = "撤销工件出库";
|
workPiece.OutTime = DateTime.Now;
|
workPiece.IsOut = false;
|
|
await _workPieceInfoRep.UpdateAsync(workPiece);
|
}
|
var outBoundLog = new WorkPieceOutbound
|
{
|
WorkPieceID = workPiece?.WorkPieceID,
|
OP80NewCode = item.OP80NewCode,
|
WorkPieceOutboundTime = DateTime.Now,
|
WorkPieceOutboundUserId = CurrentUserInfo.UserId,
|
WorkPieceOutboundUserName = CurrentUserInfo.Name,
|
CreatedUserId = CurrentUserInfo.UserId,
|
CreatedUserName = CurrentUserInfo.Name,
|
};
|
addOutBoundList.Add(outBoundLog);
|
|
|
}
|
await _workPieceOutboundRep.InsertAsync(addOutBoundList);
|
return "出库成功";
|
}
|
|
/// <summary>
|
/// 出库统计
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("getOutBoundWorkPieceInfoCount")]
|
[DisableOpLog]
|
public async Task<string> 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<WorkPieceOutbound> db_itemModelList = await _workPieceOutboundRep.Where(w => w.CreatedTime >= startOfDay && w.CreatedTime <= endOfDay && w.IsDeleted == false).ToListAsync();
|
|
return db_itemModelList.Count().ToString();
|
}
|
|
|
#region 新版 下线、出库执行
|
|
/// <summary>
|
/// 下线执行
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("unLineWorkPiece")]
|
[DisableOpLog]
|
[UnitOfWork]
|
public async Task<string> unLineWorkPiece([FromBody] UnLineInput input)
|
{
|
if (input.WorkPieceInfoLst.Count < 1)
|
{
|
throw Oops.Oh("数据不能为空!");
|
}
|
if (input.CarNo == null || input.CarNo.Equals(""))
|
{
|
throw Oops.Oh("小车码必须输入!");
|
}
|
|
List<UnBoundDetailsInput> WorkPieceInfoLst = input.WorkPieceInfoLst;
|
|
var addOutBoundList = new List<WorkPieceOutbound>();
|
var addOutBoundLogList = new List<WorkPieceOutboundRecord>();
|
|
var queryOP80NewCodeList = WorkPieceInfoLst.Select(x => x.OP80NewCode).ToList();
|
List<WorkPieceOutbound> db_WorkPieceOutboundList = await _workPieceOutboundRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
List<WorkPieceInfo> db_WorkPieceInfoList = await _workPieceInfoRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
foreach (var item in WorkPieceInfoLst)
|
{
|
var itemModel = db_WorkPieceOutboundList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (itemModel != null)
|
{
|
if (itemModel.UnLineStage == PieceUnLineStage.已出库)
|
{
|
var createitme = itemModel.WorkPieceOutboundTime == null ? "" : (((DateTimeOffset)itemModel.WorkPieceOutboundTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}已出库,出库时间:{createitme}");
|
}
|
if (itemModel.UnLineStage == PieceUnLineStage.已下线)
|
{
|
var createitme = itemModel.WorkPieceUnLineTime == null ? "" : (((DateTimeOffset)itemModel.WorkPieceUnLineTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}已下线,下线时间:{createitme}");
|
}
|
}
|
var workPiece = db_WorkPieceInfoList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (workPiece != null)
|
{
|
|
workPiece.OutRemark = "工件下线";
|
workPiece.UnLineStage = PieceUnLineStage.已下线;
|
workPiece.UnLineStageName = PieceUnLineStage.已下线.ToString();
|
workPiece.WorkPieceUnLineTime = DateTime.Now;
|
workPiece.WorkPieceUnLineUserId = CurrentUserInfo.UserId;
|
workPiece.WorkPieceUnLineUserName = CurrentUserInfo.Name;
|
|
await _workPieceInfoRep.UpdateAsync(workPiece);
|
}
|
var outBound = new WorkPieceOutbound
|
{
|
WorkPieceID = workPiece?.WorkPieceID,
|
OP80NewCode = item.OP80NewCode,
|
WorkPieceOutboundTime = DateTime.Now,
|
WorkPieceOutboundUserId = CurrentUserInfo.UserId,
|
WorkPieceOutboundUserName = CurrentUserInfo.Name,
|
CreatedUserId = CurrentUserInfo.UserId,
|
CreatedUserName = CurrentUserInfo.Name,
|
|
UnLineStage = PieceUnLineStage.已下线,
|
UnLineStageName = PieceUnLineStage.已下线.ToString(),
|
WorkPieceUnLineTime = DateTime.Now,
|
WorkPieceUnLineUserId = CurrentUserInfo.UserId,
|
WorkPieceUnLineUserName = CurrentUserInfo.Name,
|
CarNo = input.CarNo,
|
Remark = "工件下线",
|
|
};
|
addOutBoundList.Add(outBound);
|
|
var outBoundLog = new WorkPieceOutboundRecord
|
{
|
OperationType = OutboundOperationType.下线.ToString(),
|
WorkPieceID = workPiece?.WorkPieceID,
|
OP80NewCode = item.OP80NewCode,
|
|
CreatedUserId = CurrentUserInfo.UserId,
|
CreatedUserName = CurrentUserInfo.Name,
|
|
|
CarNo = input.CarNo,
|
Remark = "工件下线",
|
|
};
|
addOutBoundLogList.Add(outBoundLog);
|
|
|
|
}
|
await _workPieceOutboundRep.InsertAsync(addOutBoundList);
|
await _workPieceOutboundRecordRep.InsertAsync(addOutBoundLogList);
|
|
return "下线成功";
|
}
|
|
|
|
|
/// <summary>
|
/// 出库执行
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("outStoreWorkPiece")]
|
[DisableOpLog]
|
[UnitOfWork]
|
public async Task<string> outStoreWorkPiece([FromBody] OutStoreInput input)
|
{
|
if (input.CarNo == null || input.CarNo.Equals(""))
|
{
|
throw Oops.Oh("小车码必须输入!");
|
}
|
|
|
var updateOutBoundList = new List<WorkPieceOutbound>();
|
var addOutBoundLogList = new List<WorkPieceOutboundRecord>();
|
|
List<WorkPieceOutbound> db_WorkPieceOutboundList = await _workPieceOutboundRep.Where(w =>
|
w.CarNo == input.CarNo
|
&& w.UnLineStage == PieceUnLineStage.已下线
|
&& w.IsDeleted == false).ToListAsync();
|
|
if (db_WorkPieceOutboundList?.Count == 0)
|
{
|
throw Oops.Oh("没有可出库的数据!");
|
}
|
|
|
var queryOP80NewCodeList = db_WorkPieceOutboundList.Select(x => x.OP80NewCode).ToList();
|
|
List<WorkPieceInfo> db_WorkPieceInfoList = await _workPieceInfoRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
foreach (var item in db_WorkPieceOutboundList)
|
{
|
var itemModel = db_WorkPieceOutboundList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (itemModel != null)
|
{
|
if (itemModel.UnLineStage == PieceUnLineStage.已出库)
|
{
|
var createitme = itemModel.WorkPieceOutboundTime == null ? "" : (((DateTimeOffset)itemModel.WorkPieceOutboundTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}已出库,出库时间:{createitme}");
|
}
|
}
|
else
|
{
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}没有下线数据");
|
}
|
var workPiece = db_WorkPieceInfoList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (workPiece != null)
|
{
|
|
workPiece.OutRemark = "工件出库";
|
workPiece.UnLineStage = PieceUnLineStage.已出库;
|
workPiece.UnLineStageName = PieceUnLineStage.已出库.ToString();
|
workPiece.OutTime = DateTime.Now;
|
workPiece.OutPerson = CurrentUserInfo.Name;
|
|
await _workPieceInfoRep.UpdateAsync(workPiece);
|
}
|
|
item.UnLineStage = PieceUnLineStage.已出库;
|
item.UnLineStageName = PieceUnLineStage.已出库.ToString();
|
item.WorkPieceUnLineTime = DateTime.Now;
|
item.WorkPieceUnLineUserId = CurrentUserInfo.UserId;
|
item.WorkPieceUnLineUserName = CurrentUserInfo.Name;
|
updateOutBoundList.Add(item);
|
|
var outBoundLog = new WorkPieceOutboundRecord
|
{
|
OperationType = OutboundOperationType.出库.ToString(),
|
WorkPieceID = workPiece?.WorkPieceID,
|
OP80NewCode = item.OP80NewCode,
|
|
CreatedUserId = CurrentUserInfo.UserId,
|
CreatedUserName = CurrentUserInfo.Name,
|
|
|
CarNo = input.CarNo,
|
Remark = "工件出库",
|
|
};
|
addOutBoundLogList.Add(outBoundLog);
|
|
|
|
}
|
await _workPieceOutboundRep.UpdateAsync(updateOutBoundList);
|
await _workPieceOutboundRecordRep.InsertAsync(addOutBoundLogList);
|
|
return "出库成功";
|
}
|
|
|
/// <summary>
|
/// 下线撤回/出库撤回
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("unLineWorkPieceRollback")]
|
[DisableOpLog]
|
[UnitOfWork]
|
public async Task<string> unLineWorkPieceRollback([FromBody] UnLineRoolbackInput input)
|
{
|
if (input.WorkPieceInfoLst.Count < 1)
|
{
|
throw Oops.Oh("数据不能为空!");
|
}
|
if (!(input.Flag == 1 || input.Flag == 2))
|
{
|
throw Oops.Oh("标记不正确!");
|
}
|
var remark = "工件下线撤回";
|
if (input.Flag == 2)
|
{
|
remark = "工件出库撤回";
|
}
|
|
List<UnBoundDetailsInput> WorkPieceInfoLst = input.WorkPieceInfoLst;
|
|
var removeOutBoundList = new List<WorkPieceOutbound>();
|
var addOutBoundLogList = new List<WorkPieceOutboundRecord>();
|
|
var queryOP80NewCodeList = WorkPieceInfoLst.Select(x => x.OP80NewCode).ToList();
|
List<WorkPieceOutbound> db_WorkPieceOutboundList = await _workPieceOutboundRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
List<WorkPieceInfo> db_WorkPieceInfoList = await _workPieceInfoRep.Where(w => queryOP80NewCodeList.Contains(w.OP80NewCode) && w.IsDeleted == false).ToListAsync();
|
|
foreach (var item in WorkPieceInfoLst)
|
{
|
var itemModel = db_WorkPieceOutboundList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (itemModel != null)
|
{
|
if (input.Flag == 1 && itemModel.UnLineStage == PieceUnLineStage.已出库)
|
{
|
var createitme = itemModel.WorkPieceOutboundTime == null ? "" : (((DateTimeOffset)itemModel.WorkPieceOutboundTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}已出库,出库时间:{createitme}");
|
}
|
if (input.Flag == 2 && itemModel.UnLineStage == PieceUnLineStage.已下线)
|
{
|
var createitme = itemModel.WorkPieceUnLineTime == null ? "" : (((DateTimeOffset)itemModel.WorkPieceUnLineTime).UtcDateTime.ToString("yyyy-MM-dd HH:mm:ss"));
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}已下线,下线时间:{createitme}");
|
}
|
}
|
else
|
{
|
throw Oops.Oh($"成品码{itemModel.OP80NewCode}没有下线出库数据");
|
}
|
var workPiece = db_WorkPieceInfoList.FirstOrDefault(w => w.OP80NewCode == item.OP80NewCode);
|
if (workPiece != null)
|
{
|
workPiece.OutRemark = remark;
|
|
if (input.Flag == 1)
|
{
|
workPiece.UnLineStage = null;
|
workPiece.UnLineStageName = "";
|
workPiece.WorkPieceUnLineTime = null;
|
workPiece.WorkPieceUnLineUserId = null;
|
workPiece.WorkPieceUnLineUserName = "";
|
}
|
else
|
{
|
workPiece.UnLineStage = PieceUnLineStage.已下线;
|
workPiece.UnLineStageName = PieceUnLineStage.已下线.ToString();
|
workPiece.WorkPieceUnLineTime = DateTime.Now;
|
workPiece.WorkPieceUnLineUserId = CurrentUserInfo.UserId;
|
workPiece.WorkPieceUnLineUserName = CurrentUserInfo.Name;
|
}
|
|
|
await _workPieceInfoRep.UpdateAsync(workPiece);
|
}
|
|
|
removeOutBoundList.Add(itemModel);
|
|
var outBoundLog = new WorkPieceOutboundRecord
|
{
|
OperationType = input.Flag == 1 ? OutboundOperationType.撤销下线.ToString() : OutboundOperationType.撤销出库.ToString(),
|
WorkPieceID = workPiece?.WorkPieceID,
|
OP80NewCode = item.OP80NewCode,
|
|
CreatedUserId = CurrentUserInfo.UserId,
|
CreatedUserName = CurrentUserInfo.Name,
|
|
CarNo = itemModel.CarNo,
|
Remark = remark,
|
|
};
|
addOutBoundLogList.Add(outBoundLog);
|
|
|
|
}
|
await _workPieceOutboundRep.DeleteAsync(removeOutBoundList);
|
await _workPieceOutboundRecordRep.InsertAsync(addOutBoundLogList);
|
|
return "操作成功";
|
}
|
|
|
|
/// <summary>
|
/// 出库统计
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("getOutBoundWorkPieceInfoCountList")]
|
[DisableOpLog]
|
public async Task<List<OutBoundWorkPieceInfoCountOutput>> GetOutBoundWorkPieceInfoCountList([FromBody] OutBoundWorkPieceInfoCountInput input)
|
{
|
/*
|
//测试
|
List<OutBoundWorkPieceInfoCountOutput> outBoundWorkPieceInfoCountOutputs = new List<OutBoundWorkPieceInfoCountOutput>();
|
outBoundWorkPieceInfoCountOutputs.Add(new OutBoundWorkPieceInfoCountOutput()
|
{
|
Count = 10,
|
WorkPieceOutboundUserName = "AAA"
|
});
|
outBoundWorkPieceInfoCountOutputs.Add(new OutBoundWorkPieceInfoCountOutput()
|
{
|
Count = 99,
|
WorkPieceOutboundUserName = "BBb"
|
});
|
return outBoundWorkPieceInfoCountOutputs;
|
//*/
|
|
|
//DateTimeOffset now = DateTimeOffset.Now; // 获取当前时间,包括时区偏移量
|
DateTimeOffset now = input.Date; // 获取当前时间,包括时区偏移量
|
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<WorkPieceOutbound> db_itemModelList = await _workPieceOutboundRep.Where(w => w.CreatedTime >= startOfDay
|
&& w.CreatedTime <= endOfDay && w.IsDeleted == false).ToListAsync();
|
//汇总分组
|
var groupList = db_itemModelList.GroupBy(g => g.WorkPieceOutboundUserName).Select(s => new OutBoundWorkPieceInfoCountOutput()
|
{
|
WorkPieceOutboundUserName = s.Key,
|
Count = s.ToList().Count
|
}).ToList();
|
return groupList;
|
//*/
|
}
|
|
|
#endregion
|
|
}
|
}
|