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;
}
}
}