009_DI-Elec/Learun.Application.Web/AppApi/IOModuleApiController.cs
2025-09-22 15:42:18 +08:00

1173 lines
46 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using Learun.Application.Organization;
using Learun.Application.TwoDevelopment.ZZDT_EC;
using Learun.Application.TwoDevelopment.ZZDT_EC.Frame;
using Learun.Cache.Base;
using Learun.Cache.Factory;
using Learun.Loger;
using Learun.Util;
using Learun.Util.SqlSugar;
using log4net.Config;
using Microsoft.Practices.ObjectBuilder2;
using Newtonsoft.Json;
using Org.BouncyCastle.Bcpg.OpenPgp;
using Pipelines.Sockets.Unofficial.Arenas;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Diagnostics;
using System.Linq;
using System.Web.Http;
using static Learun.Application.TwoDevelopment.ZZDT_EC.IO_WorkFlowService;
namespace Learun.Application.Web.AppApi
{
/// <summary>
/// IO模块By YuXH
/// </summary>
[HandlerApiLogin(FilterMode.Ignore)]
public class IOModuleApiController : WebApiControllerBase
{
#region
private ec_CableBLL ec_CableBLL = new ec_CableBLL();
private ec_PanelBLL ec_PanelBLL = new ec_PanelBLL();
private ec_PanelStripBLL ec_PanelStripBLL = new ec_PanelStripBLL();
private ec_PanelStripTermBLL ec_PanelStripTermBLL = new ec_PanelStripTermBLL();
private ec_PanelChannelBLL ec_PanelChannelBLL = new ec_PanelChannelBLL();
#endregion
#region
#endregion
/// <summary>
/// 找到某一个预分配箱子 附近的某一个箱子
/// <param name="curPanelId"/>
/// <param name="frameLists"/>
/// <param name="allPanel"/>
/// <param name="allPanelProps">所有柜子的属性</param>
/// <param name="IOTypeOnCable">Digital,4-20mA,10v,pt100,pulse</param>
/// </summary>
private ec_PanelEntity FindPanelNearby(string curPanelId, List<FrameBll.FrameList> frameLists, List<ec_PanelEntity> allPanel,
Dictionary<string, List<ec_enginedata_propertyEntity>> allPanelProps, string IOTypeOnCable)
{
double GetPanelXYDistance2Target(string panelId, double targetX, double targetY)
{
var nearPanel = allPanel.FirstOrDefault(x => x.PanelID == panelId);
var nearPanelProps = allPanelProps[nearPanel.EngineerDataID];
var X = nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
X = X.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
var validFrme2 = frameLists.FirstOrDefault(f => f.Num == X);
if (validFrme2 == null)
{
return -1;//无效的肋位号导致的
}
var XValue = validFrme2.Value;
if (XValue < 400)//null也没事
{
// 小于400我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm400mm的肋位号似乎也太小了。
XValue = 1000 * XValue; // 转成mm
}
if (double.TryParse(nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue,
out double XOffValue))
{
}
else
{
return -1;//无效的x off导致的
}
if (double.TryParse(nearPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
out double YOffValue))
{
}
else
{
return -1;//无效的y off导致的
}
var distance = Math.Sqrt(Math.Pow(targetX - XValue - XOffValue, 2) + Math.Pow(targetY - YOffValue, 2));
return distance;
}
var curPanel = allPanel.FirstOrDefault(x => x.PanelID == curPanelId);
var curPanelProps = allPanelProps[curPanel.EngineerDataID];
//当前预分配的箱子的位置
var AssignPanelX = curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_Frame)?.PropertyValue;
AssignPanelX = AssignPanelX.Split(new string[] { GlobalObject.enum_separator }, StringSplitOptions.None)[0];//插件端对于下拉列表 都是 name || nameEN
var validFrme = frameLists.FirstOrDefault(X => X.Num == AssignPanelX);
if (validFrme == null)
{
return null;//无效的肋位号导致的
}
var AssignPanelXValue = validFrme.Value;
if (AssignPanelXValue < 400)//null也没事
{
// 小于400我几乎可以认为此时肋位号用的是m这个单位。因为如果用的是mm400mm的肋位号似乎也太小了。
AssignPanelXValue = 1000 * AssignPanelXValue; // 转成mm
}
if (double.TryParse(curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_FrameOff)?.PropertyValue,
out double AssignPanelXOffValue))
{
}
else
{
return null;//无效的x off导致的
}
if (double.TryParse(curPanelProps.FirstOrDefault(x => x.PropertyName == GlobalObject.propName_YOff)?.PropertyValue,
out double AssignPanelYValue))
{
}
else
{
return null;//无效的y off导致的
}
double minDistance = 0.1; ec_PanelEntity nearestPanel = null;
foreach (var panel in allPanel.Where(x => x.PanelID != curPanelId))
{
#region io
#endregion
#region distance
//拿到每一个的xy属性
//然后和预分配箱子进行对比
var DISTANCE = GetPanelXYDistance2Target(panel.PanelID, AssignPanelXValue + AssignPanelXOffValue, AssignPanelYValue);
if (0.1 == minDistance && DISTANCE > 0)
{
minDistance = DISTANCE; nearestPanel = panel;
}
else if (DISTANCE < minDistance && DISTANCE > 0)
{
minDistance = DISTANCE; nearestPanel = panel;
}
#endregion
}
//根据电缆上的信号,去找匹配的排序第一位(已经按照距离排序过)的箱子
switch (IOTypeOnCable.ToUpper())
{
case "DIGITAL":
//其他就近箱子的 allowIOTypes里有DI DO
break;
default:
break;
}
return nearestPanel;
}
/// <summary>
/// IO分配主界面查询查询所有的位置 - 采集箱 - 模块 - 通道
/// </summary>
/// <param name="projectId"></param>
/// <returns></returns>
public IHttpActionResult GetPanelTree(string projectId)
{
//2023 05 22从用户所在的role的lr base authorize里去查
//UserInfo userInfo = LoginUserInfo.Get();
//UserRelationIBLL userRelationIBLL = new UserRelationBLL();
//var roles = userRelationIBLL.GetObjectIds(userInfo.userId, 1, projectId);
var stopWatch = new Stopwatch();
var Locations = GetLocList(projectId);
if (Locations == null)
{
return Fail("系统设置中找不到“系统柜位置”这一项内容。联系管理员");
}
var ec_PanelStripTermService = new ec_PanelStripTermBLL();
var ec_WireTerminalService = new ec_WireTerminalService();
var ec_Wire_GroupService = new ec_Wire_GroupBLL();
stopWatch.Start();
var Panels = ec_PanelBLL.GetList("{ProjectId:\"" + projectId + "\"}").OrderBy(x => x.TagNumber).ToList();
stopWatch.Stop();
this.Logger.Info($"Panel查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
var Strips = ec_PanelStripBLL.GetList("{ProjectId:\"" + projectId + "\"}").OrderBy(x => x.Panel_Strip_Seq).OrderBy(x => x.StripName);
stopWatch.Stop();
this.Logger.Info($"Strip查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
var Channels = ec_PanelChannelBLL.GetList("{ProjectId:\"" + projectId + "\"}");
stopWatch.Stop();
this.Logger.Info($"Channel查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
var AllTerms = ec_PanelStripTermService.GetList("{ProjectId:\"" + projectId + "\"}");
stopWatch.Stop();
this.Logger.Info($"Term查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
var AllWTs = ec_WireTerminalService.GetList("{ProjectId:\"" + projectId + "\"}", true);
stopWatch.Stop();
this.Logger.Info($"WireTerminal查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
var AllSignals = ec_Wire_GroupService.GetList("{ProjectId:\"" + projectId + "\"}", true);
stopWatch.Stop();
this.Logger.Info($"Signals查询 {stopWatch.ElapsedMilliseconds}" + "\r\n");
stopWatch.Start();
List<TreeModel> treeList = new List<TreeModel>();
foreach (var Loc in Locations)
{
TreeModel nodeCatalogue = new TreeModel();
nodeCatalogue.id = Loc.DataItemDetailID;
nodeCatalogue.text = Loc.DataItemName;
nodeCatalogue.value = Loc.DataItemName;
nodeCatalogue.nodeType = "0";
nodeCatalogue.showcheck = false;
nodeCatalogue.checkstate = 0;
nodeCatalogue.isexpand = false;
nodeCatalogue.parentId = Loc.UpDataItemDetailID;
nodeCatalogue.NodeExtData = Loc;
treeList.Add(nodeCatalogue);
var listPanel = Panels.Where(x => x.Panel_Loc_ID == Loc.DataItemDetailID && x.systempanel == GlobalEnum.specialType..ToString()).ToList();
if (listPanel != null && listPanel.Count > 0)
{
foreach (var Panel in listPanel)
{
TreeModel nodeFile = new TreeModel();
nodeFile.id = Panel.PanelID;
nodeFile.text = Panel.TagNumber;
nodeFile.value = Panel.EngineerDataID;
nodeFile.nodeType = "1";
nodeFile.showcheck = false;
nodeFile.checkstate = 0;
nodeFile.isexpand = false;
nodeFile.parentId = Panel.Panel_Loc_ID; //后面会根据变为tree
nodeFile.NodeExtData = Panel;
//判断下是不是有效的类型
treeList.Add(nodeFile);
var StripsInPanel = Strips.Where(x => x.PanelID == Panel.PanelID).ToList();
if (StripsInPanel != null && StripsInPanel.Count > 0)
{
//StripsInPanel = StripsInPanel.OrderBy(x => x.Panel_Strip_Seq).ToList();
foreach (var Strip in StripsInPanel)
{
#region
var ChannelsInStrip = Channels.Where(x => x.StripID == Strip.StripID).ToList();//("{ProjectId:\"" + projectId + "\",StripID:\"" + Strip.StripID + "\",PanelID:\"" + Strip.PanelID + "\"}");
//Strip.Channels = ChannelsInStrip.ToList();
foreach (var Channel in ChannelsInStrip)
{
var Terms = AllTerms.Where(x => x.StripID == Strip.StripID && x.ChannelID == Channel.ChannelID).ToList();//ec_PanelStripTermService.GetList("{ProjectId:\"" + projectId + "\",StripID:\"" + Strip.StripID + "\",ChannelID:\"" + Channel.ChannelID + "\"}");
//wire termianl
var conns = AllWTs.Where(x => Terms.Select(y => y.TermID).ToList().Contains(x.TermID)).ToList(); //.GetList(("{ProjectId:\"" + projectId + "\",PanelID:\"" + Strip.PanelID + "\",StripID:\"" + Strip.StripID + "\"}"));
bool bUsed = false;
if (conns != null && conns.Count() > 0)
{
bUsed = true;
}
//foreach (ec_PanelStripTermEntity term in Terms)
//{
// var conn = conns.FirstOrDefault(x => x.TermID == term.TermID);
// if (conn != null)
// {
// bUsed = true;
// break;
// }
//}
if (bUsed)
{
//wire group
var signal = AllSignals.FirstOrDefault(x => x.ChannelID == Channel.ChannelID);//.GetList("{ProjectId:\"" + projectId + "\",StripID:\"" + Strip.StripID + "\",ChannelID:\"" + Channel.ChannelID + "\"}").FirstOrDefault();
if (signal != null)
{
Strip.ChannelsUsed += 1;
}
else
{
Strip.ChannelsUsedNoSignal += 1;
}
}
else
{
Strip.ChannelsSpared += 1;
}
}
#endregion
TreeModel nodeStrip = new TreeModel();
nodeStrip.id = Strip.StripID;
nodeStrip.text = Strip.StripName;
nodeStrip.value = Strip.Panel_Strip_Seq;
nodeStrip.nodeType = "1";
nodeStrip.showcheck = false;
nodeStrip.checkstate = 0;
nodeStrip.isexpand = false;
nodeStrip.parentId = Strip.PanelID;
nodeStrip.NodeExtData = Strip;
treeList.Add(nodeStrip);
}
}
}
}
}
stopWatch.Stop();
this.Logger.Info($"循环位置耗时 {stopWatch.ElapsedMilliseconds}" + "\r\n");
return Success(treeList.ToTree());
}
/// <summary>
/// 根据ID拿。只查询ec panel表本身
/// </summary>
/// <param name="PanelID"></param>
/// <param name="projId"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetPanel(string PanelID, string projId)
{
var res = ec_PanelBLL.GetEntity(projId, PanelID);
return Success(res);
}
/// <summary>
/// 根据EngineerDataID拿。包括set wire以及from to信息
/// </summary>
/// <param name="EngineerDataID"></param>
/// <param name="projId"></param>
/// <param name="OnlySelf"></param>
/// <param name="PreAssign"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetCableByEngID(string EngineerDataID, string projId, bool OnlySelf = false, bool PreAssign = false)
{
if (PreAssign)
{
var res = ec_CableBLL.GetCablePreAssign(projId, EngineerDataID);
return Success(res);
}
else
{
var res = ec_CableBLL.GetCableByEngID(projId, EngineerDataID, OnlySelf);
return Success(res);
}
}
ICache redisObj = CacheFactory.CaChe();
/// <summary>
/// 自动分配通道(点表信号自动分配)。
///
/// </summary>
/// <param name="projId"></param>
/// <param name="AcceptNearbyPanel"></param>
/// <param name="CableIds">需要分配的电缆cableid,不是enginedataId逗号分开</param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult AutoAssignCable2Channel_step1(string projId, bool AcceptNearbyPanel, [FromBody] List<string> CableIds)
{
#region
var frameBll = new FrameBll();
var allFrames = frameBll.GetFrameList(projId);
var cbll = new ec_CableBLL();
var panelTable = ProjectSugar.TableName<ec_PanelEntity>(projId);
var stripTable = ProjectSugar.TableName<ec_PanelStripEntity>(projId);
var tagTable = ProjectSugar.TableName<ec_enginedataEntity>(projId);
var propTable = ProjectSugar.TableName<ec_enginedata_propertyEntity>(projId);
var typeTable = ProjectSugar.TableName<ec_objecttypeEntity>(projId);
#endregion
#region
if (CableIds == null || CableIds.Count == 0)
{
return Success("OK");
}
var cablesNeedAssigned = cbll.GetCablesPreAssign(projId, CableIds, true);
cablesNeedAssigned = cablesNeedAssigned.Where(x => CableIds.Contains(x.CableID)).ToList();
#endregion
//涉及到哪些箱子
var allPanel = SqlSugarHelper.Db.Queryable<ec_PanelEntity>().AS(panelTable).
InnerJoin<ec_enginedataEntity>((a, b) => a.EngineerDataID == b.EngineDataID).AS<ec_enginedataEntity>(tagTable).
InnerJoin<ec_objecttypeEntity>((a, b, c) => b.ObjectTypeID == c.ObjectTypeID).AS<ec_objecttypeEntity>(typeTable).
Where((a, b, c) => c.specialType == GlobalEnum.specialType.).
ToList();//这里要过滤一下根据object type里的specialType而不是所有的panel
var allPanelProp = SqlSugarHelper.Db.Queryable<ec_enginedata_propertyEntity>().AS(propTable)
.Where(x => allPanel.Select(xx => xx.EngineerDataID).Contains(x.EngineDataID))
.ToList().GroupBy(x => x.EngineDataID).ToDictionary(x => x.Key, x => x.ToList());
var panelsNeed = allPanel.Where(x => cablesNeedAssigned.Select(xx => xx.PanelID).Contains(x.PanelID)).ToList();//用户指定的预分配的箱子
var stripsNeed = SqlSugarHelper.Db.Queryable<ec_PanelStripEntity>().AS(stripTable).
Where(x => panelsNeed.Select(xx => xx.PanelID).Contains(x.PanelID)).
ToList();
#region 1.1()
var cablesNotMatchIO = cablesNeedAssigned.Where(x => x.IOTypesNotMatchedList.Count > 0).ToList(); // GetCablesPreAssign 查询时已经处理过io是否匹配了
if (cablesNotMatchIO != null && cablesNotMatchIO.Count > 0)
{
if (AcceptNearbyPanel)//允许进行
{
//有不匹配的,但是用户允许继续
//如果选是则在之后的自动分配过程中会自动寻找匹配的采集箱原则上从就近的开始找如果没有匹配的采集箱则提示“未找到具有XX类型的采集箱请新增后再次分配是否取消自动分配进程
bool nearbyFound = false;
foreach (var cable in cablesNotMatchIO)
{
var nearPanel = FindPanelNearby(cable.PanelID, allFrames, allPanel, allPanelProp, cable.PreAssignIOType);
if (nearPanel == null)
{
nearbyFound = false;
//必要的数据存入redis以便后续步骤使用
redisObj.Remove("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
redisObj.Write<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch);
return Fail($"在附近未找到具有{cable.PreAssignIOType}类型的采集箱,请新增后再次分配,是否取消自动分配进程?");
//之后插件端进行选择。
//如果不想新增,则选择否,继续自动分配,没有分配到的信号在备注上填写由于何种原因没有被分配,弹出未被分配的信号列表供查看。
//也就是这里要等所有循环结束后才能return结果而不是目前一个nearByFound = false时就退出了。
}
else
{
nearbyFound = true;
}
}
}
else
{
//如果选否,则不继续自动分配,中断进程,等添加完正确的模块后再继续自动分配
var cableNamesNotMatched = string.Join(",", cablesNotMatchIO.Select(x => x.TagNumber).ToList());
var panelIOMissing = new List<string>();
foreach (ec_CableEntity cableNotMatchIO in cablesNotMatchIO)
{
panelIOMissing.Add(cableNotMatchIO.PanelID + "缺失IO: " + string.Join(",", cableNotMatchIO.IOTypesNotMatchedList));
}
return Fail($"预分配结果中,以下电缆【{cableNamesNotMatched}】的IO类型和其预分配采集箱的IO类型无法匹配。等添加完正确的模块后再继续自动分配。\r\n" +
$"需要添加的正确模块有:{string.Join(",", panelIOMissing)}");
}
}
else
{
//没有不匹配的,可以继续进行
}
//必要的数据存入redis以便后续步骤使用
redisObj.Remove("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
redisObj.Write<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, cablesNeedAssigned, CacheId.IOModule_AutoAssign2Ch);
return Success("OK");
#endregion
}
/// <summary>
/// 根据step1的初步采集箱判断情况来进行分配预览。
/// </summary>
/// <param name="projId"></param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult AutoAssignCable2Channel_step2(string projId)
{
ICache redisObj = CacheFactory.CaChe();
var cablesNeedAssigned = redisObj.Read<List<ec_CableEntity>>("IOModule_AutoAssign2Ch_" + projId, CacheId.IOModule_AutoAssign2Ch);
//#region 1.2 开始自动分配(不保存到数据库)
#region 1.2.2
var cablesGrouped = cablesNeedAssigned.OrderBy(x => x.PanelID).ThenBy(x => x.PreAssignIOType).ThenBy(x => x.System).ToList();
foreach (var item in cablesNeedAssigned)
{
if (item.Sets == null || item.Sets.Count() == 0)
{
//也归类到未成功
}
else
{
foreach (var set in item.Sets)
{
set.ConnectionInfo = $"采集箱:{item.ToPanel.TagNumber}/模块(端子排){"test_ts"}/通道:{"test_ch"}";
set.AssignedTerms = set.Wires.Select(x => x.PreAssignChannelTermNo).ToList();// new List<string>() { "test_term1", "test_term2" };//假数据
}
}
}
//var curPanel = new ec_PanelEntity();
//curPanel = panelsNeed.FirstOrDefault(x => x.PanelID == cablesNeedAssigned[0].PanelID);//先定位到第一个电缆所在的箱子
//curPanel.strips = stripsNeed.Where(x => x.PanelID == curPanel.PanelID).ToList();
//var curStrip = new ec_PanelStripEntity();
#endregion
//for (var i = 0; i < cablesNeedAssigned.Count; i++)
//{
// #region 是否有端子排 1.2.1
// if (curPanel.PanelID != cablesNeedAssigned[i].PanelID)
// {
// curPanel = panelsNeed.FirstOrDefault(x => x.PanelID == cablesNeedAssigned[0].PanelID);//切换箱子
// curPanel.strips = stripsNeed.Where(x => x.PanelID == curPanel.PanelID).ToList();
// }
// foreach (var set in cablesNeedAssigned[i].Sets)
// {
// var availableStrips = curPanel.strips.Where(x => x.IO_TYPE.ToUpper() == set.IOType.ToString().ToUpper()).ToList();
// if (availableStrips != null && availableStrips.Count > 0)
// {
// //已经存在端子排
// }
// else
// {
// //没有端子排根据信号数里自动新建端子排通道数里根据端子io模板的默认值获得
// //
// }
// }
// //可能要换一下循环主体评估下是按照cable循环好还是按strip循环好
// #endregion
//}
//#endregion
return Success(cablesNeedAssigned);
}
/// <summary>
/// 根据step2的预分配结果进行实际的分配修改数据库。
/// </summary>
/// <param name="projId"></param>
/// <param name="cables">传入有效的cable即可未成功分配的cable不需要</param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult AutoAssignCable2Channel_step3(string projId, [FromBody] List<ec_CableEntity> cables)
{
//大原则:同一根电缆的信号不能跨采集箱,跨模块可以。
return Success(cables);
}
/// <summary>
/// 把电缆分配到空余的模块的通道上。
/// </summary>
/// <param name="projId"></param>
/// <param name="execute"></param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult AssignCable2Channel(string projId, bool execute = false)
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var cableIds = asyncContent.ToObject<List<string>>();
return Success("res");
}
/// <summary>
/// 查询所有需要预分配的电缆
/// </summary>
/// <param name="projId"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetCablePreAssignPreview(string projId)
{
var bll = new ec_CableBLL();
var res = bll.GetCablesPreAssign(projId, null);
return Success(res);
}
/// <summary>
/// 查询所有的电缆
/// </summary>
/// <param name="projId"></param>
/// <param name="homerun">true或false</param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetCables(string projId, bool homerun = true)
{
var res = ec_CableBLL.GetCables(projId, homerun);//这有个问题 如果一开始不知道要关联到那个通道 就不会有ec cable出来
return Success(res);
}
/// <summary>
/// PanelStrip参考库
/// </summary>
/// <param name="projId"></param>
/// <param name="OnlySelf">false时带上下面的通道和端子。true时就是返回端子排自己</param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetPanelStrips(string projId, bool OnlySelf = false)
{
var res = ec_PanelStripBLL.GetList("{ProjectId:\"" + projId + "\",OnlySelf:\"" + OnlySelf + "\"}");
return Success(res);
}
/// <summary>
/// 在IO分配界面从左侧目录树中选择一个“端子排”后进行查询
/// </summary>
/// <param name="StripID"></param>
/// <param name="projId"></param>
/// <param name="OnlySelf">false时带上下面的通道和端子。true时就是返回端子排自己</param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetPanelStrip(string StripID, string projId, bool OnlySelf = false, bool HaveChannel = true)
{
var res = ec_PanelStripBLL.GetEntity(projId, StripID, OnlySelf, HaveChannel);
return Success(res);
}
/// <summary>
/// 新增或者修改。
/// 新建相当于强行因为正常流程是和engineerdata一起新建出来的。
/// 改的话只是改location和端子排数量这些。常规属性依旧通过objectTypeAPI去做
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
/// <returns></returns>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanel(ec_PanelEntity entity, string projId)
{
try
{
ec_PanelBLL.SaveEntity(projId, entity.PanelID, entity);
return Success("OK");
}
catch (System.Exception E)
{
return Fail(E.Message);
}
}
/// <summary>
/// SaveConnections 专用
/// </summary>
private class Connections
{
public string ID { get; set; }
public List<ec_WireTerminalEntity> Conns { get; set; }
}
/// <summary>
/// 处理 接线关系同时对cableset和wire的个别属性进行修改
/// </summary>
/// <param name="projId"></param>
/// <returns></returns>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SaveConnections(string projId)
{
try
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var entity = asyncContent.ToObject<Connections>();
var res = entity.Conns;
new ec_WireTerminalBLL().SaveConnections(projId, ref res);
return Success(res);
}
catch (System.Exception E)
{
return Fail(E.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="projId"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetConnections(string projId, string ID)
{
try
{
var res = new ec_WireTerminalService().GetEntity(projId, ID);
return Success(res);
}
catch (System.Exception E)
{
return Fail(E.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
/// <returns></returns>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SaveCable(ec_CableEntity entity, string projId)
{
try
{
if (!string.IsNullOrEmpty(entity.CableID))
{
ec_CableBLL.SaveEntity(projId, entity.CableID, entity);
}
return Success("OK");
}
catch (System.Exception E)
{
return Fail(E.Message);
}
}
/// <summary>
/// 通过预设模式,批量创建端子排 通道 端子
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult CreatePanelStripByProfile(string projId)
{
try
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var entity = asyncContent.ToObject<ec_PanelStripEntity>();
string NewID = "";
ec_PanelStripBLL.SaveEntity(projId, "", entity, out NewID);
var res = ec_PanelStripBLL.GetEntity(projId, NewID);
return Success(res);
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
///// <summary>
///// 通过预设模式,批量创建端子排 端子(不需要了因为预设模式只有对IO有通道的那边才有用)
///// </summary>
///// <param name="entity"></param>
///// <param name="projId"></param>
//[HttpPost]
//[HandlerApiLogin(FilterMode.Enforce)]
//public IHttpActionResult CreatePanelStripByProfileNoChannel(string projId, ec_PanelStripEntity entity)
//{
// try
// {
// string NewID = "";
// ec_PanelStripBLL.SaveEntity(projId, "", entity, out NewID, false);
// var res = ec_PanelStripBLL.GetEntity(projId, NewID);
// return Success(res);
// }
// catch (System.Exception e)
// {
// return Fail(e.Message);
// }
//}
/// <summary>
/// GetCableByEngID先去判断这个cable是否已经有了IO Module这边的记录
/// 电缆-端子连接,从图面上选择一个电缆对象
/// </summary>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult CreateCableByProfile(string projId)
{
try
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var entity = asyncContent.ToObject<ec_CableEntity>();
ec_CableBLL.SaveEntity(projId, entity.CableID, entity);
var res = ec_CableBLL.GetCableByEngID(projId, entity.EngineerDataID);
return Success(res);
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 批量保存电缆的set wire 名字等
/// </summary>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SaveCables(string projId)
{
try
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var entitys = asyncContent.ToObject<List<ec_CableEntity>>();
foreach (var entity in entitys)
{
ec_CableBLL.SaveEntity(projId, entity.CableID, entity);
}
return Success(entitys);
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 创建、修改 端子排和端子(一般是为非监测设备的端子排)
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanelStripNoChannel(string projId, ec_PanelStripEntity entity)
{
try
{
string NewID = "";
ec_PanelStripBLL.SaveEntity(projId, entity.StripID, entity, out NewID, false);
var res = ec_PanelStripBLL.GetEntity(projId, NewID, false, false);
return Success(res);
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 保存端子排 通道 端子的信息(不管信号和接线关系)。
/// 迁移通道也是这里。
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanelStrip(string projId, ec_PanelStripEntity entity)
{
XmlConfigurator.Configure();
var log = log4net.LogManager.GetLogger("Debug"); //参数就是config里logger节点的名字
try
{
//var asyncContent = Request.Content.ReadAsStringAsync().Result;
//var entity = asyncContent.ToObject<ec_PanelStripEntity>();
ec_PanelStripBLL.SaveEntity(projId, entity.StripID, entity, out string NewID);
var res = ec_PanelStripBLL.GetEntity(projId, NewID);
return Success(res);
}
catch (System.Exception e)
{
log.Debug($"★★★{DateTime.Now.ToString()}★★★{e}★★★");
return Fail(e.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanelStripTerm(ec_PanelStripTermEntity entity, string projId)
{
try
{
ec_PanelStripTermBLL.SaveEntity(projId, entity.TermID, entity);
return Success("OK");
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanelChannel(ec_PanelChannelEntity entity, string projId)
{
try
{
var newId = ec_PanelChannelBLL.SaveEntity(projId, entity.ChannelID, entity);
foreach (var term in entity.Terms)
{
ec_PanelStripTermBLL.SaveEntity(projId, term.TermID, term);
}
var res = ec_PanelChannelBLL.GetEntity(projId, newId);
return Success(res);
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 调端子排所属Panel
/// </summary>
/// <param name="StripID">端子排ID</param>
/// <param name="PanelID">PanelID</param>
/// <param name="ProjectId">项目ID</param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SwitchPanelStrip(string StripID, string PanelID, string ProjectId)
{
try
{
ec_PanelStripBLL.SwitchPanelStrip(StripID, PanelID, ProjectId);
return Success("OK");
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 调换电缆的from/to信息
/// </summary>
/// <param name="CableID">Cable的工程ID</param>
/// <param name="ProjectId">项目ID</param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SwitchCableFromTo(string ProjectId)
{
try
{
var asyncContent = Request.Content.ReadAsStringAsync().Result;
var entityCol = asyncContent.ToObject<List<string>>();
var res = new ec_enginedata_relService().SwitchCableFromTo(entityCol, ProjectId);
if (res)
{
return Success("OK");
}
else
{
return Fail("From/To 交换出现问题。");
}
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 比如 移动通道时,进行保存
/// </summary>
/// <param name="entity"></param>
/// <param name="projId"></param>
/// <returns></returns>
[Obsolete]
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult SavePanelChannels(List<ec_PanelChannelEntity> entitys, string projId)
{
try
{
foreach (var entity in entitys)
{
var newId = ec_PanelChannelBLL.SaveEntity(projId, entity.ChannelID, entity);
foreach (var term in entity.Terms)
{
ec_PanelStripTermBLL.SaveEntity(projId, term.TermID, term);
}
}
return Success("OK");
}
catch (System.Exception e)
{
return Fail(e.Message);
}
}
/// <summary>
/// 根据某个数据字典的编号来。默认有个id=1的枚举
/// </summary>
/// <param name="ProjectId"></param>
/// <returns></returns>
private List<ec_dataitemdetailEntity> GetLocList(string ProjectId)
{
var ec_dataitemBLL = new ec_dataitemBLL();
var settings = new ec_projectSettingsBLL();
var ListFlg = settings.GetEntity(GlobalObject.projSetting_enumlist_IORackPosition, ProjectId);
if (ListFlg != null)
{
List<ec_dataitemdetailEntity> frameLists = new List<ec_dataitemdetailEntity>();
frameLists.Add(new ec_dataitemdetailEntity() { DataItemName = "默认", DataItemCode = "默认", DataItemDetailID = "1", UpDataItemDetailID = "", DataItemID = "" }); //{ Name = "默认", Desc = "默认", Id = "1", ParentID = "" });
var ListName = ec_dataitemBLL.GetList("{ProjectId:\"" + ProjectId + "\",keyword:\"" + ListFlg.SettingValue + "\"}").FirstOrDefault();
if (ListName == null)
{
return null;
}
else
{
frameLists[0].DataItemID = ListName.DataItemID;
}
var res = ec_dataitemBLL.GetDetailList(ListFlg.SettingValue, "", ProjectId, false); //区域
foreach (var item in res)
{
//frameLists.Add(new ec_dataitemdetailEntity()
//{
// Name = item.DataItemName,
// ParentID = item.UpDataItemDetailID,
// Desc = item.DataItemCode,
// Id = item.DataItemDetailID,
// DataItemId = item.DataItemID
//});
frameLists.Add(item);
}
return frameLists;
}
else
{
return null;
}
}
/// <summary>
/// 位置。缺省都放到“默认”下
/// </summary>
/// <param name="ProjectId"></param>
/// <returns></returns>
[HttpGet]
public IHttpActionResult GetLocationList(string ProjectId)
{
var RES = GetLocList(ProjectId);
if (RES != null)
{
return Success(RES);
}
else
{
return Fail("未找到合适的数据字典,可以当做位置");
}
}
/// <summary>
/// 根据id来删除
/// </summary>
/// <param name="keyValue"></param>
/// <param name="ProjectId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult DeletePanel(string PanelID, string ProjectId)
{
new ec_enginedataBLL().DeleteEntity(PanelID, ProjectId);
return Success("删除成功!");
}
/// <summary>
/// 根据id来删除
/// </summary>
/// <param name="CableID"></param>
/// <param name="ProjectId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult DeleteCableProfile(string CableID, string ProjectId)
{
ec_CableBLL.DeleteEntity(ProjectId, CableID);
return Success("OK");
}
/// <summary>
/// 根据id来删除
/// </summary>
/// <param name="keyValue"></param>
/// <param name="ProjectId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult DeletePanelStrip(string StripID, string ProjectId)
{
ec_PanelStripBLL.DeleteEntity(ProjectId, StripID);
return Success("删除成功!");
}
/// <summary>
/// 根据id来删除
/// </summary>
/// <param name="ChannelID"></param>
/// <param name="ProjectId"></param>
[HttpPost]
[HandlerApiLogin(FilterMode.Enforce)]
public IHttpActionResult DeletePanelChannel(string ChannelID, string ProjectId)
{
ec_PanelChannelBLL.DeleteEntity(ProjectId, ChannelID);
return Success("OK");
}
}
/// <summary>
///
/// </summary>
//public class Panel_Location
//{
/// <summary>
///
/// </summary>
//public string ParentID { get; set; }
/// <summary>
///
/// </summary>
//public string Id { set; get; }
/// <summary>
/// 所在数据字典的ID
/// </summary>
// public string DataItemId { set; get; }
/// <summary>
///
/// </summary>
//public string Name { get; set; }
/// <summary>
/// 数据字典里的code
/// </summary>
//public string Desc { get; set; }
//}
}