using System;
using System.Collections;
using System.Windows.Forms;
using Core.StlMes.Client.LgClassModel;
using CoreFS.CA06;
namespace Core.StlMes.Client.LgCommon
{
///
/// 命令发送公用
///
public class ClsCommandPack
{
private OpeBase _ob;
private COM_STL_COMMAND _csc; //
private string _HeatProcessNo = ""; //加热处理号
private string _OBJECTPOS = ""; //设备位置 如:LFS01_FRONT
private string _DEVICE_POSITION = ""; //设备编码 如:LFS01
private string[] _HeatProcessBuffer = new string[] { "", "", "", "" }; //各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK
private WORKBIT _WorkBit = WORKBIT.NONE; //FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 0不变化
public string strObjectID = "12100000"; //转炉加载默从PPC_STEEL_HEATNO取对应工序最小炉号,脱硫由作业界面生成脱硫号
///
/// 切换岗位信息(FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 NONE:不变化)
///
public WORKBIT WorkBit
{
get { return _WorkBit; }
}
public ClsCommandPack(OpeBase ob)
{
this._ob = ob;
}
///
/// 发送命令
///
///
///
///
private bool SendCommand(RealDataCommand realDataCommand, out string strMsg)
{
strMsg = "";
if (realDataCommand == null)
{
strMsg = "指令不能为空!";
return false;
}
ArrayList Args = new ArrayList();
Args.Add(realDataCommand.COMMANDTYPE);
Args.Add(realDataCommand.OBJECTPOS);
Args.Add(realDataCommand.OBJECTID);
Args.Add(realDataCommand.STR_VALUE);
Args.Add(realDataCommand.FLT_VALUE.ToString());
Args.Add(realDataCommand.OBJECTIP);
Args.Add(realDataCommand.SENDTYPE);
CoreClientParam ccp = new CoreClientParam();
try
{
ccp.IfShowErrMsg = false;
ccp.ServerName = "Core.LgMes.Server.LgJobMgt.SchedulingCommandMgt";
ccp.MethodName = "AddNewCommand";
ccp.ServerParams = new object[] { Args };
ccp = _ob.ExecuteNonQuery(ccp, CoreInvokeType.Internal);
strMsg = ccp.ReturnInfo;
}
catch (Exception ex)
{
string strErr = (ccp == null ? "" : ccp.ReturnInfo);
if (string.IsNullOrEmpty(strErr)) strMsg = ex.Message;
else strMsg = strErr;
}
if (string.IsNullOrEmpty(strMsg)) return true;
else return false;
}
///
/// 加载炉次计划命令(不能指定炉号,系统自动查找最小排产炉号)
///
/// BOF0?_DEVICE、HMP0?_DEVICE
///
public bool CommandCharge(string srcPos)
{
bool bSuccess = false;
try
{
RealDataCommand realDataCommand = new RealDataCommand();
realDataCommand.COMMANDTYPE = "SCHEDULE_CHARGE";
realDataCommand.OBJECTID = strObjectID;
realDataCommand.OBJECTPOS = srcPos;
realDataCommand.STR_VALUE = srcPos;
realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
realDataCommand.SENDTYPE = "0";
string strMsg = "";
bSuccess = SendCommand(realDataCommand, out strMsg);
if (!bSuccess)
MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch { }
return bSuccess;
}
///
/// 发送钢水到目标位置
///
/// 原始位置加热处理号
/// 原始位置 如:BOF01_DEVICE
/// 目标位置 如:BOF01_BACK
///
public bool CommandMove(string HeatProcessNo, string srcPos, string destPos)
{
bool bSuccess = false;
try
{
RealDataCommand realDataCommand = new RealDataCommand();
realDataCommand.COMMANDTYPE = "SCHEDULE_MOVE";
realDataCommand.OBJECTID = HeatProcessNo;
realDataCommand.OBJECTPOS = srcPos;
realDataCommand.STR_VALUE = destPos;
realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
realDataCommand.SENDTYPE = "0";
string strMsg = "";
bSuccess = SendCommand(realDataCommand, out strMsg);
if (!bSuccess)
MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch { }
return bSuccess;
}
///
/// 钢包位置交换
///
/// 原始位置加热处理号
/// 原始位置 如:LFS01_FRONT
/// [0]:IDLE [1]:FRONT [2]DEVICE [3]BACK
public bool CommandTrans(string HeatProcessNo, string srcPos, string[] HeatProcessBuffer)
{
bool bSuccess = false;
if (string.IsNullOrEmpty(srcPos) || srcPos.Length < 5) return false;
if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return false;
string strIdleID = HeatProcessBuffer[0];
string strFrontID = HeatProcessBuffer[1];
string strDeviceID = HeatProcessBuffer[2];
string strBackID = HeatProcessBuffer[3];
string desPos = "";
if (srcPos.IndexOf("_FRONT") > -1)
{
if (!string.IsNullOrEmpty(strDeviceID))
desPos = srcPos.Substring(0, 5) + "_DEVICE"; //FRONT -> DEVICE
if (!string.IsNullOrEmpty(strBackID))
desPos = srcPos.Substring(0, 5) + "_BACK"; //FRONT -> BACK
}
else if (srcPos.IndexOf("_DEVICE") > -1)
{
if (!string.IsNullOrEmpty(strBackID))
desPos = srcPos.Substring(0, 5) + "_BACK"; //DEVICE -> BACK
if (!string.IsNullOrEmpty(strFrontID))
desPos = srcPos.Substring(0, 5) + "_FRONT"; //DEVICE -> FRONT
}
else if (srcPos.IndexOf("_BACK") > -1)
{
if (!string.IsNullOrEmpty(strDeviceID))
desPos = srcPos.Substring(0, 5) + "_DEVICE"; //BACK -> DEVICE
if (!string.IsNullOrEmpty(strFrontID))
desPos = srcPos.Substring(0, 5) + "_FRONT"; //BACK -> FRONT
}
if (string.IsNullOrEmpty(desPos))
{
MessageBox.Show("无可置换位置的钢水!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return false;
}
try
{
RealDataCommand realDataCommand = new RealDataCommand();
realDataCommand.COMMANDTYPE = "SCHEDULE_TRANS";
realDataCommand.OBJECTID = HeatProcessNo;
realDataCommand.OBJECTPOS = srcPos;
realDataCommand.STR_VALUE = desPos;
realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
realDataCommand.SENDTYPE = "0";
string strMsg = "";
bSuccess = SendCommand(realDataCommand, out strMsg);
if (!bSuccess)
MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
catch { }
return bSuccess;
}
///
/// 手动执行操作
///
/// 设备位置 如:LFS01_FRONT
/// 各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK
/// 当前岗位手动操作配置集合
public void BeginManualOperate(string ObjectPos, string[] HeatProcessBuffer, CommandCollection CC)
{
ObjectPos = ObjectPos.Trim().ToUpper();
if (string.IsNullOrEmpty(ObjectPos) || ObjectPos.Length <= 6) return;
if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return;
string strPos = ObjectPos.Substring(5);
if (strPos.Equals("_IDLE")) this._HeatProcessNo = HeatProcessBuffer[0];
else if (strPos.Equals("_FRONT")) this._HeatProcessNo = HeatProcessBuffer[1];
else if (strPos.Equals("_DEVICE")) this._HeatProcessNo = HeatProcessBuffer[2];
else if (strPos.Equals("_BACK")) this._HeatProcessNo = HeatProcessBuffer[3];
else
{
this._HeatProcessNo = "";
MessageBox.Show("设备位置:" + ObjectPos + " 无法识别!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (ObjectPos.Substring(0, 3).Equals("HMP"))
{
if (ClsBusinessPack.HudwProcessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHudwProcessNo);
else _HeatProcessNo = "";
}
else
{
if (ClsBusinessPack.HeatProccessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHeatProcessNo);
else _HeatProcessNo = "";
}
if (string.IsNullOrEmpty(_HeatProcessNo))
{
MessageBox.Show("当前岗位无生产任务,无法操作!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
this._WorkBit = WORKBIT.NONE; //默认不切换工位显示
this._OBJECTPOS = ObjectPos; //设备位置
this._DEVICE_POSITION = ObjectPos.Substring(0, 5); //设备编码
this._HeatProcessBuffer = HeatProcessBuffer; //各工位加热处理号
frmManualOperate frm = new frmManualOperate(_DEVICE_POSITION, _OBJECTPOS, CC);
frm.Location = ClsControlPack.GetChildWindowLocation(frm.Size);
if (frm.ShowDialog() == DialogResult.OK)
{
this._csc = frm.CSC;
this.AnaliseCommand();
}
}
///
/// 解析操作
///
private void AnaliseCommand()
{
if (_csc == null) return;
try
{
string strMsg = "";
string destPos = "";
string destID = "";
bool Successfull = false;
string ConfirmMsg = AnaliseDevide(_DEVICE_POSITION) + GetHeatNo(_DEVICE_POSITION) + " ";
if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ARRIVE ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ASSIGNEDPOS ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TAPPING ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.MELTDOWN ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OVER) //进站、上台、指定位置、出钢、回炉、强制结束
{
ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
destPos = (_csc.OBJECTPOS.IndexOf("%") > -1 ? _csc.OBJECTPOS.Replace("%", _DEVICE_POSITION) : _csc.OBJECTPOS);
if (_csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.MELTDOWN && _csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.OVER && !AssignedPosValid(destPos)) return;
Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos);
}
else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.GONEXT) //出站、去下道工序
{
Successfull = ClsBusinessPack.GetNextPos(_HeatProcessNo, out destPos, out destID, out strMsg, _ob);
if (!Successfull) return;
strMsg = AnaliseObjectPos(destPos);
if (!string.IsNullOrEmpty(destID))
{
strMsg = AnaliseObjectPos(destPos);
MessageBox.Show(strMsg + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE) ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
else ConfirmMsg += "去 " + strMsg + "\n是否确认?";
if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos);
}
else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TRANS) //钢包位置对换
{
ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
Successfull = CommandTrans(_HeatProcessNo, _OBJECTPOS, _HeatProcessBuffer);
}
else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OPENCAST ||
_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.STOPCAST) //开浇、停浇
{
Successfull = true;//无钢水调动操作、只需要更新相关字段
}
else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.SWITCH) //显示工位切换
{
if (_csc.OBJECTPOS.Contains("FRONT")) _WorkBit = WORKBIT.FRONT;
else if (_csc.OBJECTPOS.Contains("DEVICE")) _WorkBit = WORKBIT.DEVICE;
else if (_csc.OBJECTPOS.Contains("BACK")) _WorkBit = WORKBIT.BACK;
else _WorkBit = WORKBIT.NONE;
}
//设置关键时间
if (Successfull) ClsBusinessPack.UpdateTimeNode(_csc, _HeatProcessNo, _ob);
}
catch { }
}
///
/// 验证指定设备位置是否空闲
///
///
///
private bool AssignedPosValid(string ObjectPos)
{
if (string.IsNullOrEmpty(ObjectPos))
{
MessageBox.Show("目标位置未指定!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return false;
}
string strMsg = "";
bool bSuccess = false;
string ObjectID = ClsBusinessPack.GetDesignatedObjectID(ObjectPos, out bSuccess, out strMsg, this._ob);
string str = AnaliseObjectPos(ObjectPos);
if (!bSuccess)
{
MessageBox.Show(str + "生产信息获取失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return false;
}
if (!string.IsNullOrEmpty(ObjectID))
{
MessageBox.Show(str + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return false;
}
return true;
}
///
/// 根据设备位置获取炉号类别
///
///
///
private string AnaliseDevide(string DEVICE_POSITION)
{
return (DEVICE_POSITION.Substring(0, 3) == "HMP" ? "脱硫号" : "炉号") + ":";
}
///
/// 获取脱硫号或者炉号
///
///
///
private string GetHeatNo(string DEVICE_POSITION)
{
if (DEVICE_POSITION.Substring(0, 3) == "HMP") return ClsBusinessPack.getHudwIdID(this._HeatProcessNo);
else return ClsBusinessPack.getSmeltingID(this._HeatProcessNo);
}
///
/// 证设备位置为中文名称
///
///
///
private string AnaliseObjectPos(string ObjectPos)
{
try
{
ObjectPos = ObjectPos.Trim().ToUpper();
if (string.IsNullOrEmpty(ObjectPos)) return "";
if (!ObjectPos.Contains("_")) return "";
string[] str = ObjectPos.Split(new string[] { "_" }, StringSplitOptions.None);
str[0] = ClsBusinessPack.GetDeviceChineseName(str[0]);
str[1] = ClsBusinessPack.analysPosName(ObjectPos);
return str[0] + str[1] + "";
}
catch { }
return "";
}
}
///
/// 工位显示(主要为LF、RH、VD设备提供)
///
public enum WORKBIT : int
{
///
/// 不变化
///
NONE = 0,
///
/// 切换到FRONT(1#小车位)
///
FRONT = 1,
///
/// 切换到BACK(2#小车位)
///
BACK = 2,
///
/// 切换到DEVICE(处理位)
///
DEVICE = 3,
///
/// 切换到IDLE(缓冲位)
///
IDLE = 4
}
public enum DeviceCode : int
{
MIS = 20,
MIS01 = 1,
MIS02 = 2,
HMP = 21,
HMP01 = 1,
HMP02 = 2,
HMP03 = 3,
BOF = 22,
BOF01 = 1,
BOF02 = 2,
BOF03 = 3,
BOF04 = 4,
BOF05 = 5,
CAS = 23,
CAS01 = 1,
CAS02 = 2,
CAS03 = 3,
CAS04 = 4,
CAS05 = 5,
LFS = 24,
LFS01 = 1,
LFS02 = 2,
LFS03 = 3,
RHS = 25,
RHS01 = 1,
RHS02 = 2,
RHS03 = 3,
CCM = 26,
CCM01 = 1,
CCM02 = 2,
CCM03 = 3,
CCM04 = 4,
CCM05 = 5
}
}