EquipmentCommunicationExtension.cs 6.19 KB
using HHECS.BllModel;
using HHECS.Communication;
using RCS.Model.Entity;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RCS.Communication
{
    //
    // 摘要:
    //     设备通讯读写扩展类
    public static class EquipmentCommunicationExtension
    {
        public static event Action<Base_EquipmentProp[], long, BllResult> ReadRecord;

        public static event Action<Base_EquipmentProp[], long, BllResult> WriteRecord;

        //
        // 摘要:
        //     扩展单个读取
        //
        // 参数:
        //   equipmentCommunicationHub:
        //
        //   equipmentProp:
        public static BllResult Read(this IEquipmentCommunication equipmentCommunicationHub, Base_EquipmentProp equipmentProp)
        {
            try
            {
                EquipmentCommunicationObj equipmentCommunicationObj = new EquipmentCommunicationObj
                {
                    IP = equipmentProp.Equipment.Ip,
                    Address = equipmentProp.Address,
                    Value = equipmentProp.Value
                };
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Read(equipmentCommunicationObj);
                stopwatch.Stop();
                equipmentProp.Value = equipmentCommunicationObj.Value;
                EquipmentCommunicationExtension.ReadRecord?.Invoke(new Base_EquipmentProp[1] { equipmentProp }, stopwatch.ElapsedMilliseconds, bllResult);
                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }

        //
        // 摘要:
        //     扩展多个读取
        //
        // 参数:
        //   equipmentCommunicationHub:
        //
        //   equipmentProps:
        public static BllResult Reads(this IEquipmentCommunication equipmentCommunicationHub, params Base_EquipmentProp[] equipmentProps)
        {
            try
            {
                List<EquipmentCommunicationObj> list = equipmentProps.Select((Base_EquipmentProp t) => new EquipmentCommunicationObj
                {
                    IP = t.Equipment.Ip,
                    Address = t.Address,
                    Value = t.Value
                }).ToList();
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Reads(list.ToArray());
                stopwatch.Stop();
                EquipmentCommunicationExtension.ReadRecord?.Invoke(equipmentProps, stopwatch.ElapsedMilliseconds, bllResult);
                if (bllResult.Success)
                {
                    list.ForEach(delegate (EquipmentCommunicationObj t)
                    {
                        equipmentProps.First((Base_EquipmentProp a) => a.Equipment.Ip == t.IP && a.Address == t.Address).Value = t.Value;
                    });
                }

                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }

        //
        // 摘要:
        //     扩展单个写入,如果失败,固定重复尝试三次
        //
        // 参数:
        //   equipmentCommunicationHub:
        //
        //   equipmentProp:
        public static BllResult Write(this IEquipmentCommunication equipmentCommunicationHub, Base_EquipmentProp equipmentProp)
        {
            try
            {
                EquipmentCommunicationObj equipmentCommunicationObj = new EquipmentCommunicationObj
                {
                    IP = equipmentProp.Equipment.Ip,
                    Address = equipmentProp.Address,
                    Value = equipmentProp.Value
                };
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Write(equipmentCommunicationObj);
                if (!bllResult.Success)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        bllResult = equipmentCommunicationHub.Write(equipmentCommunicationObj);
                        if (bllResult.Success)
                        {
                            break;
                        }
                    }
                }

                stopwatch.Stop();
                EquipmentCommunicationExtension.WriteRecord?.Invoke(new Base_EquipmentProp[1] { equipmentProp }, stopwatch.ElapsedMilliseconds, bllResult);
                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }

        //
        // 摘要:
        //     扩展批量写入,如果失败,固定重复尝试三次
        public static BllResult Writes(this IEquipmentCommunication equipmentCommunicationHub, params Base_EquipmentProp[] equipmentProps)
        {
            try
            {
                List<EquipmentCommunicationObj> list = equipmentProps.Select((Base_EquipmentProp t) => new EquipmentCommunicationObj
                {
                    IP = t.Equipment.Ip,
                    Address = t.Address,
                    Value = t.Value
                }).ToList();
                Stopwatch stopwatch = Stopwatch.StartNew();
                BllResult bllResult = equipmentCommunicationHub.Writes(list.ToArray());
                if (!bllResult.Success)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        bllResult = equipmentCommunicationHub.Writes(list.ToArray());
                        if (bllResult.Success)
                        {
                            break;
                        }
                    }
                }

                stopwatch.Stop();
                EquipmentCommunicationExtension.WriteRecord?.Invoke(equipmentProps, stopwatch.ElapsedMilliseconds, bllResult);
                return bllResult;
            }
            catch (Exception ex)
            {
                return BllResultFactory.Exception(ex, ex.Message);
            }
        }
    }
}