FitUpExcute.cs 17.8 KB
using HHECS.Application.Enums;
using HHECS.Application.Service;
using HHECS.BllModel;
using HHECS.Communication;
using HHECS.Communication.PLC;
using HHECS.Dal;
using HHECS.Dal.Repository;
using HHECS.DAL.Repository;
using HHECS.Executor.EquipmentHandler;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using HHHECS.Model.Enums;
using System;
using System.Collections.Generic;
using System.Linq;

namespace HHECS.BLL.EquipmentExcute.Machine
{
    /// <summary>
    /// 组对
    /// </summary>
    public class FitUpExcute : StationExecute
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="timeSpace"></param>
        /// <param name="origin"></param>
        /// <param name="referer"></param>
        /// <param name="sendNoneGoodsPointsUrl"></param>
        public FitUpExcute(EquipmentType equipmentType) : base(equipmentType)
        {
        }
        int toadd = 0;
        public override BllResult ExcuteWCSControl(Equipment station, List<Equipment> allEquipments, PLCCore plc, User user)
        {
            var OperationModel = station[StationProps.OperationModel.ToString()];
            var Status = station[StationProps.Status.ToString()];
            var TotalError = station[StationProps.TotalError.ToString()];
            if (Status.Value != EquipmentStatus.空闲.GetIndexString())
            {
                return BllResultFactory.Success($"");
            }
            var weldTechnologyEquipmentRepository = DALHelper.GetFreeSql().GetRepository<BaseWeldTechnologyEquipment>();
            //该设备 创建时间最新的数据 下发
            var weldTechnologyEquipments = weldTechnologyEquipmentRepository
                                                    .Where(u => u.sendStatus == (int)WeldTechnologyEquipmentStatus.init && u.equipmentCode == station.Code)
                                                    .OrderByDescending(u => u.createTime)
                                                    .ToList();
            var sendData = new BaseWeldTechnologyEquipment();
            if (weldTechnologyEquipments.Count < 1)
            {
                return BllResultFactory.Success();
            }
            //查找最近一条数据是1分钟之内的就发送给PLC,其余数据状态全部修改为“过期”
            foreach (var item in weldTechnologyEquipments)
            {
                item.sendStatus = (int)WeldTechnologyEquipmentStatus.expire;
                item.updateTime = DateTime.Now;
                item.updateBy = "ECS";
            }
            var dateDiff = DateTime.Now.Subtract((DateTime)weldTechnologyEquipments.First().createTime).Duration().TotalSeconds;
            if ((int)dateDiff < 60)
            {
                sendData = weldTechnologyEquipments[0];
                sendData.sendStatus = (int)WeldTechnologyEquipmentStatus.success;
                //移除可以发送的数据,防止更新过期数据的时候把可以发送的数据同步更新成过期数据
            }
            using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
            {
                try
                {
                    weldTechnologyEquipmentRepository.UnitOfWork = uw;
                    var issend = weldTechnologyEquipments.Where(t => t.sendStatus == (int)WeldTechnologyEquipmentStatus.success).ToList();

                    if (!issend.Any())
                    {
                        weldTechnologyEquipmentRepository.Update(weldTechnologyEquipments);
                        uw.Commit();
                        return BllResultFactory.Create(BllResultCode.Info, $"工位【{station.WorkStationCode}】的设备【{station.Name}】处理过期数据成功");
                    }
                    //响应设备
                    var sendResult = SendControlToPLC(station, plc, StationMessageFlag.WCSControl, "1", "0", sendData.Id.ToString(), sendData.material, Convert.ToInt32(sendData.pipeLength), sendData.minDiameter, sendData.minThickness, sendData.minWeldingSeam.ToString());
                    if (sendResult.Success)
                    {
                        weldTechnologyEquipmentRepository.Update(weldTechnologyEquipments);
                        uw.Commit();
                        return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】下发焊接工艺参数成功,最小管径:[{sendData.minDiameter}],最小壁厚:[{sendData.minThickness}],材质:[{sendData.material}],最小焊缝:[{sendData.minWeldingSeam}]!");
                    }
                    else
                    {
                        weldTechnologyEquipments.ForEach(t => { t.sendStatus = (int)WeldTechnologyEquipmentStatus.fail; });
                        weldTechnologyEquipmentRepository.Update(weldTechnologyEquipments);
                        uw.Commit();
                        return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】下发焊接工艺参数失败,工艺参数设备id【{sendData.Id}】的信息写入PLC失败,原因:{sendResult.Msg}");
                    }
                }
                catch (Exception ex)
                {
                    uw?.Rollback();
                    return BllResultFactory.Exception(ex, $"处理工位【{station.WorkStationCode}】的设备【{station.Name}】下发焊接工艺参数时候,处理在工艺参数设备id【{sendData.Id}】发生异常,原因:{ex.Message}");
                }
            }

        }
        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();
                    if (cutplandilt == null)
                    {
                        return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,没有找到切割明细");
                    }
                    //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}】信息写入设备成功");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        else if (cutplandilt[0].flowOrientation1 == "W")
                        {
                            gotoadd = 1008;
                            cutplandilt[0].Extend2 = gotoadd.ToString();
                            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", gotoadd.ToString(), "0");
                            if (sendResult.Success)
                            {
                                //WebApiService.Layingoff(cutplandilt[0].BarCode, gotoadd.ToString());//告诉mes在哪下料
                                uw.Commit();
                                return BllResultFactory.Success($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,工单id【{cutplandilt[0].Id}】信息写入设备成功");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        else if (cutplandilt[0].flowOrientation1 == "L")
                        {
                            toadd--; //全局变量,每次进来+1
                            if (toadd > 1007 || toadd < 1005) toadd = 1007;
                            cutplandilt[0].Extend2 = toadd.ToString();
                            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", 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}】信息写入设备成功");
                            }
                            else
                            {
                                uw.Rollback();
                                return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,工单id【{cutplandilt[0].Id}】信息写入设备失败,原因:{sendResult.Msg}");
                            }
                        }
                        else
                        {
                            return BllResultFactory.Error($"处理切割工位【{station.WorkStationCode}】设备【{station.Name}】地址请求下料失败,工单id【{cutplandilt[0].Id}】存在没有的下料工位,请检查套料数据");
                        }

                        //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}");
            }
        }
        /// <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
        //    {
        //        BaseWeldTechnologyEquipment baseTaskEquipment;
        //        var taskEquipmentRepository = DALHelper.GetFreeSql().GetRepository<BaseWeldTechnologyEquipment>();
        //        var requestBarcode = station[StationProps.RequestBarcode.ToString()];
        //        var requestNumber = station[StationProps.RequestNumber.ToString()];
        //        if (string.IsNullOrEmpty(requestBarcode.Value))
        //        {
        //            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,PLC上传的任务号为空");

        //        }
        //        else
        //        {
        //            var convertResult = int.TryParse(requestBarcode.Value, out int BarCode);
        //            if (!convertResult)
        //            {
        //                return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,PLC上传的任务号【{requestBarcode.Value}】转化为整数失败!");
        //            }
        //            if (BarCode < 1)
        //            {
        //                return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,PLC上传的任务号【{requestBarcode.Value}】不能小于1!");
        //            }

        //            baseTaskEquipment = taskEquipmentRepository.Where(t => t.taskNo == BarCode.ToString() && t.equipmentCode == station.Code).First();
        //            if (baseTaskEquipment == null)
        //            {
        //                return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】 地址请求失败,找不到任务号【{BarCode}】的数据");
        //            }
        //        }
        //        var sendResult = SendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ControlReply, "0", "0", "0", 0, 0, 0, 0, 0);
        //        if (sendResult.Success)
        //        {
        //            WebApiService.SendEndTask(baseTaskEquipment.taskNo, baseTaskEquipment.equipmentCode);
        //            return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】设备【{station.Name}】地址请求成功,任务号【{baseTaskEquipment.taskNo}】上传中控成功");
        //        }
        //        else
        //        {
        //            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】设备【{station.Name}】地址请求失败,任务号【{baseTaskEquipment.taskNo}】上传中控失败,原因:{sendResult.Msg}");

        //        }
        //    }
        //    catch (Exception ex)
        //    {

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

    }
}