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