public static string SaveImage(byte[] p_ImgData, string p_Exe) { string outstr = string.Empty; string filename = GetTempFileName("pic", p_Exe);//临时文件 if (filename == "") { SysFile.WriteFrameworkLog("导出临时图片生成失败,请重新导出"); return(outstr); } try { if (p_ImgData.Length != 0)//有图片内容 { System.IO.MemoryStream ms = new System.IO.MemoryStream(p_ImgData); System.Drawing.Image image = System.Drawing.Image.FromStream(ms); image.Save(filename); } } catch { return(outstr); } return(filename); }
/// <summary> /// 数据初始化 /// </summary> public void IniData() { try { lblError.Visible = false; string sql = string.Empty; if (OrderTypeID == 1)//订单 { sql = "exec USP1_GetSaleOrderRelInfo " + SysString.ToDBString(OrderNo); } else//采购单 { sql = "exec USP1_GetBuyOrderRelInfo " + SysString.ToDBString(OrderNo); } DataTable dt = SysUtils.Fill(sql); gridView1.GridControl.DataSource = dt; gridView1.GridControl.Show(); if (OrderNo != string.Empty) { gridControlDetail.Visible = true; } else { gridControlDetail.Visible = false; lblError.Text = "无单号"; lblError.Visible = true; } } catch (Exception E) { lblError.Text = "数据处理异常"; lblError.Visible = true; gridControlDetail.Visible = false; SysFile.WriteFrameworkLog(E.Message); } }
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { lock (locker) { if (Closing) { return; //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 } try { Listening = true; //设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 int n = comm.BytesToRead; //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n]; //声明一个临时数组存储当前来的串口数据 received_count += n; //增加接收计数 comm.Read(buf, 0, comm.BytesToRead); //读取缓冲数据 //如果需要别的协议,只要扩展这个data_n_catched就可以了。往往我们协议多的情况下,还会包含数据编号,给来的数据进行 //编号,协议优化后就是: 头+编号+长度+数据+校验 //</协议解析> ///////////////////////////////////////////////////////////////////////////////////////////////////////////// SysFile.WriteFrameworkLog("A1 " + builder.ToString()); builder.Remove(0, builder.Length);//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { ////判断是否是显示为16禁止 //if (checkBoxHexView.Checked) //{ // //依次的拼接出16进制字符串 //foreach (byte b in buf) //{ // builder.Append(b.ToString("X2") + " "); //} //} //else //{ ////直接按ASCII规则转换成字符串 SysFile.WriteFrameworkLog("A2 " + builder.ToString()); builder.Append(Encoding.ASCII.GetString(buf)); //} SysFile.WriteFrameworkLog("A3 " + builder.ToString()); string Outstr = SysConvert.ToString(Encoding.ASCII.GetString(buf)).Substring(1, SysConvert.ToString(Encoding.ASCII.GetString(buf)).Length - 1); //txtQty.Text = SysConvert.ToString(Encoding.ASCII.GetString(buf)).Substring(1, SysConvert.ToString(Encoding.ASCII.GetString(buf)).Length - 1); //txtQty.Text = SysConvert.ToDecimal(SysConvert.ToDecimal(Outstr)+SysConvert.ToDecimal( 0.05), 1).ToString(); txtQty.Text = SysConvert.ToString(Math.Round(SysConvert.ToDecimal(Outstr), 1)); SysFile.WriteFrameworkLog("A4 " + builder.ToString()); try { } catch (Exception E) { this.ShowMessage(E.Message); } //SysConvert.ToString(SysConvert.ToDecimal(Convert.ToInt32(builder.ToString().Substring(15, 6), 16).ToString()) / 10m);//builder.ToString();// })); } finally { Listening = false;//我用完了,ui可以关闭串口了。 } } }
bool THAddOneFlag = false;//2010/12月处理系统调号异常 标志是否已经自动跳过一次了 /// <summary> /// 获得流水号处理 /// </summary> /// <param name="fncEntity">单号控制表</param> /// <param name="p_VendorID">客户</param> /// <param name="sqlTrans">事务</param> /// <returns></returns> public string RGetFormNo(FormNoControl fncEntity, int p_FNCVID, string p_VendorID, IDBTransAccess sqlTrans) { string outstr = string.Empty; string sql = ""; //先期处理获得客户流水号实体BEGIN sql = "SELECT ID FROM Data_FormNCVendor WHERE VendorID=" + SysString.ToDBString(p_VendorID) + " AND FNCVID=" + p_FNCVID; DataTable dt = sqlTrans.Fill(sql); FormNCVendor entity = new FormNCVendor(sqlTrans); if (dt.Rows.Count != 0) { entity.ID = SysConvert.ToInt32(dt.Rows[0]["ID"]); entity.SelectByID(); } else//如果没找到,新增一笔进去 { entity.VendorID = p_VendorID; entity.FNCVID = p_FNCVID; this.RAdd(entity, sqlTrans); } //先期处理获得客户流水号实体END #region 开始取号 sql = "SELECT getdate() AS ServerTime"; DateTime dtserver = SysConvert.ToDateTime(sqlTrans.Fill(sql).Rows[0][0].ToString()); bool UpdFlag = false; if (fncEntity.CurYear != 0 && entity.CurYear != dtserver.Year)//判断年 { entity.CurYear = dtserver.Year; UpdFlag = true; } if (fncEntity.CurMonth != 0 && entity.CurMonth != dtserver.Month)//判断月 { entity.CurMonth = dtserver.Month; UpdFlag = true; } if (fncEntity.CurDay != 0 && entity.CurDay != dtserver.Day)//判断日 { entity.CurDay = dtserver.Day; UpdFlag = true; } if (UpdFlag)//需要更新 { entity.CurSort = 0; this.RUpdate(entity, sqlTrans); } outstr = fncEntity.FormRulePre; if (entity.CurYear != 0) //替换年 { outstr = outstr.Replace("YYYY", entity.CurYear.ToString()); //如果是4位 陈加海2010/3/26日修改 outstr = outstr.Replace("YY", entity.CurYear.ToString().Substring(2)); } if (entity.CurMonth != 0)//替换月 { outstr = outstr.Replace("MM", SysString.IntToStr(entity.CurMonth, 2)); } if (entity.CurDay != 0)//替换日 { outstr = outstr.Replace("DD", SysString.IntToStr(entity.CurDay, 2)); } if (fncEntity.FormRuleSpecial == "V4") { string spstr = p_VendorID; if (p_VendorID.Length > 4) { spstr = p_VendorID.Substring(p_VendorID.Length - 4); } outstr = outstr.Replace("X", spstr); } else if (fncEntity.FormRuleSpecial != "")//替换特殊符号 { outstr = outstr.Replace("X", fncEntity.FormRuleSpecial); } outstr += SysString.IntToStr(entity.CurSort + 1, fncEntity.FormRuleSort.Length);//获得序号 #endregion #region 多跳一个号处理 if (!THAddOneFlag) //没有调号过,防止死循环 { try //跳号验证是否存在处理,存在则加1 { sql = "SELECT DTableName,DFieldName FROM Enum_FormNoControl WHERE ID=" + fncEntity.ID; DataTable dtL = sqlTrans.Fill(sql); if (dtL.Rows.Count != 0) { if (dtL.Rows[0]["DTableName"].ToString() != string.Empty && dtL.Rows[0]["DFieldName"].ToString() != string.Empty) { sql = "SELECT " + dtL.Rows[0]["DFieldName"].ToString() + " FROM " + dtL.Rows[0]["DTableName"].ToString() + " WHERE " + dtL.Rows[0]["DFieldName"].ToString() + "=" + SysString.ToDBString(outstr); if (sqlTrans.Fill(sql).Rows.Count != 0)//产生的号码系统中已存在,则序号跳号 { THAddOneFlag = true; this.RAddSort(fncEntity.ID, p_FNCVID, p_VendorID, sqlTrans); outstr = RGetFormNo(fncEntity, p_FNCVID, p_VendorID, sqlTrans);//循环调用一次 } } } } catch (Exception EL)//异常情况下填写临时信息 { SysFile.WriteFrameworkLog(EL.Message); } } #endregion return(outstr); }
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { #region SysFile.WriteFrameworkLog("comm_DataReceived a" + builder.ToString()); lock (locker) { //if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 if (!m_Frm.saveReadStartFlag) { return; //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 } try { Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 SysFile.WriteFrameworkLog("comm_DataReceived b" + builder.ToString()); int n = comm.BytesToRead; //先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n]; //声明一个临时数组存储当前来的串口数据 received_count += n; //增加接收计数 comm.Read(buf, 0, n); //读取缓冲数据 builder.Remove(0, builder.Length); //清除字符串构造器的内容 if (m_Frm.IsHandleCreated) { //因为要访问ui资源,所以需要使用invoke方式同步ui。 m_Frm.Invoke((EventHandler)(delegate { //SysFile.WriteFrameworkLog("comm_DataReceived a" + builder.ToString()); ////判断是否是显示为16禁止 //if (false)//checkBoxHexView.Checked //{ // //依次的拼接出16进制字符串 //foreach (byte b in buf) //{ // builder.Append(b.ToString("X2") + " "); //} //} //else //{ // //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); //} ////直接按ASCII规则转换成字符串 //builder.Append(Encoding.ASCII.GetString(buf)); //SysFile.WriteFrameworkLog("comm_DataReceived b " + builder.ToString()); //if (builder.Length >= 16) //{ // string tempData1 = builder.ToString().Substring(3, 2); // string tempData2 = builder.ToString().Substring(6, 2); // string tempData3 = builder.ToString().Substring(9, 2); // string tempData4 = builder.ToString().Substring(12, 2); // string tempData5 = builder.ToString().Substring(18, 2); // string tempData6 = builder.ToString().Substring(21, 2); // int Num1 = SysConvert.ToInt32(tempData1); // int Num2 = SysConvert.ToInt32(tempData2); // int Num3 = SysConvert.ToInt32(tempData3); // int Num4 = SysConvert.ToInt32(tempData4); // int Num5 = SysConvert.ToInt32(tempData5); // int Num6 = SysConvert.ToInt32(tempData6); // //int Num1 = Convert.ToInt32(tempData1, 16); // //int Num2 = Convert.ToInt32(tempData2, 16); // //int Num3 = Convert.ToInt32(tempData3, 16); // //int Num4 = Convert.ToInt32(tempData4, 16); // //int Num5 = Convert.ToInt32(tempData5, 16); // //int Num6 = Convert.ToInt32(tempData6, 16); // string ReadDateStr = SysConvert.ToString(Num1) + SysConvert.ToString(Num2) + SysConvert.ToString(Num3) + SysConvert.ToString(Num4) + "." + SysConvert.ToString(Num5) + SysConvert.ToString(Num6); // ReadData = SysConvert.ToDecimal(ReadDateStr); // SysFile.WriteFrameworkLog("comm_DataReceived B4 " + ReadData.ToString()); //} SysFile.WriteFrameworkLog("comm_DataReceived A " + builder.ToString()); SysFile.WriteFrameworkLog("comm_DataReceived B " + builder.ToString().Length); string tempData = builder.ToString(); if (ComPortID == 1)//码表 { ReadData = SysConvert.ToDecimal(tempData.Substring(0, tempData.Length - 1)); } if (ComPortID == 2)//称重 { if (builder.Length == 8) { Str1 = tempData.Substring(2, tempData.Length - 2); } if (builder.Length == 6) { Str2 = tempData.Substring(0, 2); } SysFile.WriteFrameworkLog("comm_DataReceived C " + Str1.ToString()); SysFile.WriteFrameworkLog("comm_DataReceived D " + Str2.ToString()); SysFile.WriteFrameworkLog("comm_DataReceived E " + (Str1 + Str2).ToString()); if (Str1 != "" && Str2 != "") { ReadData = SysConvert.ToDecimal(Str1 + Str2); Str1 = ""; Str2 = ""; } } //ReadData = SysConvert.ToDecimal(tempData.Substring(0, tempData.Length - 1)); SysFile.WriteFrameworkLog("comm_DataReceived F " + ReadData.ToString()); })); } } finally { Listening = false;//我用完了,ui可以关闭串口了。 } //catch (Exception E) //{ // m_Frm.ShowMessage(E.Message); //} //SysFile.WriteFrameworkLog("comm_DataReceived b" + builder.ToString()); //string tempData = builder.ToString(); //ReadData = SysConvert.ToDecimal(tempData.Substring(0, tempData.Length - 1)); ////SysFile.WriteFile(tempData); ////追加的形式添加到文本框末端,并滚动到最后。 ////this.txGet.AppendText(builder.ToString()); ////修改接收计数 ////labelGetCount.Text = "Get:" + received_count.ToString(); #endregion #region //lock (locker) //{ // if (!m_Frm.saveReadStartFlag) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 // try // { // Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 // int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 // byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 // received_count += n;//增加接收计数 // comm.Read(buf, 0, comm.BytesToRead);//读取缓冲数据 // ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // //<协议解析> // bool data_1_catched = false;//缓存记录数据是否捕获到 // //1.缓存数据 // buffer.AddRange(buf); // //2.完整性判断 // while (buffer.Count >= 4)//至少要包含头(2字节)+长度(1字节)+校验(1字节) // { // //请不要担心使用>=,因为>=已经和>,<,=一样,是独立操作符,并不是解析成>和=2个符号 // //2.1 查找数据头 // if (buffer[0] == 0xAA && buffer[1] == 0x44) // { // //2.2 探测缓存数据是否有一条数据的字节,如果不够,就不用费劲的做其他验证了 // //前面已经限定了剩余长度>=4,那我们这里一定能访问到buffer[2]这个长度 // int len = buffer[2];//数据长度 // //数据完整判断第一步,长度是否足够 // //len是数据段长度,4个字节是while行注释的3部分长度 // if (buffer.Count < len + 4) break;//数据不够的时候什么都不做 // //这里确保数据长度足够,数据头标志找到,我们开始计算校验 // //2.3 校验数据,确认数据正确 // //异或校验,逐个字节异或得到校验码 // byte checksum = 0; // for (int i = 0; i < len + 3; i++)//len+3表示校验之前的位置 // { // checksum ^= buffer[i]; // } // if (checksum != buffer[len + 3]) //如果数据校验失败,丢弃这一包数据 // { // buffer.RemoveRange(0, len + 4);//从缓存中删除错误数据 // continue;//继续下一次循环 // } // //至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析 // //我们这里采用的办法是缓存一次,好处就是如果你某种原因,数据堆积在缓存buffer中 // //已经很多了,那你需要循环的找到最后一组,只分析最新数据,过往数据你已经处理不及时 // //了,就不要浪费更多时间了,这也是考虑到系统负载能够降低。 // buffer.CopyTo(0, binary_data_1, 0, len + 4);//复制一条完整数据到具体的数据缓存 // data_1_catched = true; // buffer.RemoveRange(0, len + 4);//正确分析一条数据,从缓存中移除数据。 // } // else // { // //这里是很重要的,如果数据开始不是头,则删除数据 // buffer.RemoveAt(0); // } // } // //分析数据 // if (data_1_catched) // { // //我们的数据都是定好格式的,所以当我们找到分析出的数据1,就知道固定位置一定是这些数据,我们只要显示就可以了 // string data = binary_data_1[3].ToString("X2") + " " + binary_data_1[4].ToString("X2") + " " + // binary_data_1[5].ToString("X2") + " " + binary_data_1[6].ToString("X2") + " " + // binary_data_1[7].ToString("X2"); // //更新界面 // m_Frm.Invoke((EventHandler)(delegate { }));//buttonOpenClose.Text = data; // } // //如果需要别的协议,只要扩展这个data_n_catched就可以了。往往我们协议多的情况下,还会包含数据编号,给来的数据进行 // //编号,协议优化后就是: 头+编号+长度+数据+校验 // //</协议解析> // ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // builder.Remove(0, builder.Length);//清除字符串构造器的内容 // //因为要访问ui资源,所以需要使用invoke方式同步ui。 // m_Frm.Invoke((EventHandler)(delegate // { // ////判断是否是显示为16禁止 // //if (checkBoxHexView.Checked) // //{ // // //依次的拼接出16进制字符串 // foreach (byte b in buf) // { // builder.Append(b.ToString("X2") + " "); // } // //} // //else // //{ // //直接按ASCII规则转换成字符串 // // builder.Append(Encoding.ASCII.GetString(buf)); // //} // try // { // //if (!showflag) // //{ // // MessageBox.Show(builder.ToString()); // //SysFile.WriteFrameworkLog(builder.ToString()); // //SysFile.WriteFrameworkLog(Environment.NewLine + builder.ToString().Length.ToString()); // if (builder.ToString().Length >= 23) // { // //追加的形式添加到文本框末端,并滚动到最后。 // ReadData = SysConvert.ToDecimal(Convert.ToInt32(builder.ToString().Trim().Substring(15, 8).Replace(" ", ""), 16).ToString()) / 10m; // //if (ReadDate < 600m) // //{ // // decimal tz = 0m;// SysConvert.ToDecimal(txtTZQty.Text); // // if (drpItemUnit.Text == "M")//计量单位是米 // // { // // if (ReadDate > 0m) // // { // // txtItemM.Text = SysConvert.ToString(ReadDate + tz); // // txtItemY.Text = SysConvert.ToDecimal(SysConvert.ToDecimal(ReadDate + tz) * 1.0936132983377m, 2).ToString(); // // } // // } // // if (drpItemUnit.Text == "Y")//计量单位是码 // // { // // if (ReadDate > 0m) // // { // // txtItemM.Text = SysConvert.ToDecimal(SysConvert.ToDecimal(ReadDate + tz) * 0.9144m, 2).ToString(); // // txtItemY.Text = SysConvert.ToString(ReadDate + tz); // // } // // } // //} // //if (ReadDate == 0m) // //{ // // lblELength.Text = builder.ToString(); // //} // //showflag = true; // } // //} // } // catch (Exception E) // { // m_Frm.ShowMessage(E.Message); // } // //SysConvert.ToString(SysConvert.ToDecimal(Convert.ToInt32(builder.ToString().Substring(15, 6), 16).ToString()) / 10m);//builder.ToString();// // })); // } // finally // { // Listening = false;//我用完了,ui可以关闭串口了。 // } //} #endregion } #endregion }
/// <summary> /// 获得单据号码 /// </summary> /// <param name="p_FormNoID">单据ID</param> /// <param name="p_Num">第几个单据号码0,1,2,</param> /// <param name="sqlTrans">事务</param> public string RGetFormNo(int p_FormNoID, int p_Num, string p_WHID, IDBTransAccess sqlTrans) { try { string outstr = ""; FormNoControl entity = new FormNoControl(sqlTrans); entity.ID = p_FormNoID; entity.SelectByID(); string sql = "SELECT getdate() AS ServerTime"; DateTime dtserver = SysConvert.ToDateTime(sqlTrans.Fill(sql).Rows[0][0].ToString()); bool UpdFlag = false; if (entity.CurYear != 0 && entity.CurYear != dtserver.Year)//判断年 { entity.CurYear = dtserver.Year; UpdFlag = true; } if (entity.CurMonth != 0 && entity.CurMonth != dtserver.Month)//判断月 { entity.CurMonth = dtserver.Month; UpdFlag = true; } if (entity.CurDay != 0 && entity.CurDay != dtserver.Day)//判断日 { entity.CurDay = dtserver.Day; UpdFlag = true; } if (UpdFlag)//需要更新 { entity.CurSort = 0; this.RUpdate(entity, sqlTrans); } outstr = entity.FormRulePre; if (entity.CurYear != 0)//替换年 { outstr = outstr.Replace("YY", entity.CurYear.ToString().Substring(2)); } if (entity.CurMonth != 0)//替换月 { outstr = outstr.Replace("MM", SysString.IntToStr(entity.CurMonth, 2)); } if (entity.CurDay != 0)//替换日 { outstr = outstr.Replace("DD", SysString.IntToStr(entity.CurDay, 2)); } if (entity.FormRuleSpecial != "")//替换特殊符号 { outstr = outstr.Replace("X", entity.FormRuleSpecial); } outstr += SysString.IntToStr(entity.CurSort + 1 + p_Num, entity.FormRuleSort.Length);//获得序号 if (!THAddOneFlag) //没有调号过,防止死循环 { try //跳号验证是否存在处理,存在则加1 { sql = "SELECT DTableName,DFieldName FROM Enum_FormNoControl WHERE ID=" + p_FormNoID; DataTable dtL = sqlTrans.Fill(sql); if (dtL.Rows.Count != 0) { if (dtL.Rows[0]["DTableName"].ToString() != string.Empty && dtL.Rows[0]["DFieldName"].ToString() != string.Empty) { sql = "SELECT " + dtL.Rows[0]["DFieldName"].ToString() + " FROM " + dtL.Rows[0]["DTableName"].ToString() + " WHERE " + dtL.Rows[0]["DFieldName"].ToString() + "=" + SysString.ToDBString(outstr); if (sqlTrans.Fill(sql).Rows.Count != 0)//产生的号码系统中已存在,则序号跳号 { THAddOneFlag = true; //this.RAddSort(p_FormNoID, sqlTrans); outstr = RGetFormNo(p_FormNoID, p_Num, p_WHID, sqlTrans);//循环调用一次 } } } } catch (Exception EL)//异常情况下填写临时信息 { SysFile.WriteFrameworkLog(EL.Message); } } return(outstr); } catch (BaseException) { throw; } catch (Exception E) { throw new BaseException(E.Message); } }