ConveyingExcute.cs 16.3 KB
using HHECS.Application.Enums;
using HHECS.Application.Service;
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.Model.Entities;
using HHECS.Model.Enums;
using Microsoft.Data.SqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;

namespace HHECS.BLL.EquipmentExcute.Machine
{
    /// <summary>
    /// 自动打磨机
    /// </summary>
    public class ConveyingExcute : StationExecute
    {
        int toadd = 1009;
        public bool ISorTrue = true;
        int LStationNum = 0;
        public ConveyingExcute(EquipmentType equipmentType) : base(equipmentType)
        {

        }




        /// <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 cutPlandDilt = new CutPlanDetailRepository();
        //        var workOrderDetail = new BusWorkOrderDetail();
        //        var workOrderHead = new BusWorkOrderHead();
        //        int beavl = 0;
        //        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}】 位置到达失败,没有找到符合正在运输中并且设备等于{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!");
        //            }
        //            var cutplandilt = cutPlandDilt.Where(t => t.Id == BarCode).First();
        //            workOrderDetail = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.初始化 && t.BarCode == BarCode.ToString()&& t.OprSequenceCode == "Bevel").OrderByDescending(t=>t.CreateTime).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.CutMaterCode).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;
        //        }
        //        if (workOrderDetail.ExtendComp3!= null) //判断单坡还是双坡
        //        {
        //            beavl = beavl + 1 ;
        //        }
        //        else if (workOrderDetail.ExtendComp2 != null)
        //        {
        //            beavl = beavl+ 1;
        //        }
        //        if (workOrderDetail.Bevels1 == null)
        //        {
        //            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败,坡口角度【{arriveBarcode.Value}】,坡口信息为空,信息写入设备失败");
        //        }
        //        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, "0", "0", beavl.ToString(), Convert.ToInt32(workOrderDetail.Bevels1), 0,0,0, 0);
        //                if (sendResult.Success)
        //                {
        //                    uw.Commit();
        //                    //WebApiService.SendIWPTechnologylineProcess(workOrderHead.WorkOrderCode, workOrderDetail.BarCode, (int)EnumCutHeadState.打磨进行);
        //                    return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达成功,管段条码【{arriveBarcode.Value}】信息写入设备成功");
        //                }
        //                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}");
        //    }
        //}

        /// <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 arriveBarcode = station[StationProps.RequestBarcode.ToString()];
                var number = station[StationProps.ArriveRealAddress.ToString()];
                var baseMaterialRepository = new BaseMaterialRepository();
                var cutPlanHeadRepository = new CutPlanHeadRepository();
                var cutPlandDilt = new CutPlanDetailRepository();
                var BusWorkOrderDetail = new BusWorkOrderDetailRepository();
                var wcs_dictdetail = new DictRepository();
                var wcs_dict = new DictDetailRepository();
                int gotoadd;
                int gotadd;
                if (string.IsNullOrEmpty(arriveBarcode.Value))
                {
                    return BllResultFactory.Error($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】下料条码{arriveBarcode.Value}为空请求失败,切割方案");
                }
                else
                {
                    var cutplandilt = cutPlandDilt.Where(t => t.Id.ToString() == arriveBarcode.Value).OrderByDescending(t => t.CreateTime).ToList();
                    if (cutplandilt.Count == 0)
                    {
                        return BllResultFactory.Error($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,没有找到{arriveBarcode.Value}切割明细");
                    }
                    //cutplandilt[0].CutState = (int)CutPlanDetailState.切割完成;



                    using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                    {
                        cutPlandDilt.UnitOfWork = uw;
                        //var planhead = cutPlanHeadRepository.Where(t => t.Keys == cutplandilt[0].HeadKeys).First();

                        //var busworkorderdetail = BusWorkOrderDetail.Where(t => t.BodyKeys == cutplandilt[0].WorkOrderDetailKeys && t.OprSequenceName == "弯管" && t.State!=100).First();//如果存在弯管的给目的地为弯管机
                        if (!string.IsNullOrEmpty(cutplandilt[0].Extend2))
                        {
                            gotadd = Convert.ToInt32(cutplandilt[0].Extend2);
                            cutplandilt[0].UpdateTime = DateTime.Now;
                            cutplandilt[0].CutEndTime = DateTime.Now;
                            cutPlandDilt.Update(cutplandilt);
                            var sendResult = SendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, "0", "0", "0", cutplandilt[0].Cuttinglength.ToString(), "0", "0", gotadd.ToString(), "0");
                            if (sendResult.Success)
                            {
                                WebApiService.Layingoff(cutplandilt[0].BarCode, gotadd.ToString());//告诉mes在哪下料
                                uw.Commit();
                                return BllResultFactory.Success($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,工单id【{cutplandilt[0].Id}】信息写入设备成功,目的地{cutplandilt[0].Extend2}");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        else if (string.IsNullOrEmpty(cutplandilt[0].Extend2))
                        {
                            ///确认下料点位 多个点位轮流下料
                            var Isdict = wcs_dictdetail.Where(t => t.Code == "WorkStation").ToList();
                            //  var Expend1 = EnumStationFlowCode.L.ToString();
                            var Code = ConfigurationManager.AppSettings["LineCode"].Trim().Split(',')[0];
                            var istrue = wcs_dict.Where(t => t.DictId == Isdict[0].Id && t.Remark != "1" && t.Code == Code).ToList();
                            if (istrue.Count == 0)
                            {
                                toadd = 1006;
                            }
                            else
                            {
                                ///工位轮询取值
                                for (int i = 0; i < istrue.Count; i++)
                                {
                                    if (LStationNum >= istrue.Count)
                                    {
                                        LStationNum = 0;
                                    }
                                    if (i == LStationNum)
                                    {
                                        toadd = Convert.ToInt32(istrue[i].Value);
                                        LStationNum++;
                                        break;
                                    }
                                }
                            }
                            cutplandilt[0].UpdateTime = DateTime.Now;
                            cutplandilt[0].Extend2 = toadd.ToString();
                            // cutplandilt[0].CutEndTime = DateTime.Now;
                            cutPlandDilt.Update(cutplandilt);

                            var sendResult = SendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, "0", "0", "0", cutplandilt[0].Cuttinglength.ToString(), "0", "0", toadd.ToString(), "0");
                            if (sendResult.Success)
                            {
                                WebApiService.Layingoff(cutplandilt[0].BarCode, toadd.ToString());//告诉mes在哪下料
                                uw.Commit();
                                return BllResultFactory.Success($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,工单id【{cutplandilt[0].Id}】信息写入设备成功,目的地{toadd.ToString()}");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        {
                            return BllResultFactory.Error($"处理输送线工位【{station.WorkStationCode}】设备【{station.Name}】地址请求下料失败,工单id【{cutplandilt[0].Id}】存在没有的下料工位,请检查套料数据");
                        }
                    }
                }
            }
            catch (Exception ex)
            {

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