You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
8.7 KiB

using Microsoft.AspNetCore.Mvc;
using StackExchange.Profiling;
using zzz.Common.Helper;
using zzz.Model;
using zzz.Model.Entity;
using zzz.Repository;
using zzz.Services.ERP.Dtos;
using zzz.Tasks;
namespace zzz.Api.Controllers
{
/// <summary>
/// 余宏大屏数据
/// </summary>
[ApiController]
[Route("api/[controller]/[action]")]
public class BigScreenController : BaseApiController
{
private readonly ILogger<ApiActiveController> _logger;
private readonly IBaseRepository<plan_order> _planOrderRep;
private readonly IBaseRepository<salesout_delivery_order> _salesout_delivery_orderRep;
private readonly IBaseRepository<EqmtCollectAddData> _eqmtAddRep;
private readonly IBaseRepository<EqmtBase> _eqmtBaseRep;
private readonly IBaseRepository<EqmtPubData> _eqmtPubRep;
/// <summary>
/// 余宏大屏数据
/// </summary>
/// <param name="planOrderRep"></param>
/// <param name="salesout_delivery_orderRep"></param>
/// <param name="logger"></param>
public BigScreenController(
IBaseRepository<plan_order> planOrderRep,
IBaseRepository<salesout_delivery_order> salesout_delivery_orderRep,
IBaseRepository<EqmtCollectAddData> eqmtAddRep,
IBaseRepository<EqmtBase> eqmtBaseRep,
IBaseRepository<EqmtPubData> eqmtPubRep,
ILogger<ApiActiveController> logger
)
{
_planOrderRep = planOrderRep;
_salesout_delivery_orderRep = salesout_delivery_orderRep;
_eqmtAddRep = eqmtAddRep;
_eqmtBaseRep = eqmtBaseRep;
_eqmtPubRep = eqmtPubRep;
_logger = logger;
}
/// <summary>
/// 工单列表数据
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task< MessageModel<List<plan_order_output>>> getPlanOrderList()
{
var orderList = await _planOrderRep.QueryAsync(x => x.FSTATUS != "结案" && x.FSTART_DATE.Length > 0);
var ret = orderList.OrderByDescending(x=>x.FBILL_NO).Take(50).AsEnumerable().MapToList<plan_order, plan_order_output>();
foreach (var item in ret)
{
item.FBILL_NO = " " + item.FBILL_NO;
}
return Success(ret.ToList());
}
/// <summary>
/// 工单详情
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<plan_order_output>> getPlanOrderDetail(long fentryId)
{
var orderInfo = await _planOrderRep.FirstOrDefaultAsync(x=>x.FENTRY_ID == fentryId);
var ret = orderInfo.MapTo<plan_order, plan_order_output>();
return Success(ret);
}
/// <summary>
/// 动态月订单信息数据
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<MonthDataOutput>> getMonthData()
{
var ret = new MonthDataOutput() {
ProductQty = new ProductQtyDto(),
EqmtRate = new LineRateDto(),
ProductOKRate = new List<ProductOkRateDto>(),
};
var exceptDate = new DateTime(1900, 01, 01);
var monthFirstDat = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
//设备列表
var eqmtList = await _eqmtBaseRep.QueryAsync();
//生产工单
var MoList = await _planOrderRep.QueryAsync(
x => x.FPLAN_FINISH_DATE.StartsWith(DateTime.Now.ToString("yyyy-MM"))
); //本月数据
//生产计划达成率
var moTotalCnt = MoList.Where(x => x.FPLAN_FINISH_DATE.ObjToDate(exceptDate).Date <= DateTime.Now.Date).Count();
if (moTotalCnt > 0)
{
var completeList = new List<string>() { "结案", "完工" };
var completeCnt = MoList.Where(x => x.FPLAN_FINISH_DATE.ObjToDate(exceptDate).Date <= DateTime.Now.Date && completeList.Contains(x.FSTATUS)).Count();
ret.MoCompleteRate = Math.Round(completeCnt.ObjToDecimal() / moTotalCnt.ObjToDecimal(), 4) * 100;
}
//订单交付率
var SoList = await _salesout_delivery_orderRep.QueryAsync(
x => x.FDATE.StartsWith(DateTime.Now.ToString("yyyy-MM"))
); //本月数据
var soCount = SoList.Where(x => x.FDATE.ObjToDate(exceptDate).Date <= DateTime.Now.Date).Count();
if (soCount>0)
{
var soCompleteCnt = SoList.Where(x => x.FDATE.ObjToDate(exceptDate).Date <= DateTime.Now.Date && x.FREAL_QTY > 0).Count();
ret.PoCompleteRate = Math.Round(soCompleteCnt.ObjToDecimal() / soCount.ObjToDecimal(), 4) * 100;
}
//月产量 _eqmtAddRep
var productType = (await _eqmtBaseRep.QueryAsync()).Select(x => x.product).Distinct();
ret.ProductQty.xAxis.type = "category";
ret.ProductQty.xAxis.data = new List<string>();
for (int i = 6; i >= 0 ; i--)
{
ret.ProductQty.xAxis.data.Add(DateTime.Now.Date.AddDays(-i).ToString("MM-dd"));
}
var addList = await _eqmtAddRep.QueryAsync(x => x.add_datetime >= DateTime.Now.Date.AddDays(-6).Date);
//var addList = await _eqmtAddRep.QueryAsync();
foreach (var t in productType)
{
seriesDto s = new seriesDto();
s.name = t;
s.type = "bar";
s.data = new List<decimal>();
for (int i = 6; i >= 0; i--)
{
var day = DateTime.Now.Date.AddDays(-i).Date;
var sumQty = addList.Where(x => x.add_datetime.Value.Date == day && x.product == t).Sum(x => x.add_qty_ok);
s.data.Add(sumQty);
}
ret.ProductQty.series.Add(s);
}
//设备利用率
ret.EqmtRate.xAxis.data = (await _eqmtBaseRep.QueryAsync()).Select(x => x.line_name).ToList();
var pubList = await _eqmtPubRep.QueryAsync(x => x.gmt_create >= monthFirstDat);
seriesDto01 newSeries = new seriesDto01();
foreach (var item in eqmtList)
{
var totalTime = pubList.Where(x => x.eqmt_id == item.eqmt_id).Sum(x => x.intraday_eqmt_run_time);
var workTime = pubList.Where(x => x.eqmt_id == item.eqmt_id).Sum(x => x.intraday_eqmt_work_time);
if (totalTime > 0)
{
newSeries.data.Add(Math.Round((decimal)workTime / totalTime, 4)*100);
}
else
{
newSeries.data.Add(0);
}
}
ret.EqmtRate.series.Add(newSeries);
//合格率
var addListMonth = await _eqmtAddRep.QueryAsync(x => x.add_datetime >= monthFirstDat);
foreach (var item in productType)
{
ProductOkRateDto newOK = new ProductOkRateDto();
newOK.ProductName = item;
var okQty = addListMonth.Where(x => x.product == item).Sum(x => x.add_qty_ok);
var ngQty = addListMonth.Where(x => x.product == item).Sum(x => x.add_qty_ng);
if (okQty > 0 || ngQty>0)
{
newOK.OKRate = Math.Round((decimal)okQty / (okQty + ngQty), 4) * 100;
}
ret.ProductOKRate.Add(newOK);
}
return Success(ret);
}
/// <summary>
/// 设备信息
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<EqmtInfoOutput>>> getEqmtDetailList()
{
List<EqmtInfoOutput> ret = new List<EqmtInfoOutput>();
//设备列表
var eqmtList = await _eqmtBaseRep.QueryAsync();
var pubList = await _eqmtPubRep.QueryAsync(x => x.gmt_create >= DateTime.Now.Date);
foreach (var item in eqmtList)
{
EqmtInfoOutput newOne = new EqmtInfoOutput();
var lastInfo = pubList.Where(x => x.eqmt_id == item.eqmt_id).OrderByDescending(x => x.gmt_create).FirstOrDefault();
if (lastInfo != null)
{
newOne = lastInfo.MapTo<EqmtPubData, EqmtInfoOutput>();
}
else
{
}
newOne.eqmt_name = eqmtList.Where(x => x.eqmt_id == item.eqmt_id).FirstOrDefault()?.line_name;
ret.Add(newOne);
}
return Success(ret);
}
}
}