StationForConveyorExcute.cs 17.3 KB
using HHECS.Application.Enums;
using HHECS.Application.Service;
using HHECS.BLL.EquipmentExcute;
using HHECS.BLL.EquipmentExcute.RGV;
using HHECS.BLL.Services;
using HHECS.BllModel;
using HHECS.Communication;
using HHECS.Communication.PLC;
using HHECS.Dal;
using HHECS.Dal.Repository;
using HHECS.DAL;
using HHECS.DAL.Repository;
using HHECS.Executor.EquipmentHandler;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HHECS.EquipmentExcute.CacheShelf
{
    /// <summary>
    /// 输送线站台
    /// </summary>
    public class StationForConveyorExcute : StationExecute
    {
        public StationForConveyorExcute(EquipmentType equipmentType) : base(equipmentType)
        {
        }

        /// <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
            {
                var baseMaterialRepository = new BaseMaterialRepository();
                var busWorkOrderHeadRepository = new BusWorkOrderHeadRepository();
                var busWorkOrderDetailRepository = new BusWorkOrderDetailRepository();
                var workOrderHead = new BusWorkOrderHead();
                var workOrderDetail = new BusWorkOrderDetail();
                var requestBarcode = station[StationProps.RequestBarcode.ToString()];
                var requestNumber = station[StationProps.RequestNumber.ToString()];
                if (string.IsNullOrEmpty(requestBarcode.Value))
                {
                    workOrderDetail = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.生产中 && t.EquipmentCode == station.Code).OrderBy(t => t.UpdateTime).First();
                    if (workOrderDetail == null)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,没有找到符合正在生产中并且设备等于{station.Code}工位条件的工单");
                    }
                }
                else
                {
                    var convertResult = int.TryParse(requestBarcode.Value, out int BarCode);
                    if (!convertResult)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,工序任务ID【{requestBarcode.Value}】转化为整数失败!");
                    }
                    if (BarCode < 1)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,工序任务ID【{requestBarcode.Value}】不能小于1!");
                    }
                    workOrderDetail = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.生产中 && t.BarCode == BarCode.ToString()).First();
                    if (workOrderDetail == null)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,找不到管段【{BarCode}】的工单明细数据");
                    }
                }
                var workOrderDetails = busWorkOrderDetailRepository.Where(t => t.HeadKeys == workOrderDetail.HeadKeys).ToList();
                workOrderHead = busWorkOrderHeadRepository.Where(t => t.Keys == workOrderDetail.HeadKeys).First();
                if (workOrderHead == null)
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,找不到工单数据");
                }
                //var nextOprSequenceCodeWorkOrderDetails = workOrderDetails.Where(t => t.BarCode == workOrderDetail.BarCode && t.State == (int)EnumOrderBodyStatus.初始化).OrderBy(t => t.SerialNumber).ToList();
                var material = baseMaterialRepository.Where(t => t.MaterialCode == workOrderDetail.WeldMaterCode).First();
                if (material == null)
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】地址请求失败,没有找到物料");
                }
                #region 检查工单中是否存在管段已经到某一个组队生产,如果存在,则直接去该组队工位,否则寻找联机无故障的组队工位上料
                var NextStationCode = new Equipment();
                //当前工序为2个设备对应一个工序,这里判断该工序的设备编号不为输送线,就说明已经到了组队工位了
                var temp = workOrderDetails.FirstOrDefault(t =>t.EquipmentCode!=station.Code&& t.SerialNumber == workOrderDetail.SerialNumber && t.BarCode != workOrderDetail.BarCode && t.State > (int)EnumOrderBodyStatus.初始化);
                if (temp != null)
                {
                    NextStationCode = allEquipments.FirstOrDefault(t => t.Code == temp.EquipmentCode);
                }
                else
                {
                    if (string.IsNullOrEmpty(station.GoAddress))
                    {
                        var NextStationCodes = allEquipments.Where(t => t.EquipmentTypeId == station.NextEquipmentTypeId).ToList();
                        for (int i = 0; i < NextStationCodes.Count; i++)
                        {
                            var operationModel = NextStationCodes[i][StationProps.OperationModel.ToString()];
                            var totalError = NextStationCodes[i][StationProps.TotalError.ToString()];
                            var allowEntry = NextStationCodes[i][StationProps.AllowEntry.ToString()];
                            if (operationModel?.Value != OperationModelFlag.Online.GetIndexString() || totalError?.Value != TotalErrorFlag.Normal.GetIndexString() || allowEntry?.Value != StationAllowEntry.Allow.GetIndexString())
                            {
                                NextStationCodes.RemoveAt(i);
                            }
                        }
                        // 优先去二号组队,防止堵塞
                        NextStationCodes = NextStationCodes.OrderByDescending(t => t.Code).ToList();
                        if (NextStationCodes.Any())
                        {
                            NextStationCode = NextStationCodes[0];
                        }
                        else
                        {
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】地址请求失败,下个设备{station.GoAddress}没有找到,请检查设备表的自身地址");
                        }

                    }
                    else
                    {
                        NextStationCode = allEquipments.Where(t => t.SelfAddress == station.GoAddress).FirstOrDefault();
                    }
                }
                #endregion


                workOrderDetail.StationCode = NextStationCode.WorkStationCode;
                workOrderDetail.EquipmentCode = NextStationCode.Code;
                workOrderDetail.ActualEndTime = DateTime.Now;
                workOrderDetail.State = (int)EnumOrderBodyStatus.运输中;
                workOrderDetail.UpdateTime = DateTime.Now;
                workOrderDetail.UpdateBy = user.UserCode;


                //设置工序任务头
                var otherPipeOrder = workOrderDetails.Where(t => t.SerialNumber == workOrderDetail.SerialNumber && t.BarCode != workOrderDetail.BarCode && t.State < (int)EnumOrderBodyStatus.已完成).ToList();
                //判断是否为工单中的第一个单管,当前工位工序,只在第一个单管执行。下个工位工序,只在最后一个单管执行
                if (!otherPipeOrder.Any())
                {
                    workOrderHead.NextStationCode = NextStationCode.WorkStationCode;
                    workOrderHead.UpdateTime = DateTime.Now;
                    workOrderHead.UpdateBy = user.UserCode;
                }
                using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                {
                    try
                    {
                        busWorkOrderHeadRepository.UnitOfWork = uw;
                        busWorkOrderHeadRepository.Update(workOrderHead);

                        busWorkOrderDetailRepository.UnitOfWork = uw;
                        busWorkOrderDetailRepository.Update(workOrderDetail);

                        var sendResult = SendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, requestNumber.Value,workOrderDetail.BarCode.ToString(), NextStationCode.SelfAddress, "0",material.TypesPlcCode, (decimal)workOrderDetail.CuttingLength, material.Diameter, material.Thickness);
                        if (sendResult.Success)
                        {
                            uw.Commit();
                            return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,管段编码【{workOrderDetail.BarCode}】信息写入设备成功");
                        }
                        else
                        {
                            uw.Rollback();
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,管段编码【{workOrderDetail.BarCode}】信息写入设备失败,原因:{sendResult.Msg}");
                        }
                    }
                    catch (Exception ex)
                    {
                        uw.Rollback();
                        return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】的设备【{station.Name}】地址请求失败,处理管段编码【{workOrderDetail.BarCode}】信息发生异常,原因:{ex.Message}");
                    }
                }
            }
            catch (Exception ex)
            {

                return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,异常原因:{ex.Message}");
            }
        }


        /// <summary>
        /// 位置到达的处理
        /// 注意:allEquipments引用所有设备,此为共享应用
        /// </summary>
        /// <param name="station"></param>
        /// <param name="allEquipments"></param>
        /// <param name="plc"></param>
        /// <returns></returns>
        public override BllResult ExcuteArrive(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            try
            {
                var arriveBarcode = station[StationProps.ArriveBarcode.ToString()];
                var number = station[StationProps.ArriveRealAddress.ToString()];
                var baseMaterialRepository = new BaseMaterialRepository();
                var busWorkOrderHeadRepository = new BusWorkOrderHeadRepository();
                var busWorkOrderDetailRepository = new BusWorkOrderDetailRepository();
                var workOrderDetail = new BusWorkOrderDetail();
                var workOrderHead = new BusWorkOrderHead();
                if (string.IsNullOrEmpty(arriveBarcode.Value))
                {
                    workOrderDetail = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.运输中 && t.EquipmentCode == station.Code).OrderBy(t => t.UpdateTime).First();
                    if (workOrderDetail == null)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,没有找到符合正在运输中并且s设备等于{station.Code}工位条件的工单");
                    }
                }
                else
                {
                    var convertResult = int.TryParse(arriveBarcode.Value, out int BarCode);
                    if (!convertResult)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,工序任务ID【{arriveBarcode.Value}】转化为整数失败!");
                    }
                    if (BarCode < 1)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,工序任务ID【{arriveBarcode.Value}】不能小于1!");
                    }
                    workOrderDetail = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.运输中 && t.BarCode == BarCode.ToString()).First();
                    if (workOrderDetail == null)
                    {
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,找不到管段【{BarCode}】的工单明细数据");
                    }
                }
                var workOrderDetails = busWorkOrderDetailRepository.Where(t => t.HeadKeys == workOrderDetail.HeadKeys).ToList();
                workOrderHead = busWorkOrderHeadRepository.Where(t => t.Keys == workOrderDetail.HeadKeys).First();
                if (workOrderHead == null)
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,找不到工单数据");
                }
                var material = baseMaterialRepository.Where(t => t.MaterialCode == workOrderDetail.WeldMaterCode).First();
                if (material == null)
                {
                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达失败,没有找到物料");
                }

                var otherPipeOrder = workOrderDetails.Where(t => t.SerialNumber == workOrderDetail.SerialNumber && t.BarCode != workOrderDetail.BarCode && t.State > (int)EnumOrderBodyStatus.运输中).ToList();
                //判断是否为工单中的第一个单管,当前工位工序,只在第一个单管执行。下个工位工序,只在最后一个单管执行
                if (!otherPipeOrder.Any())
                {
                    //工单头,只有在第一根管材的时候才修改时间
                    workOrderHead.NowOprSequenceCode = workOrderDetail.OprSequenceCode;
                    workOrderHead.NowStationCode = workOrderDetail.StationCode;
                }

                workOrderDetail.State = (int)EnumOrderBodyStatus.生产中;
                workOrderDetail.EquipmentCode = station.Code;
                workOrderDetail.StationCode = station.WorkStationCode;
                workOrderDetail.UpdateBy = user.UserCode;
                workOrderDetail.ActualEndTime = DateTime.Now;


                using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                {
                    try
                    {
                        busWorkOrderHeadRepository.UnitOfWork = uw;
                        busWorkOrderHeadRepository.Update(workOrderHead);
                        busWorkOrderDetailRepository.UnitOfWork = uw;
                        busWorkOrderDetailRepository.Update(workOrderDetail);

                        BllResult sendResult = SendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply, number.Value, workOrderDetail.BarCode, "0", 0, material.TypesPlcCode, (decimal)workOrderDetail.CuttingLength, material.Diameter, material.Thickness);
                        if (sendResult.Success)
                        {
                            uw.Commit();
                            return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达成功,管段条码【{workOrderDetail.BarCode}】信息写入设备成功");
                        }
                        else
                        {
                            uw.Rollback();
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败,库存id【{workOrderDetail.BarCode}】信息写入设备失败,原因:{sendResult.Msg}");
                        }
                    }
                    catch (Exception ex)
                    {
                        uw.Rollback();
                        return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达的时候,处理库存id【{workOrderDetail.BarCode}】信息发生异常,原因:{ex.Message}");
                    }
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败时候,异常原因:{ex.Message}");
            }
        }

    }
}