BoardController.cs 11.8 KB
using DataAcquisitionServer.Common.Enums;
using DataAcquisitionServer.DataAccess;
using DataAcquisitionServer.Services;
using DataAcquisitionServer.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace DataAcquisitionServer.ApiControllers
{
    /// <summary>
    /// 看板接口
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class BoardController : ControllerBase
    {
        private readonly ILogger<BoardController> _logger;
        private readonly IDbContextFactory<DataContext> _dbContextFactory;
        private readonly DataCacheService _dataCacheService;

        public BoardController(ILogger<BoardController> logger, IDbContextFactory<DataContext> dbContextFactory, DataCacheService dataCacheService)
        {
            _logger = logger;
            _dbContextFactory = dbContextFactory;
            _dataCacheService = dataCacheService;
        }

        /// <summary>
        /// 焊接看板
        /// </summary>
        /// <param name="kukaNo">机器人编号</param>
        /// <returns></returns>
        [HttpGet]
        [Route("WeldBoard/{kukaNo:int}")]
        public ActionResult<ResultVM<dynamic>> GetWeldBoard1Data(int kukaNo = 1)
        {
            var result = new ResultVM<dynamic>();
            try
            {
                //本月开始时间
                var monthStartTime = DateTime.Today.AddDays(1 - DateTime.Today.Day).Date;
                using var context = _dbContextFactory.CreateDbContext();
                var kukaEquipment = kukaNo switch
                {
                    1 => _dataCacheService.Equipments.Find(x => x.Code == EquipmentConst.Kuka_1.ToString())!,
                    2 => _dataCacheService.Equipments.Find(x => x.Code == EquipmentConst.Kuka_2.ToString())!,
                    _ => throw new NotImplementedException($"未找到编号为“{kukaNo}”的设备数据!"),
                };
                var kukaPlc = kukaNo switch
                {
                    1 or 2 => _dataCacheService.Equipments.Find(x => x.Code == EquipmentConst.KukaPLC_1.ToString())!,
                    _ => throw new NotImplementedException($"未找到编号为“{kukaNo}”的设备数据!"),
                };

                _ = double.TryParse(kukaEquipment[KukaProps.Pos_X.ToString()].Value, out var pos_X);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_Y.ToString()].Value, out var pos_Y);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_Z.ToString()].Value, out var pos_Z);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_A.ToString()].Value, out var pos_A);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_B.ToString()].Value, out var pos_B);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_C.ToString()].Value, out var pos_C);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_E1.ToString()].Value, out var pos_E1);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_E2.ToString()].Value, out var pos_E2);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_E3.ToString()].Value, out var pos_E3);
                _ = double.TryParse(kukaEquipment[KukaProps.Pos_E4.ToString()].Value, out var pos_E4);

                _ = bool.TryParse(kukaEquipment[KukaProps.Weld_CleanGun.ToString()].Value, out var weld_CleanGun);
                _ = bool.TryParse(kukaEquipment[KukaProps.WeldFlag.ToString()].Value, out var weldFlag);
                _ = bool.TryParse(kukaEquipment[KukaProps.Weld_Gas.ToString()].Value, out var weld_Gas);
                _ = bool.TryParse(kukaEquipment[KukaProps.WeldCompleteFlag.ToString()].Value, out var weldCompleteFlag);

                _ = int.TryParse(kukaEquipment[KukaProps.Weld_V.ToString()].Value, out var weld_V);
                _ = int.TryParse(kukaEquipment[KukaProps.Weld_I.ToString()].Value, out var weld_I);
                _ = int.TryParse(kukaEquipment[KukaProps.Weld_Speed.ToString()].Value, out var weld_Speed);
                _ = int.TryParse(kukaEquipment[KukaProps.Work_Mode.ToString()].Value, out var work_Mode);
                _ = int.TryParse(kukaEquipment[KukaProps.Program_No.ToString()].Value, out var program_no);
                _ = int.TryParse(kukaEquipment[KukaProps.Type.ToString()].Value, out var type);

                var days = 7;//显示最近N天的数据
                var xAxisData = Enumerable.Range(0, days).Select(x => DateTime.Today.AddDays(-x)).OrderBy(x => x).ToList();
                var vm = new Board1VM
                {
                    NowDayCountLeft = new NowDayCountLeft
                    {
                        WorkTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.Work_Time.ToString() && x.CreateTime >= DateTime.Today).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),

                        ArcingTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.WeldFlag.ToString() && x.CreateTime >= DateTime.Today).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),

                        FinishCount = context.WorkpieceProcessingRecords.Where(x => x.EquipmentId == kukaEquipment.Id && x.CreateTime >= DateTime.Today && x.IsEnd).Count(),

                        PowerTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.BootFlag.ToString() && x.CreateTime >= DateTime.Today).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2)
                    },
                    EqCenter = new EquipmentStatusVM
                    {
                        EqCode = kukaEquipment.Code,
                        EqName = kukaEquipment.Name,
                        EqState = "自动",
                        Eqmode = work_Mode switch
                        {
                            1 => "T1模式",
                            2 => "T2模式",
                            3 => "自动模式",
                            4 => "外部自动模式",
                            _ => string.Empty
                        },
                        MonthDaoDian = $"{Random.Shared.Next(10)}/个",
                        MonthGas = $"{Random.Shared.Next(100)}/m³",
                        MonthVoltage = Random.Shared.Next(100),
                        MonthWeld = Random.Shared.Next(100).ToString(),
                        NowDayVoltage = Random.Shared.Next(100),
                    },
                    MonthCountRight = new MonthCountRight
                    {
                        WorkTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.Work_Time.ToString() && x.CreateTime >= monthStartTime).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),

                        ArcingTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.WeldFlag.ToString() && x.CreateTime >= monthStartTime).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),

                        PowerTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.BootFlag.ToString() && x.CreateTime >= monthStartTime).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),

                        AlarmTime = Math.Round(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == kukaEquipment.Code && x.EquipmentPropertyCode == KukaProps.Alarm.ToString() && x.CreateTime >= monthStartTime).Sum(x => x.UpdateTime.Ticks - x.CreateTime.Ticks)).TotalHours, 2),
                    },

                    EqInfoLeft = new EquipmentInfoLeftVM
                    {
                        ClearSpearState = weld_CleanGun,
                        ArcingState = weldFlag,
                        AspiratedState = weld_Gas,
                        NowProject = "程序名称",
                        ProjectRow = program_no,
                        X = pos_X,
                        Y = pos_Y,
                        Z = pos_Z,
                        A = pos_A,
                        B = pos_B,
                        C = pos_C,
                        E1 = pos_E1,
                        E2 = pos_E2,
                        E3 = pos_E3,
                        E4 = pos_E4,
                        SsSpeed = weld_Speed,
                        Current = weld_I,
                        Voltage = weld_V,
                    },
                    EqInfoRight = new EquipmentInfoRight
                    {
                        EfficiencyList = new Efficiency
                        {
                            Arcing = xAxisData.Select(x => Convert.ToInt32(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(r => r.EquipmentCode == kukaEquipment.Code && r.EquipmentPropertyCode == KukaProps.WeldFlag.ToString() && r.CreateTime.Date == x).Sum(r => r.UpdateTime.Ticks - r.CreateTime.Ticks)).TotalMinutes)).ToList(),

                            PowerOn = xAxisData.Select(x => Convert.ToInt32(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(r => r.EquipmentCode == kukaEquipment.Code && r.EquipmentPropertyCode == KukaProps.BootFlag.ToString() && r.CreateTime.Date == x).Sum(r => r.UpdateTime.Ticks - r.CreateTime.Ticks)).TotalMinutes)).ToList(),

                            Work = xAxisData.Select(x => Convert.ToInt32(TimeSpan.FromTicks(context.EquipmentPropertyRecords.Where(r => r.EquipmentCode == kukaEquipment.Code && r.EquipmentPropertyCode == KukaProps.Work_Time.ToString() && r.CreateTime.Date == x).Sum(r => r.UpdateTime.Ticks - r.CreateTime.Ticks)).TotalMinutes)).ToList(),
                            XAxisData = xAxisData.Select(x => x.ToString("M")).ToList(),
                        },
                        ProductInfo = type.ToString(),
                        ProductState = weldCompleteFlag,
                        TimeSum = 0,
                        YieldList = new YieldListVM
                        {
                            XAxisData = xAxisData.Select(x => x.ToString("M")).ToList(),
                            Yield = xAxisData.Select(x => context.WorkpieceProcessingRecords.Where(w => w.EquipmentId == kukaEquipment.Id && w.CreateTime.Date == x.Date && w.IsEnd).Count()).ToList(),
                        }
                    },

                    CurrentList = weld_I,
                    EqEfficiencyCenter = new EquipmentEfficiencyCenter
                    {
                        AlarmRate = Random.Shared.Next(1, 100),
                        AutoRate = Random.Shared.Next(1, 100),
                        OnLineRate = Random.Shared.Next(1, 100),
                        UtilizeRate = Random.Shared.Next(1, 100),
                    },
                    VoltagetList = weld_V,
                };

                result.Data = new
                {
                    Head = new
                    {
                        vm.NowDayCountLeft,
                        vm.EqCenter,
                        vm.MonthCountRight,
                    },
                    Center = new
                    {
                        vm.EqInfoLeft,
                        vm.EqInfoRight,
                    },
                    Footer = new
                    {
                        vm.CurrentList,
                        vm.EqEfficiencyCenter,
                        vm.VoltagetList,
                    }
                };
            }
            catch (Exception ex)
            {
                result.Code = 500;
                result.Message = ex.Message;
            }
            return Ok(result);
        }
    }
}