leiqunqing
2026-01-19 ba8aa925e7901381ceb394adb53eca8723d1c4c5
´úÂë¹ÜÀí/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ScanStationService.cs
@@ -1,20 +1,224 @@
using System;
using Autofac.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.PLCEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.BasicInfo;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
namespace WIDESEAWCS_BasicInfoService
{
    public class ScanStationService : ServiceBase<Dt_ScanStation, IRepository<Dt_ScanStation>>, IScanStationService
    {
        public ScanStationService(IRepository<Dt_ScanStation> BaseDal) : base(BaseDal)
        private readonly IFormulaService _formulaService;
        private readonly IFormulaDetailService _formulaDetailService;
        public ScanStationService(IRepository<Dt_ScanStation> BaseDal,
            IFormulaService formulaService,
            IFormulaDetailService formulaDetailService
            ) : base(BaseDal)
        {
            _formulaService = formulaService;
            _formulaDetailService = formulaDetailService;
        }
        public IRepository<Dt_ScanStation> Repository => BaseDal;
        /// <summary>
        /// å¯åЍPLC
        /// </summary>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        /// <summary>
        public WebResponseContent StartPLC(bool isStop)
        {
            try
            {
                OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "主控PLC") as OtherDevice;
                if (device == null) throw new Exception("未找到主控PLC设备信息");
                if (!device.IsConnected) throw new Exception($"主控PLC设备通讯异常");
                if (isStop)
                {
                    device.SetValue(W_PLCDBName.wboolAutoStart, false);
                    //暂停信号
                    device.SetValue(W_PLCDBName.wboolAutoPause, false);
                    return WebResponseContent.Instance.OK();
                }
                var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
                var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
                var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
                var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
                if (Heart && !EMG && OnlineExecuting && !Error)
                {
                    device.SetValue(W_PLCDBName.wboolAutoStart, true);
                    //暂停信号
                    device.SetValue(W_PLCDBName.wboolAutoPause, false);
                    return WebResponseContent.Instance.OK();
                }
                return WebResponseContent.Instance.Error("设备不是在线状态");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// æš‚停/恢复PLC(双向控制)
        /// </summary>
        /// <param name="isPause">是否为暂停操作:true=暂停,false=恢复</param>
        /// <returns>统一格式的响应结果</returns>
        public WebResponseContent PausePLC(bool isPause)
        {
            try
            {
                OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "主控PLC") as OtherDevice;
                if (device == null) throw new Exception("未找到主控PLC设备信息");
                if (!device.IsConnected) throw new Exception($"主控PLC设备通讯异常");
                var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
                var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
                var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
                if(!device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart))
                {
                    return WebResponseContent.Instance.Error("设备未启动");
                }
                if (!Heart || EMG || Error)
                {
                    return WebResponseContent.Instance.Error("设备状态异常,无法执行暂停/恢复操作");
                }
                device.SetValue(W_PLCDBName.wboolAutoPause, isPause);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// è¿”回信号
        /// </summary>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public WebResponseContent GetSignalStates()
        {
            OtherDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceName == "主控PLC") as OtherDevice;
            if (device == null) throw new Exception("未找到主控PLC设备信息");
            if (!device.IsConnected) throw new Exception($"主控PLC设备通讯异常");
            //获取信号灯状态
            var Heart = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolHeart);
            var EMG = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolEMG);
            var AutoExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolAutoExecuting);
            var OnlineExecuting = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolOnlineExecuting);
            var Error = device.GetValue<R_PLCDBName, bool>(R_PLCDBName.rboolError);
            //获取启动暂停状态
            var IsStarted = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoStart);
            var IsPaused = device.GetValue<W_PLCDBName, bool>(W_PLCDBName.wboolAutoPause);
            //返回对象
            var responseData = new
            {
                // ä¿¡å·ç¯çŠ¶æ€æ•°ç»„ï¼ˆä¿æŒåŽŸæœ‰é¡ºåºï¼‰
                signalStates = new bool[] { Heart, EMG, AutoExecuting, OnlineExecuting, Error },
                // PLC启动/暂停状态对象
                plcStatus = new
                {
                    isStarted = IsStarted,
                    isPaused = IsPaused
                }
            };
            return WebResponseContent.Instance.OK(data: responseData);
        }
        /// <summary>
        /// èŽ·å–æˆå“ä¿¡æ¯
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetLeftInitialData()
        {
            try
            {
                Dt_ScanStation dt_ScanStation = BaseDal.QueryFirst(x => x.StationCode == "001");
                if (dt_ScanStation == null)
                {
                    return WebResponseContent.Instance.Error("未找到工位编码为001的工位信息");
                }
                Dt_Formula dt_Formula = _formulaService.Repository.QueryFirst(x => x.ProductCode == dt_ScanStation.StationEndProduct);
                if (dt_Formula == null)
                {
                    return WebResponseContent.Instance.Error($"未找到成品编号【{dt_ScanStation.StationEndProduct}】对应的配方信息");
                }
                List<Dt_FormulaDetail> dt_FormulaDetails = _formulaDetailService.Repository.QueryData(x => x.FormulaId == dt_Formula.Id);
                var responseData = new
                {
                    finishedProductId = dt_Formula.Id,
                    finishedProduct = dt_Formula.ProductCode,
                    leftPartCodes = new List<string>(),
                    leftPartIds = new List<int>(),
                    leftPartChecked = new List<int>()
                };
                foreach (var detail in dt_FormulaDetails.Take(10))
                {
                    responseData.leftPartCodes.Add(detail.ComponentCode ?? "");
                    responseData.leftPartIds.Add(detail.Id);
                    responseData.leftPartChecked.Add(detail.IsScanned);
                }
                int needFillCount = 10 - responseData.leftPartCodes.Count;
                for (int i = 0; i < needFillCount; i++)
                {
                    responseData.leftPartCodes.Add("");
                    responseData.leftPartIds.Add(0);
                    responseData.leftPartChecked.Add(0);
                }
                return WebResponseContent.Instance.OK("获取左侧初始数据成功", responseData);
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error($"获取左侧初始数据失败,请稍后重试【{ex.Message}】");
            }
        }
        /// <summary>
        /// æ›´æ–°æ˜¯å¦æ‰«ç 
        /// </summary>
        /// <param name="updatePartScannedStatusRequest"></param>
        /// <returns></returns>
        public WebResponseContent UpdatePartScannedStatus(UpdatePartScannedStatusRequest updatePartScannedStatusRequest)
        {
            try
            {
                Dt_FormulaDetail dt_FormulaDetail = _formulaDetailService.Repository.QueryFirst(x => x.Id == updatePartScannedStatusRequest.Id);
                dt_FormulaDetail.IsScanned = updatePartScannedStatusRequest.IsScanned;
                bool flag = _formulaDetailService.Repository.UpdateData(dt_FormulaDetail);
                if (flag)
                {
                    return WebResponseContent.Instance.OK();
                }
                return WebResponseContent.Instance.Error("更新错误");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("获取数据失败");
            }
        }
    }
}