StationForBlankingConveyorExcute.cs 5.43 KB
using HHECS.Application.Enums;
using HHECS.BllModel;
using HHECS.Communication;
using HHECS.Communication.PLC;
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;

namespace HHECS.EquipmentExcute.CacheShelf
{
    /// <summary>
    /// 输送线站台
    /// </summary>
    public class StationForBlankingConveyorExcute : StationExecute
    {
        public StationForBlankingConveyorExcute(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)
        {
            BllResult plcResult = NewSendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply,
                                                            "0", 0);
            return BllResultFactory.Success($"处理上料输送线的位置到达成功");
        }


        /// <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
            {
                BusWorkOrderDetail busWorkOrderDetail =null;
                var busWorkOrderHeadRepository = new BusWorkOrderHeadRepository();
                var busworkOrderDetailRepository = new BusWorkOrderDetailRepository();
                var stepTraceRepository = new BaseStepTraceRepository();
                // 获取位置到达的工序任务头
                var getResult = GetArriveWorkOrderHead(station, busWorkOrderHeadRepository, out BusWorkOrderHead workOrderHead);
                if (!getResult.Success) return getResult;

                //更新数据
                workOrderHead.NowOprSequenceCode = workOrderHead.NextOprSequenceCode;
                workOrderHead.NowStationCode = station.WorkStationCode;
                workOrderHead.NextOprSequenceCode = "0";
                workOrderHead.NextStationCode = "0";
                workOrderHead.State = StepTraceStatus.生产完成.GetIndexInt();
                workOrderHead.UpdateTime = DateTime.Now;
                workOrderHead.UpdateBy = user.UserCode;

                busWorkOrderDetail = busworkOrderDetailRepository.Where(x => x.OprSequenceCode == workOrderHead.NowOprSequenceCode).First();
                busWorkOrderDetail.ActualEndTime = DateTime.Now;
                busWorkOrderDetail.State = EnumWorkOrderStatus.已完成.GetIndexInt();

                var wcsProductType = DALHelper.GetFreeSql().GetRepository<BaseProductHeader>().Where(u => u.ProductCode == workOrderHead.ProductHeaderCode).First().WcsProductType;
                var arriveRealAddress = station[StationProps.ArriveRealAddress.ToString()];
                using (var uw = DALHelper.GetFreeSql().CreateUnitOfWork())
                {
                    try
                    {
                        busWorkOrderHeadRepository.UnitOfWork = uw;
                        busworkOrderDetailRepository.UnitOfWork = uw;
                        //更新工序跟踪表
                        busWorkOrderHeadRepository.Update(workOrderHead);
                        busworkOrderDetailRepository.Update(busWorkOrderDetail);
                        BllResult plcResult=NewSendAckToPlc(station, plc, StationMessageFlag.WCSPLCACK, StationLoadStatus.ArriveReply, workOrderHead.Id.ToString(), wcsProductType, "0", "0", 0);
                        if (plcResult.Success)
                        {
                            uw.Commit();
                            return BllResultFactory.Success($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达成功,在制品ID【{workOrderHead.Id}】相关信息写入设备成功");
                        }
                        else
                        {
                            uw?.Rollback();
                            return BllResultFactory.Error($"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达失败,在制品ID【{workOrderHead.Id}】信息没写入设备失败,原因:{plcResult.Msg}");
                        }
                    }
                    catch (Exception ex)
                    {
                        uw?.Rollback();
                        return BllResultFactory.Exception(ex,$"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达的时候,处理在制品ID【{workOrderHead.Id}】发生异常,原因:{ex.Message}");
                    }
                }
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex,$"处理工位【{station.WorkStationCode}】的设备【{station.Name}】位置到达时候,发生异常:{ex.Message}");
            }


        }

    }
}