using System; using System.Linq; using System.Text; using SHJX.Service.Dao; using SHJX.Service.Model.Dao; using System.Threading.Tasks; using System.Collections.Generic; using SHJX.Service.Common.Extend; using SHJX.Service.Model.Control; using SHJX.Service.Common.ReadXML; using SHJX.Service.Common.ExtendElement; using SHJX.Service.CustomControl; using System.Data; using Newtonsoft.Json.Linq; using System.Xml.Linq; namespace SHJX.Service.Control.ServiceController { public class MainController { /// /// 配置文件 /// private static ReadConfigUtil _config; /// /// 数据库 /// private static MainManager _dataManager; public MainManager DataManager; public MainController(ReadConfigUtil config) { _config = config; _dataManager = new MainManager(config); DataManager = _dataManager; } public List GetEquipmentMotors() { return DataCentre.GetMotor; } /// /// 打开连接 /// public Task<(string, bool)> ClientOpen() { return Task.Factory.StartNew(() => DataCentre.GetClient.Open()); } /// /// 设置速度、加速度、减速度 /// /// /// public bool SetSpeed(MotorSpeed speed) { #region 速度 PortArgs speedArgs = new PortArgs() { TypeName = speed.NodeName, Distance = speed.Speed, WriteWay = WriteWay.Speed }; var res = DataCentre.GetClient.Factory(speed.NodeName).Write(speedArgs); #endregion #region 加速度 var acSpeedArgs = new PortArgs() { TypeName = speed.NodeName, Distance = speed.AcSpeed, WriteWay = WriteWay.AcSpeed }; res = res && DataCentre.GetClient.Factory(speed.NodeName).Write(acSpeedArgs); #endregion #region 减速度 PortArgs deSpeedArgs = new() { TypeName = speed.NodeName, Distance = speed.DeSpeed, WriteWay = WriteWay.DeSpeed }; res = res && DataCentre.GetClient.Factory(speed.NodeName).Write(deSpeedArgs); #endregion return res; } public List<(string, string)> GetHeatAtPresent() { List<(string, string)> ringNames = new List<(string, string)>(); foreach (var item in _dataManager.GetHeatingTaskAtPresent()) { ringNames.Add((item.To, item.OriginLocalName.Replace("A", string.Empty))); } return ringNames; } public bool CheckHeatingIsRunning() { var equipment = _dataManager.CheckHeatRodStatus(); EquipmentEnum[] status = new EquipmentEnum[] { EquipmentEnum.Start, EquipmentEnum.Waiting }; return status.Contains(equipment.EquipmentState); } public bool UpdateHeatingIsRunning() { var portArgs = new PortArgs { TypeName = "Heat", Distance = -100, Reserve = DataCentre._dataManager.GetPid("Dissolve") }; DataCentre.GetClient.Factory("Heat").Write(portArgs); var equipment = _dataManager.CheckHeatRodStatus(); equipment.EquipmentState = EquipmentEnum.Stop; equipment.Udf1 = string.Empty; equipment.Udf2 = "0"; return _dataManager.Update(equipment) > 0; } /// /// 启动时,所有设备返回原点 /// /// public async Task StartEquipmentGoBackAsync() { #region 四轴 var portArgs = new PortArgs() { ReadWay = "OriginalPosition", WriteWay = WriteWay.GoBack }; #region Z轴单独罗列 portArgs.TypeName = "MotorZ"; if (!((bool)DataCentre.GetClient.Factory("MotorZ").Read(portArgs))) { DataCentre.GetClient.Factory("MotorZ").Write(portArgs); } portArgs.TypeName.UpdateMotorPoint(); #endregion #region X、Y、T轴 #region 设置电机速度 if (_config.SpeedWrite) { MotorSpeed item = _config.GetSpeed[0]; item.Speed = 6; SetSpeed(item); MotorSpeed item1 = _config.GetSpeed[1]; item1.Speed = 6; SetSpeed(item1); } #endregion string[] gobackPoint = new string[] { "MotorX", "MotorY", "MotorT" }; var res = true; foreach (var item in gobackPoint) { res = res && await Task.Factory.StartNew(() => { portArgs.TypeName = item; return (bool)DataCentre.GetClient.Factory(item).Read(portArgs) || DataCentre.GetClient.Factory(item).Write(portArgs); }); item.UpdateMotorPoint(); } #region 设置电机速度 if (_config.SpeedWrite) { MotorSpeed item = _config.GetSpeed[0]; SetSpeed(item); MotorSpeed item1 = _config.GetSpeed[1]; SetSpeed(item1); } #endregion #endregion #endregion #region 升降台 var cagePortArgs = new PortArgs() { TypeName = "Cage", WriteWay = WriteWay.Normotopia }; res = res && DataCentre.GetClient.Factory("Cage").Write(cagePortArgs); var cageStatus = _dataManager.GetEquipmentStatusByName("Cage"); cageStatus.EquipmentState = EquipmentEnum.Normotopia; _dataManager.Update(cageStatus); #endregion #region 消解位 var dissolvePortArgs = new PortArgs() { TypeName = "Dissolve", ReadWay = "OriginalPosition", WriteWay = WriteWay.Antiposition }; res = res && (bool)DataCentre.GetClient.Factory("Dissolve").Read(dissolvePortArgs) || DataCentre.GetClient.Factory("Dissolve").Write(dissolvePortArgs); "Dissolve".UpdateMotorPoint(); var dissolveStatus = _dataManager.GetEquipmentStatusByName("DissolvePosition"); dissolveStatus.EquipmentState = EquipmentEnum.Normotopia; _dataManager.Update(dissolveStatus); #endregion res = DataCentre.GetStorageContent.Factory("DripNozzle").Stop(); #region 硫酸银泵回原点 var silverSulfatePortArgs = new PortArgs() { TypeName = "SilverSulfate", ReadWay = "OriginalPosition", WriteWay = WriteWay.GoBack }; int count = 20; while (!((bool)DataCentre.GetClient.Factory("SilverSulfate").Read(silverSulfatePortArgs))) { if (count-- < 1) { break; } silverSulfatePortArgs.WriteWay = WriteWay.Move; silverSulfatePortArgs.Distance = 1000; DataCentre.GetClient.Factory("SilverSulfate").Write(silverSulfatePortArgs); } #endregion //res = DataCentre.GetStorageContent.Factory("DripNozzle2").Stop(); return res; } public bool zBackToPoint() { PortArgs portArg = new() { WriteWay = WriteWay.GoBack, TypeName = "MotorZ", Distance = "MotorZ".MotorFinal() }; var res = DataCentre.GetClient.Factory("MotorZ").Write(portArg); return res; } public List GetResidueWashTasks() { return _dataManager.GetResidueWashTask(); } /// /// 获取剩余任务 /// /// public List GetResidueTask() { return _dataManager.GetEquipmentTasks(); } /// /// 根据uuid获取任务 /// /// /// /// public List GetTaskByUUID(string guid, params TaskState[] states) { return _dataManager.QueryTaskByUuid(guid, states).ToList(); } /// /// 删除剩余任务 /// /// /// public bool DeleteResidueTask(List tasks) { var rows = _dataManager.Delete(tasks); return rows > 0; } /// /// 更新剩余任务状态(变更为取消) /// /// /// public bool UpdateResidueTaskState(List tasks) { var rows = _dataManager.Update(tasks); return rows > 0; } public bool UpdateTaskState(EquipmentTask task) { var task2= _dataManager.GetEquipmentTasks(task).Where(item => item.OriginLocalName.Equals(task.OriginLocalName)).ToList(); if(task2.Count > 0) { task2[0].Result = task.Result; task2[0].Amount = task.Amount; var rows = _dataManager.Update(task2); return rows == 1; } else return false; } /// /// 查询区域 /// /// public List QueryArea() { return _dataManager.GetAreasByDisable(); } public string GetWavekeyValue() { OptionWindows option = new(_dataManager.GetWavekeys()); return (bool)option.ShowDialog() ? option.WaveKey : string.Empty; } /// /// Word转换 /// /// /// public async Task ConvertWordAsync(string wavekey) { try { var path = _config.ResultWordFilePath; var maxVolume = DataCentre.GetBalanceValue.MaxVolume; var tasks = _dataManager.QueryTaskByUuid(wavekey, TaskState.Finished); if (!tasks.Any()) { UMessageBox.Error("暂未发现已完成任务!"); return false; } if (string.IsNullOrWhiteSpace(path)) { UMessageBox.Error("请查看保存路径是否正确!"); return false; } var res = false; if (_config.ExportTypeByWord) { res = await Task.Factory.StartNew(() => tasks.ConvertToWord(path, maxVolume)); } else if(_config.ExportTypeByExcel) { res = await Task.Factory.StartNew(() => tasks.ConvertToExcel(path)); } return res; } catch (Exception) { throw new Exception(); } } public void deleteTask(string nodeName) { _dataManager.QuerydeledeTask(nodeName); } public void QuerydeledeEmptyCupTask(string nodeName) { _dataManager.QuerydeledeEmptyCupTask(nodeName); } /// /// UI界面任务下发水样任务 /// /// /// /// public IEnumerable SendSampleToControl(List args, string waveKey) { var tasks = new List(); var resList = new List(); var successSend = new StringBuilder(); //这里是已下发的 var repetitionSend = new StringBuilder(); //这里是重复 foreach (var item in args) { if (_dataManager.QueryContainTask(item.NodeName)) { repetitionSend.AppendFormat("{0} ", item.NodeName); continue; } successSend.AppendFormat("{0} ", item.NodeName); var task = item.NewSampleTask(waveKey); //创建任务 tasks.Add(task); _dataManager.QuerydeledeTask(item.NodeName); } _dataManager.Insert(tasks); var successData = new ResponseData(); var errorData = new ResponseData(); if (successSend.Length > 0) { successData.Code = 200; successData.Message = string.Concat(successSend.ToString(), "任务下发成功!"); resList.Add(successData); return resList; } if (repetitionSend.Length <= 0) return resList; errorData.Code = 404; errorData.Message = string.Concat(repetitionSend.ToString(), "地址有在执行的任务,请勿重复下发任务!"); resList.Add(errorData); return resList; } /// /// 检查是否已存在任务 /// /// public bool CheckExistTask() { return _dataManager.GetEquipmentTasks().Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).Any(); } public List CheckExistTaskBD(string wavekey) { return _dataManager.GetEquipmentTasksBD(wavekey).Where(item => item.Status.Equals(TaskState.Finished)).ToList(); } public List GetUpdateValue(params string[] values) { return _dataManager.GetTaskByConcentration(values); } /// /// 下发润洗的任务 /// public bool SendWashTask(string detailName,string waveKey) { if (_dataManager.GetResidueWashTask().Any()) return false; var washTask = detailName.NewWashTask(); washTask.WaveKey = waveKey; if (washTask is null) return false; return _dataManager.Insert(washTask) > 0; } /// /// 写入预热温度 /// public void WritePreheatTemperature() { var portArgs = new PortArgs { TypeName = "Heat", Reserve = _dataManager.GetPid("Preheat"), Distance = Convert.ToInt32(_config.PreheatTemperature) }; DataCentre.GetClient.Factory("Heat").Write(portArgs); Action action = () => UMessageBox.SuccessTip("预热写入成功!"); do { if (DataCentre.GetClient.Factory("Heat").Read(portArgs) is not Dictionary obj) continue; //设定温度小于或等于实际温度 if (Math.Round(obj["sv"]) <= Math.Round(obj["pv"])) break; } while (true); portArgs.Distance = -100; DataCentre.GetClient.Factory("Heat").Write(portArgs); action = () => UMessageBox.SuccessTip("预热结束!"); } public void StopHeatingTemperature() { if (CheckHeatingIsRunning()) { var portArgs = new PortArgs { TypeName = "Heat", Distance = -99, Reserve = DataCentre._dataManager.GetPid("Dissolve") }; DataCentre.GetClient.Factory("Heat").Write(portArgs); string EquipmentName = "HeatRod"; var status = EquipmentName.GetEquipmentState(); //获取加热棒的状态 status.EquipmentState = EquipmentEnum.Waiting; _dataManager.Update(status); Action action = () => UMessageBox.SuccessTip("已停止加热!"); } } /// /// 获取WaveKey /// /// public string GetWavekey() { List equipmentTasks = _dataManager.GetExistTask(); if (equipmentTasks.Any()) { return equipmentTasks.GroupBy(item => item.WaveKey).FirstOrDefault()?.Key; } Batch batch = _dataManager.GetBatch(); if (batch == null || batch.Createtime.ToString("yyyyMMdd") != DateTime.Now.ToString("yyyyMMdd")) { batch = new Batch { CurrentValue = 1, Createtime = DateTime.Now }; } else { ++batch.CurrentValue; } _dataManager.Insert(batch); Wavekey wavakey = new() { WaveKey = $"{DateTime.Now:yyyyMMdd}{batch.CurrentValue.ToString().PadLeft(3, '0')}" }; //20210604001; _dataManager.Insert(wavakey); return wavakey.WaveKey; } } }