using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Action.Base;
using Mesnac.Action.Feeding.Qingquan.BasicInfo;
using Mesnac.Codd.Session;
using System.Data;
using Mesnac.Action.Feeding.Qingquan.FeedingPlc;
using System.Windows.Forms;
namespace Mesnac.Action.Feeding.Qingquan.ProducingPlan
{
///
/// 拆分计划业务类
/// 将A计划剩余车数生成一个B计划
///
public class SplitPlanAction : FeedingAction, IAction
{
#region 事件定义
///
/// 刷新计划事件
///
public static event EventHandler OnRefreshPlan;
#endregion
public void Run(RuntimeParameter runtime)
{
base.RunIni(runtime);
if (runtime.Sender != null && runtime.Sender is Control)
{
(runtime.Sender as Control).Enabled = false;
}
try
{
//是否允许选择班组
if (base.GetConfigValue("IsAllowSelectShiftClass", "0") == "1")
{
FrmShiftClass frmShiftClass = new FrmShiftClass();
DialogResult result = frmShiftClass.ShowDialog();
if (result == DialogResult.OK)
{
int shiftClass = frmShiftClass.ShiftClass;
if (!this.SplitPlan(runtime, shiftClass))
{
runtime.IsReturn = false;
}
}
frmShiftClass.Dispose();
}
else
{
if (!this.SplitPlan(runtime))
{
runtime.IsReturn = false;
}
}
}
catch { }
finally
{
if (runtime.Sender != null && runtime.Sender is Control)
{
(runtime.Sender as Control).Enabled = true;
}
}
}
#region 拆分计划主业务方法
///
/// 拆分计划
///
/// 成功返回true,失败返回false
public bool SplitPlan()
{
return this.SplitPlan(null);
}
///
/// 拆分计划
///
/// 指定新计划的班组
/// 成功返回true,失败返回false
public bool SplitPlan(int shiftClass)
{
return this.SplitPlan(null, shiftClass);
}
///
/// 拆分计划
///
/// 运行时参数
/// 拆分计划时显示指定班组
/// 成功返回true,失败返回false
public bool SplitPlan(RuntimeParameter runtime, params int[] shiftClass)
{
try
{
#region 变量定义
List errorList = new List(); //保存错误信息
DateTime shift_DT = DateTime.Now; //保存计划日期
int shift_id = 0; //保存班次
int shift_class = 0; //保存班组
string recipeObjId = ""; //当前配方编码
int recipeVersionId = 0; //当前配方版本号
int AplanNum = 0; //当前计划数
int ArealNum = 0; //当前计划完成数
int BplanNum = 0; //新计划完成数
int currMixingFisishedCount = 0; //当前密炼完成数
int G_PloyFinishedCount = 0; //新计划的胶料完成数
int G_CarbonFinishedCount = 0; //新计划的炭黑完成数
int G_oilFinishedCount = 0; //新计划的油1完成数
int G_oil2FinishedCount = 0; //新计划的油2完成数
int G_powderFinishedCount = 0; //新计划的粉料完成数
int G_xiaoLiaoFinishedCount = 0; //新计划的小料完成数
int planState = 0; //保存计划状态
string planID = String.Empty; //保存计划号
#endregion
#region 验证部分
if (PlcData.Instance.FinishedBatch.LastValue.ToInt() == 1)
{
ICSharpCode.Core.LoggingService.Debug("正在存盘不允许换班");
errorList.Add("正在存盘不允许换班");
}
//单机版终止执行
if (base.NetType == 0)
{
return false;
}
if (String.IsNullOrEmpty(PlanCommon.PlanLog.LastPlanID))
{
return false;
}
DbHelper serverHelper = base.NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Server);
if (serverHelper == null)
{
ICSharpCode.Core.LoggingService.Error("换班拆分计划失败:获取网络库连接失败...");
errorList.Add("换班拆分计划失败:获取网络库连接失败...");
return false;
}
DataRow row = PlanCommon.GetServerShiftTimeRow();
if (row == null)
{
ICSharpCode.Core.LoggingService.Error("换班拆分计划失败:从网络库获取工厂日历数据失败...");
errorList.Add("换班拆分计划失败:从网络库获取工厂日历数据失败...");
return false;
}
shift_DT = Mesnac.Basic.DataProcessor.RowValue(row, "Shift_dt", DateTime.Now);
shift_id = Mesnac.Basic.DataProcessor.RowValue(row, "Shift_id", 0);
shift_class = Mesnac.Basic.DataProcessor.RowValue(row, "Shift_class", 0);
if (shiftClass.Length > 0)
{
shift_class = shiftClass[0]; //如果指定了班组参数,则使用指定的班组
}
if (String.Format("{0:yyyyMMdd}", PlanCommon.PlanLog.LastSelectDate) == String.Format("{0:yyyyMMdd}", shift_DT) && PlanCommon.PlanLog.LastSelectShiftID == shift_id)
{
ICSharpCode.Core.LoggingService.Debug(String.Format("当前班次:{0};班次相同,不换班!", PlanCommon.PlanLog.LastSelectShiftID));
errorList.Add("班次相同,不换班");
return false;
}
#endregion
#region 业务数据处理部分
ICSharpCode.Core.LoggingService.Debug(String.Format("换班日期:{0:yyyy-MM-dd},班次:{1}", shift_DT, shift_id));
DataRow planRow = PlanCommon.GetPlanData(Basic.DataSourceFactory.MCDbType.Local, PlanCommon.PlanLog.LastPlanID);
if (planRow == null)
{
ICSharpCode.Core.LoggingService.Error("换班拆分计划失败:获取当前计划失败...");
return false;
}
planState = Mesnac.Basic.DataProcessor.RowValue(planRow, "PlanState", 0);
recipeObjId = Mesnac.Basic.DataProcessor.RowValue(planRow, "RecipeMaterialCode", String.Empty);
recipeVersionId = Mesnac.Basic.DataProcessor.RowValue(planRow, "RecipeVersionID", 0);
AplanNum = Mesnac.Basic.DataProcessor.RowValue(planRow, "PlanNum", 0);
ArealNum = Mesnac.Basic.DataProcessor.RowValue(planRow, "RealNum", 0);
BplanNum = AplanNum - ArealNum;
if (planState != 5)
{
if (BplanNum <= 0)
{
ICSharpCode.Core.LoggingService.Debug("剩余数量为0");
errorList.Add("剩余数量为0");
}
//把原始计划的计划状态改为完成,原始计划数更新计划完成数
PlanCommon.UpdatedPlanStateAndRealEndTime(Basic.DataSourceFactory.MCDbType.Server, PlanCommon.PlanLog.LastPlanID, 5, DateTime.Now, ArealNum);
PlanCommon.UpdatedPlanStateAndRealEndTime(Basic.DataSourceFactory.MCDbType.Local, PlanCommon.PlanLog.LastPlanID, 5, DateTime.Now, ArealNum);
if (BplanNum > 0)
{
//在网络数据库中添加计划
planID = PlanCommon.AddPlan(Mesnac.Basic.DataSourceFactory.MCDbType.Server, base.CurrEquipCode, shift_DT, shift_id, shift_class, recipeObjId.ToString(), recipeVersionId, BplanNum, out errorList);
//接收新添加的计划到本地库
PlanCommon.RecivePlan(planID, base.CurrEquipCode, shift_DT, shift_id);
}
}
//更新计划日志
PlanLog planLog = new PlanLog();
planLog.LastSelectDate = shift_DT;
planLog.LastSelectShiftID = shift_id;
planLog.LastClassID = shift_class;
planLog.LastPlanID = planID;
PlanCommon.PlanLog = planLog;
//更新计划缓存
RecipeData recipeData = new RecipeData();
RecipeCache.Instance.CachePlanInfo(recipeData.GetCurrentPptPlanInfo());
string xmlRecipeCache_PlanInfo = Mesnac.Basic.SerializeHandler.SerializeObject(RecipeCache.Instance.PlanInfo);
base.UpdateSysValue("RecipeCache_PlanInfo", xmlRecipeCache_PlanInfo);
//更改计划状态为正在执行
PlanCommon.UpdatedPlanStateAndRealStartTime(Basic.DataSourceFactory.MCDbType.Server, planID, 4, DateTime.Now);
PlanCommon.UpdatedPlanStateAndRealStartTime(Basic.DataSourceFactory.MCDbType.Local, planID, 4, DateTime.Now);
//更新总重
double totalweight = PlanCommon.GetTotalWeightByPlanID(planID);
PlanCommon.UpdateTotalWeight(planID, totalweight);
#endregion
#region PLC操作部分
currMixingFisishedCount = PlcData.Instance.MixingFinishedCount.LastValue.ToInt(); //当前密炼完成数
#region 密炼
//下传密炼完成数为0
this.DownloadFinishNumer(0);
#endregion
#region 胶料
if (PlcData.Instance.PloyFinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_PloyFinishedCount = PlcData.Instance.PloyFinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_PloyFinishedCount = 0;
}
//下传胶料完成数
this.DownLoadRubWeightNum(G_PloyFinishedCount);
#endregion
#region 炭黑
if (PlcData.Instance.CarbonFinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_CarbonFinishedCount = PlcData.Instance.CarbonFinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_CarbonFinishedCount = 0;
}
//下传炭黑完成数
this.DownLoadCBWeightNum(G_CarbonFinishedCount);
#endregion
#region 油1
if (PlcData.Instance.OilFinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_oilFinishedCount = PlcData.Instance.OilFinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_oilFinishedCount = 0;
}
//下传油1完成数
this.DownLoadOil1WeightNum(G_oilFinishedCount);
#endregion
#region 油2
if (PlcData.Instance.Oil2FinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_oil2FinishedCount = PlcData.Instance.Oil2FinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_oil2FinishedCount = 0;
}
//下传油2完成数
this.DownLoadOil2WeightNum(G_oil2FinishedCount);
#endregion
#region 粉料
if (PlcData.Instance.PowderFinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_powderFinishedCount = PlcData.Instance.PowderFinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_powderFinishedCount = 0;
}
//下传粉料完成数
this.DownLoadPowderWeightNum(G_powderFinishedCount);
#endregion
#region 小料
if (PlanCommon.IsHaveXiaoliao())
{
if (PlcData.Instance.XiaoLiaoFinishedCount.LastValue.ToInt() - currMixingFisishedCount >= 0)
{
G_xiaoLiaoFinishedCount = PlcData.Instance.XiaoLiaoFinishedCount.LastValue.ToInt() - currMixingFisishedCount;
}
else
{
G_xiaoLiaoFinishedCount = 0;
}
//下传小料完成数
this.DownLoadXiaoLiaoWeightNum(G_xiaoLiaoFinishedCount);
}
#endregion
#region 下传修改密炼完成次数标志 换班标识1023
this.DownloadMixDoneNumFlag(1023);
#endregion
#endregion
#region 刷新计划
//修改新计划的设定数
ModifyPlanNum mpn = new ModifyPlanNum();
mpn.SimpleModifyPlanNum(planID, BplanNum, true);
Dictionary paras = new Dictionary();
paras.Add("@planID", planID);
paras.Add("@planNum", BplanNum);
base.ExecuteProcedure(Basic.DataSourceFactory.MCDbType.Server, "proc_PlanToYFS", paras);
//刷新计划界面
if (OnRefreshPlan != null)
{
if (runtime != null)
{
OnRefreshPlan(runtime.Sender, System.EventArgs.Empty);
}
else
{
OnRefreshPlan(null, System.EventArgs.Empty);
}
}
ICSharpCode.Core.LoggingService.Debug("计划拆分完成");
base.DBLog("基本操作", "换班", "计划拆分完成"); //增加数据操作日志
#endregion
#region 把当前计划列表发送给客户端
if (PlanCommon.PlanLog != null)
{
PlanCommon.SendInit(base.CurrEquipCode, PlanCommon.PlanLog.LastSelectDate, PlanCommon.PlanLog.LastSelectShiftID, PlanCommon.PlanLog.LastClassID, base.GetConfigValue("LastUserID", "0"));
}
else
{
string sbNetMsg = Global.ProtocalHeader.ReceivePlanIpNumber + ":/";
Mesnac.Communication.TcpService.Instance.NetSendMsg(sbNetMsg.ToString()); //发送网络消息
ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]没有计划日志!", planID));
}
#endregion
return true;
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("拆分计划错误:" + ex.Message);
return false;
}
}
#endregion
#region PLC写入辅助方法定义
///
/// 下传密炼完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownloadFinishNumer(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.MixingFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyMixDoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传密炼完成次数到PLC]");
}
return result;
}
///
/// 下传胶料完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadRubWeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.PloyFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyPloyDoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传胶料完成次数到PLC]");
}
return result;
}
///
/// 下传炭黑完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadCBWeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.CarbonFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyCBDoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传炭黑完成次数到PLC]");
}
return result;
}
///
/// 下传油1完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadOil1WeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.OilFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyOil1DoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传油1完成次数到PLC]");
}
return result;
}
///
/// 下传油2完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadOil2WeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.Oil2FinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyOil2DoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传油1完成次数到PLC]");
}
return result;
}
///
/// 下传粉料完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadPowderWeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.PowderFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyPowderDoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传粉料完成次数到PLC]");
}
return result;
}
///
/// 下传小料完成次数到PLC
///
/// 成功返回true,失败返回false
public bool DownLoadXiaoLiaoWeightNum(int nNumber)
{
//bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.XiaoLiaoFinishedCount, new object[] { nNumber });
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyDrugDoneNum, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传小料完成次数到PLC]");
}
return result;
}
///
/// 下传修改密炼完成次数标志
///
///
///
public bool DownloadMixDoneNumFlag(int nNumber)
{
bool result = PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.ModifyMixDoneNumFlag, new object[] { nNumber });
if (result == false)
{
base.LogError("PLC通讯故障:[下传修改密炼完成次数标志到PLC]");
}
return result;
}
///
/// 是否有小料
///
///
//private bool IsHaveXiaoliao()
//{
// //List lst = new RecipeData().GetCurrentRecipeWeightInfo();
// List lst = RecipeCache.Instance.AllWeightInfo;
// foreach (RecipeData.RecipeWeightInfo item in lst)
// {
// if (item.WeightType == (int)RecipeData.WeightType.小料)
// {
// return true;
// }
// }
// return false;
//}
#endregion
}
}