MeasureExcute.cs 17.1 KB
using HHECS.Application.Enums;
using HHECS.Application.Service;
using HHECS.BllModel;
using HHECS.Communication.PLC;
using HHECS.Dal;
using HHECS.Dal.Repository;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Model.Dtos;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using HHECS.Model.Enums.Machine;
using NPOI.SS.Formula.Functions;
using NPOI.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HHECS.Executor.EquipmentHandler.Machine
{
    /// <summary>
    /// 测长设备处理类
    /// </summary>
    public class MeasureExcute : StationExecute
    {
        /// <summary>
        /// 对应的设备类型
        /// </summary>
        public EquipmentType EquipmentType { get; set; }

        /// <summary>
        /// 用于可用存储设备列表
        /// </summary>
        public List<Equipment> Equipments { get; set; }

        public MeasureExcute(EquipmentType equipmentType) : base(equipmentType)
        {
        }
        /// <summary>
        /// 测长的控制指令
        /// </summary>
        /// <param name="station"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public override BllResult ExcuteWCSControl(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            var controlType = station[StationProps.AllowEntry.ToString()];//判断PLC是否允许放货信号
            if (controlType != null)
            {
                if (controlType.Value == "1")//允许下发数据
                {
                    return ExcuteWCSControlToMeasure(station, allEquipments, plc, user);
                }
                else if (controlType.Value == "2")
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】PLC禁止下发测长数据,请检查测长口是否有货!");
                }
                else
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】执行WCS发给PLC的控制指令失败,任务类型【{controlType.Value}】没有做对应的处理!");
                }
            }
            else
            {
                return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】执行WCS发给PLC的控制指令失败,设备属性中不存在任务类型【ControlType】");
            }
        }
        /// <summary>
        /// 地址请求的处理,测长设备的标准版
        /// 注意:allEquipments引用所有设备,此为共享应用
        /// </summary>
        /// <param name="station"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public override BllResult ExcuteRequest(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            try
            {
                BaseLoaderTaskRepository baseLoaderTaskRepository = new BaseLoaderTaskRepository();
                var requestBarcode = station[StationProps.RequestBarcode.ToString()];
                var requestNumber = station[StationProps.RequestNumber.ToString()];
                var requestLength = station[StationProps.RequestLength.ToString()];
                if (string.IsNullOrEmpty(requestBarcode.Value))
                {
                    return BllResultFactory.Error($"设备{station.Code}处理测长设备请求失败,请求的信号中无任务号信息{requestBarcode}");
                }
                else
                {
                    var baseloder = baseLoaderTaskRepository.Where(t => t.taskCode == requestBarcode.Value && t.loaderStatus == (int)BaseLoaderTaskStatus.测长上料中 && t.equipmentCode == station.Code).ToList();
                    if (baseloder == null) //如果没有在测长中的数据直接跳出
                    {
                        return BllResultFactory.Error($"设备{station.Code}处理测长设备请求失败,暂无可处理测长信号的数据条码{requestBarcode}");
                    }
                    else//如果存在
                    {
                        using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                        {
                            if (requestNumber.Value == baseloder[0].loaderNum.ToString())
                            {
                                baseloder[0].loaderStatus = (int)BaseLoaderTaskStatus.测长成功;
                                baseloder[0].updateTime = DateTime.Now;
                                baseloder[0].feedbackNum = requestNumber.Value;
                                baseLoaderTaskRepository.UnitOfWork = uw;
                                baseLoaderTaskRepository.Update(baseloder[0]);
                            }
                            if (requestLength.Value == "0")
                            {
                                return BllResultFactory.Error($"设备{station.Code}处理设备测长请求失败,测长长度为{requestLength.Value}");
                            }
                            //响应设备
                            var sendResult = SendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, requestNumber.Value,
                                                               "0", station.Code, "", "0", "0", "0", "0");
                            if (sendResult.Success)
                            {
                                WebApiService.SendMeasure(baseloder[0].taskCode.ToString(), requestLength.Value, requestNumber.Value); //同步给mes
                            }
                            return BllResultFactory.Success($"设备{station.Code}处理设备测长请求成功,已完成数量{requestNumber.Value}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Error(ex.ToString(), $"设备{station.Code}处理测长设备请求失败");
                //throw;
            }
        }
        /// <summary>
        /// 到达-->此项目弃用
        /// </summary>
        /// <param name="station"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <param name="user"></param>
        /// <returns></returns>

        public override BllResult ExcuteArrive(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            try
            {
                BaseLoaderTaskRepository baseLoaderTaskRepository = new BaseLoaderTaskRepository();

                var backup = station[StationProps.ACKBackup.ToString()]; //反馈第几根
                var length = station[StationProps.ACKLength.ToString()];//测量长度
                var barcode = station[StationProps.ACKBarcode.ToString()];//条码
                string lenghw;
                string number;
                if (string.IsNullOrEmpty(barcode.Value))
                {
                    return BllResultFactory.Error($"设备{station.Code}处理测长设备请求失败,请求的信号中无任务号信息{barcode}");
                }
                else
                {
                    var baseloder = baseLoaderTaskRepository.Where(t => t.taskCode == barcode.Value && t.loaderStatus == (int)BaseLoaderTaskStatus.测长上料中 && t.equipmentCode == station.Code).ToList();
                    if (baseloder == null) //如果没有在测长中的数据直接跳出
                    {
                        return BllResultFactory.Error($"设备{station.Code}处理测长设备请求失败,暂无可处理测长信号的数据条码{barcode}");
                    }
                    else//如果存在
                    {
                        using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                        {
                            if (backup.Value == baseloder[0].loaderNum.ToString())
                            {
                                baseloder[0].loaderStatus = (int)BaseLoaderTaskStatus.测长成功;
                                baseloder[0].updateTime = DateTime.Now;
                            }
                            baseloder[0].consumeNum = backup.Value;
                            baseLoaderTaskRepository.UnitOfWork = uw;
                            baseLoaderTaskRepository.Update(baseloder[0]);
                            if (length.Value == "0")
                            {
                                return BllResultFactory.Error($"设备{station.Code}处理设备测长请求失败,测长长度为{length.Value}");
                            }
                            lenghw = length.Value;
                            number = backup.Value;
                            //响应设备
                            var sendResult = SendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply, "0",
                                                               "0", "0", 0, 0, 0, 0, 0);
                            if (sendResult.Success)
                            {
                                uw.Commit();
                                WebApiService.SendMeasure(baseloder[0].taskCode.ToString(), lenghw, number); //同步给mes
                                return BllResultFactory.Success($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,任务号【{baseloder[0].taskCode.ToString()}】,长度:{length.Value},第【{backup.Value}】根上传中控成功");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败时候");

                            }
                            //return BllResultFactory.Success($"设备{station.Code}处理设备测长请求成功,已完成数量{backup.Value}");
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败时候,异常原因:{ex.Message}");
            }
        }
        /// <summary>
        /// 发送测长数量
        /// </summary>
        /// <param name="station"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public BllResult ExcuteWCSControlToMeasure(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            try
            {
                BaseLoaderTaskRepository baseLoaderRepository = new BaseLoaderTaskRepository();
                BaseMaterialRepository baseMaterialRepository = new BaseMaterialRepository();
                var baselodertask = baseLoaderRepository.Where(t => t.loaderStatus == (int)BaseLoaderTaskStatus.初始 && t.equipmentCode == station.Code).OrderBy(t => t.createTime).ToList();
                var baseloadertaskToPLC = baseLoaderRepository.Where(t => t.loaderStatus == (int)BaseLoaderTaskStatus.测长成功 && t.equipmentCode == station.Code).ToList();
                if (baselodertask.Any())
                {
                    var matercode = baseMaterialRepository.Where(t => t.MaterialCode == baselodertask[0].materialCode).First(); //获取管径、壁厚、材质
                    var isbaseloder = baselodertask.GroupBy(t => t.taskCode).ToList();
                    if (isbaseloder.Count > 1)
                    {
                        var msg = isbaseloder.Count > 1 ? $"存在不同测长计划" : $"没有找到可以测长的计划";
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,{msg}");
                    }
                    baselodertask[0].loaderStatus = (int)BaseLoaderTaskStatus.测长上料中;
                    baselodertask[0].updateTime = DateTime.Now;
                    using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                    {
                        try
                        {
                            var sendResult = SendControlToPLC(station, plc, StationMessageFlag.WCSControl, "1", "1", Convert.ToInt32(matercode.Diameter * 10).ToString(), Convert.ToInt32(matercode.Thickness * 10).ToString(), baselodertask[0].taskCode.ToString(), baselodertask[0].loaderNum.ToString());
                            baseLoaderRepository.UnitOfWork = uw;
                            baseLoaderRepository.Update(baselodertask[0]);
                            if (sendResult.Success)
                            {
                                uw?.Commit();
                                return BllResultFactory.Success($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求成功,条码{baselodertask[0].taskCode},测长数量{baselodertask[0].loaderNum}");
                            }
                            else
                            {
                                uw?.Rollback();
                                return BllResultFactory.Error($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,下发数据给PLC失败原因:{sendResult.Msg}");
                            }
                        }
                        catch (Exception ex)
                        {
                            uw.Rollback();
                            return BllResultFactory.Exception(ex, $"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,下发测长数据的时候发生异常:{ex.Message}");
                        }
                    }
                }
                else if (baseloadertaskToPLC.Any())
                {
                    using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                    {
                        var isbaseloder = baseloadertaskToPLC.GroupBy(t => t.taskCode).ToList();
                        if (isbaseloder.Count > 1)
                        {
                            var msg = isbaseloder.Count > 1 ? $"存在不同测长完成计划" : $"没有找到可以测长完成的计划";
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】测长请求完成失败,{msg}");
                        }
                        foreach (var item in baseloadertaskToPLC)
                        {
                            item.loaderStatus = (int)BaseLoaderTaskStatus.测长发送PLC成功;
                            item.updateTime = DateTime.Now;
                        }
                        try
                        {
                            baseLoaderRepository.UnitOfWork = uw;
                            baseLoaderRepository.Update(baseloadertaskToPLC[0]);
                            var sendResult = SendControlToPLC(station, plc, StationMessageFlag.WCSControl, "2", "0", "0", "0", "0", "0");
                            if (sendResult.Success)
                            {
                                uw?.Commit();
                                return BllResultFactory.Success($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长全部完成请求成功");
                            }
                            else
                            {
                                uw?.Rollback();
                                return BllResultFactory.Error($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求完成失败,下发数据给PLC失败原因:{sendResult.Msg}");
                            }
                        }
                        catch (Exception ex)
                        {
                            uw.Rollback();
                            return BllResultFactory.Exception(ex, $"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求完成失败,下发测长数据的时候发生异常:{ex.Message}");
                        }
                    }
                }
                else
                {
                    return BllResultFactory.Error($"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,暂无测长的数据,请检查数据");

                }
                //return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,下发测长数据的时候发生异常");
            }
            catch (Exception ex)
            {
                // uw.Rollback();
                return BllResultFactory.Exception(ex, $"处理测长工位【{station.WorkStationCode}】设备【{station.Name}】测长请求失败,下发测长数据的时候发生异常:{ex.Message}");
            }
        }

    }
}