PolishExcute.cs 19 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.Linq;

namespace HHECS.BLL.EquipmentExcute.Machine
{
    /// <summary>
    /// 自动打磨机
    /// </summary>
    public class PolishExcute : StationExecute
    {
        int toadd = 0;
        public PolishExcute(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();
                string beavl = "";
                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}工位条件的工单");
                    }
                    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();
                    var details = busWorkOrderDetailRepository.Where(t => t.State == (int)EnumOrderBodyStatus.初始化 && t.BarCode == cutplandilt.BarCode&& t.OprSequenceCode == "Bevel").OrderByDescending(t=>t.CreateTime).ToList();
                    if (details.Count == 0) //无需坡口
                    {
                        using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                        {
                            try
                            {
                                BllResult sendResult = SendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply, "0", "0", details.Count.ToString(), 0, 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【{details[0].BarCode}】信息写入设备失败,原因:{sendResult.Msg}");
                                }

                            }
                            catch (Exception ex)
                            {
                                uw.Rollback();
                                return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达的时候,处理库存id【{details[0].BarCode}】信息发生异常,原因:{ex.Message}");
                            }

                        }
                    }
                    else //需要坡口
                    {
                        workOrderHead = busWorkOrderHeadRepository.Where(t => t.Keys == details[0].HeadKeys).First();
                        if (workOrderHead == null)
                        {
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 位置到达失败,找不到工单数据");
                        }
                        var material = baseMaterialRepository.Where(t => t.MaterialCode == details[0].CutMaterCode).First();
                        if (material == null)
                        {
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达失败,没有找到物料");
                        }
                        if (!string.IsNullOrEmpty(details[0].ExtendComp2))
                        {
                            beavl = details[0].ExtendComp2;
                        }
                        else if (!string.IsNullOrEmpty(details[0].ExtendComp3))
                        {
                            beavl = details[0].ExtendComp3;
                        }
                        foreach (var item in details)
                        {
                            item.State = (int)EnumOrderBodyStatus.已完成;
                            item.EquipmentCode = station.Code;
                            item.StationCode = station.WorkStationCode;
                            item.UpdateBy = user.UserCode;
                            item.ActualEndTime = DateTime.Now;

                        }
                        using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                        {
                            try
                            {
                                cutPlandDilt.UnitOfWork = uw;
                                busWorkOrderDetailRepository.UnitOfWork = uw;
                                baseMaterialRepository.UnitOfWork = uw;
                                busWorkOrderHeadRepository.UnitOfWork = uw;
                                busWorkOrderDetailRepository.Update(details);
                                BllResult sendResult = SendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply, "0", "0", details.Count.ToString(), Convert.ToInt32(beavl) * 10, 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}】信息写入设备成功,坡口数量{details.Count.ToString()},坡口角度{Convert.ToUInt32(beavl)}");
                                }
                                else
                                {
                                    uw.Rollback();
                                    return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】位置到达失败,库存id【{details[0].BarCode}】信息写入设备失败,原因:{sendResult.Msg}");
                                }

                            }
                            catch (Exception ex)
                            {
                                uw.Rollback();
                                return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达的时候,处理库存id【{details[0].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();
                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();
                    var busworkdi = BusWorkOrderDetail.Where(t => t.BarCode == cutplandilt[0].BarCode && t.OprSequenceCode == "Cut" && t.State == 0).OrderByDescending(t => t.CreateTime).ToList();
                    if (cutplandilt == null)
                    {
                        return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,没有找到切割明细");
                    }
                    //cutplandilt[0].CutState = (int)CutPlanDetailState.切割完成;
                    var cutplanhead = cutPlanHeadRepository.Where(t => t.Keys == cutplandilt[0].HeadKeys).First();
                    if (cutplanhead == null)
                    {
                        return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,没有找到切割主表明细");
                    }
                    var materl = baseMaterialRepository.Where(t => t.MaterialCode == cutplanhead.MaterialCode).First();
                    if (materl == null)
                    {
                        return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,没有找到物料明细");
                    }
                    using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                    {
                        cutPlandDilt.UnitOfWork = uw;
                        BusWorkOrderDetail.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))
                        {
                            if (busworkdi.Count != 0)
                            {
                                busworkdi[0].State = 100;
                                busworkdi[0].UpdateTime = DateTime.Now;
                                BusWorkOrderDetail.Update(busworkdi);
                            }
                            //gotadd = Convert.ToInt32(cutplandilt[0].Extend2);
                            //cutplandilt[0].UpdateTime = DateTime.Now;
                            //cutplandilt[0].CutEndTime = DateTime.Now;
                            //cutPlandDilt.Update(cutplandilt);
                            var sendResult = NewSendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, "0", "0", "0", "0", "0", "0", Convert.ToInt32(cutplandilt[0].Cuttinglength), Convert.ToInt32(materl.Diameter), Convert.ToInt32(materl.Thickness));
                            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].Cuttinglength},管径{materl.Diameter},壁厚{materl.Thickness}");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        else
                        {
                            if (busworkdi.Count != 0)
                            {
                                busworkdi[0].State = 100;
                                busworkdi[0].UpdateTime = DateTime.Now;
                                busworkdi[0].StationCode = toadd.ToString();
                                BusWorkOrderDetail.Update(busworkdi);
                            }
                            //cutplandilt[0].Extend2 = toadd.ToString();
                            //cutplandilt[0].UpdateTime = DateTime.Now;
                            //cutplandilt[0].CutEndTime = DateTime.Now;
                            //cutPlandDilt.Update(cutplandilt);
                            var sendResult = NewSendAddressReplyToPlc(station, plc, StationMessageFlag.WCSAddressReply, StationLoadStatus.Default, "0", "0", "0", "0", "0", "0",Convert.ToInt32(cutplandilt[0].Cuttinglength), Convert.ToInt32(materl.Diameter), Convert.ToInt32(materl.Thickness));
                            if (sendResult.Success)
                            {
                                //WebApiService.Layingoff(cutplandilt[0].BarCode, toadd.ToString());//告诉mes在哪下料
                                uw.Commit();
                                return BllResultFactory.Success($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,工单id【{cutplandilt[0].Id}】信息写入设备成功,管段长度{cutplandilt[0].Cuttinglength},管径{materl.Diameter},壁厚{materl.Thickness}");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }

                        //var pland = cutPlandDilt.Where(t => t.HeadKeys == cutplandilt[0].HeadKeys && t.CutState == (int)CutPlanDetailState.切割开始).ToList();
                        //if (pland.Count == 0)
                        //{
                        //    cutPlanHeadRepository.UnitOfWork = uw;
                        //    planhead.State = (int)CutPlanHeadState.切割完成;
                        //    planhead.UpdateTime = DateTime.Now;
                        //    cutPlanHeadRepository.Update(planhead);
                        //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.SurpplusRecord(planhead.Id.ToString());
                        //    uw.Commit();
                        //    return BllResultFactory.Success($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,工单id【{cutplandilt[0].Id}】信息写入设备成功,Mes请求余料信息{planhead.Keys},主表id{planhead.Id}");
                        //}
                        //else
                        //{
                        //    uw.Rollback();
                        //    return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                        //}
                        //}

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

        }
    }
}