//重做当前 private void bReWork_click(object sender, RoutedEventArgs e) { MesJobOrder mesJobOrder = gridorder.GetFocusedRow() as MesJobOrder; if (mesJobOrder == null) { return; } if (WPFMessageBox.ShowConfirm("确定要重做当前工序吗?", "重做工序") != WPFMessageBoxResult.OK) { return; } MesProcessCtrol processCtrol = ws.UseService(s => s.GetMesProcessCtrols($"JOB_ORDER_PKNO = '{mesJobOrder.PKNO}' AND PROCESS_STATE < 10 ")) .OrderBy(c => c.PROCESS_INDEX).FirstOrDefault(); //正在执行的 if (processCtrol == null) { return; } processCtrol.PROCESS_STATE = 1; //重新执行 ws.UseService(s => s.UpdateMesProcessCtrol(processCtrol)); gridItem.ItemsSource = ws.UseService(s => s.GetMesProcessCtrols($"JOB_ORDER_PKNO = '{mesJobOrder.PKNO}' ")) .OrderBy(c => c.PROCESS_INDEX).ThenBy(c => c.CREATION_DATE).ToList(); }
public MesProcessCtrol GetMesProcessCtrolById(string Id) { using (IMesProcessCtrolBLL MesProcessCtrolBLL = BLLContainer.Resolve <IMesProcessCtrolBLL>()) { MesProcessCtrol model = MesProcessCtrolBLL.GetFirstOrDefault(Id); return(model); } }
public bool AddMesProcessCtrol(MesProcessCtrol mMesProcessCtrol) { if (mMesProcessCtrol == null) { return(false); } using (IMesProcessCtrolBLL MesProcessCtrolBLL = BLLContainer.Resolve <IMesProcessCtrolBLL>()) { return(MesProcessCtrolBLL.Add(mMesProcessCtrol)); } }
//完成当前 private void bFinishThis_click(object sender, RoutedEventArgs e) { MesJobOrder mesJobOrder = gridorder.GetFocusedRow() as MesJobOrder; if (mesJobOrder == null) { return; } if (WPFMessageBox.ShowConfirm("确定要完成当前工序吗?", "完成当前工序") != WPFMessageBoxResult.OK) { return; } List <MesProcessCtrol> processCtrols = ws.UseService(s => s.GetMesProcessCtrols($"PROCESS_STATE < 10 ")) .OrderBy(c => c.PROCESS_INDEX).ThenBy(c => c.CREATION_DATE).ToList(); //执行的动作 MesProcessCtrol processCtrol = processCtrols.FirstOrDefault(c => c.JOB_ORDER_PKNO == mesJobOrder.PKNO); if (processCtrol == null) { return; } var result = DeviceProcessControl.FinishCurBusiness(processCtrol); if (result != "OK") { WPFMessageBox.ShowError("当前工序的业务层完成错误,请核实。\r\n错误为:" + result, "完成当前工序"); return; } processCtrol.PROCESS_STATE = 10; //执行完成 ws.UseService(s => s.UpdateMesProcessCtrol(processCtrol)); if (processCtrol == processCtrols.LastOrDefault()) { mesJobOrder.PROCESS_INFO = "手动完成当前过程"; //生产执行信息 mesJobOrder.ACT_FINISH_TIME = DateTime.Now; mesJobOrder.RUN_STATE = 101; //手动完成 mesJobOrder.ONCE_QTY = 1; //默认订单为1 mesJobOrder.COMPLETE_QTY = 1; } else { mesJobOrder.PROCESS_INFO = "手动完成当前订单"; //生产执行信息 } ws.UseService(s => s.UpdateMesJobOrder(mesJobOrder)); gridItem.ItemsSource = ws.UseService(s => s.GetMesProcessCtrols($"JOB_ORDER_PKNO = '{mesJobOrder.PKNO}' ")) .OrderBy(c => c.PROCESS_INDEX).ThenBy(c => c.CREATION_DATE).ToList(); }
public bool DelMesProcessCtrol(string Id) { using (IMesProcessCtrolBLL MesProcessCtrolBLL = BLLContainer.Resolve <IMesProcessCtrolBLL>()) { try { MesProcessCtrol item = MesProcessCtrolBLL.GetFirstOrDefault(Id); return(MesProcessCtrolBLL.Delete(item)); } catch { return(false); } } }
/// <summary> /// 检验当前工序状态 /// </summary> /// <returns></returns> public bool CheckState() { firstProcess = theJobProcessCtrols.OrderBy(c => c.PROCESS_INDEX).ThenBy(c => c.CREATION_DATE).FirstOrDefault(c => c.USE_FLAG == 1); //第一道工序可用工序 curProcess = usefulProcessCtrols.OrderBy(c => c.PROCESS_INDEX).ThenBy(c => c.CREATION_DATE).FirstOrDefault(c => c.PROCESS_STATE >= 0); //当前执行的工序 if (curProcess == null) { string sErrorInfo = $"没有可用的未执行工序控制信息"; if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } return(false); } if (curProcess.PROCESS_STATE == 0) { string sErrorInfo = $"当前工序尚未准备好,请准备好该工序."; if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } return(false); } bFirstProcess = (curProcess.PROCESS_INDEX == firstProcess.PROCESS_INDEX); //是否为第一道工序 bLastProcess = (curProcess.PROCESS_INDEX == usefulProcessCtrols.LastOrDefault().PROCESS_INDEX); //是否为最后一个工序 ctrolName = curProcess.PROCESS_CTROL_NAME ?? curProcess.PROCESS_INDEX.ToString(); //过程控制名称 curAction = actionControls.FirstOrDefault(c => c.PKNO == curProcess.PROCESS_ACTION_PKNO); //当前动作 if (curAction == null) //空动作的工序,手动完成 { string sErrorInfo = $"当前生产过程[{ctrolName}]没有动作控制指令,须手动完成."; if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } Console.WriteLine(sErrorInfo); return(false); } return(true); }
public bool DelMesProcessCtrols(string[] Ids) { using (IMesProcessCtrolBLL MesProcessCtrolBLL = BLLContainer.Resolve <IMesProcessCtrolBLL>()) { try { List <MesProcessCtrol> entitys = new List <MesProcessCtrol>(); foreach (string id in Ids) { MesProcessCtrol item = MesProcessCtrolBLL.GetFirstOrDefault(id); entitys.Add(item); } return(MesProcessCtrolBLL.Delete(entitys)); } catch { return(false); } } }
private void cmbProcess_SelectionChanged(object sender, SelectionChangedEventArgs e) { //选择工序 => 获取设备 cmbDevice.SelectedIndex = -1; cmbDevice.ItemsSource = null; if (cmbProcess.SelectedValue == null) { return; } if (cmbProduct.SelectedValue == null) { return; } MesJobOrder jobOrder = cmbTask.SelectedItem as MesJobOrder; if (jobOrder == null) { return; } string processPKNO = cmbProcess.SelectedValue.ToString(); MesProcessCtrol processCtrol = wsPLM .UseService(s => s.GetMesProcessCtrols( $"USE_FLAG = 1 AND JOB_ORDER_PKNO = '{jobOrder.PKNO}' AND ROUTING_DETAIL_PKNO = '{processPKNO}'")) .OrderBy(c => c.PROCESS_INDEX).FirstOrDefault(); if (processCtrol == null) { return; } cmbDevice.ItemsSource = wsEAM.UseService(s => s.GetAmAssetMasterNs($"USE_FLAG = 1 AND ASSET_CODE = '{processCtrol.PROCESS_DEVICE_PKNO}'")); if (cmbDevice.Items.Count > 0) { cmbDevice.SelectedIndex = 0; //选择第一个 } GetPage(); }
private void bSave_Click(object sender, System.Windows.RoutedEventArgs e) { if (cmbRoutingMain.SelectedValue == null) { return; } #region 创建生产过程 //生产线数据 PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine; //产品数据 string itemPKNO = cmbProduct.SelectedValue.ToString(); RsItemMaster product = wsRSM.UseService(s => s.GetRsItemMasterById(itemPKNO)); if (product == null) { MessageBox.Show("产品信息不存在,请核实.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //准备完成 List <MesProcessCtrol> processCtrols = new List <MesProcessCtrol>(); List <RsRoutingDetail> rsRoutingDetails = gridProcessInfo.ItemsSource as List <RsRoutingDetail>; //已创建加工数量 int qty = CheckPlanQTY(taskLine.TASK_NO); decimal preparedQty = 0; decimal.TryParse(tbTaskQty.Text.ToString(), out preparedQty); if (preparedQty <= 0) { MessageBox.Show("请输入正确的任务数量.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #region 判断加工数量 if (tbTaskQty.Text.ToString() == "") { MessageBox.Show($"请输入数量", "未输入数量", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (int.Parse(tbTaskQty.Text.ToString()) + qty > taskLine.TASK_QTY) { MessageBox.Show($"输入数量超出订单加工数量", "数量超限", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #endregion AmAssetMasterN mainDevice = cmbAssetInfo.SelectedItem as AmAssetMasterN; if (mainDevice == null) { MessageBox.Show("请选择主控PLC", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #region 创建工单表 MesJobOrder jobOrder = new MesJobOrder() { PKNO = Guid.NewGuid().ToString("N"), COMPANY_CODE = "", LINE_PKNO = taskLine.LINE_PKNO, //产线信息 LINE_TASK_PKNO = taskLine.PKNO, ITEM_PKNO = itemPKNO, JOB_ORDER_NO = taskLine.TASK_NO + lbBatchIndex.Content.ToString(), BATCH_NO = lbBatchIndex.Content.ToString(), ROUTING_DETAIL_PKNO = cmbRoutingMain.SelectedValue.ToString(), TASK_QTY = preparedQty, COMPLETE_QTY = 0, ONLINE_QTY = 0, ONCE_QTY = 0, RUN_STATE = 1, //准备完成 CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "", }; #endregion List <MesProcessCtrol> newMesProcessCtrols = new List <MesProcessCtrol>(); int iProcessIndex = 0; string DeviceInfos = ""; string Programs = ""; #region 获取加工设备、程序号 foreach (RsRoutingDetail item in rsRoutingDetails) { if (string.IsNullOrEmpty(item.WC_ABV)) { MessageBox.Show($"工序【{item.OP_NAME}】加工设备不能为空,请选择加工设备!", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } AmAssetMasterN device = wsEAM.UseService(s => s.GetAmAssetMasterNById(item.WC_ABV)); if (device == null) { MessageBox.Show($"工序【{item.OP_NAME}】加工设备,请选择加工设备!", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } DeviceInfos += device.ASSET_LABEL; //设备 Programs += item.NC_PRO_NAME; //程序号 } #endregion wsPLM.UseService(s => s.AddMesJobOrder(jobOrder)); //添加工单 #region 添加加工工序,共5步 FmsActionControl ctrl1 = wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送产品信息'")) .FirstOrDefault(); // FmsActionControl ctrl2 = wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送数量'")) .FirstOrDefault(); // FmsActionControl ctrl3 = wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '发送设备及程序号'")) .FirstOrDefault(); // FmsActionControl ctrl4 = wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '订单确认'")) .FirstOrDefault(); // FmsActionControl ctrl5 = wsFMS.UseService(s => s.GetFmsActionControls($"ASSET_CODE = '{mainDevice.ASSET_CODE}' AND ACTION_NAME = '订单完成'")) .FirstOrDefault(); // #region 1.第一步发送产品信息 MesProcessCtrol step1 = new MesProcessCtrol() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = "", JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = cmbTask.Text + lbBatchIndex.Content, //工单编号 ITEM_PKNO = jobOrder.ITEM_PKNO, //产品PKNO SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", //工序编号(工艺路线明细)为空,不按照工艺进行控制 PROCESS_DEVICE_PKNO = mainDevice.PKNO, //加工设备为 主控PLC PROCESS_INDEX = 0, PROCESS_ACTION_TYPE = 0, PROCESS_ACTION_PKNO = (ctrl1 == null) ? "" : ctrl1.PKNO, PROCESS_ACTION_PARAM1_VALUE = product.ITEM_ABV, //产品简称 PROCESS_ACTION_PARAM2_VALUE = "", CUR_PRODUCT_CODE_PKNO = "", PROCESS_QTY = preparedQty, COMPLETE_QTY = 0, QUALIFIED_QTY = 0, PROCESS_STATE = 1, CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "系统自动形成", }; #endregion end 1 #region 2.第二步发送数量 MesProcessCtrol step2 = new MesProcessCtrol() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = "", JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = cmbTask.Text + lbBatchIndex.Content, //工单编号 ITEM_PKNO = jobOrder.ITEM_PKNO, //产品PKNO SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", //工序编号(工艺路线明细)为空,不按照工艺进行控制 PROCESS_DEVICE_PKNO = mainDevice.PKNO, //加工设备为 主控PLC PROCESS_INDEX = 1, PROCESS_ACTION_TYPE = 0, PROCESS_ACTION_PKNO = (ctrl2 == null) ? "" : ctrl2.PKNO, PROCESS_ACTION_PARAM1_VALUE = preparedQty.ToString(), //数量 PROCESS_ACTION_PARAM2_VALUE = "", CUR_PRODUCT_CODE_PKNO = "", PROCESS_QTY = preparedQty, COMPLETE_QTY = 0, QUALIFIED_QTY = 0, PROCESS_STATE = 1, CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "系统自动形成", }; #endregion end 2 #region 3.第三步发送设备及程序号 MesProcessCtrol step3 = new MesProcessCtrol() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = "", JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = cmbTask.Text + lbBatchIndex.Content, //工单编号 ITEM_PKNO = jobOrder.ITEM_PKNO, //产品PKNO SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", //工序编号(工艺路线明细)为空,不按照工艺进行控制 PROCESS_DEVICE_PKNO = mainDevice.PKNO, //加工设备为 主控PLC PROCESS_INDEX = 2, PROCESS_ACTION_TYPE = 0, PROCESS_ACTION_PKNO = (ctrl3 == null) ? "" : ctrl3.PKNO, PROCESS_ACTION_PARAM1_VALUE = DeviceInfos, //设备ID PROCESS_ACTION_PARAM2_VALUE = Programs, //程序号 CUR_PRODUCT_CODE_PKNO = "", PROCESS_QTY = preparedQty, COMPLETE_QTY = 0, QUALIFIED_QTY = 0, PROCESS_STATE = 1, CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "系统自动形成", }; #endregion end 3 #region 4.第四步发送订单确认 MesProcessCtrol step4 = new MesProcessCtrol() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = "", JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = cmbTask.Text + lbBatchIndex.Content, //工单编号 ITEM_PKNO = jobOrder.ITEM_PKNO, //产品PKNO SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", //工序编号(工艺路线明细)为空,不按照工艺进行控制 PROCESS_DEVICE_PKNO = mainDevice.PKNO, //加工设备为 主控PLC PROCESS_INDEX = 3, PROCESS_ACTION_TYPE = 0, PROCESS_ACTION_PKNO = (ctrl4 == null) ? "" : ctrl4.PKNO, PROCESS_ACTION_PARAM1_VALUE = cmbTask.Text + lbBatchIndex.Content, //订单ID PROCESS_ACTION_PARAM2_VALUE = "", // CUR_PRODUCT_CODE_PKNO = "", PROCESS_QTY = preparedQty, COMPLETE_QTY = 0, QUALIFIED_QTY = 0, PROCESS_STATE = 1, CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "系统自动形成", }; #endregion end 4 #region 5.第五步订单完成 MesProcessCtrol step5 = new MesProcessCtrol() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = "", JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = cmbTask.Text + lbBatchIndex.Content, //工单编号 ITEM_PKNO = jobOrder.ITEM_PKNO, //产品PKNO SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", //工序编号(工艺路线明细)为空,不按照工艺进行控制 PROCESS_DEVICE_PKNO = mainDevice.PKNO, //加工设备为 主控PLC PROCESS_INDEX = 4, PROCESS_ACTION_TYPE = 0, PROCESS_ACTION_PKNO = (ctrl5 == null) ? "" : ctrl5.PKNO, PROCESS_ACTION_PARAM1_VALUE = "", // PROCESS_ACTION_PARAM2_VALUE = "", // CUR_PRODUCT_CODE_PKNO = "", PROCESS_QTY = preparedQty, COMPLETE_QTY = 0, QUALIFIED_QTY = 0, PROCESS_STATE = 1, CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, USE_FLAG = 1, REMARK = "系统自动形成", }; #endregion end 5 wsPLM.UseService(s => s.AddMesProcessCtrol(step1)); wsPLM.UseService(s => s.AddMesProcessCtrol(step2)); wsPLM.UseService(s => s.AddMesProcessCtrol(step3)); wsPLM.UseService(s => s.AddMesProcessCtrol(step4)); wsPLM.UseService(s => s.AddMesProcessCtrol(step5)); #endregion #endregion //修改产线任务的完成数量 taskLine.PREPARED_QTY += preparedQty; if (taskLine.RUN_STATE == 0) { taskLine.RUN_STATE = 1; } wsPLM.UseService(s => s.UpdatePmTaskLine(taskLine)); cmbTask.ItemsSource = wsPLM.UseService(s => s.GetPmTaskLines("USE_FLAG = 1 AND RUN_STATE < 10 ")) //未完成的 .Where(c => c.TASK_QTY > c.PREPARED_QTY) .OrderBy(c => c.CREATION_DATE) .ToList(); //生产线任务 cmbTask.SelectedIndex = -1; gridProcessInfo.ItemsSource = null; }
public bool StartCurrentProgerss() { if (curProcess.PROCESS_STATE == 1) //准备完成,未开始执行 { if (!string.IsNullOrEmpty(startCondition) && LimitConditions.Contains(startCondition)) //如果前面的Job存在需要判断该状态,则不执行当前的 { string sErrorInfo = $"等待执行"; if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } return(false); } #region 开始执行工序 共 5 步 string startCustomParam = ""; //开始执行的参数,增加到同步写入数据后面 /************ !!!工序开始的条件!!! ************/ #region 1. 检验当前执行的工序是否可以执行,启动条件 if (startTag != null) //启动条件为空则直接执行 { string checkValue = startTag.CUR_VALUE.Split('|')[0]; //当前执行条件的结果 string startValue = curAction.START_CONDITION_VALUE; //开始条件 string[] startValues = startValue.Split('|'); //多个开启条件 if ((string.IsNullOrEmpty(checkValue)) || (!startValues.Contains(checkValue))) //当前值不是工序开始检测值 { #region 条件不符合的 流程分支情况 if (curProcess.PROCESS_ACTION_TYPE == 4) //流程分支,不启用,直接往下运行 { #region 直接完成当前工序 #region 第一道工序处理 if (bFirstProcess) //第一道工序 { mesJobOrder.RUN_STATE = 20; //正在执行 mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间 mesJobOrder.PROCESS_INFO = "正常"; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } #endregion curProcess.PROCESS_STATE = 10; //直接完成 curProcess.PROCESS_END_TYPE = 1; curProcess.PROCESS_END_TIME = DateTime.Now; curProcess.REMARK = "条件不满足,不启用流程分支,直接执行现有流程。"; PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); return(false); //直接执行重新执行 #endregion } #endregion #region 判断条件不满足 string sErrorInfo = $"生产过程【{ctrolName}】开启条件【{startTag?.TAG_NAME}】不足,当前状态为【{checkValue}】,需要状态【{startValue}】"; if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } if (!LimitConditions.Contains(startCondition)) { LimitConditions.Add(startCondition); //起始条件不满足,则添加限制条件 } return(false); #endregion } } #endregion /************ !!!工序开始的条件满足,直接执行!!! ************/ Console.WriteLine($"========生产过程【{ctrolName}】开始条件【{startTag?.TAG_NAME}】满足,开始执行======="); #region 2. 启动流程分支 if (curProcess.PROCESS_ACTION_TYPE == 4) //流程分支 { string disableProcesses = curProcess.PROCESS_ACTION_PARAM1_VALUE; //禁用的流程 string enableProcesses = curProcess.PROCESS_ACTION_PARAM2_VALUE; //启用的流程 string stemp = $"触发流程分支.禁用流程[{disableProcesses}], 启用流程[{enableProcesses}]"; mesJobOrder.PROCESS_INFO = stemp; //生产执行信息 Console.WriteLine(stemp); #region 启动流程分支 if (!string.IsNullOrEmpty(disableProcesses)) { foreach (var disableP in disableProcesses.Split(';')) { MesProcessCtrol process = unFinishProcessCtrols.FirstOrDefault(c => c.PROCESS_INDEX == SafeConverter.SafeToInt(disableP, -1)); process.USE_FLAG = 0; //禁用 PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(process)); } } if (!string.IsNullOrEmpty(enableProcesses)) { foreach (var enableP in enableProcesses.Split(';')) { MesProcessCtrol process = unFinishProcessCtrols.FirstOrDefault(c => c.PROCESS_INDEX == SafeConverter.SafeToInt(enableP, -1)); process.USE_FLAG = 1; //启用 PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(process)); } } #endregion #region 更新数据 #region 加工控制 curProcess.PROCESS_STATE = 10; //直接完成 curProcess.PROCESS_END_TYPE = 1; curProcess.PROCESS_START_TIME = DateTime.Now.AddMilliseconds(-100); curProcess.PROCESS_END_TIME = DateTime.Now; curProcess.REMARK = $"流程分支条件满足,启用流程分支,禁用流程[{disableProcesses}], 启用流程[{enableProcesses}]"; PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(curProcess)); #endregion #region Job处理 if (bFirstProcess) //第一道工序 { mesJobOrder.RUN_STATE = 20; //正在执行 mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间 } PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); #endregion DeviceMonitor.SetTagSettingValueById(curAction.START_CONDITION_TAG_PKNO, ""); //将检测结果置为空 //产品处理 if (productProcess != null) { productProcess.PRODUCT_STATE = curProcess.PROCESS_ACTION_TYPE; //当前状态 productProcess.LAST_UPDATE_DATE = DateTime.Now; var process = productProcess; PServiceEvent?.Invoke(d => d.UpdateMesProductProcess(process)); } #endregion return(false); //直接开启下一次流程 } //启动流程分支 #endregion //增加限制条件 if (!string.IsNullOrEmpty(startCondition) && !LimitConditions.Contains(startCondition)) //未完成的任务需要增加开始条件 { LimitConditions.Add(startCondition); } #region 3. 获取产品,第一道工序形成产品 if (bFirstProcess || (productProcess == null)) //第一道控制,且没有形成 { string productPKNO = CBaseData.NewGuid(); productProcess = new MesProductProcess() //生成新的产品 { PKNO = productPKNO, COMPANY_CODE = CBaseData.BelongCompPKNO, ITEM_PKNO = curProcess.ITEM_PKNO, JOB_ORDER_PKNO = curProcess.JOB_ORDER_PKNO, JOB_ORDER = curProcess.JOB_ORDER, SUB_JOB_ORDER_NO = curProcess.SUB_JOB_ORDER_NO, PRODUCT_CODE = TableNOHelper.GetNewNO("MesProductProcess.PRODUCT_CODE", "P"), PRODUCT_POSITION = "", //当前位置 CUR_ROCESS_CTROL_PKNO = curProcess.PKNO, //当前过程 RAW_NUMBER = curProcess.PROCESS_QTY, //原料数量 PRODUCT_NUMBER = curProcess.COMPLETE_QTY, //完成数量 QUALIFIED_NUMBER = curProcess.QUALIFIED_QTY, //合格品数量 PALLET_NO = curProcess.PALLET_NO, //托盘号 PRODUCT_STATE = -1, //尚未开始 CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginNO, LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = 1, REMARK = "", //备注 }; //生成新的产品 curProcess.CUR_PRODUCT_CODE_PKNO = productPKNO; //新产品编号 } else { curProcess.CUR_PRODUCT_CODE_PKNO = firstProcess.CUR_PRODUCT_CODE_PKNO; //将所有的产品 } #endregion #region 4. 执行当前工序 => 向设备写入数据 写 3 个值 int ret = 0; string error = ""; string tagPKNO = ""; string sTagValue = ""; bool bWriteSuccess = true; //写入设备成功标志 #region 4.1 写参数1 tagPKNO = curAction.EXECUTE_PARAM1_TAG_PKNO; sTagValue = GetDynamicValue(curProcess.PROCESS_ACTION_PARAM1_VALUE); if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue))) { #region 多次重写 int iWrite = 0; while (iWrite < ReWriteCount) { ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error); if (ret == 0) { Thread.Sleep(100); //写入成功后暂停 break; } iWrite++; Thread.Sleep(100); } #endregion if (ret == 10) //写入设备失败 { string sErrorInfo = $"向设备写入参数1失败。错误为:{error}"; //生产执行信息 if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } Console.WriteLine(sErrorInfo); return(false); } if (ret == 0) { bWriteSuccess = true; //写入成功 } } #endregion #region 4.2 写参数2 tagPKNO = curAction.EXECUTE_PARAM2_TAG_PKNO; sTagValue = GetDynamicValue(curProcess.PROCESS_ACTION_PARAM2_VALUE); if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue))) { #region 多次重写 int iWrite = 0; while (iWrite < ReWriteCount) { ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error); if (ret == 0) { Thread.Sleep(100); //写入成功后暂停 break; } iWrite++; Thread.Sleep(100); } #endregion if (ret == 10) //写入设备失败 { string sErrorInfo = $"向设备写入参数2失败。错误为:{error}"; //生产执行信息 if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } Console.WriteLine(sErrorInfo); return(false); } if (ret == 0) { bWriteSuccess = true; //写入成功 } } #endregion #region 4.3 写执行 tagPKNO = curAction.EXECUTE_TAG_PKNO; sTagValue = GetDynamicValue(curAction.EXECUTE_WRITE_VALUE) + "|" + (string.IsNullOrEmpty(curProcess.PROCESS_ACTION_PARAM1_VALUE) ? "0" : curProcess.PROCESS_ACTION_PARAM1_VALUE) + "|" + (string.IsNullOrEmpty(curProcess.PROCESS_ACTION_PARAM2_VALUE) ? "0" : curProcess.PROCESS_ACTION_PARAM2_VALUE) + "|" + (string.IsNullOrEmpty(startCustomParam) ? "0" : startCustomParam); if ((!string.IsNullOrEmpty(tagPKNO)) && (!string.IsNullOrEmpty(sTagValue.Replace("|", "")))) { #region 多次重写 int iWrite = 0; while (iWrite < ReWriteCount) { ret = DeviceMonitor.WriteTagToDevice(tagPKNO, sTagValue, out error); if (ret == 0) { //Thread.Sleep(100); //写入成功后暂停,最后不需要 break; } iWrite++; Thread.Sleep(100); } #endregion if (ret == 10) //写入设备失败 { string sErrorInfo = $"向设备写入开始动作值失败。错误为:{error}"; //生产执行信息 if (mesJobOrder.PROCESS_INFO != sErrorInfo) { mesJobOrder.PROCESS_INFO = sErrorInfo; //生产执行信息 PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); } Console.WriteLine(sErrorInfo); return(false); } if (ret == 0) { bWriteSuccess = true; //写入成功 } } #endregion if (bWriteSuccess) { Console.WriteLine("给设备发送指令成功.开始进行执行" + (string.IsNullOrEmpty(curProcess.SUB_JOB_ORDER_NO) ? curProcess.JOB_ORDER_PKNO : curProcess.SUB_JOB_ORDER_NO)); //给设备发送动作指令成功 } #endregion #region 5. 更新数据 共更新 4 个模块 #region 5.1 加工控制 curProcess.PROCESS_STATE = 2; //正在执行 curProcess.PROCESS_START_TYPE = 1; //自动开始 curProcess.PROCESS_START_TIME = DateTime.Now; PServiceEvent?.Invoke(d => d.UpdateMesProcessCtrol(curProcess)); #endregion #region 5.2 业务相关处理 if (curProcess.PROCESS_ACTION_TYPE == 11) //开始 出库 { mesJobOrder.ONLINE_QTY = curProcess.PROCESS_QTY; //在线数量 } if (bFirstProcess) //第一道工序,新增产品信息 { PServiceEvent?.Invoke(s => s.AddMesProductProcess(productProcess)); } string sError = ""; string result = DeviceProcessControl.BeginCurBusiness(curProcess, ref sError); //开始当前控制的业务 if (result != "OK") { mesJobOrder.PROCESS_INFO = $"业务开始执行发生错误,写入数据库错误! 具体:{sError}"; } #endregion #region 5.3 Job处理 if (bFirstProcess) //第一道工序 { mesJobOrder.RUN_STATE = 20; //正在执行 mesJobOrder.ACT_START_TIME = DateTime.Now; //修改任务开始时间 } PServiceEvent?.Invoke(d => d.UpdateMesJobOrder(mesJobOrder)); #endregion #region 5.4 将开始和结束条件 置空 DeviceMonitor.SetTagSettingValueById(curAction.START_CONDITION_TAG_PKNO, ""); //将检测结果置为空 FmsAssetTagSetting finishTag = DeviceMonitor.GetTagSettingById(curAction.FINISH_CONDITION_TAG_PKNO); if (finishTag != null) { if (finishTag.SAMPLING_MODE == 11) { finishTag.SAMPLING_MODE = 10; //按照条件开启 } DeviceMonitor.SetTagSettingValue(finishTag, ""); } #endregion #endregion #endregion if (startTag != null) { FMSControlService.iConditionStartAddPause = 500; //按条件启动后增加的延时 } FMSControlService.bStart = true; //本次订单已经启动过了 } return(true); }
private void Btn_Start2Click(object sender, RoutedEventArgs e) { WcfClient <IPLMService> ws2 = new WcfClient <IPLMService>(); string LineCode = CBaseData.CurLinePKNO;//加工单元 List <MesJobOrder> mesJobOrders = ws2.UseService(s => s.GetMesJobOrders( $"USE_FLAG = 1 AND RUN_STATE < 100 AND LINE_PKNO = '{LineCode}'")) .OrderBy(c => c.CREATION_DATE).ToList(); if (mesJobOrders.Count > 20) { WaitLoading.SetDefault(this); WPFMessageBox.ShowError("当前订单过多,请等待加工完成", "加工工单"); return; } if (WPFMessageBox.ShowConfirm("确定下达加工工单么吗?\r\n" + "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n", "加工工单") != WPFMessageBoxResult.OK) { return; } //后台执行添加 new Thread(delegate() { WaitLoading.SetWait(this); Thread.Sleep(1000); DateTime jobOrderTime = DateTime.Now.AddSeconds(-10); int iJobOrderIndex = 0; List <MesJobOrder> jobOrders = new List <MesJobOrder>(); //所有订单 List <MesProcessCtrol> processCtrols = new List <MesProcessCtrol>(); //控制流程 List <WmsAllocationInfo> allocationInfos = new List <WmsAllocationInfo>(); //需要修改的货位 Dictionary <string, string> ParamValues = new Dictionary <string, string>(); MesJobOrder job = null; string sFormulaCode = ""; List <FmsActionFormulaDetail> formulaDetails; List <RsItemMaster> items = wsRsm.UseService(s => s.GetRsItemMasters("USE_FLAG = 1")); RsItemMaster gyroscope = items.FirstOrDefault(c => c.ITEM_NAME == "指尖陀螺"); //产品信息 #region 2.车床上料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); #endregion sFormulaCode = "车床上料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 3.加工中心上料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); #endregion sFormulaCode = "加工中心上料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.1.AGV充电 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); #endregion sFormulaCode = "AGV充电"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.2 加工中心先下料再上料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "加工中心先下料再上料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.3.AGV充电 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "AGV充电"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.4 加工中心先下料再上料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "加工中心先下料再上料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.3.AGV充电 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "AGV充电"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.4 加工中心先下料再上料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "加工中心先下料再上料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 4.3.AGV充电 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); //生产设备 #endregion sFormulaCode = "AGV充电"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 5.加工中心下料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); #endregion sFormulaCode = "加工中心下料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion #region 6.车床下料 job = BuildNewJobOrder(gyroscope.PKNO, 2, "陀螺生产", jobOrderTime.AddSeconds(iJobOrderIndex++)); //--形成订单-- jobOrders.Add(job); #region --设定参数-- ParamValues.Clear(); ParamValues.Add("{图片名称}", LaserPicName); //定制图片 //ParamValues.Add("{加工数量}", this.txt_Qty2.Text); #endregion sFormulaCode = "车床下料"; #region 形成过程控制 formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = BuildNewProcess(job, detail, ParamValues); processCtrols.Add(process); } #endregion #endregion DeviceProcessControl.PauseByLine(CBaseData.CurLinePKNO); //暂停,防止任务直接执行 #region 保存数据 foreach (var allocationInfo in allocationInfos) { ws.UseService(s => s.UpdateWmsAllocationInfo(allocationInfo)); Thread.Sleep(100); } foreach (var ctrol in processCtrols) { wsPlm.UseService(s => s.AddMesProcessCtrol(ctrol)); Thread.Sleep(100); } foreach (var jobOrder in jobOrders) //订单 { wsPlm.UseService(s => s.AddMesJobOrder(jobOrder)); Thread.Sleep(100); } #endregion DeviceProcessControl.RunByLine(CBaseData.CurLinePKNO); //启动动作流程 WaitLoading.SetDefault(this); WPFMessageBox.ShowInfo("FCS订单已下达", "指尖陀螺加工"); }).Start(); }
private void BtnAutoChange_Click(object sender, RoutedEventArgs e) { TmsToolsMaster mToolsMaster = GridControlInvTool.SelectedItem as TmsToolsMaster; TmsDeviceToolsPos mTmsDeviceToolsPos = GridControlDeviceTool.SelectedItem as TmsDeviceToolsPos; MesJobOrder jobOrder = null; WmsInventory inv = null; List <MesProcessCtrol> processCtrols = new List <MesProcessCtrol>(); #region 形成工单 jobOrder = new MesJobOrder() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = CBaseData.BelongCompPKNO, LINE_PKNO = CBaseData.CurLinePKNO, LINE_TASK_PKNO = "", //产线任务PKNO ITEM_PKNO = "", // TODO:暂无 JOB_ORDER_NO = TableNOHelper.GetNewNO("MES_JOB_ORDER.JOB_ORDER_NO", "J"), BATCH_NO = "", ROUTING_DETAIL_PKNO = "", JOB_ORDER_TYPE = 2, //工单类型 1:原料入库;2:加工;3:成品出库;4:转换 TASK_QTY = 1, COMPLETE_QTY = 0, ONLINE_QTY = 0, ONCE_QTY = 0, RUN_STATE = 10, //直接生产 CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginNO, LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = 1, REMARK = "", }; #endregion #region 增加参数 Dictionary <string, string> ParamValues = new Dictionary <string, string>(); #endregion string sFormulaCode = "换刀"; List <FmsActionFormulaDetail> formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = new MesProcessCtrol() { #region 标准信息 PKNO = CBaseData.NewGuid(), COMPANY_CODE = CBaseData.BelongCompPKNO, ITEM_PKNO = "", //成品PKNO TODO:暂无 JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = jobOrder.JOB_ORDER_NO, SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", // #endregion PROCESS_CTROL_NAME = detail.FORMULA_DETAIL_NAME, //名称 PROCESS_DEVICE_PKNO = Replace(detail.PROCESS_DEVICE_PKNO, ParamValues), //生产设备 PROCESS_PROGRAM_NO = Replace(detail.PROCESS_PROGRAM_NO, ParamValues), //加工程序号 PROCESS_PROGRAM_CONTENT = detail.PROCESS_PROGRAM_CONTENT, //加工程序内容 PROCESS_INDEX = detail.PROCESS_INDEX, //工序顺序 BEGIN_ITEM_PKNO = Replace(detail.BEGIN_ITEM_PKNO, ParamValues), //生产前项目PKNO FINISH_ITEM_PKNO = Replace(detail.FINISH_ITEM_PKNO, ParamValues), //生产后项目PKNO BEGIN_POSITION = Replace(detail.BEGIN_POSITION, ParamValues), //生产前位置 FINISH_POSITION = Replace(detail.FINISH_POSITION, ParamValues), //生产后位置 PALLET_NO = detail.PALLET_NO, //托盘号 PROCESS_ACTION_TYPE = detail.PROCESS_ACTION_TYPE, //工序动作类型 PROCESS_ACTION_PKNO = detail.PROCESS_ACTION_PKNO, //工序动作控制PKNO PROCESS_ACTION_PARAM1_VALUE = Replace(detail.PROCESS_ACTION_PARAM1_VALUE, ParamValues), //工序动作参数1 PROCESS_ACTION_PARAM2_VALUE = Replace(detail.PROCESS_ACTION_PARAM2_VALUE, ParamValues), //工序动作参数2 CUR_PRODUCT_CODE_PKNO = "", //当前生产加工的产品编码PKNO PROCESS_QTY = 1, //加工数量(上线数量) COMPLETE_QTY = 0, //完成数量 QUALIFIED_QTY = 0, //合格数量 PROCESS_STATE = 1, //准备完成 CREATION_DATE = DateTime.Now, //创建日期 CREATED_BY = CBaseData.LoginNO, //创建人 LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = detail.USE_FLAG, //启用标识 REMARK = "", //备注 }; processCtrols.Add(process); } Cursor = Cursors.Wait; wsPLM.UseService(s => s.AddMesJobOrder(jobOrder)); foreach (MesProcessCtrol processCtrol in processCtrols) { wsPLM.UseService(s => s.AddMesProcessCtrol(processCtrol)); } Cursor = Cursors.Arrow; MessageBox.Show("换刀下单成功."); GridControlInvTool.ItemsSource = ws.UseService(s => s.GetTmsToolsMasters("USE_FLAG > 0")).OrderBy(n => n.CREATION_DATE).ToList();; }
private void BtnAutoChange_Click(object sender, RoutedEventArgs e) { TmsToolsMaster mToolsMasterUp = GridControlInvTool.SelectedItem as TmsToolsMaster; //库存 TmsDeviceToolsPos mTmsDeviceToolsPos = GridControlDeviceTool.SelectedItem as TmsDeviceToolsPos; //机床刀位信息 if (mToolsMasterUp == null) { return; } if (mTmsDeviceToolsPos == null) { return; } AmAssetMasterN asset = ComAsset.SelectedItem as AmAssetMasterN; if (asset == null) { WPFMessageBox.ShowError("请选择机床信息!", "自动换刀管理"); return; } TmsToolsMaster mToolsMasterDown = ws.UseService(s => s.GetTmsToolsMasterById(mTmsDeviceToolsPos.TOOLS_PKNO)); if (mToolsMasterDown == null) { WPFMessageBox.ShowError("选中的需要换下的机床刀具信息不存在,请核实!", "自动换刀管理"); return; } MesJobOrder jobOrder = null; WmsInventory inv = null; List <MesProcessCtrol> processCtrols = new List <MesProcessCtrol>(); #region 形成工单 jobOrder = new MesJobOrder() { PKNO = CBaseData.NewGuid(), COMPANY_CODE = CBaseData.BelongCompPKNO, LINE_PKNO = CBaseData.CurLinePKNO, LINE_TASK_PKNO = "", //产线任务PKNO ITEM_PKNO = "", // TODO:暂无 JOB_ORDER_NO = TableNOHelper.GetNewNO("MES_JOB_ORDER.JOB_ORDER_NO", "J"), BATCH_NO = "自动换刀", ROUTING_DETAIL_PKNO = "", JOB_ORDER_TYPE = 2, //工单类型 1:原料入库;2:加工;3:成品出库;4:转换 TASK_QTY = 1, COMPLETE_QTY = 0, ONLINE_QTY = 0, ONCE_QTY = 0, RUN_STATE = 10, //直接生产 CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginNO, LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = 1, REMARK = "", }; #endregion #region 增加参数 Dictionary <string, string> ParamValues = new Dictionary <string, string>(); ParamValues.Add("{机床刀号}", mTmsDeviceToolsPos.TOOLS_POS_NO); //机床刀号 ParamValues.Add("{卸下刀具编号}", mToolsMasterDown.TOOLS_CODE.PadRight(25)); //卸下刀具编号 ParamValues.Add("{装上刀具编号}", mToolsMasterUp.TOOLS_CODE.PadRight(25)); //装上刀具编号 ParamValues.Add("{装上刀具PKNO}", mToolsMasterUp.PKNO); //装上刀具PKNO ParamValues.Add("{卸下刀具PKNO}", mToolsMasterDown.PKNO); //卸下刀具PKNO ParamValues.Add("{长度形状补偿}", SafeConverter.SafeToStr(mToolsMasterUp.COMPENSATION_SHAPE_LENGTH)); //长度形状补偿 - 装上 ParamValues.Add("{半径形状补偿}", SafeConverter.SafeToStr(mToolsMasterUp.COMPENSATION_SHAPE_DIAMETER)); //半径形状补偿 - 装上 ParamValues.Add("{卸下刀位PKNO}", mTmsDeviceToolsPos.PKNO); //卸下刀位PKNO ParamValues.Add("{装上刀位PKNO}", mTmsDeviceToolsPos.PKNO); //装上刀位PKNO ParamValues.Add("{装刀机床PKNO}", asset?.PKNO); //装刀机床PKNO #endregion string sFormulaCode = "换刀-" + asset.ASSET_CODE; List <FmsActionFormulaDetail> formulaDetails = wsFms.UseService(s => s.GetFmsActionFormulaDetails($"FORMULA_CODE = '{sFormulaCode}' AND USE_FLAG= 1")) .OrderBy(c => c.PROCESS_INDEX) .ToList(); foreach (var detail in formulaDetails) //配方 { MesProcessCtrol process = new MesProcessCtrol() { #region 标准信息 PKNO = CBaseData.NewGuid(), COMPANY_CODE = CBaseData.BelongCompPKNO, ITEM_PKNO = "", //成品PKNO TODO:暂无 JOB_ORDER_PKNO = jobOrder.PKNO, JOB_ORDER = jobOrder.JOB_ORDER_NO, SUB_JOB_ORDER_NO = "", ROUTING_DETAIL_PKNO = "", // #endregion PROCESS_CTROL_NAME = detail.FORMULA_DETAIL_NAME, //名称 PROCESS_DEVICE_PKNO = ProcessParamReplace.Replace(detail.PROCESS_DEVICE_PKNO, ParamValues), //生产设备 PROCESS_PROGRAM_NO = ProcessParamReplace.Replace(detail.PROCESS_PROGRAM_NO, ParamValues), //加工程序号 PROCESS_PROGRAM_CONTENT = detail.PROCESS_PROGRAM_CONTENT, //加工程序内容 PROCESS_INDEX = detail.PROCESS_INDEX, //工序顺序 BEGIN_ITEM_PKNO = ProcessParamReplace.Replace(detail.BEGIN_ITEM_PKNO, ParamValues), //生产前项目PKNO FINISH_ITEM_PKNO = ProcessParamReplace.Replace(detail.FINISH_ITEM_PKNO, ParamValues), //生产后项目PKNO BEGIN_POSITION = ProcessParamReplace.Replace(detail.BEGIN_POSITION, ParamValues), //生产前位置 FINISH_POSITION = ProcessParamReplace.Replace(detail.FINISH_POSITION, ParamValues), //生产后位置 PALLET_NO = detail.PALLET_NO, //托盘号 PROCESS_ACTION_TYPE = detail.PROCESS_ACTION_TYPE, //工序动作类型 PROCESS_ACTION_PKNO = detail.PROCESS_ACTION_PKNO, //工序动作控制PKNO PROCESS_ACTION_PARAM1_VALUE = ProcessParamReplace.Replace(detail.PROCESS_ACTION_PARAM1_VALUE, ParamValues), //工序动作参数1 PROCESS_ACTION_PARAM2_VALUE = ProcessParamReplace.Replace(detail.PROCESS_ACTION_PARAM2_VALUE, ParamValues), //工序动作参数2 CUR_PRODUCT_CODE_PKNO = "", //当前生产加工的产品编码PKNO PROCESS_QTY = 1, //加工数量(上线数量) COMPLETE_QTY = 0, //完成数量 QUALIFIED_QTY = 0, //合格数量 PROCESS_STATE = 1, //准备完成 CREATION_DATE = DateTime.Now, //创建日期 CREATED_BY = CBaseData.LoginNO, //创建人 LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = detail.USE_FLAG, //启用标识 REMARK = "", //备注 }; processCtrols.Add(process); } Cursor = Cursors.Wait; wsPLM.UseService(s => s.AddMesJobOrder(jobOrder)); foreach (MesProcessCtrol processCtrol in processCtrols) { wsPLM.UseService(s => s.AddMesProcessCtrol(processCtrol)); } Cursor = Cursors.Arrow; MessageBox.Show("换刀下单成功."); GridControlInvTool.ItemsSource = ws.UseService(s => s.GetTmsToolsMasters("USE_FLAG > 0 AND TOOLS_POSITION = 1")).OrderBy(n => n.CREATION_DATE).ToList();; }
private void bSave_Click(object sender, System.Windows.RoutedEventArgs e) { if (cmbRoutingMain.SelectedValue == null) { return; } #region 创建生产过程 //生产线数据 PmTaskLine taskLine = cmbTask.SelectedItem as PmTaskLine; //产品数据 string itemPKNO = cmbProduct.SelectedValue.ToString(); //准备完成 List <MesProcessCtrol> processCtrols = new List <MesProcessCtrol>(); List <RsRoutingDetail> rsRoutingDetails = gridProcessInfo.ItemsSource as List <RsRoutingDetail>; //已创建加工数量 int qty = CheckPlanQTY(taskLine.TASK_NO); decimal preparedQty = 0; decimal.TryParse(tbTaskQty.Text.ToString(), out preparedQty); if (preparedQty <= 0) { MessageBox.Show("请输入正确的任务数量.", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #region 判断加工数量 if (tbTaskQty.Text.ToString() == "") { MessageBox.Show($"请输入数量", "未输入数量", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (int.Parse(tbTaskQty.Text.ToString()) + qty > taskLine.TASK_QTY) { MessageBox.Show($"输入数量超出订单加工数量", "数量超限", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #endregion MesJobOrder jobOrder = new MesJobOrder() { PKNO = Guid.NewGuid().ToString("N"), COMPANY_CODE = "", LINE_PKNO = taskLine.LINE_PKNO, //产线信息 LINE_TASK_PKNO = taskLine.PKNO, ITEM_PKNO = itemPKNO, JOB_ORDER_NO = taskLine.TASK_NO + lbBatchIndex.Content.ToString(), BATCH_NO = lbBatchIndex.Content.ToString(), ROUTING_DETAIL_PKNO = cmbRoutingMain.SelectedValue.ToString(), TASK_QTY = preparedQty, COMPLETE_QTY = 0, ONLINE_QTY = 0, ONCE_QTY = 0, RUN_STATE = 1, //准备完成 CREATION_DATE = DateTime.Now, CREATED_BY = CBaseData.LoginName, LAST_UPDATE_DATE = DateTime.Now, //最后修改日期 USE_FLAG = 1, REMARK = "", }; List <MesProcessCtrol> newMesProcessCtrols = new List <MesProcessCtrol>(); int iProcessIndex = 0; foreach (RsRoutingDetail item in rsRoutingDetails) { if (string.IsNullOrEmpty(item.WC_ABV)) { MessageBox.Show($"工序【{item.OP_NAME}】加工设备不能为空,请选择加工设备!", "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } //if (string.IsNullOrEmpty(item.PROCESS_ACTION_PKNO)) //{ // MessageBox.Show($"工序【{item.OP_NAME}】指令动作不能为空,请选择指令动作!", // "完成生产准备", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); // return; //} MesProcessCtrol mesProcess = new MesProcessCtrol(); mesProcess.PKNO = Guid.NewGuid().ToString("N"); mesProcess.COMPANY_CODE = ""; mesProcess.ITEM_PKNO = jobOrder.ITEM_PKNO; mesProcess.JOB_ORDER_PKNO = jobOrder.PKNO; mesProcess.SUB_JOB_ORDER_NO = jobOrder.JOB_ORDER_NO + "-" + iProcessIndex; mesProcess.ROUTING_DETAIL_PKNO = item.PKNO; //工序PKNO mesProcess.PROCESS_DEVICE_PKNO = item.WC_ABV; //设备信息 mesProcess.PROCESS_INDEX = iProcessIndex; mesProcess.PROCESS_ACTION_TYPE = item.PROCESS_ACTION_TYPE; mesProcess.PROCESS_ACTION_PKNO = item.PROCESS_ACTION_PKNO; mesProcess.PROCESS_ACTION_PARAM1_VALUE = item.PROCESS_ACTION_PARAM1_VALUE; //控制参数1 mesProcess.PROCESS_ACTION_PARAM2_VALUE = item.PROCESS_ACTION_PARAM2_VALUE; //控制参数2 mesProcess.PROCESS_QTY = 0; mesProcess.COMPLETE_QTY = 0; mesProcess.QUALIFIED_QTY = 0; mesProcess.PROCESS_STATE = 1; //准备完成 mesProcess.CREATED_BY = CBaseData.LoginName; mesProcess.CREATION_DATE = DateTime.Now; mesProcess.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期 mesProcess.USE_FLAG = 1; iProcessIndex++; newMesProcessCtrols.Add(mesProcess); } wsPLM.UseService(s => s.AddMesJobOrder(jobOrder)); //添加工单 foreach (MesProcessCtrol mesProcessCtrol in newMesProcessCtrols) { wsPLM.UseService(s => s.AddMesProcessCtrol(mesProcessCtrol)); //添加具体工序 } #endregion //修改产线任务的完成数量 taskLine.PREPARED_QTY += preparedQty; if (taskLine.RUN_STATE == 0) { taskLine.RUN_STATE = 1; } wsPLM.UseService(s => s.UpdatePmTaskLine(taskLine)); tbLiftQty.Text = ""; cmbTask.SelectedIndex = -1; gridProcessInfo.ItemsSource = null; tbTaskQty.Text = ""; lbBatchIndex.Content = ""; if (System.Windows.Forms.MessageBox.Show($"确定生成质检计划吗?", @"生成质检信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { QmsCheckParam qmsCheckParam = wsQMS.UseService(s => s.GetQmsCheckParams(" USE_FLAG = 1 AND ITEM_PKNO = " + taskLine.ITEM_PKNO + "")).FirstOrDefault(); if (qmsCheckParam == null) { return; } List <QmsRoutingCheck> qmsRoutingChecks = wsQMS.UseService(s => s.GetQmsRoutingChecks(" USE_FLAG = 1 AND CHECK_PARAM_PKNO = " + qmsCheckParam.PKNO + "")); if (qmsRoutingChecks.Count <= 0) { return; } foreach (var itemRoutingCheck in qmsRoutingChecks) { //创建质检主表内容 if (itemRoutingCheck.CHK_MODE == "首检" || itemRoutingCheck.CHK_MODE == "尾检")//首尾检 { QmsCheckMaster qmsCheckMaster = new QmsCheckMaster(); qmsCheckMaster.PKNO = Guid.NewGuid().ToString("N"); if (itemRoutingCheck.CHK_MODE == "首检") { qmsCheckMaster.CHECK_NO = "ZJ" + jobOrder.JOB_ORDER_NO + (1 * 1000).ToString("0000"); } else { qmsCheckMaster.CHECK_NO = "ZJ" + jobOrder.JOB_ORDER_NO + (2 * 1000).ToString("0000"); } qmsCheckMaster.CHECK_PARAM_PKNO = itemRoutingCheck.CHECK_PARAM_PKNO; qmsCheckMaster.ROUTING_CHECK_PKNO = itemRoutingCheck.PKNO; qmsCheckMaster.CREATION_DATE = DateTime.Now; qmsCheckMaster.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期 qmsCheckMaster.USE_FLAG = 1; qmsCheckMaster.CHECK_STATUS = "1"; qmsCheckMaster.TASKLINE_PKNO = jobOrder.JOB_ORDER_NO;//以工单编号应用为关联 qmsCheckMaster.PROCESS_PKNO = itemRoutingCheck.PROCESS_PKNO; qmsCheckMaster.CHK_MODE = itemRoutingCheck.CHK_MODE; wsQMS.UseService(s => s.AddQmsCheckMaster(qmsCheckMaster)); } else { //todo:未判断首尾检对批次检测影响 if (itemRoutingCheck.CHK_FREQ_VALUE == String.Empty) { return; } int count = int.Parse(jobOrder.TASK_QTY.ToString()) / int.Parse(itemRoutingCheck.CHK_FREQ_VALUE); for (int i = 1; i <= count; i++) { QmsCheckMaster qmsCheckMaster = new QmsCheckMaster(); qmsCheckMaster.PKNO = Guid.NewGuid().ToString("N"); qmsCheckMaster.CHECK_PARAM_PKNO = itemRoutingCheck.CHECK_PARAM_PKNO; qmsCheckMaster.ROUTING_CHECK_PKNO = itemRoutingCheck.PKNO; qmsCheckMaster.CHECK_NO = "ZJ" + jobOrder.JOB_ORDER_NO + ((3 * 1000) + i).ToString("0000"); //3为批次检测,抽检需要另外规则定制生成 qmsCheckMaster.CREATION_DATE = DateTime.Now; qmsCheckMaster.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期 qmsCheckMaster.USE_FLAG = 1; qmsCheckMaster.CHECK_STATUS = "1"; qmsCheckMaster.TASKLINE_PKNO = jobOrder.JOB_ORDER_NO;//以工单编号应用为关联 qmsCheckMaster.PROCESS_PKNO = itemRoutingCheck.PROCESS_PKNO; qmsCheckMaster.CHK_MODE = itemRoutingCheck.CHK_MODE; wsQMS.UseService(s => s.AddQmsCheckMaster(qmsCheckMaster)); } } } } GetPage(); }