private void BtnDeletnPc(object sender, RoutedEventArgs e) { if (this.ListProgramLocal.Items.Count <= 0) { WPFMessageBox.ShowError("路径中无文件!", "删除程序"); return; } if (this.ListProgramLocal.SelectedIndex == -1) { WPFMessageBox.ShowError("请选中要删除的文件!", "程序"); return; } string str = (string)ListProgramLocal.SelectedItem; string path = System.Environment.CurrentDirectory + "//NC_Programe//" + str; if (WPFMessageBox.ShowConfirm("确定该删除选中的文件吗?", "程序删除") != WPFMessageBoxResult.OK) { return; } if (File.Exists(path)) { File.Delete(path); //删除 } }
private void btnOK_Click(object sender, RoutedEventArgs e) { FmsActionFormulaMain main = gbInfo.DataContext as FmsActionFormulaMain; if (main == null) { return; } #region 检验 if (string.IsNullOrEmpty(main.FORMULA_CODE)) { WPFMessageBox.ShowError("请输入动作配方编码", "保存"); return; } var check = ws.UseService(s => s.GetFmsActionFormulaMains( $"USE_FLAG = 1 AND FORMULA_CODE = '{main.FORMULA_CODE}' AND PKNO <> '{main.PKNO}'")); if (check.Any()) { WPFMessageBox.ShowError($"输入动作配方编码已经存在不能{(string.IsNullOrEmpty(main.PKNO) ? "新增" : "修改")}该编码,请核实", "保存"); return; } #endregion if (string.IsNullOrEmpty(main.PKNO)) //新增 { main.PKNO = CBaseData.NewGuid(); main.CREATION_DATE = DateTime.Now; main.CREATED_BY = CBaseData.LoginName; main.LAST_UPDATE_DATE = DateTime.Now; //最后修改日期 ws.UseService(s => s.AddFmsActionFormulaMain(main)); } else { main.UPDATED_BY = CBaseData.LoginName; main.LAST_UPDATE_DATE = DateTime.Now; ws.UseService(s => s.UpdateFmsActionFormulaMain(main)); } if (!string.IsNullOrEmpty(formulaCode)) { string sql = $"UPDATE FMS_ACTION_FORMULA_DETAIL SET FORMULA_CODE = '{main.FORMULA_CODE}' WHERE FORMULA_CODE = '{formulaCode}'"; WcfClient <ISQLService> wsSQL = new WcfClient <ISQLService>(); wsSQL.UseService(s => s.ExecuteSql(sql)); } Close(); }
//完成当前 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(); }
//设置Name值 private void bNameByDB_ItemClick(object sender, ItemClickEventArgs e) { if (cvMain.CurSelectedDragThumb != null) { try { SelectTag select = new SelectTag(); select.SelectName = viewModel.SelectName; select.ShowDialog(); cvMain.CurSelectedDragThumb.CtrlName = select.SelectName; } catch (Exception exception) { WPFMessageBox.ShowError("获取系统Tag失败,请手动设置Tag点", "设置Tag点"); } } }
private void BtnSave_Click(object sender, RoutedEventArgs e) { //保存 AmAssetMasterN asset = cmbAssetInfo.SelectedItem as AmAssetMasterN; FmsActionControl actionControl = gbItem.DataContext as FmsActionControl; if (actionControl == null) { return; } #region //TODO: 校验;保存 if (asset == null) { WPFMessageBox.ShowError("请选择设备!", "保存"); return; } if (string.IsNullOrEmpty(actionControl.ACTION_NAME)) { WPFMessageBox.ShowError("请输入指令动作名称!", "保存"); return; } if (actionControl.PKNO == "") { actionControl.PKNO = CBaseData.NewGuid(); _fmsClient.UseService(s => s.AddFmsActionControl(actionControl)); } else { _fmsClient.UseService(s => s.UpdateFmsActionControl(actionControl)); } WPFMessageBox.ShowTips("指令动作配置信息已保存。", "保存"); #endregion GetPage(); //重新刷新数据,根据需求是否进行刷新数据 //保存成功 gbItem.IsCollapsed = true; gbItem.Visibility = Visibility.Collapsed; BindHelper.SetDictDataBindingGridItem(gbItem, gridItem); }
private void ImageButtonWithIcon_Click_1(object sender, RoutedEventArgs e) { #region 检验 if (this.ListProgramLocal.Items.Count <= 0) { WPFMessageBox.ShowError("当前路径中无文件!", "提醒"); return; } if (this.ListProgramLocal.SelectedIndex == -1) { WPFMessageBox.ShowError("未选中文件!", "提醒"); return; } #endregion string pathrestorefile = System.Environment.CurrentDirectory + "//NC_Back//"; if (!Directory.Exists(pathrestorefile)) { Directory.CreateDirectory(pathrestorefile); } string fileName = pathrestorefile + this.ListProgramLocal.SelectedItem.ToString(); if (File.Exists(fileName)) { if (WPFMessageBox.ShowConfirm($"确定要删除备份文件[{fileName}]吗?", "删除文件") != WPFMessageBoxResult.OK) { return; } try { File.Delete(fileName); GetPcProgram(); } catch (Exception exception) { Console.WriteLine(exception); } } }
//程序启动 protected override void OnStartup(StartupEventArgs e) { #region 检测进程是否存在 string sName = Assembly.GetExecutingAssembly().FullName; bool runone = true; System.Threading.Mutex run = new System.Threading.Mutex(true, sName, out runone); if (!runone) { MessageBox.Show("系统已经在运行中,请查看任务管理器并退出系统【BFM.WPF.MainUI.exe】.", "系统启动", MessageBoxButton.OK, MessageBoxImage.Error); System.Environment.Exit(0); return; } run.ReleaseMutex(); //必须需要 #endregion NewMainForm mainForm; #if !DEBUG NetLog.Write("============系统启动========="); mainForm = new NewMainForm(); #endif System.Threading.ThreadPool.SetMaxThreads(2000, 800); #region 获取用户 try { WcfClient <ISDMService> _SDMService = new WcfClient <ISDMService>(); List <SysUser> mSysUsers = _SDMService.UseService(s => s.GetSysUsers("USE_FLAG = 1")).ToList(); } catch (Exception ex) { MessageBox.Show("数据库访问失败,请核实系统配置是否正确。\r\n错误为:" + ex.Message, "系统启动", MessageBoxButton.OK, MessageBoxImage.Error); System.Environment.Exit(0); return; } #endregion try { #region 自动升级程序 //1.检验版本并提示升级 //VersionManage.UpdateAppVersion(true); //检验版本 //2.开启后台检查版本 //VersionManage.AutoUpdateVersion(); //自动升级版本 #endregion #if DEBUG NetLog.Write("系统为DEBUG,请使用Release..."); mainForm = new NewMainForm(); #endif mainForm.ShowDialog(); } catch (Exception ex) { NetLog.Error("系统错误,", ex); WPFMessageBox.ShowError( $"系统错误,请核实。" + Environment.NewLine + $"错误为:" + ex.Message, "系统错误"); } }
/// <summary> /// 后台自动升级程序 /// <param name="bFisrtCheck">是否首次检测</param> /// </summary> public static void UpdateAppVersion(bool bFisrtCheck) { try { if (File.Exists(UpgradeBatFile)) { File.Delete(UpgradeBatFile); } //删除升级文件 string updateCmd = ""; int iUpdateIndex = 0; //升级文件的序号 bool bForceUpdate = false; //强制升级 foreach (SysAppInfo appInfo in AllModels) { string error; List <string> value = VersionProcess.GetDBVersionNO(appInfo.MODEL_CODE, out error); //获取服务器的新版本 if (!string.IsNullOrEmpty(error)) //错误 { if (bFisrtCheck) //第一次检验失败 { WPFMessageBox.ShowError(error + "请检查连接!", "系统启动失败"); App.AppExit(5); //系统退出 } continue; } int dbVersion = -1; string newAppPKNO = ""; if (value.Count >= 2) { newAppPKNO = value[0]; dbVersion = SafeConverter.SafeToInt(value[1]); } if (dbVersion < appInfo.MODEL_INNER_VERSION) //服务器版本 < 当前版本 => 上传 { string filename = Environment.CurrentDirectory + "\\" + (String.IsNullOrEmpty(appInfo.APP_RELATIVE_PATH) ? "" : appInfo.APP_RELATIVE_PATH + "\\") + appInfo.APP_NAME; if (!File.Exists(filename)) { continue; } #region 版本 SysAppInfo newApp = new SysAppInfo() { PKNO = CBaseData.NewGuid(), MODEL_CODE = appInfo.MODEL_CODE, MODEL_NAME = appInfo.MODEL_NAME, MODEL_INNER_VERSION = appInfo.MODEL_INNER_VERSION, MODEL_VERSION = appInfo.MODEL_VERSION, APP_NAME = appInfo.APP_NAME, APP_RELATIVE_PATH = appInfo.APP_RELATIVE_PATH, VERSION_INTROD = appInfo.VERSION_INTROD, MODEL_CONTENT = FileHelper.FileToBytes(filename), //上传文档 CREATED_BY = CBaseData.LoginName, CREATION_DATE = DateTime.Now, VERSION_TYPE = appInfo.VERSION_TYPE, REMARK = appInfo.REMARK, }; bool ret = VersionProcess.UploadApp(newApp); //上传到数据库 if (ret) { EventLogger.Log($"上传最新版本 {newApp.MODEL_VERSION} 的程序【{newApp.MODEL_NAME}】到服务器。"); } #endregion } else if (dbVersion > appInfo.MODEL_INNER_VERSION) //服务器版本 > 当前版本 => 升级 { #region 载最新版本 SysAppInfo newApp = VersionProcess.GetNewApp(newAppPKNO); //下载 #endregion if (string.IsNullOrEmpty(newApp?.PKNO)) //下载失败 { continue; } bool updateResult = false; //强制升级 #region 保存到本地,并升级 string newfilename = Environment.CurrentDirectory + "\\Temp\\" + (String.IsNullOrEmpty(newApp.APP_RELATIVE_PATH) ? "" : newApp.APP_RELATIVE_PATH + "\\") + newApp.APP_NAME; string directory = Path.GetDirectoryName(newfilename); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } FileHelper.BytesToFile(newApp.MODEL_CONTENT, newfilename); string oldfilename = Environment.CurrentDirectory + "\\" + (String.IsNullOrEmpty(newApp.APP_RELATIVE_PATH) ? "" : newApp.APP_RELATIVE_PATH + "\\") + newApp.APP_NAME; string filename = (String.IsNullOrEmpty(newApp.APP_RELATIVE_PATH) ? "" : newApp.APP_RELATIVE_PATH + "\\") + newApp.APP_NAME; try { File.Copy(newfilename, oldfilename); updateResult = true; //升级成功 EventLogger.Log($"【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 完成自动升级。"); } catch (Exception) //升级失败 { iUpdateIndex++; //索引号 #region 形成升级Bat updateCmd += $"echo {iUpdateIndex}. 正在升级 【{appInfo.MODEL_NAME}】 到 {appInfo.MODEL_VERSION} ..." + Environment.NewLine; //显示提示信息 updateCmd += "ping 127.0.0.1 -n 2 > nul " + Environment.NewLine; //暂停2s updateCmd += "if not exist Temp\\" + filename + " (" + Environment.NewLine; //检验是否已经下载了文件 updateCmd += $" echo 【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} ... 尚未下载,升级失败!" + Environment.NewLine; // updateCmd += $")" + Environment.NewLine; // updateCmd += "copy /y " + "Temp\\" + filename + " " + filename + Environment.NewLine; //复制 => 升级文件 updateCmd += "if %ERRORLEVEL% == 0 (" + Environment.NewLine; //复制成功 updateCmd += $" echo 【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 升级成功。" + Environment.NewLine; // updateCmd += $" echo %DATE% %TIME% 完成【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 的升级 >>log\\AutoUpdate.txt" + Environment.NewLine; // updateCmd += ") else (" + Environment.NewLine; //复制失败 updateCmd += " copy /y " + "Temp\\" + filename + " " + filename + Environment.NewLine; //二次复制 => 升级文件 updateCmd += " if %ERRORLEVEL% == 0 (" + Environment.NewLine; //复制成功 updateCmd += $" echo 【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 升级成功。" + Environment.NewLine; // updateCmd += $" echo %DATE% %TIME% 完成【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 的升级 >>log\\AutoUpdate.txt" + Environment.NewLine; // updateCmd += " ) else (" + Environment.NewLine; updateCmd += $" echo 【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 升级失败,请退出系统后,运行【{UpgradeBatFile}】。" + Environment.NewLine; // updateCmd += $" echo %DATE% %TIME% 【{appInfo.MODEL_NAME}】 {appInfo.MODEL_VERSION} 升级失败,错误代码为 %ERRORLEVEL% >>log\\AutoUpdate.txt" + Environment.NewLine; // updateCmd += " pause" + Environment.NewLine; updateCmd += " exit" + Environment.NewLine; updateCmd += " )" + Environment.NewLine; updateCmd += ")" + Environment.NewLine; #endregion updateResult = false; } #endregion if ((!updateResult) && (!bForceUpdate)) //升级失败,检验是否强制升级 { if (bFisrtCheck) { bForceUpdate = true; //强制升级 } else //不是第一次检测,则需要检测是否强制升级 { int updateType = VersionProcess.CheckUpdateVersion(appInfo.MODEL_CODE, appInfo.MODEL_INNER_VERSION.Value); //获取版本升级信息,是否强制升级 #region 强制升级 if (updateType == 2) //强制升级 { bForceUpdate = true; //强制升级 } #endregion } } } } //end foreach if (!string.IsNullOrEmpty(updateCmd)) //有升级 { if (!Directory.Exists("log")) { Directory.CreateDirectory("log"); } updateCmd = "@echo off " + Environment.NewLine + " color fc " + Environment.NewLine + " title ******** 客户端自动升级程序 ******* " + Environment.NewLine + " echo *****************客户端自动升级程序(共" + iUpdateIndex + "个) ************* " + Environment.NewLine + updateCmd; updateCmd += "echo 系统升级成功!" + (bFisrtCheck ? "请重新打开程序。": "") + Environment.NewLine; //升级成功 updateCmd += "del /f /q " + UpgradeBatFile + Environment.NewLine; //删除本身 FileHelper.SaveStrToFile(updateCmd, UpgradeBatFile, true); //保存升级文件 } if (bForceUpdate) //强制升级 { Application.Current.Dispatcher.Invoke(new Action(() => { WPFMessageBox.ShowWarring( $"检测到系统有强制升级的新版本,系统自动升级失败,需要强制升级。" + Environment.NewLine + "***!系统将退出!***", "自动升级程序"); })); App.AppExit(5); } } catch (Exception ex) { NetLog.Error("自动升级程序失败,", ex); Console.WriteLine("自动升级程序失败,错误为:" + ex.Message); } }
//测试 private void BtnTest_Click(object sender, RoutedEventArgs e) { TbTestResult.Text = ""; RefreshCalculationText(); Type dynamicCode = null; //获取编译后代码,调用该类用 Dictionary <string, Dictionary <string, string> > FuncAndParamTagPKNO = new Dictionary <string, Dictionary <string, string> >(); //函数和对应参数的Tag的PKNO string className = "C" + Guid.NewGuid().ToString("N"); try { Cursor = Cursors.Wait; #region 形成执行的代码 string execCode = "using System; \r\n" + "using System.Text; \r\n" + "using System.Collections.Generic; \r\n" + "using BFM.Common.Base; \r\n\r\n"; execCode += "public class " + className + "\r\n" + "{ \r\n"; string basicFuc = "AutoCalculation"; int index = 1; FuncAndParamTagPKNO.Clear(); string exp = CalculationText; //表达式 string funcname = basicFuc + index.ToString(); //函数名称 Dictionary <string, string> paramTas = new Dictionary <string, string>(); //参数对应的标签的PKNO, param名称 List <string> funcParam = new List <string>(); //带类型的参数 string code = ""; foreach (var line in exp.Split(new string[] { "\r\n" }, StringSplitOptions.None)) { string ret = line; #region 替换标签值,将标签替换成参数名 string[] expTags = line.Split('{'); for (int i = 0; i < expTags.Length; i++) { string str = expTags[i]; int length = str.IndexOf('}'); if (length < 0) //没有找到 } { continue; } string tagPKNO = str.Substring(0, length); //{ } 内为PKNO string param = "{" + tagPKNO + "}"; if (paramTas.ContainsKey(tagPKNO)) //已经添加了该参数 { param = paramTas[tagPKNO]; } else { FmsAssetTagSetting tag = DeviceTags.FirstOrDefault(s => s.PKNO == tagPKNO); if (tag == null) { continue; } param = "param" + paramTas.Count; paramTas.Add(tagPKNO, param); string paramType = "string"; //string paramType = ((CalculationType == 2) || (tag.VALUE_TYPE > 0 && tag.VALUE_TYPE < 20)) // ? "double" // : "string"; funcParam.Add(paramType + " " + param); } ret = ret.Replace("{" + tagPKNO + "}", param); } #endregion if (string.IsNullOrEmpty(code)) { code = " " + ret; } else { code += Environment.NewLine + " " + ret; } } //C#脚本 //支持C#语法,最后返回值(Double/String) string resultType = "string"; //确定返回结果类型,将code语句转换成C#的语句 if (CalculationType == 1) //逻辑运算 { //(结果为1,0):({标签1}==1)&&({标签2}==1)&&({标签3}==0||{标签4}==0)&&({标签5}==1) code = code.Replace("AND", "&&").Replace("and", "&&").Replace("OR", "||").Replace("or", "||"); resultType = "bool"; } else if (CalculationType == 2) //数值运算 { //{标签1}+3+{标签2}+4 resultType = "double"; } else if (CalculationType == 3) //字符运算 { //{标签1}+"123" } else if (CalculationType == 12) //条件数值运算 { //{标签1}==3:{标签2}+1;{标签1}==4:{标签2}+2;{标签1}==5:{标签2}+3 resultType = "double"; List <string> exps = code.Split(';').ToList(); string temp = ""; foreach (var exp1 in exps) { if (exp1.Split(':').Length < 2) { continue; } temp += " if (" + exp1.Split(':')[0] + ") { return (" + exp1.Split(':')[1] + "); } \r\n"; } temp += " return 0; \r\n"; code = temp; } else if (CalculationType == 13) //条件字符运算 { //{标签1}==3:{标签1}+"123";{标签1}==4:{标签1}+"123" List <string> exps = code.Split(';').ToList(); string temp = ""; foreach (var exp1 in exps) { if (exp1.Split(':').Length < 2) { continue; } temp += " if (" + exp1.Split(':')[0] + ") { return (" + exp1.Split(':')[1] + ").ToString(); } \r\n"; } temp += " return \"\"; \r\n"; code = temp; } else if (CalculationType == 21) { resultType = "string";//{标签1};3 List <string> exps = code.Split(';').ToList(); string temp = ""; if (exps.Count >= 2) { int arrayIndex = SafeConverter.SafeToInt(exps[1].Trim(), 0); temp += " if ( " + exps[0].Trim() + ".Split('|').Length > " + arrayIndex + ") { return " + exps[0].Trim() + ".Split('|')[" + arrayIndex + "]; } \r\n"; } temp += " return \"\"; \r\n"; code = temp; } else if (CalculationType == 100) //C#脚本 { //支持C#语法,最后返回值(Double/String) resultType = "string"; } else //不支持的类型 { code = $" return \"计算类型[{CalculationType}],不支持的类型。\"; \r\n"; } execCode += DynamicCode.BuildExecFunc(funcname, resultType, code, funcParam); FuncAndParamTagPKNO.Add(funcname, paramTas); //添加 execCode += "}\r\n"; #endregion #region 编译代码 CodeDomProvider compiler = new CSharpCodeProvider(); CompilerParameters cp = new CompilerParameters() { GenerateExecutable = false, GenerateInMemory = true, }; cp.ReferencedAssemblies.Add("BFM.Common.Base.dll"); CompilerResults cr = compiler.CompileAssemblyFromSource(cp, execCode); if (cr.Errors.HasErrors) { WPFMessageBox.ShowError("测试失败,语法错误.\r\n" + execCode, "测试"); return; } dynamicCode = cr.CompiledAssembly.GetType(className); //获取 #endregion #region 获取值 index = 0; string funcName = FuncAndParamTagPKNO.Keys.ToList()[index]; var tagParms = FuncAndParamTagPKNO.Values.ToList()[index]; List <object> paramValues = new List <object>(); //参数值 foreach (var tagpkno in tagParms) //参数 { object value; FmsAssetTagSetting tagParam = DeviceTags.FirstOrDefault(s => s.PKNO == tagpkno.Key); if (tagParam != null) { value = SafeConverter.SafeToStr(tagParam.CUR_VALUE); //if ((CalculationType == 2) || (tagParam.VALUE_TYPE > 0 && tagParam.VALUE_TYPE < 20)) //{ // value = SafeConverter.SafeToDouble(tagParam.CUR_VALUE); //} //else //{ // value = SafeConverter.SafeToStr(tagParam.CUR_VALUE); //} } else { value = ""; } paramValues.Add(value); } object obj = dynamicCode.InvokeMember(funcName, BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, System.Type.DefaultBinder, null, paramValues.ToArray()); string newValue = ""; //新的计算结果 if (CalculationType == 1) //逻辑运算 { newValue = SafeConverter.SafeToBool(obj) ? "1" : "0"; } else { newValue = SafeConverter.SafeToStr(obj); } Console.WriteLine("测试结果:" + newValue); TbTestResult.Text = newValue; #endregion WPFMessageBox.ShowInfo("测试成功. \r\n测试结果为:" + newValue, "测试"); } catch (Exception ex) { Console.WriteLine(ex); WPFMessageBox.ShowError("测试失败,错误为:" + ex.Message, "测试"); } finally { Cursor = Cursors.Arrow; } }
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 bTestMessageBoxError_Click(object sender, RoutedEventArgs e) { WPFMessageBox.ShowError((sender as Button).Content.ToString(), "测试"); }
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();; }
//获取刀具补偿,需要读取zoller对刀仪数据--共享文件夹 private void BtnGetToolCompensation_Click(object sender, RoutedEventArgs e) { TmsToolsMaster m_TmsToolsMaster = gridItem.SelectedItem as TmsToolsMaster; if (m_TmsToolsMaster == null) { return; } string path = @"C:\\ZOLLER\\"; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception exception) { Console.WriteLine(exception); return; } } try { bool isHave = false; DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo fileitem in folder.GetFiles("*.txt")) { Console.WriteLine(fileitem.FullName); if (fileitem.FullName.Contains(m_TmsToolsMaster.TOOLS_CODE)) { isHave = true; byte[] byData = new byte[10000]; char[] charData = new char[10000]; FileStream file = new FileStream(path + m_TmsToolsMaster.TOOLS_CODE + ".TXT", FileMode.Open); file.Seek(0, SeekOrigin.Begin); file.Read(byData, 0, 1000); //byData传进来的字节数组,用以接受FileStream对象中的数据,第2个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端文件中向数组写数据,最后一个参数规定从文件读多少字符. Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); Console.WriteLine(charData); string z = ""; bool flagz = false; string x = ""; bool flagx = false; int ncount = 0; foreach (char item in charData) { if (item == '\n') { ncount++; if (ncount > 1) { if (z == "") { flagz = true; } else { flagz = false; flagx = true; } } } if (flagz) { z += item; } if (flagx) { x += item; } } file.Close(); z = z.Split('\t')[10]; x = x.Split('\t')[10]; m_TmsToolsMaster.COMPENSATION_SHAPE_DIAMETER = decimal.Parse(x); m_TmsToolsMaster.COMPENSATION_SHAPE_LENGTH = decimal.Parse(z); text_X.Text = x; text_Z.Text = z; fileitem.Delete(); BFM.WPF.Base.Helper.BindHelper.SetDictDataBindingGridItem(dictInfo, gridItem); } } if (isHave == false) { WPFMessageBox.ShowError("未获取到刀补,请在对刀仪上生成刀补数据", "获取刀补"); } } catch (Exception exception) { WPFMessageBox.ShowError("未获取到刀补,请在对刀仪上生成刀补数据", "获取刀补"); Console.WriteLine("未获取到刀补,请在对刀仪上生成刀补数据"); } }