using Learun.Application.Organization; using Learun.Application.TwoDevelopment.ZZDT_EC; using Learun.Util; using Learun.Util.SqlSugar; using Pipelines.Sockets.Unofficial.Arenas; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Web.Http; using static Learun.Application.TwoDevelopment.ZZDT_EC.IO_WorkFlowService; using Action = Learun.Application.TwoDevelopment.ZZDT_EC.Action; namespace Learun.Application.Web.AppApi { /// /// 信号(By ChenGT) /// [HandlerApiLogin(FilterMode.Enforce)] [TokenAuthorize] public class WireGroupApiController : WebApiControllerBase { #region 辅助类 /// /// SaveSignals 专用 /// private class WireGroups { public string ID { get; set; } public List Signals { get; set; } } #endregion #region 模块对象 private ec_Wire_GroupIBLL ec_Wire_GroupIBLL = new ec_Wire_GroupBLL(); #endregion #region 信号模板 ///// ///// 信号列表 ///// ///// 项目编号 ///// 模板编号 ///// 信号编号 ///// //[HttpGet] //public IHttpActionResult GetList(string projectId, string templateId = "", string wireGroupId = "") //{ // try // { // var res = ec_Wire_GroupIBLL.GetList("{\"ProjectId\":\"" + projectId + "\"}"); // return Success(res); // } // catch (Exception ex) // { // return Fail(ex.Message); // } //} /// /// 所有信号(平级,不会因为进行排列)。 /// 目前插件端用的是这个。 /// /// /// 默认true,返回和channel关联的。false时,返回全部 /// [HttpGet] public IHttpActionResult GetSignals(string projId, bool Assigned = true) { var res = new ec_Wire_GroupBLL(projId).GetList("{ProjectId:\"" + projId + "\"}", Assigned, false, true); return Success(res); } /// /// 获取信号组信息,用于输出点落实信息(暂时) /// /// /// [HttpGet] public IHttpActionResult GetGroupInfo(string projId) { var res = new List(); var allSignal = new ec_Wire_GroupBLL(projId).GetList("{ProjectId:\"" + projId + "\"}", false); var dataitemBll = new ec_dataitemBLL(); var group_codelist = dataitemBll.GetDetailList(GlobalObject.enumlist_signalGroup, "", projId).OrderBy(x => x.DataItemCode).ToList(); foreach (var x in group_codelist) { var group = new signalGroup(); group.Name = x.DataItemName; group.Code = x.DataItemCode; group.Id = x.DataItemDetailID; group.Sub = allSignal.Where(X => X.Signal_Group == group.Code && X.InOrOut == "output").OrderBy(X => X.Group_Name).ToList(); if (group.Sub.Count > 0) { var approvedCount = group.Sub.Where(y => y.Status == WireGroupStatusEnum.Confirmed).Count(); if (approvedCount == 0) { group.status = signalGroupStatusEnum.未核对; } else if (approvedCount == group.Sub.Count) { group.status = signalGroupStatusEnum.已落实; } else { group.status = signalGroupStatusEnum.沟通中; } res.Add(group); } } return Success(res); } /// /// 批量保存(增、改、删)信号。 /// /// /// 0是默认。1表示从IO关联界面保存 /// [HttpPost] public IHttpActionResult SaveSignals(string projId, string mode = "0") { //送过来的信号,也可能是完全相同的(前端1改为2,2又改回1的时候) try { var BLL = new ec_Wire_GroupBLL(projId); var asyncContent = Request.Content.ReadAsStringAsync().Result; var entity = asyncContent.ToObject(); var res = new List(); var messages = ""; foreach (var item in entity.Signals) { var id = item.Wire_Group_ID; string result = BLL.SaveEntity(projId, ref id, item, mode); if (!string.IsNullOrEmpty(result)) { messages += result + "\n"; } item.Wire_Group_ID = id; res.Add(item); } if (!string.IsNullOrEmpty(messages)) { return Fail(messages); } return Success(res); } catch (Exception e) { return Fail(e.Message); } } /// /// 验证信号是否可以保存,如果无法保存,返回原因 /// /// 项目编号 /// 0 新增,1 修改,2 准备删除,3 撤销删除, 4 彻底删除, 5 关联通道,6 审核,7 重新打开,8 关联解除, 9 回收站恢复 /// [HttpPost] public IHttpActionResult CanSaveSignals(string projId, Action ActionType) { try { var BLL = new ec_Wire_GroupBLL(projId); var asyncContent = Request.Content.ReadAsStringAsync().Result; var entity = asyncContent.ToObject(); var res = new List(); var messages = ""; foreach (var item in entity.Signals) { string result = BLL.CanSaveEntity(projId, item, ActionType); if (!string.IsNullOrEmpty(result)) { messages += result + "\n"; } res.Add(item); } if (!string.IsNullOrEmpty(messages)) { return Fail(messages); } return Success(res); } catch (Exception e) { return Fail(e.Message); } } /// /// 删除某个信号,同时删除虚拟点 /// /// /// 多个删除,按逗号隔开 /// [HttpPost] public IHttpActionResult DeleteSignal(string projId, string WireGroupID) { try { var BLL = new ec_Wire_GroupBLL(projId); var IDs = WireGroupID.Split(','); foreach (var Id in IDs) { string res = ""; res = BLL.DeleteEntity(projId, Id, false); if (res != "") { return Fail(res); } } return Success("OK"); } catch (Exception e) { return Fail(e.Message); } } /// /// 验证信号是否可以删除,如果无法删除,返回原因 /// /// /// 多个删除,按逗号隔开 /// [HttpPost] public IHttpActionResult CanDeleteSignals(string projId, string WireGroupID) { try { var BLL = new ec_Wire_GroupBLL(projId); var IDs = WireGroupID.Split(','); var message = ""; foreach (var Id in IDs) { string res = ""; res = BLL.DeleteEntity(projId, Id, true); if (res != "") { message += res + "\n"; } } if (!string.IsNullOrEmpty(message)) { return Fail(message); } return Success("OK"); } catch (Exception e) { return Fail(e.Message); } } #endregion /// /// 信号导入(xlsx) /// /// 项目编号 /// 文件编号 /// 版本1:1642版;2:8600版 /// 只更新 /// 模板编号(项目级时,就是空的) /// [HttpPost] public IHttpActionResult ImportSignals(string projectId, string fileId, int version, ImportMode mode, string templateId = "", string singleColIndex = "") { try { var BLL = new ec_Wire_GroupBLL(); byte[] bytes = null; string res = ""; res = BLL.ImportSignals(projectId, templateId, fileId, mode, version, singleColIndex); if (!string.IsNullOrEmpty(res)) { return Fail(res); } return Success("导入完成"); } catch (Exception e) { return Fail(e.Message); } } /// /// 历史记录输出操作,时间节点主要分为送审前、送审后、施工图后 /// /// /// /// /// [HttpGet] public void ExportChanges(string projectId, DateTime start, DateTime end, bool delete = false) { if (string.IsNullOrEmpty(projectId)) { return; // 空时,无意义 } var BLL = new ec_Wire_GroupBLL(); var bytes = BLL.ExportChanges(projectId, delete, start, end);//api export var stream = new MemoryStream(bytes); FileDownHelper.DownLoad(stream, $"信号变更记录{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx");//自动化平台导出excel } /// /// 成品导出(xlsx) /// /// 项目编号 /// 版本1:1642版;2:8600版 /// 包含待删除 /// [HttpGet] public void ExportSignals(string projectId, int version, bool delete = false) { if (string.IsNullOrEmpty(projectId)) { return; // 空时,无意义 } var reportTableName = ProjectSugar.TableName(projectId); ec_report_fileEntity report = null; byte[] bytes; switch (version) { case 1: report = SqlSugarHelper.Db.Queryable().AS(reportTableName).First(x => x.ReportFileName == "信号清册(1642版)"); break; case 2: report = SqlSugarHelper.Db.Queryable().AS(reportTableName).First(x => x.ReportFileName == "信号清册(8600版)"); break; case 3: report = SqlSugarHelper.Db.Queryable().AS(reportTableName).First(x => x.ReportFileName == "信号清册(8600版单行)"); break; } if (report == null || string.IsNullOrEmpty(report.FolderId)) { bytes = System.Text.Encoding.UTF8.GetBytes("找不到名为【信号清册(1642版)】或【信号清册(8600版)】的报表文件,或者报表文件没有上传其背后的excel模板文件。"); } else { var BLL = new ec_Wire_GroupBLL(); bytes = BLL.ExportSignals(projectId, delete, version, report.FolderId);//api export } var stream = new MemoryStream(bytes); FileDownHelper.DownLoad(stream, $"报警点表{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx");//自动化平台导出excel } /// /// 查询信号历史和日志 /// /// 项目ID /// 信号ID,多个用都逗号隔开 /// [HttpGet] public IHttpActionResult GetSignalPropertyhisAndLogs(string projId, string wireGroupIds) { try { var SignalTableName = ProjectSugar.TableName(projId); var PropertyhisTableName = ProjectSugar.TableName(projId); var LogTableName = ProjectSugar.TableName(projId); var ids = wireGroupIds.Split(','); var signals = SqlSugarHelper.Db.Queryable().AS(SignalTableName) .Where(x => ids.Contains(x.Wire_Group_ID) && !x.DeleteFlg).ToList(); var his = SqlSugarHelper.Db.Queryable().AS(PropertyhisTableName).Where(x => ids.Contains(x.WireGroupID) && !(string.IsNullOrEmpty(x.OldPropertyValue) && string.IsNullOrEmpty(x.NewPropertyValue))).ToList(); var logs = SqlSugarHelper.Db.Queryable().AS(LogTableName).Where(x => ids.Contains(x.WireGroupID)).ToList(); var users = SqlSugarHelper.Db.Queryable().ToList(); his.ForEach(x => { x.CreateUserName = users.FirstOrDefault(y => y.F_UserId == x.CreateUserID)?.F_RealName; }); logs.ForEach(x => { x.CreateUserName = users.FirstOrDefault(y => y.F_UserId == x.CreateUserID)?.F_RealName; }); signals.ForEach(x => { x.Propertyhis = his.Where(y => y.WireGroupID == x.Wire_Group_ID).OrderByDescending(y => y.CreateTime).ToList(); x.Logs = logs.Where(y => y.WireGroupID == x.Wire_Group_ID).OrderByDescending(y => y.CreateTime).ToList(); }); return Success(signals); } catch (System.Exception E) { return Fail(E.Message); } } /// /// 查询信号历史 /// /// 项目ID /// 信号ID,多个用都逗号隔开 /// [HttpGet] public IHttpActionResult GetSignalPropertyhis(string projId, string wireGroupIds) { try { var PropertyhisTableName = ProjectSugar.TableName(projId); var ids = wireGroupIds.Split(','); var his = SqlSugarHelper.Db.Queryable().AS(PropertyhisTableName) .Where(x => ids.Contains(x.WireGroupID) && !(string.IsNullOrEmpty(x.OldPropertyValue) && string.IsNullOrEmpty(x.NewPropertyValue))).OrderByDescending(x => x.CreateTime).ToList(); var pairs = new Dictionary() { {"Status", "状态" }, {"LinkedID", "关联ID" }, {"Group_Name", "信号名称" }, {"PanelID", "箱柜ID" }, {"StripID", "端子排ID" }, {"ChannelID", "通道ID" }, {"Group_Desc_EN", "英文描述" }, {"Group_Desc", "中文描述" }, {"IO_Type", "信号类型" }, {"Signal_Group", "信号的分组" }, {"Signal_SeqNo", "信号的序号" }, {"Code", "代码" }, {"Range_Min", "范围最小值" }, {"Range_Max", "范围最大值" }, {"Unit", "单位" }, {"Alarm_LL", "报警下限1" }, {"Alarm_L", "报警下限2" }, {"Alarm_H", "报警上限2" }, {"Alarm_HH", "报警上限1" }, {"AL_GRP", "延申报警组" }, {"BL_GRP", "抑制报警" }, {"Time_Delay", "延时" }, {"Supplier", "供应商" }, {"EquipName", "设备名" }, {"SENSOR_CODE", "传感器代码" }, {"VDR_Record", "VDR_Record" }, {"SLD", "slow down信号" }, {"SHD", "shut down信号" }, {"Remarks", "备注" }, {"ElecOnly", "信号归属" }, {"CommunicationPoint", "通讯点" }, {"ECC", "ECC" }, {"WCC", "WCC" }, {"BCC", "BCC" }, {"InOrOut", "IO类型" }, {"WHConsole", "驾驶室(控制台)" }, {"WHCPU", "驾驶室(计算机)" }, {"ECRConsole", "集控室(控制台)" }, {"ECRCPU", "集控室(计算机)" }, {"ShipOfficeConsole", "船舶办公室(控制台)" }, {"ShipOfficeCPU", "船舶办公室(计算机)" }, {"SafetyProt", "安全保护" }, {"ParentID", "父亲" }, {"DeleteFlg", "删除标记" }, {"CableName", "电缆位号" }, {"CableId", "母线ID" }, {"CreateUserID", "创建人" }, {"CreateTime", "创建时间" }, {"UpdateUserID", "更新人" }, {"UpdateTime", "更新时间" }, {"WireGroupTemplateID", "信号模板ID" }, }; var users = SqlSugarHelper.Db.Queryable().ToList(); his.ForEach(x => { if (x.PropertyName == "Status") { switch (x.OldPropertyValue) { case "1": x.OldPropertyValue = "待删除"; break; case "2": x.OldPropertyValue = "新增的"; break; case "3": x.OldPropertyValue = "已关联"; break; case "4": x.OldPropertyValue = "已审核"; break; case "5": x.OldPropertyValue = "重新打开"; break; } switch (x.NewPropertyValue) { case "1": x.NewPropertyValue = "待删除"; break; case "2": x.NewPropertyValue = "新增的"; break; case "3": x.NewPropertyValue = "已关联"; break; case "4": x.NewPropertyValue = "已审核"; break; case "5": x.NewPropertyValue = "重新打开"; break; } } x.PropertyNameDec = pairs[x.PropertyName]; x.CreateUserName = users.FirstOrDefault(y => y.F_UserId == x.CreateUserID)?.F_RealName; }); return Success(his); } catch (System.Exception E) { return Fail(E.Message); } } /// /// 新建信号名称时,从后台返回一个当前分组中可用的seqNo /// /// 项目编号 /// 信号分组 /// [HttpGet] public IHttpActionResult GetNextAvailableSeq(string projId, string group) { try { var tableName = ProjectSugar.TableName(projId); var names = SqlSugarHelper.Db.Queryable().AS(tableName) .Where(x => x.Group_Name.StartsWith(group)).Select(x => x.Group_Name).ToList(); List seqNos = new List(); seqNos.Add(0); names.ForEach(x => { string seqNo; if (group == "SLD" || group == "SHD") { seqNo = x.Substring(3); } else { seqNo = x.Substring(2); } var mac = new Regex("[0-9]+").Match(seqNo); if (mac.Success) { seqNos.Add(int.Parse(mac.Value)); } }); return Success($"{(seqNos.Max() + 1).ToString().PadLeft(3, '0')}"); } catch (Exception ex) { return Fail(ex.Message); } } /// /// 查询信号日志 /// /// 项目ID /// 信号ID,多个用都逗号隔开 /// [HttpGet] public IHttpActionResult GetSignalLogs(string projId, string wireGroupIds) { try { var LogTableName = ProjectSugar.TableName(projId); var ids = wireGroupIds.Split(','); var logs = SqlSugarHelper.Db.Queryable().AS(LogTableName).Where(x => ids.Contains(x.WireGroupID)).OrderByDescending(x => x.CreateTime).ToList(); var users = SqlSugarHelper.Db.Queryable().ToList(); logs.ForEach(x => { x.CreateUserName = users.FirstOrDefault(y => y.F_UserId == x.CreateUserID)?.F_RealName; }); return Success(logs); } catch (System.Exception E) { return Fail(E.Message); } } #region notice /// /// 查询信号的消息 /// /// /// /// [HttpGet] public IHttpActionResult GetNotification(string projId) { try { var NoticeTableName = ProjectSugar.TableName(projId); var SignalTableName = ProjectSugar.TableName(projId); //SugarRedis 需要 NET Standard 2.1,不支持Framework var users = SqlSugarHelper.Db.Queryable().ToList(); #region 只需要对方的 var _User = users.FirstOrDefault(x => x.F_UserId == LoginUserInfo.Get().userId); if (_User == null) { throw new Exception("找不到UserEntity。"); } var _Company = SqlSugarHelper.Db.Queryable().First(x => x.F_CompanyId == _User.F_CompanyId); var DepartmentStr = ""; Department _Department; if (_Company != null) { DepartmentStr = _Company.F_FullName; if (DepartmentStr.Contains("轮机")) { _Department = Department.轮机; } else { _Department = Department.电气; } } else { _Department = Department.电气; } var res = SqlSugarHelper.Db.Queryable().AS(NoticeTableName). Where(x => !string.IsNullOrEmpty(x.WireGroupID)). OrderByDescending(x => x.CreateTime). Where(x => x.CompanyID == _Department).ToList(); //Where(x => x.CompanyID == _Department).ToList();//收到本专业的通知即可 #endregion var signals = SqlSugarHelper.Db.Queryable().AS(SignalTableName).ToList(); foreach (ec_wire_group_noticeEntity noticeEntity in res) { var user_Send = users.FirstOrDefault(x => x.F_UserId == noticeEntity?.CreateUserID); var user_Confrim = users.FirstOrDefault(x => x.F_UserId == noticeEntity?.UpdateUserID); var signal = signals.FirstOrDefault(x => x.Wire_Group_ID == noticeEntity.WireGroupID); if (signal != null) { noticeEntity.Group_Name = signal.Group_Name; noticeEntity.Group_Desc = signal.Group_Desc; noticeEntity.Group_Desc_EN = signal.Group_Desc_EN; noticeEntity.IO_Type = signal.IO_Type; noticeEntity.CreateUserName = user_Send?.F_RealName; noticeEntity.UpdateUserName = user_Confrim?.F_RealName; noticeEntity.Action = noticeEntity.ActionID.ToString(); } else { //信号都没了 noticeEntity.WireGroupID = "-1"; } } return Success(res.Where(x => !string.IsNullOrEmpty(x.Group_Name) || x.WireGroupID != "-1").ToList()); } catch (System.Exception E) { return Fail(E.Message); } } /// /// 读通知确认 /// /// /// /// [HttpPost] public IHttpActionResult ReadNotification(string projId, [FromBody] List NoticeIds) { try { var bll = new ec_Wire_GroupBLL(); var res = bll.ReadNotification(projId, NoticeIds); return Success(res); } catch (System.Exception E) { return Fail(E.Message); } } #endregion } }